VHDL Synthesis Error and Code Suggestions

45 views Asked by At

Im trying to design and build a VHDL SPI slave interface which takes serial data, parallelizes it, responds accordingly, and then outputs based on the given command. Right now my simulation runs as its supposed to but when I synthesize it, the register_file or the register_address leads to several hundred error.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
USE ieee.numeric_std.ALL;


ENTITY STATE IS
   PORT(
      D_SI                : in STD_LOGIC;
      CS                  : IN STD_LOGIC;
      CLK                 : in STD_LOGIC;
      RESET               : in STD_LOGIC;
      STATE_SO            : out std_logic
      );
END STATE;

ARCHITECTURE BEHAVIOR OF STATE IS

    constant NUM_REG_ADDR_BITS : integer := 8;

    constant NUM_INTERFACE_REGISTERS : integer := (2**NUM_REG_ADDR_BITS);
    type interface_register_file is array(((2**NUM_REG_ADDR_BITS) - 1) downto 0) of std_logic_vector(7 downto 0);

    signal register_address : std_logic_vector(NUM_REG_ADDR_BITS - 1 downto 0);


    signal register_file : interface_register_file;


    SIGNAL ready        : STD_LOGIC := '0';
    signal COUNT        : STD_LOGIC_VECTOR(2 downto 0);
    SIGNAL OUTS         : STD_LOGIC_VECTOR(7 DOWNTO 0);
    CONSTANT READS      : std_logic_vector(7 downto 0) := "11110000";       -- CONSTANTS FOR READ AND WRITE COMMANDS
    CONSTANT WRITES     : std_logic_vector(7 downto 0) := "00001111";              

    signal DSEND        : std_logic_vector(7 downto 0); 
    signal CNT          : std_logic_vector(2 downto 0);
    signal EN         : std_logic;
    signal D_PO         : STD_LOGIC_VECTOR(7 downto 0);

    type state_type is (IDLE,REA,WRI,RD_ADDRESS,WR_ADDRESS);  --type of state machine. 
    signal current_s,next_s: state_type;  --current and next state declaration.

    type mode_type is (ADD,DATA);  --type of state machine.
    signal current_mode,next_mode: mode_type;  --current and next state declaration.

    type RD_type is (RD,WAI);  --This allows for an initial input of address and then an incrementing address
    signal current_RD,next_RD: RD_type;  --current and next RD declaration.



BEGIN


process(DSEND,CS,RESET,EN)
begin
    IF CS = '1' or RESET = '1' then
        D_PO <= "ZZZZZZZZ";
    else
        IF EN = '1' then
            D_PO <= DSEND;
        end if;
    end if;
end process;

Data_out:PROCESS(CLK,D_SI)
BEGIN

        IF rising_edge(CLK) then
            DSEND(0) <= D_SI;
            DSEND(7 downto 1) <= DSEND(6 downto 0);


        END IF;
END PROCESS;

Bit_Counter:PROCESS(CLK,RESET,CNT,CS,EN)
BEGIN
    IF CS ='1' THEN
        CNT <= "000";
        EN <= '0';
    ELSE
        IF Reset = '1' then
            CNT <= "000";
            EN <= '0';
        ELSE
            IF rising_edge(CLK) then
                CNT <= CNT + '1';
                    IF CNT = "111" then
                        EN <= '1';
                    ELSE
                        EN <= '0';

                    END IF;
            END IF;
        END IF;
    END IF;

END PROCESS;

PROCESS (CLK, reset, EN, CS) --Change State of IDLE write or read
begin
    if (reset='1') or CS = '1' then
        current_s <= IDLE; --default state on reset.
    elsif falling_edge(clk) and EN = '1' then
        current_s <= next_s;   --state change.
    END IF;
END PROCESS;


PROCESS (CLK, reset, CS) --Change mode of writing and reading memory
begin
    if (reset='1') or CS = '1' then
        current_mode <= ADD; --default state on reset.
    elsif clk'event then
        current_mode <= next_mode; --state change.
    END IF;
END PROCESS;

PROCESS (CLK, reset, EN, CS) --Change Waiting state for address processing 
begin
    if (reset='1') or CS = '1' then
        current_RD <= WAI; --default state on reset.
    elsif rising_edge(en) then
        current_RD <= next_RD; --state change.
    END IF;
END PROCESS;

process(RESET)
begin

end process;

--state machine process.
PROCESS (current_s,D_PO, EN, CLK, CS,current_rd)
BEGIN
    if CS = '1' then
        outs <= "ZZZZZZZZ";
        register_address <= "ZZZZZZZZ";
        next_mode <= add;
        next_rd <= wai;
        next_s <= IDLE;
        STATE_SO <= 'Z';
    else
        case current_s is

            when IDLE =>--when current state is "IDLE"
                register_address <= "ZZZZZZZZ";
                    if(D_PO = READS) then
                        next_s <= REA;
                    elsif(D_PO = WRITES) then
                        next_s <= WRI;
                    ELSE
                        next_s <= IDLE; 
                    END IF;

            when REA =>        --when current state is Read
                next_s <= RD_ADDRESS;

                when RD_ADDRESS =>
                    if current_rd = WAI then
                        register_address <= D_PO;
                        next_rd <= rd;
                    end if;

                        if rising_edge(clk) THEN
                            STATE_SO <= register_file(to_integer(unsigned(register_address)))(7);
                            register_file(to_integer(unsigned(register_address)))(7 downto 1) <= register_file(to_integer(unsigned(register_address)))(6 downto 0);
                            register_file(to_integer(unsigned(register_address)))(0) <= '0';
                            outs <= register_address;
                        End if;

                        if rising_edge(en) then
                            register_address <= register_address + 1;
                        end if;

                        case current_rd is
                            when wai =>

                            when rd =>
                                next_rd <= rd;
                        end case;


            when WRI =>        -- Current state is Write
                next_s <= WR_ADDRESS;

            when WR_ADDRESS =>

                if current_rd = WAI then
                   if rising_edge(clk) and En = '1' then
                   register_address <= D_PO;
                   end if;

                next_rd <= rd;

                elsif current_rd = RD then
                    if falling_edge(clk) and EN = '1' THEN
                            register_file(to_integer(unsigned(register_address)))<= D_PO;
                            register_address <= register_address+1;
                            outs <= register_address;


                    End if;


                end if;

                    case current_rd is
                        when wai =>

                        when rd =>
                            next_rd <= rd;
                    end case;

        END CASE;
    END IF;
END PROCESS;



PROCESS(CLK, reset, CS) -- Counter For READY
BEGIN
    if CS = '1' then
        count <= (others=>'0');
        ready <= '0';
    elsif (rising_edge(CLK)) then
        count <= count + 1;
    END IF;
     if count = "111"  and clk = '1' then
                READY <= '1';
            else
                READY <= '0';
            END IF;
END PROCESS;

END behavior;

The errors are always something like

Asynchronous load of non-constant data for register_file_0_cl(7) is not supported

This is the picture of my simulation and it works fine here but I guess my code is very much non-synthesizable. my simulation

I'd appriciate any feedback on this error and my code in general. I've only been using VHDL for about a week now and I'm still trying to get used to the syntax and programming style.

0

There are 0 answers