首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >clk‘’event vs rising_edge()

clk‘’event vs rising_edge()
EN

Stack Overflow用户
提问于 2013-03-04 23:36:18
回答 3查看 122.8K关注 0票数 42

我一直用这个来检测上升沿:

if (clk'event and clk='1') then

但这也可以使用:

if rising_edge(clk) then

阅读this post,推荐使用rising_edge(clk),但也有a comment表明rising_edge(clk)可能导致错误的行为。

我不能决定将来选择哪一个,继续使用(clk'event and clk='1')还是采用rising_edge(clk)

这两个人在现实中有什么经验吗?有什么偏好吗?

谢谢!

EN

回答 3

Stack Overflow用户

发布于 2013-03-05 00:11:54

rising_edge定义为:

代码语言:javascript
复制
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,那么rising_edge将生成相同的代码。否则,您可以解释其中的差异。

就我个人而言,我的时钟只从0到1,反之亦然。我发现rising_edge(clk)(clk'event and clk = '1')变体更具描述性。

票数 38
EN

Stack Overflow用户

发布于 2013-03-05 00:31:04

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

此外,如果您的时钟信号从'H‘转换为'1',rising_edge(clk)将不会(正确地)触发,而(clk'event and clk = '1')将(错误地)触发。

诚然,这看起来像是人为的例子,但我见过时钟波形在真实的硬件中做到这一点,因为其他地方的故障。

票数 18
EN

Stack Overflow用户

发布于 2013-08-07 07:45:41

实用示例:

假设您正在对类似于I2C总线(用于时钟的信号称为SCL,用于数据的信号称为SDA )的东西进行建模,其中总线是三态的,并且两个网络都具有弱上拉。您的测试台应将PCB上的上拉电阻模型化为'H‘值。

代码语言:javascript
复制
scl <= 'H'; -- Testbench resistor pullup

您的I2C主设备或从设备可以将总线驱动到“1”或“0”,或者通过分配“Z”使其保持原样。

将'1‘分配给SCL网络将导致事件发生,因为SCL的值已更改。

  • 如果你有一行依赖于(scl'event and scl = '1')的代码,那么你会得到一个错误的触发器。
  • 如果你有一行代码依赖于rising_edge(scl),那么你就不会得到错误的触发器。

继续这个例子:你给SCL赋值一个'0‘,然后赋值一个'Z’。SCL网转到'0',然后回到'H‘。

在这里,从“1”到“0”都不会触发这两种情况,但是从“0”到“H”会触发rising_edge(scl)条件(正确),但是(scl'event and scl = '1')条件会错过它(不正确)。

通用推荐:

对所有代码使用rising_edge(clk)falling_edge(clk),而不是clk'event

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15205202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档