具有 loop/after 的 VHDL 脉冲发生器
VHDL Pulse Generator with loop/after
我一直在尝试构建一个脉冲发生器,比方说,检测信号何时下降。我尝试了不同的方法来使用进程构建这个脉冲发生器:我的模拟挂起。
我发布这个问题,与其说是寻找脉冲发生器的代码,不如说是希望得到解释为什么这种方法不起作用。我正在尝试从顺序语言(如 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;
在进程挂起之前,信号不会得到更新,要么通过点击等待语句,要么在进程有敏感列表时到达进程末尾。
在您的示例中,您进入了一个没有等待任何时间长度的机制的循环。在每个循环迭代中,您分配
epoch <= '1' 5 ns 后;
因为您没有在循环内等待,所以每次迭代都需要 0 个增量,并且时间永远不会增加任何增量。 (顺便说一句,你不能在这里等,因为这个过程有敏感列表)
我建议您从编码中退一步,多画画。您打算使用此代码创建什么电路?你能画出电路吗?因为 VHDL 是一种描述语言,所以您需要了解您要创建的电路,而不是编写您认为可能会模拟某种电路的代码。
我也质疑 "after" 作业的必要性。您不能使用 "after" 合成真实电路 - 它们仅用于模拟信号的惯性延迟并且仅适用于模拟。
我一直在尝试构建一个脉冲发生器,比方说,检测信号何时下降。我尝试了不同的方法来使用进程构建这个脉冲发生器:我的模拟挂起。
我发布这个问题,与其说是寻找脉冲发生器的代码,不如说是希望得到解释为什么这种方法不起作用。我正在尝试从顺序语言(如 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;
在进程挂起之前,信号不会得到更新,要么通过点击等待语句,要么在进程有敏感列表时到达进程末尾。 在您的示例中,您进入了一个没有等待任何时间长度的机制的循环。在每个循环迭代中,您分配
epoch <= '1' 5 ns 后;
因为您没有在循环内等待,所以每次迭代都需要 0 个增量,并且时间永远不会增加任何增量。 (顺便说一句,你不能在这里等,因为这个过程有敏感列表)
我建议您从编码中退一步,多画画。您打算使用此代码创建什么电路?你能画出电路吗?因为 VHDL 是一种描述语言,所以您需要了解您要创建的电路,而不是编写您认为可能会模拟某种电路的代码。
我也质疑 "after" 作业的必要性。您不能使用 "after" 合成真实电路 - 它们仅用于模拟信号的惯性延迟并且仅适用于模拟。