【发布时间】: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