0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

DFF的电路工作原理与ModelSim仿真

GReq_mcu168 来源:知芯情报局 作者:知芯情报局 2022-07-12 10:22 次阅读

之前的理解

最近在做设计的时候,发现之前对DFF的理解有些模糊,直到有次在实践中遇到了一些问题,含糊其词的也不能解决问题,于是乎就把DFF理解透彻透彻,毕竟这可是时序电路的基本概念。

对于DFF,之前理解的,DFF在时钟的上升沿进行对D端的数据采集,再下一个时钟的上升沿来临,Q端输出D端采集的数据。能这么理解,是离开书本时间太长了,又观察到了ModelSim仿真波形的影响,这么理解只是在描述仿真波形的表征现象,并非根本的原理。比如,在Modelsim仿真中,若通过DFF将数据组进行延时,用时钟将寄存器进行多个时钟周期的同步,并带有异步复位,对应Verilog描述如下:

reg [7:0] data_d0, data_d1, data_d2;always @ ( posedge clk or negedge rst_n ) begin    if ( !rst_n ) begin        data_d0 <= 8'b0;        data_d1 <= 8'b0;    end else begin        data_d0 <= data_in;        data_d1 <= data_d0;    endend
对应仿真波形如下:05ed7dcc-0119-11ed-ba43-dac502259ad0.png 此时,时钟上升沿和数据的变化沿都是对齐的,就产生了不正确的理解:通过Modelsim的wave窗口查看仿真波形的时候,如果将光标打到时钟的上升沿时候(比如心在光标在Event 1时刻),对应的数据data_in应该是从8‘h00->8‘h0’1,可是光标处data_in的数值显示为8’h01。这样,我就理解成了在Even1时刻,时钟的上升沿对data_in(值为8’h01)进行捕获(接入到寄存器data_d0的D端),在下一个时钟的上升沿到来的时刻(Event2时刻),寄存器data_d0的Q端数据发生改变(值为8’h01)。上述理解完全是根据波形描述出来的,是不全面的,是非本源的,是错误的。

正确的理解

正确的理解应该从DFF本身出发,通过DFF的电路原理图分析DFF的电路工作原理,了解时钟上升沿之前和之内部逻辑的如何变化,如何影响了从D端到Q端的数据输出。

D锁存器

在网上找到的很多电路图讲的都是D锁存器,D锁存器的电路为消除逻辑门控SR锁存器不确定状态,在电路的S和R输入端连接一个非门(Inverter),从而保证了S和R同时为0的条件,参考下图由与非门构成的D锁存器电路图:

06177e2e-0119-11ed-ba43-dac502259ad0.png

如果D信号在E=1期间发生变化,电路提供的信号路径将使Q端信号跟随D端变化。 在E由1跳变为0以后,锁存器将锁存跳变前瞬间D端的逻辑值,可以暂存1位二进制数据。又因为有Inverter的存在,SR锁存器不会存在S&R==1的状态,所以就有了D锁存器的捕获数据,E为0的时候会一直维持数据状态。此D锁存器的功能表为:

06285c3a-0119-11ed-ba43-dac502259ad0.png

D触发器

触发和触发器——时钟脉冲边沿作用下的状态刷新称为触发,具有这种特性的存储单元电路称为触发器。D触发器的电路图如下(图中的SR为了标注有两级SR锁存器,方便逻辑推理):

064a9232-0119-11ed-ba43-dac502259ad0.png

以上升沿触发为例,进一步分析D触发器在上升沿捕获数据,并维持锁存的过程。D端为0,CLK为0时,此时第一级的D锁存器输出为0,第二级SR锁存器处于保持状态,详情参考下图:

065be6b8-0119-11ed-ba43-dac502259ad0.png

若继续保持D端为0,CLK变为1时,第一级D锁存器处于保持状态,第二级的SR锁存器将上一次的D值传递到Q端输出,详情参考下图:

066de08e-0119-11ed-ba43-dac502259ad0.png

若在D端数值发生改变为1,且CLK仍然为1,第一级的D锁存器仍处于保持状态,不会由于D端的变化而改变,更不会影响最后Q端的输出。

06899aae-0119-11ed-ba43-dac502259ad0.png

D端继续保持为1,CLK转换为0,此时第一级D锁存器的输出为D端的数据,Q端输出仍为保持状态。

06ab5626-0119-11ed-ba43-dac502259ad0.png

D端数据继续保持为1,CLK转换为高,第一级D锁存器的结果就会输出到Q端,Q端的值也就随着CLK的上升沿,捕获到了1,并进行输出到Q端;

从逻辑图中,也可以看出DFF的数据捕获和输出都需要满足一定的时间约束。比如:

    • 时钟上升沿之前前后的数据要做够稳定,否则在时钟跳变时刻,可能无法将其传递到Q端进行输出;

    • 时钟上升沿捕获数据之后,到Q端输出也需要一定的时间,稳定之后才能用于下一级工作;

DFF捕获时钟上升沿的D端数据,并在Q端输出,一直维持到下一时钟上升沿到来之前。在此期间,D端的数据变化不会直接影响到Q端的输出。

ModelSim仿真

将tb文件中的data_in输入做5个单位的传输延时,仿真结果见下图:

06d16d66-0119-11ed-ba43-dac502259ad0.png         可以看出,在时钟的上升沿前后数据是不发生变化的,对于寄存器做延时的时序理解为:

Event 1时刻:

    • 在Event 1时刻,时钟上升沿之前data_in(值为8’h00),data_d0的D端为data_in(值为8’h00);

    • 在Event 1时刻,时钟上升沿之后data_in(值为8’h00),data_d0的Q端为data_in(值为8’h00);所以在Event 1时刻,data_d0的Q端保持为8’h00不变;

Event 2时刻:
    • 在Event 2时刻,时钟上升沿之后data_in(值为8’h01),data_d0的D端为data_in(值为8’h01);
    • 在Event 2时刻,时钟上升沿之后data_in(值为8’h01),data_d0的D端为data_in(值为8’h01);所以在Event 2时刻,data_d0的Q端从8’h00变为8’h01;
Event 3时刻:
    • 在Event 3时刻,时钟上升沿之后data_in(值为8’h02),data_d0的D端为data_in(值为8’h02);
    • 在Event 3时刻,时钟上升沿之后data_in(值为8’h02),data_d0的D端为data_in(值为8’h02);所以在Even 3时刻,data_d0的Q端从8’h01变为8’h02;
可以看出在Event 1到Event 2一个时钟周期内,data_d0的数值保持为8’h00;Event 1到Event 2一个时钟周期内,data_d0的数值保持为8’h01;在时序上就表明了使用data_d0寄存器,通过clk对data_in进行了1个时钟周期的延时。在Modelsim仿真中,若数据的变化沿与时钟的上升沿对齐,cursor在时钟上升沿时刻,对应的数据需要往后加入延时,才能与实际电路情况相符合。

总结

DFF捕获时钟上升沿的D端数据,并在Q端输出,一直维持到下一时钟上升沿到来之前。在此期间,D端的数据变化不会直接影响到Q端的输出。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 时序电路
    +关注

    关注

    1

    文章

    114

    浏览量

    21672
  • ModelSim
    +关注

    关注

    5

    文章

    174

    浏览量

    47086
  • D锁存器
    +关注

    关注

    0

    文章

    13

    浏览量

    3688
  • dff
    dff
    +关注

    关注

    0

    文章

    26

    浏览量

    3392

原文标题:时序电路之DFF再理解

文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Altera ModelSim 6.5仿真入门教程

    Altera ModelSim 6.5仿真入门教程,需要的可自行下载。 平台 软件:ModelSim-Altera 6.5e (Quartus II 10.0) Starter Edition 内容 1 设计流程 使用
    发表于 08-15 15:40 255次下载
    Altera <b class='flag-5'>ModelSim</b> 6.5<b class='flag-5'>仿真</b>入门教程

    Modelsim的功能仿真和时序仿真

    ModelSim 进行功能仿真,进行功能仿真首先要检查设计的语法是否正确;其次检查代码是否达到设计的功能要求。下文主要介绍仿真步骤和测试激励的加载。
    发表于 11-13 15:35 9132次阅读

    MODELSIM仿真(适合xilinx ISE)

    基于Xilinx ISE的modelsim仿真教程
    发表于 11-30 15:52 8次下载

    使用 ModelSim 进行设计仿真详解

    本章为ModelSim的初级教程,读者读完本章可以较为熟练的使用ModelSim进行设计仿真,本章没有也不可能涉及ModelSim的各个方面,要想全面的掌握
    发表于 12-24 18:29 0次下载

    modelsim仿真详细过程(功能仿真与时序仿真

    modelsim仿真详细过程(功能仿真与时序仿真).ModelSim不仅可以用于数字电路系统设计
    发表于 12-19 11:14 6.7w次阅读
    <b class='flag-5'>modelsim</b><b class='flag-5'>仿真</b>详细过程(功能<b class='flag-5'>仿真</b>与时序<b class='flag-5'>仿真</b>)

    仿真软件ModelSim及其应用,ModelSim仿真流程

    ModelSim不仅可以用于数字电路系统设计的功能仿真,还可以应用于数字电路系统设计的时序仿真Mod
    的头像 发表于 12-29 11:35 9544次阅读

    Modelsim仿真教程Modelsim的基础入门基础教程免费下载

    笔者一直以来都在纠结,自己是否要为仿真编辑相关的教程呢?一般而言,Modelsim等价仿真已经成为大众的常识,但是学习仿真是否学习Modelsim
    发表于 04-30 18:24 23次下载
    <b class='flag-5'>Modelsim</b><b class='flag-5'>仿真</b>教程<b class='flag-5'>Modelsim</b>的基础入门基础教程免费下载

    基于ModelSim使用二联合Quarus自动仿真教程

    3 ModelSim工程实战之自动仿真说完了 ModelSim 的使用流程,接下来我们将会对每个流程进行详细的操作演示,一步步、手把手带领大家学习使用 ModelSim 软件。首先我们
    的头像 发表于 07-23 10:51 2010次阅读
    基于<b class='flag-5'>ModelSim</b>使用二联合Quarus自动<b class='flag-5'>仿真</b>教程

    基于ModelSim使用四ModelSim手动仿真教程

    4.1 新建仿真工程 在开始动手仿真之前,首先,我们需要创建一个文件夹用来放置我们的 ModelSim 仿真工程文件,这里我们就在之前创建的 Quartus 工程目录下的 simula
    的头像 发表于 07-23 11:10 3997次阅读

    如何夹带modelsim仿真波形白底黑线

    Modelsim使用技巧—波形白底黑线设置 在发表期刊或者论文时,我们需要夹带modelsim仿真波形在我们的论文里,在modelsim默认模式下的波形一般是黑底绿线白字,如图1所示
    的头像 发表于 08-26 11:23 3876次阅读

    ModelSim手动仿真教程

    在开始动手仿真之前,首先,我们需要创建一个文件夹用来放置我们的 ModelSim 仿真工程文件,这里我们就在之前创建的 Quartus 工程目录下的 simulation 文件夹中创建一个
    的头像 发表于 07-11 10:58 5041次阅读

    芯片设计之Modelsim仿真工具

    Modelsim仿真将设计以树状表示,设计中的每一个实体,每一个module、每一个进程(always块、initial块等)在Modelsim仿真中以对象的形式展现。
    的头像 发表于 08-12 15:04 2560次阅读

    modelsim自动化仿真实验 利用脚本实现modelsim自动化仿真

    大家好!今天给大家带来的是modelsim自动化仿真程序。我们在代码编写完成时,通常都需要先进行仿真,然后上板实验。但是如果我们每次仿真都要去新建一个工程,添加.v文件以及testbe
    的头像 发表于 07-19 10:10 1577次阅读
    <b class='flag-5'>modelsim</b>自动化<b class='flag-5'>仿真</b>实验 利用脚本实现<b class='flag-5'>modelsim</b>自动化<b class='flag-5'>仿真</b>

    Vivado调用Modelsim仿真

    Modelsim是十分常用的外部仿真工具,在Vivado中也可以调用Modelsim进行仿真,下面将介绍如何对vivado进行配置并调用Models
    的头像 发表于 07-24 09:04 3445次阅读
    Vivado调用<b class='flag-5'>Modelsim</b><b class='flag-5'>仿真</b>

    电路仿真软件multium的工作原理

    Multisim(是美国国家仪器有限公司推出的仿真工具)的工作原理主要基于电路元件的建模与仿真分析。
    的头像 发表于 03-29 15:24 1057次阅读