我正在尝试对下面的这个电路进行VHDL编码,以避免在我的项目中出现亚稳态。
这是我到目前为止编写的代码:
stabel
但是当我在modelsim中模拟它时,Led
信号在两个时钟周期过去之前不会改变它的状态,而'1'
的一个额外信号将成为{{1}}。那是为什么?
答案 0 :(得分:1)
有两个问题:
复位时,您希望将固定值(在编译时已知)分配给信号。所以你应该改变
if (reset = '1') then stabel <= metastable; …
到
if (reset = '1') then
stabel <= '0';
…
否则stabel
在复位后的一个时钟周期之前未处于定义状态。
您展示的代码并未描述图片中的电路。相反,它描述了一个具有一个额外寄存器的电路:
key metastable stabel Led
,,,,,,, ,,,,,,, ,,,,,,,
---> | D Q | ------> | D Q | ------> | D Q | --->
| | | | | |
|> | |> | |> |
´´´´´´´ ´´´´´´´ ´´´´´´´
您应该从时钟进程中删除Led
信号的分配,而是进行并发分配:
process(clk, reset)
begin
…
metastable <= … ;
stabel <= … ;
end process;
Led <= stabel;
还有两个小问题:
信号名称拼写为stable
,而不是stabel
(但至少你是一致的)。
不要使用两个嵌套的if
,而是使用if
elsif
一个{/ 1}}:
if (reset = '1') then … else if rising_edge(clk) then … end if; end if;
变为
if (reset = '1') then
…
elsif rising_edge(clk) then
…
end if;