Я действительно запутался, потому что это простой код, и я не нахожу ошибку. Синтаксис в порядке, но в Simulation значения Dready и acc_value не меняются.
Это мой модуль MVM.vhd:
entity MVM is
port (
CLK: IN std_logic;
RST: IN std_logic;
DREADY: OUT std_logic
);
end entity MVM;
architecture base of MVM is
begin
process(CLK)
variable acc_value : signed(15 downto 0);
begin
IF rising_edge(CLK) then
IF RST='1' THEN
acc_value := (OTHERS => '0'); -- reset
DREADY <= '0';
END IF;
END IF;
END process;
end base;
Если Reset высокий, он должен установить значения Dready и acc_value на «0».
Мой тестовый стенд:
entity tb_MVM is
-- Port ( );
end tb_MVM;
architecture TEST of tb_MVM is
Component MVM
port (
CLK: IN std_logic;
RST: IN std_logic;
DREADY: OUT std_logic
);
End component;
signal CLK: std_logic;
signal RST: std_logic;
signal DREADY: std_logic;
BEGIN
uut: MVM Port Map(
CLK=>CLK,
RST=>RST,
DREADY => DREADY
);
tb: process
BEGIN
wait for 100ns;
CLK <= '1';
RST <= '1';
wait for 100ns;
CLK <= '0';
wait for 100ns;
CLK <= '1';
RST <= '0';
END PROCESS;
end TEST;
В моделировании значения DREADY и acc_value не определены ('X').
Предполагая, что вы имеете в виду выход до 300 нс...
Упрощенно: rising_edge()
проверяет переход от '0'
к '1'
и неверно для переходов от 'X'
к '1'
.
Вы также можете убедиться, что RST
стабилен, когда CLK
действительно растет, например:
tb: process
BEGIN
CLK <= '0';
RST <= '1';
wait for 100ns;
CLK <= '1';
wait for 100ns;
CLK <= '0';
RST <= '0';
END PROCESS;
Это приводит к нулю DREADY
и acc_value
через 100 нс.
Вы правы, он должен установить его на «0», а не на «1». Во всяком случае, в симуляции, но это не 0 и не 1, это "x" (не определено/неизвестно)
Мы называем эти типографские ошибки или, в просторечии, размышлениями, когда вы имели в виду одно, а написали другое.