【问题标题】:How to create an asynchronous Edge Detector in VHDL?如何在 VHDL 中创建异步边缘检测器?
【发布时间】:2019-03-24 19:03:46
【问题描述】:

我是 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;

但是这段代码不起作用。

我做错了什么?

【问题讨论】:

  • 很久以前才用过VHDL,编译器有可能把它优化掉吗?
  • 我也是这么想的。如果属实,如何避免?或者有其他方法吗?
  • not(not (MyInput))` 和 not(not (MyInput)) 是表达式,重载运算符 xor 的操作数。信号分配右侧的表达式在执行期间进行评估。这两个操作数正在评估相同的信号值(在模拟中not MyInput 并不意味着不同的命名对象)。为了检测边缘,您需要评估两个单独的信号。在合成中,图像中的电路通常没有用,反相器具有较宽的延迟裕度,并且会被最小化或映射掉。使用顺序(时钟)逻辑进行边缘检测。
  • 不使用时钟就没有办法吗?
  • 采用较旧的技术,逻辑单元的传播延迟要大得多(并且定义更好),这导致了像 Altera 中的 LCELL 这样的结构,允许故意插入逻辑单元。但是现在,合成器工具非常擅长最小化电路并且延迟最小(ps 级),所以如果你能让它按照你尝试的方式工作,边沿脉冲将非常短(100 PS)。在更现代的芯片中,时钟可以达到 300Mhz+,可以非常精细地控制边缘脉冲。

标签: vhdl


【解决方案1】:

声明信号:

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

【讨论】:

  • 我也有同样的问题:没有时钟信号也可以吗?
  • 这是可能的,但是 (a) 非常困难,并且 (b) 由于已经给出的原因根本不推荐。如果没有其他可能的方法,您只会这样做。为什么要在没有时钟的情况下这样做?
  • 因为我正在创建一个异步项目,没有时钟
  • 好吧,我以为你可以用 FPGA 来做!
【解决方案2】:

我对 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 ; 

这适用于很多事情,但一些综合工具 - 甚至一些布局布线工具可能能够删除这些。

祝你好运。让我们知道怎么回事。

【讨论】:

  • 好的,显然它工作正常(即使@Paebbels 解决方案似乎也能工作)。我没有想到的一件事是,当我打开电路和关闭它时,我得到了状态变化。我知道我要求的太多了,但是是否可以避免在我打开和关闭电路时检测到状态变化?
  • 如果您可以像@Paebbels 建议的那样使用人字拖,那么就这样做。它将创建一个更稳定的解决方案。如果您只想要前沿,则在 X 的路径中添加一个额外的反相器并使用“与”门而不是 XOR。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-13
  • 2013-10-13
  • 1970-01-01
  • 1970-01-01
  • 2011-05-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多