我一直在尝试构建一个脉冲发生器,比方说,检测信号何时下降。我尝试了使用过程来构建此脉冲发生器的不同方法:我的模拟失败了。
我要发布这个问题,而不是寻找脉冲发生器的代码,而是希望解释为什么这种方法不起作用。我正在尝试从顺序语言(例如C ++等)过渡到VHDL
,并且遇到了这个看不见的概念墙。预先感谢。
library ieee;
use ieee.std_logic_1164.all;
entity puls_on_FE is
port (signal_in : in std_logic; pulse_out : out std_logic);
end puls_on_FE;
architecture behavior of puls_on_FE is
signal epoch: std_logic := '0';
begin
process (signal_in)
begin
if falling_edge(signal_in)then
pulse_out <= '0';
wait1: loop --using loop because an after by itself hangs the sim too
exit when epoch = '1';
epoch <= '1' after 5 ns;
end loop wait1; --expect loop to execute once and exit after 5ns
pulse_out <= '1';
end if;
end process;
end behavior;
答案 0 :(得分:0)
在进程挂起之前,信号不会更新,方法是单击等待语句,或者在具有敏感度列表时进入进程结尾。 在您的示例中,您输入的循环没有任何机制可以等待任何时间长度。在每个循环迭代中,您分配
5 ns后epoch <='1';
因为您不在循环内等待,所以每次迭代都占用0个增量,并且时间永远不会增加任何增量。 (顺便说一句,因为该进程具有敏感性列表,所以您不能在这里等待)
我建议您退出编码,并做更多的工作。您打算将此代码创建在什么电路上?你可以画电路吗?由于VHDL是一种描述语言,因此您需要了解要尝试创建的电路,而不是编写您认为可能会仿真某种电路的代码。
我也质疑“之后”分配的必要性。您不能使用“之后”来合成真实的电路-它们只能在那里模拟信号的惯性延迟,并且仅对仿真有用。