我是VHDL的新手。我想创建一个异步工作的边缘检测器(不使用时钟信号)。
我为此使用了一个简单的示意图:
在Quartus II(Altera / Intel)中,我有以下代码:
----
signal MyInput_Change : std_logic;
----
process (MyInput)
begin
MyInput_Change<= not(not (MyInput)) xor MyInput; --edge detector
if ( MyInput_Change = '1' ) then
--change state of FSM
end if;
但是此代码不起作用。
我在做什么错了?
答案 0 :(得分:2)
声明信号:
signal I : std_logic; -- input
signal I_d : std_logic := '0'; -- input delayed by 1 cycle
signal I_re : std_logic; -- rising edge
signal I_fe : std_logic; -- falling edge
signal I_ch : std_logic; -- changed
延迟输入信号:
I_d <= I when rising_edge(Clock);
上升沿检测:
I_re <= not I_d and I; -- old = 0, new = 1 => rising edge
下降边缘检测:
I_fe <= I_d and not I; -- old = 1, new = 0 => falling edge
边缘/变化检测:
I_ch <= I_d xor I; -- old <> new => changed
答案 1 :(得分:0)
我很幸运,使用了syn_keep属性(或者继续使用您的综合工具)。
signal A1, A2, A3, A4 : std_logic ;
attribute syn_keep : boolean ;
attribute synkeep of A1 : signal is true ;
attribute synkeep of A2, A3, A4 : signal is true ; -- should be able to group them, but if not do it as A1
. . .
A1 <= not A ;
A2 <= not A1 ;
A3 <= not A2 ;
A4 <= not A3 ;
EdgePulse <= A xor A4 ;
这对许多事情都有效,但是某些综合工具-甚至某些布局和布线工具也可以将其删除。
祝你好运。让我们知道怎么回事。