2013-05-27 5 views
-1

Почему значения сигналов «state» и «return_state» не меняются в форме сигналов модели. Я имитирую SD-интерфейс (SPI-шину) с (ISE Design Suite 14.1) testbench и ModelSim SE plus 6.5. Проблема в том, что имена состояний в FSM не переключаются в форме волны. Сигналы «state» и «return_state» всегда находятся в состоянии «RST». Я объявила в тестовом банке сигналы «состояние», «return_state» и «type states». Когда я иду через симуляцию с функцией шага, указатель показывает, что имитация переключается между состояниями. Мне нужно увидеть в форме волны, когда меняются состояния, но я не знаю, что я сделал неправильно. Код находится на http://stevenmerrifield.com/tools/sd.vhd. Пожалуйста помоги., имитирующий VHDL FSM с ModelSim

clk_period = 20 нс

начальная часть кода:

begin 

process(clk,reset) 
    variable byte_counter : integer range 0 to WRITE_DATA_SIZE; 
    variable bit_counter : integer range 0 to 160; 
begin 
    data_mode <= dm_in; 

    if rising_edge(clk) then 
     if (reset='1') then 
      state <= RST; 
      sclk_sig <= '0'; 
     else 
      case state is 

      when RST => 
       sclk_sig <= '0'; 
       cmd_out <= (others => '1'); 
       address <= x"00000000"; 
       byte_counter := 0; 
       cmd_mode <= '1'; -- 0=data, 1=command 
       response_mode <= '1'; -- 0=data, 1=command 
       bit_counter := 160; 
       cs <= '1'; 
       state <= INIT; 

      when INIT =>  -- CS=1, send 80 clocks, CS=0 
       if (bit_counter = 0) then 
        cs <= '0'; 
        state <= CMD0; 
       else 
        bit_counter := bit_counter - 1; 
        sclk_sig <= not sclk_sig; 
       end if; 

      when CMD0 => 
       cmd_out <= x"FF400000000095"; 
       bit_counter := 55; 
       return_state <= CMD55; 
       state <= SEND_CMD; 

Если "сброс" сигнала установлен в '1', а затем обратно на '0', сигналы в "первый" состояние не изменяется, за исключением того, что «cs» и «mosi» установлены в «1». «state» должно получить значение «INIT» и после 80 часов значение «CMD0», но оно сохраняет значение «rst». затем:

-На 3310 нс «CS» получает значение «0»

часть кода, когда это должно произойти:

when INIT =>  -- CS=1, send 80 clocks, CS=0 
       if (bit_counter = 0) then 
        cs <= '0'; 
        state <= CMD0; 

Кажется, что «государство» имеет или должно было значение «INIT», но в форме волны оно все еще имеет значение «rst».

Testbench:

LIBRARY ieee; 
USE ieee.std_logic_1164.ALL; 

ENTITY simulacija IS 
END simulacija; 

ARCHITECTURE behavior OF simulacija IS 

COMPONENT sd_controller 
PORT(
    cs : OUT std_logic; 
    mosi : OUT std_logic; 
    miso : IN std_logic; 
    sclk : OUT std_logic; 
    rd : IN std_logic; 
    wr : IN std_logic; 
    dm_in : IN std_logic; 
    reset : IN std_logic; 
    din : IN std_logic_vector(7 downto 0); 
    dout : OUT std_logic_vector(7 downto 0); 
    clk : IN std_logic 
    ); 
END COMPONENT; 

signal miso : std_logic := '0'; 
signal rd : std_logic := '0'; 
signal wr : std_logic := '0'; 
signal dm_in : std_logic := '0'; 
signal reset : std_logic := '0'; 
signal din : std_logic_vector(7 downto 0) := (others => '0'); 
signal clk : std_logic := '0'; 


signal cs : std_logic := '0'; 
signal mosi : std_logic; 
signal sclk : std_logic; 
signal dout : std_logic_vector(7 downto 0); 

type states is (
RST, 
INIT, 
CMD0,        
CMD55,     
CMD41,    

IDLE,      
READ_BLOCK, 
READ_BLOCK_WAIT, 
READ_BLOCK_DATA, 
READ_BLOCK_CRC, 
SEND_CMD, 
RECEIVE_BYTE_WAIT, 
RECEIVE_BYTE, 
WRITE_BLOCK_CMD, 
WRITE_BLOCK_INIT,  
WRITE_BLOCK_DATA,  
WRITE_BLOCK_BYTE,  
WRITE_BLOCK_WAIT   
); 
signal state, return_state : states;   
signal sclk_sig : std_logic := '0';    
signal cmd_out : std_logic_vector(55 downto 0);   
signal recv_data : std_logic_vector(7 downto 0); 
signal address : std_logic_vector(31 downto 0); 
signal cmd_mode : std_logic := '0';    
signal data_mode : std_logic := '1';   
signal response_mode : std_logic := '0';  
signal data_sig : std_logic_vector(7 downto 0) := x"00"; 

constant clk_period : time := 20 ns; 

BEGIN 

uut: sd_controller PORT MAP (
     cs => cs, 
     mosi => mosi, 
     miso => miso, 
     sclk => sclk, 
     rd => rd, 
     wr => wr, 
     dm_in => dm_in, 
     reset => reset, 
     din => din, 
     dout => dout, 
     clk => clk 
    ); 

clk_process :process 
begin 
    clk <= '0'; 
    wait for clk_period/2; 
    clk <= '1'; 
    wait for clk_period/2; 
end process; 


stim_proc: process 
begin 

    reset <= '1'; 
    wait for 80 ns; 
    reset <= '0'; 
    wait; 
end process; 
END; 
+0

напишите ** соответствующий ** фрагмент кода здесь и уточните свой вопрос –

+0

Это, по-видимому, проблема с оборудованием Modelim для отображения осциллограмм. Я попытался использовать ghdl и gtkwave (на Mac, не менее) и получил состояние (ы), чтобы правильно отображаться. return_state идет сначала, cmd55, cmd41, poll_cmd более 8,6 или около того без каких-либо изменений в вашем тестовом стенде или uut. cs и состояние отображаются корректно. Формат файла ghw для gtkwave автоматически обрабатывает типы перечисления VHDL. Похоже, что Modelsim использует что-то VCD, основанное на болтах на интерпретации перечисления для отображения. Похоже, все не настроено. Я не использовал Modelsim более десяти лет. – user1155120

ответ

1

вы видите состояние, определенное в вашем тестбенча! на самом деле я ожидаю, что это было не специально, так как нет абсолютно никакой необходимости определять тип состояний в тестовом банке тоже! если вы добавите сигналы архитектуры к вашему сигналу, вы увидите, что состояния меняются!

+0

Я очистил определение типа состояний, состояния, return_state, и теперь он работает. Большое спасибо!!! – user2418627

Смежные вопросы