Vhdl clk&x27;事件vs上升沿()

Vhdl clk&x27;事件vs上升沿(),vhdl,Vhdl,我一直用它来检测上升沿: if(clk'event和clk='1')那么 但这也可用于: 如果上升沿(clk),则 阅读时,建议使用上升沿(clk),但也有迹象表明上升沿(clk)可能导致错误行为 我无法决定未来选择哪一个,继续进行(clk'event and clk='1')还是采用上升沿(clk) 在这两方面有什么实际经验吗?有什么偏好吗 谢谢 上升沿定义为: FUNCTION rising_edge (SIGNAL s : std_ulogic) RETURN BOOLEAN IS BE

我一直用它来检测上升沿:

if(clk'event和clk='1')那么

但这也可用于:

如果上升沿(clk),则

阅读时,建议使用
上升沿(clk)
,但也有迹象表明
上升沿(clk)
可能导致错误行为

我无法决定未来选择哪一个,继续进行
(clk'event and clk='1')
还是采用
上升沿(clk)

在这两方面有什么实际经验吗?有什么偏好吗


谢谢

上升沿定义为:

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 To_X01  ( s : std_ulogic ) RETURN  X01 IS
BEGIN
    RETURN (cvt_to_x01(s));
END;

CONSTANT cvt_to_x01 : logic_x01_table := (
                     'X',  -- 'U'
                     'X',  -- 'X'
                     '0',  -- '0'
                     '1',  -- '1'
                     'X',  -- 'Z'
                     'X',  -- 'W'
                     '0',  -- 'L'
                     '1',  -- 'H'
                     'X'   -- '-'
                    );
如果您的时钟只从0到1,从1到0,那么上升沿将产生相同的代码。否则,您可以解释差异


就个人而言,我的时钟只从0到1,反之亦然。我发现
上升沿(clk)
(clk'事件和clk='1')
变体更具描述性。

链接的注释不正确:“L”到“1”将产生上升沿

此外,如果时钟信号从“H”转换为“1”,则上升沿(clk)将(正确)不触发,而
(clk事件和clk=“1”)
(错误)将触发


诚然,这看起来像是一个人为的例子,但我在实际硬件中看到过这样的时钟波形,这是由于其他地方的故障造成的。

实际例子:

假设您正在对I2C总线(时钟信号称为
SCL
,数据信号称为
SDA
)进行建模,其中总线为三态,两个网络都有弱上拉。您的测试台应使用“H”值对PCB上的上拉电阻器进行建模

scl <= 'H'; -- Testbench resistor pullup

scl在模拟启动时,如果时钟从“U”转到“1”,上升沿(clk)将为假,但手写边缘检测“事件和1”将为真。在这种特殊情况下,上升沿会更安全。
如果(clk'last_value='0'和clk='1')那么
会完成同样的事情吗?这是一个有争议的评论-这是好的,因为它给出了上升沿()机制的明确定义;对“H”到1和“1”到L转换的上升沿()的优点持矛盾态度是完全错误的。我的选择-没有充分的理由使用“事件和1”结构-完全同意Iain Waugh的回答。您的示例成功地证明了设计描述不使用设备引脚缓冲区的谬误。在现实生活中,当触发器的复位未被断言时,除了“X”、“0”或“1”之外,您不会将任何东西传播到触发器的时钟输入。使用IEEE Std 1076.6-2004批准的边缘敏感顺序逻辑表示方法不会导致该问题。问题是某个特定的供应商是否会允许一个to_X01(scl)作为正式的或类似的。是否可以在子程序体中使用“if(rising_edge(clk))?@VineetDeoraj当然可以。在某些情况下,它可能没有意义或不可合成(例如,如果子程序是在由不同时钟触发的进程中调用的),但这是另一回事。有些相关-。