通过采样信号避免亚稳态

时间:2017-11-10 16:45:56

标签: vhdl

我正在尝试对下面的这个电路进行VHDL编码,以避免在我的项目中出现亚稳态。

enter image description here

这是我到目前为止编写的代码:

stabel

但是当我在modelsim中模拟它时,Led信号在两个时钟周期过去之前不会改变它的状态,而'1'的一个额外信号将成为{{1}}。那是为什么?

image

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;

还有两个小问题:

  1. 信号名称拼写为stable,而不是stabel(但至少你是一致的)。

  2. 不要使用两个嵌套的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;