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