带循环/后置的VHDL脉冲发生器

时间:2018-09-27 19:08:20

标签: vhdl

我一直在尝试构建一个脉冲发生器,比方说,检测信号何时下降。我尝试了使用过程来构建此脉冲发生器的不同方法:我的模拟失败了。

我要发布这个问题,而不是寻找脉冲发生器的代码,而是希望解释为什么这种方法不起作用。我正在尝试从顺序语言(例如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;

1 个答案:

答案 0 :(得分:0)

在进程挂起之前,信号不会更新,方法是单击等待语句,或者在具有敏感度列表时进入进程结尾。 在您的示例中,您输入的循环没有任何机制可以等待任何时间长度。在每个循环迭代中,您分配

5 ns后

epoch <='1';

因为您不在循环内等待,所以每次迭代都占用0个增量,并且时间永远不会增加任何增量。 (顺便说一句,因为该进程具有敏感性列表,所以您不能在这里等待)

我建议您退出编码,并做更多的工作。您打算将此代码创建在什么电路上?你可以画电路吗?由于VHDL是一种描述语言,因此您需要了解要尝试创建的电路,而不是编写您认为可能会仿真某种电路的代码。

我也质疑“之后”分配的必要性。您不能使用“之后”来合成真实的电路-它们只能在那里模拟信号的惯性延迟,并且仅对仿真有用。