错题集:HDLBits Dualedge 双边触发

笔记重点:

1、双边沿触发的触发器(重要内容)。

2、为什么我的方法会出现毛刺。

3、竞争冒险现象。

题目:

构建一个在功能上表现得像双边沿触发触发器的电路:在时钟的两个边沿触发。但是,FPGA没有双边触发触发器,并且@(posedge clk或negedge clk)始终不被接受为合法的敏感度列表。

方法一:

分析过程:

  • 分析上升沿触发波形图、下降沿触发的波形图;
  • 观察上述情况与双边触发的波形图的关系。
  • 构建电路图,写代码。

module top_module (
    input clk,
    input d,
    output q
);
    wire q1,q2;

    always@(posedge clk)begin
            q1 <= d;
        end
    always@(negedge clk)begin
            q2 <= d;
        end
    assign q = (clk==1'b1)?q1:q2;
    
endmodule

方法二:

module top_module (
    input clk,
    input d,
    output q
);
    reg q_d1;
    reg q_d2;
    
    always@(posedge clk)begin
        q_d1 <= d ^ q_d2;
    end
    always@(negedge clk)begin
        q_d2 <= d ^ q_d1;
    end
    
    assign q = q_d1 ^ q_d2;
    
endmodule

对于双沿检测,一定不能使用always@(posedge clk or negedge clk)begin这种方式,这种方式是不可综合的,应该用图中的方法二。对于第一种方法,虽然这道题是正确的,但是有博主测试过在modelsim和vivado中仿真会产生毛刺,不建议使用。

1.为什么方法二可以呢?

首先,在上升沿的时候,q_d1变成了d ^ q_d2,那么q = q_d1 ^ q_d2 = d ^ q_d2 ^ q_d2 = d;

接着,在下降沿的时候,q_d2变成了d ^ q_d1,那么q = q_d1 ^ q_d2 = q_d1 ^ d ^ q_d1 = d;

在每个正负沿,q_d1和q_d2交替出现,因此q总会输出最新的值。

2.毛刺产生的原因:(来自其他博主和评论)

wangkai_2019:

大家可以想象,在上升沿和下降沿采到d信号以后,q_d1和q_d2会立即变化,同时时钟也会立即变化,时钟和q_d1、q_d2的变化的延迟是不一致的,这就导致了毛刺的出现,这时候的时钟相当于是一个组合逻辑了,由于路径延时的不同,导致组合逻辑到达的时间存在差异,从而会产生毛刺,如下图所示。

为什么方法一不会产生毛刺呢?大家看看代码,方法一的结果是两个寄存器直接异或,没有涉及到时钟信号,方法二的结果需要时钟信号进行判断,而时钟信号时钟的上升沿和下降沿又是触发器的输出,即q_d1、q_d2,因此会产生毛刺。

岁往长鲸:我的理解是在由于采用clk信号作为sel信号,因此clk信号必定比q_d1/1_d2信号先到达MUX,因为q_d1/1_d2信号还需要经过一级寄存器才能到达,因此如果在上一个周期采到1,这个周期采到0的话,由于clk信号先到达,误以为q_d1/1_d2信号仍为1,因此输出1,在经过一个极短的Tpd后,0信号到达,因此MUX又输出了0信号,导致了一个tpd时间的1信号(也就是毛刺)的出现,简单点讲就是q_d1/1_d2信号未满足建立时间,产生了竞争冒险,不知我这样理解对不对?

3.竞争冒险现象

  • 竞争:当信号通过导线和门电路时,将产生时间延迟。因此,同一个门的一组输入信号,由于它们在此前通过不同数目的门,经过不同长度导线的传输,到达门输入端的时间会有先有后,这种现象称为竞争。竞争可以分为两类。

        a. 同一个输入信号,经过不同路径到达输入端,产生竞争。

        b. 多个信号同时变化,因为多个输入信号同时变化的瞬间或路径导致到达输入端时间不一致,产生竞争。

  • 冒险:逻辑门因输入端的竞争而导致输出产生不应有的尖峰干扰脉冲的现象,称为冒险。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340