gpt4 book ai didi

vhdl - raise_edge() 与进程敏感度列表

转载 作者:行者123 更新时间:2023-12-03 23:22:00 24 4
gpt4 key购买 nike

我在大学类(class)中使用 VHDL 进行了一段时间的开发,我认为我了解它的工作原理,但有时我意识到我实际上并不了解它。

这是我的问题:

正如我所理解的,如果一个信号在进程的敏感列表中,那么只要该信号改变值,该进程就会“执行”。

所以我问,这2段代码有什么区别:

process(clk) is
begin
if(clk = '1') then
--Do Something
end if;
end process;


process(clk) is
begin
if(rising_edge(clk)) then
--Do Something
end if;
end process;

他们不应该一视同仁吗?

最佳答案

模拟:

让我们看看 VHDL 信号值是如何在 VHDL 中定义的。您可以在 ieee.std_logic_1164 中找到这些定义。图书馆。

通常,信号声明为 std_logic这是 std_ulogic 的解析子类型定义如下:

  type STD_ULOGIC is ( 'U',             -- Uninitialized
'X', -- Forcing Unknown
'0', -- Forcing 0
'1', -- Forcing 1
'Z', -- High Impedance
'W', -- Weak Unknown
'L', -- Weak 0
'H', -- Weak 1
'-' -- Don't care
);

我们可以看到,这种信号除了通常的“0”和“1”之外,还可以有其他几个值。您的两个流程之间的区别就在这里。

现在让我们看看 rising_edge函数已定义,始终在 std_logic_1164 库中:
  function rising_edge (signal s : STD_ULOGIC) return BOOLEAN is
begin
return (s'event and (To_X01(s) = '1') and
(To_X01(s'last_value) = '0'));
end function rising_edge;

function To_X01 (s : STD_ULOGIC) return X01 is
begin
return (cvt_to_x01(s));
end function To_X01;

----------------------------------------------------------
-- table name : cvt_to_x01
--
-- parameters :
-- in : std_ulogic -- some logic value
-- returns : x01 -- state value of logic value
-- purpose : to convert state-strength to state only
--
-- example : if (cvt_to_x01 (input_signal) = '1' ) then ...
--
----------------------------------------------------------
constant cvt_to_x01 : logic_x01_table := (
'X', -- 'U'
'X', -- 'X'
'0', -- '0'
'1', -- '1'
'X', -- 'Z'
'X', -- 'W'
'0', -- 'L'
'1', -- 'H'
'X' -- '-'
);

该函数实际上将信号值转换为“X”或“0”或“1”。并且该函数仅在转换后的新值为“1”且转换后的最后值为“0”时才为真。

然后是 rising_edge函数仅适用于以下 [last_value;value] 对:
  • [0;1]
  • [L;1]
  • [0;H]
  • [L;H]

  • 所有其他条件都无效。

    合成:

    [编辑以删除虚假信息]

    正如@user1155120 在主要帖子评论中所解释的:

    Lacking signal assignment neither process produce simulation events. Lacking an assignment target the first produces no level sensitive sequential logic (transparent latch) in synthesis. Lacking an assignment target the second produces no edge triggered sequential logic (register) in synthesis. Unlike grorel's Quartus prime other synthesis tools aren't guaranteed to produce a register for his output1. See IEEE Std 1076.6-2004 (withdrawn) 6.1.2.1 Rising (positive) edge clock., 6.2.1.1 Level-sensitive storage from process with sensitivity list (requires input signals in sensitivity list).



    output1 生成如下:
    process(clk) is
    begin
    if(clk = '1') then
    output1 <= input1;
    end if;
    end process;

    您必须在您的过程中使用边缘检测以确保寄存器创建良好。

    关于vhdl - raise_edge() 与进程敏感度列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50909128/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com