-1

信号「state」と「return_state」の値がモデルシミュレーション波形で切り替わらないのはなぜですか。(ISE Design Suite 14.1) テストベンチと ModelSim SE plus 6.5 を使用して SD インターフェイス (SPI バス) をシミュレートしています。問題は、FSM の状態名が波形で切り替わらないことです。信号「state」と「return_state」は常に「RST」状態です。テストベンチでシグナル「state」、「return_state」、および「type states」を宣言しました。ステップ関数を使用してシミュレーションを実行すると、ポインターはシミュレーションが状態間で切り替わることを示します。状態が変化したときに波形を確認する必要がありますが、何が間違っていたのかわかりません。コードはhttp://stevenmerrifield.com/tools/sd.vhdにあります。助けてください。

clk_period = 20ns

コードの最初の部分:

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」に設定される以外は、「最初」の状態の信号は変化しません。「状態」は値「INIT」を取得し、80クロック後に値「CMD0」を取得する必要がありますが、値「rst」を保持します。それから:

-at 3310 ns "cs" は値 '0' を取得します

いつ発生するかのコードの部分:

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

「状態」には値「INIT」がある、またはあるべきであるように見えますが、波形ではまだ値「rst」があります。

テストベンチ:

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;
4

1 に答える 1

1

テストベンチで定義された状態が表示されます! 実際、テストベンチでも状態タイプを定義する必要はまったくないので、これは意図的なものではないと思います! 波形にアーキテクチャ信号を追加すると、状態が変化するのがわかります。

于 2013-05-28T05:54:11.447 に答える