D触发器 (D-FF)详解

这篇具有很好参考价值的文章主要介绍了D触发器 (D-FF)详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

⭐本专栏针对FPGA进行入门学习,从数电中常见的逻辑代数讲起,结合Verilog HDL语言学习与仿真,主要对组合逻辑电路与时序逻辑电路进行分析与设计,对状态机FSM进行剖析与建模。
🔥文章和代码已归档至【Github仓库:hardware-tutorial】,需要的朋友们自取。或者公众号【AIShareLab】回复 FPGA 也可获取。

D触发器的逻辑功能

D触发器的逻辑符号

d触发器,FPGA Tutorial,fpga开发

把 CP 有效沿到来之前电路的状态称为现态,用 Q n Q^n Qn表示。

把 CP 有效沿到来之后,电路所进入的新状态称为次态,用 Q n + 1 Q^{n+1} Qn+1表示。

特性表

D Q n Q^n Qn Q n + 1 Q^{n+1} Qn+1
0 0 0
0 1 0
1 0 1
1 1 1

特性方程

Q n + 1 = D Q^{n+1} = D Qn+1=D

状态图

d触发器,FPGA Tutorial,fpga开发

有清零输入和预置输入的D 触发器

由于直接置1和清零时跟CP信号无关,所以称置1、清零操作是异步置1和异步清零。

d触发器,FPGA Tutorial,fpga开发

直接置1和直接清零的过程如下:

(1) 当 S ˉ D = 0 \bar{S}_{D}=0 SˉD=0, R ˉ D = 1 \bar{R}_{D}=1 RˉD=1 时, 使得 Y 1 = 1 Y_{1}=1 Y1=1 , S ˉ = Y 1 ⋅ C P ⋅ R ˉ D ‾ = C P ‾ \bar{S}=\overline{Y_{1} \cdot C P \cdot \bar{R}_{D}}=\overline{C P} Sˉ=Y1CPRˉD=CP, R ˉ = S ˉ ⋅ C P ⋅ Y 4 ‾ = 1 \quad \bar{R}=\overline{\bar{S} \cdot C P \cdot Y_{4}}=1 Rˉ=SˉCPY4=1 ,于是 Q = 1 Q=1 Q=1, Q ˉ = 0 \bar{Q}=0 Qˉ=0 , 即将输出 Q 直接置 1 。

(2) 当 S ˉ D = 1 \bar{S}_{\mathrm{D}}=1 SˉD=1, R ˉ D = 0 \bar{R}_{\mathrm{D}}=0 RˉD=0 时, 使得 S ˉ = 1 \bar{S}=1 Sˉ=1 , 于是 Q = 0 Q=0 Q=0, Q ˉ = 1 \bar{Q}=1 Qˉ=1 , 即将输出 Q 直接清零。

d触发器,FPGA Tutorial,fpga开发

有同步清零端的 D 触发器

所谓同步清零是指在清零输入信号有效,并且CP的有效边沿(如上升沿)到来时,才能将触发器清零。

(a) 实现同步清零的方案之一

(b) 实现同步清零的方案之二

d触发器,FPGA Tutorial,fpga开发

有使能端的D触发器

功能:

  • En=0,Q 保持不变。
  • En=1,在CP作用下,Q = D。

d触发器,FPGA Tutorial,fpga开发

d触发器,FPGA Tutorial,fpga开发
Q n + 1 = C E ‾ ⋅ Q n + C E ⋅ D Q^{n+1}=\overline{C E} \cdot Q^{n}+C E \cdot D Qn+1=CEQn+CED
逻辑符号

d触发器,FPGA Tutorial,fpga开发

D3触发器及其应用电路的Verilog HDL建模

例1.试对图所示的带有异步清零和异步置位的边沿D触发器进行建模。

d触发器,FPGA Tutorial,fpga开发

有异步输入端的D触发器

//版本1:
module Set_Rst_DFF (Q, Q_, D, CP, Rd_, Sd_); 
  output Q,Q_;
  input D,CP,Rd_,Sd_;
  wire Y1,Y2,Y3,Y4,Y5,Y6;
   assign  #5 Y1 = ~(Sd_ & Y2 & Y4);
   assign  #5 Y2 = ~(Rd_ & CP & Y1);
   assign  #5 Y3 = ~(CP  & Y2 & Y4);
   assign  #5 Y4 = ~(Rd_ & Y3 & D );
   assign  #5 Y5 = ~(Sd_ & Y2 & Y6);
   assign  #5 Y6 = ~(Rd_ & Y3 & Y5);
   assign      Q = Y5;
   assign      Q_= Y6;
endmodule

版本1: 根据该图使用连续赋值语句来建模,在assign语句中的#5表示给每个与非门加5个单位时间的传输延迟。

//版本2
module Set_Rst_DFF_bh (Q, Q_, D, CP, Rd_, Sd_); 
   output reg Q;
   output     Q_;
   input D,CP,Rd_,Sd_;

   assign Q_= ~Q;

   always @(posedge CP or negedge Sd_ or negedge Rd_) 
     if (~Sd_)     //等同于: if (Sd_== 0)
        Q <= 1'b1;   
     else if (~Rd_) 
        Q <= 1'b0; 
     else    
        Q <= D;
endmodule

版本2的特点:

采用功能描述风格,使用alwaysif-else对输出变量赋值。

negedge Sd_是一个异步事件,它与if(~Sd_)必须匹配,negedge Rd_是另一个异步事件,它与if(~Rd_)必须匹配,这是语法规定。

  • Sd_为0时,将输出Q置1;
  • Sd_=1Rd_=0时,将输出Q置0;
  • Sd_Rd_均不为0,且时钟CP的上升沿到来时,将输入D传给输出Q。

注意,如果置1事件、置0事件和时钟事件同时发生,则置1事件的优先级别最高、置0事件的次之,时钟事件的优先级最低。

例2 具有同步清零功能的上升沿D触发器。

d触发器,FPGA Tutorial,fpga开发

d触发器,FPGA Tutorial,fpga开发

module Sync_rst_DFF (Q, D, CP, Rd_);
     output  reg Q;
     input D, CP, Rd_;

     always @(posedge CP)
        if ( !Rd_)   // also as (~Rd_) 
                Q <= 0;
        else 
                Q <= D;
endmodule

例4 试用功能描述风格对图所示电路进行建模(2分频电路) ,并给出仿真结果。

解:(1)设计块:使用always和if-else语句对输出变量赋值,其代码如下。

d触发器,FPGA Tutorial,fpga开发

`timescale 1 ns/ 1 ns
module _2Divider (Q,CP,Rd_);
   output reg Q;
   input      CP,Rd_;
   wire       D;
   assign D = ~Q;
always @(posedge CP or 
         negedge Rd_)
    if(~Rd_)  Q <= 1'b0;
    else      Q <= D;
endmodule

(2)激励块:给输入变量赋值。

`timescale 1 ns/ 1 ns
module test_2Divider();
reg CP, Rd_;   wire Q;
//调用(例化)设计块
_2Divider U1 ( .CP(CP), .Q(Q),.Rd_(Rd_) );
initial begin    //产生复位信号Rd_
        Rd_ = 1'b0;
        Rd_ = #2000 1'b1;
#8000 $stop;
end 
always begin      //产生时钟信号CP
        CP = 1'b0;
        CP = #500 1'b1;
        #500;
end 
endmodule

(3)仿真波形(用ModelSim)

d触发器,FPGA Tutorial,fpga开发

由图可知,时钟CP的周期为1000ns,在2000ns之前,清零信号Rd_有效,输出Q被清零。在此之后,Rd_=1,在2500ns时,CP上升沿到来,Q=1;到下一个CP上升沿(3500ns)时,Q=0,再到下一个CP上升沿(4500ns)时,Q=1,……,如此重复,直到8000ns时,系统任务$stop被执行,仿真停止。

总之,在不考虑清零信号Rd_的作用时,每当CP上升沿到来时,触发器状态Q翻转一次。输出信号Q的频率正好是CP频率的二分之一,故称该电路为2分频电路。所谓分频电路,是指可将输入的高频信号变为低频信号输出的电路。

例5 试对图所示电路进行建模,并给出仿真结果。

4位异步二进制计数器逻辑图

d触发器,FPGA Tutorial,fpga开发

解:(1)设计块:采用结构描述风格的代码如下。编写了两个模块,这两个模块可以放在一个文件中,文件名为Ripplecounter.v。

第一个主模块Ripplecounter作为设计的顶层,它实例引用分频器子模块_2Divider1共4次,第二个分频器子模块_2Divider1作为设计的底层。

`timescale 1 ns/ 1 ns
/*==== 设计块:Ripplecounter.v ====*/
module Ripplecounter (Q,CP,CLR_); 
   output [3:0] Q;  
   input        CP, CLR_;

    //实例引用分频器模块 _2Divider1 
   _2Divider1 FF0 (Q[0],CP   ,CLR_); 
    //注意, 引用时端口的排列顺序--位置关联
   _2Divider1 FF1 (Q[1],~Q[0],CLR_);
   _2Divider1 FF2 (Q[2],~Q[1],CLR_);
   _2Divider1 FF3 (Q[3],~Q[2],CLR_);
endmodule 

设计的底层模块 _2Divider1

//分频器子模块
module _2Divider1 (Q,CP,Rd_); 
   output reg Q;
   input      CP,Rd_;

   always @(posedge CP or negedge Rd_)
    if(!Rd_)  
        Q <= 1'b0;
    else       
        Q <= ~Q;
endmodule 

(2)激励块:给输入变量(CLR_和CP)赋值。

/*==== 激励块:test_Ripplecounter.v ====*/
module test_Ripplecounter();
reg        CLR_, CP;
wire [3:0] Q;

Ripplecounter i1 (.CLR_(CLR_),.CP(CP),.Q(Q));

initial begin     // CLR_
  CLR_ = 1'b0;
  CLR_ = #20 1'b1;
#400 $stop;
end 
always begin      // CP
CP = 1'b0;
CP = #10 1'b1;
#10;
end 
endmodule

(3)仿真波形:如下图所示。

d触发器,FPGA Tutorial,fpga开发

由图可知,

  • 时钟CP的周期为20ns。
  • 开始时,清零信号CLR_有效(0~20ns),输出Q被清零。
  • 20ns之后,CLR_一直为高电平,
  • 在30ns时,CP上升沿到来, Q=0001;到下一个CP上升沿(50ns)时,Q=0010,
  • 再到下一个CP上升沿(70ns)时,Q=0011,……,如此重复,到310ns时,Q=1111,
  • 到330ns时,Q=0000,……,直到系统任务$stop被执行,仿真停止。

d触发器,FPGA Tutorial,fpga开发

电路首先在CLR_的作用下,输出被清零。此后当CLR_=1时,每当CP上升沿到来时,电路状态Q就在原来二进制值的基础上增加1,即符合二进制递增计数的规律,直到计数值为1111时,再来一个CP上升沿,计数值回到0000,重新开始计数。故称该电路为4位二进制递增计数器(Ripplecounter:纹波计数器) 。

可见,计数器实际上是对时钟脉冲进行计数,每到来一个时钟脉冲触发沿,计数器改变一次状态。

参考文献:文章来源地址https://www.toymoban.com/news/detail-778014.html

  1. Verilog HDL与FPGA数字系统设计,罗杰,机械工业出版社,2015年04月
  2. Verilog HDL与CPLD/FPGA项目开发教程(第2版), 聂章龙, 机械工业出版社, 2015年12月
  3. Verilog HDL数字设计与综合(第2版), Samir Palnitkar著,夏宇闻等译, 电子工业出版社, 2015年08月
  4. Verilog HDL入门(第3版), J. BHASKER 著 夏宇闻甘伟 译, 北京航空航天大学出版社, 2019年03月

到了这里,关于D触发器 (D-FF)详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 「FPGA」基本时序电路元件——锁存器和触发器

    「FPGA」基本时序电路元件——锁存器和触发器

    FPGA是一种数字电路实现的方式,它是基于小型查找表(16X1)设计的,它的兄弟CPLD是基于高密度复杂组合逻辑设计的。FPGA的一个优点是触发器资源丰富,适合实现复杂的时序设计。本文将从 门级电路 的角度来介绍时序电路的基本结构,锁存器(Latch)和触发器(flip-flop)。

    2024年02月11日
    浏览(9)
  • 【FPGA】Verilog:时序电路 | 触发器电路 | 上升沿触发 | 同步置位 | 异步置位

    【FPGA】Verilog:时序电路 | 触发器电路 | 上升沿触发 | 同步置位 | 异步置位

    前言: 本章内容主要是演示Vivado下利用Verilog语言进行电路设计、仿真、综合和下载 示例:触发器电路    ​ 功能特性: 采用 Xilinx Artix-7 XC7A35T芯片  配置方式:USB-JTAG/SPI Flash 高达100MHz 的内部时钟速度  存储器:2Mbit SRAM   N25Q064A SPI Flash(样图旧款为N25Q032A) 通用IO:Sw

    2024年02月11日
    浏览(14)
  • FPGA面试题【D触发器搭建4进制的计数器】

    FPGA面试题【D触发器搭建4进制的计数器】

    目录 题目 核心思路 答案 用D触发器搭建4进制的计数器 本题目主要考察了数字电路基础中的计数器设计。 题目看上去很简单,要求实现一个4进制的计数器,但要用D触发器来搭建,这显然不会像写Verilog实现一样容易,所以我们要用数字电路中的传统方法来设计。 4进制计数器

    2024年02月04日
    浏览(37)
  • [从零开始学习FPGA编程-32]:进阶篇 - 基本时序电路-D触发器(Verilog语言)

    作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址:  目录 第1章 什么是时序电路 1.1 时序电路 1.2 什么是触发器

    2023年04月08日
    浏览(14)
  • 北邮22级信通院数电:Verilog-FPGA(9)第九周实验(2)实现下降沿触发的JK触发器(带异步复位和置位功能)

    北邮22级信通院数电:Verilog-FPGA(9)第九周实验(2)实现下降沿触发的JK触发器(带异步复位和置位功能)

    北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章,请访问专栏: 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客   目录 ​编辑 一.代码部分 1.1 JK.v 1.2 JK_tb.v 二.仿真结果

    2024年02月05日
    浏览(13)
  • 北邮22级信通院数电:Verilog-FPGA(11)第十一周实验(1)用JK触发器实现8421码十进制计数器

    北邮22级信通院数电:Verilog-FPGA(11)第十一周实验(1)用JK触发器实现8421码十进制计数器

    北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章,请访问专栏: 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 目录 一.代码部分 1.1  JK_8421.v 1.2  JK_ff.v 1.3  debounce.v 二.管脚分配 三.实

    2024年02月05日
    浏览(14)
  • 【MySQL进阶】MySQL触发器详解

    【MySQL进阶】MySQL触发器详解

    序号 系列文章 7 【MySQL基础】运算符及相关函数详解 8 【MySQL基础】MySQL多表操作详解 9 【MySQL进阶】MySQL事务详解 10 【MySQL进阶】MySQL视图详解 大家好,我是小杨!前面我已经为大家介绍了MySQL中的进阶知识-视图,那么今天我们就给大家讲解MySQL中的触发器这部分的相关内容,

    2024年02月03日
    浏览(10)
  • Unity --- 物理引擎 --- 触发器 与 碰撞器详解

    Unity --- 物理引擎 --- 触发器 与 碰撞器详解

    对第一个条件进行补充 --- 不仅要两者都具有碰撞组件,同时还需要两者的碰撞组件中都没有勾选 Is Trigger属性  1.上一篇文章中说了那么多,其实也可以总结为两个碰撞条件 --- a.两个游戏物体都具有碰撞器组件 ,如果没有的话,连碰撞检测都不会发生,也就没有所谓的碰不

    2024年02月07日
    浏览(10)
  • MySQL-SQL存储过程/触发器详解(上)

    MySQL-SQL存储过程/触发器详解(上)

    ♥️ 作者:小刘在C站 ♥️ 个人主页:  小刘主页  ♥️ 努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生! ♥️ 学习两年总结出的运维经验,以及思科模拟器全套网络实验教程。专栏: 云计算技术 ♥️小刘私信可以随便问,只要会绝不吝啬,感谢CSD

    2024年02月09日
    浏览(44)
  • MySQL-SQL存储函数以及触发器详解

    MySQL-SQL存储函数以及触发器详解

    ♥️ 作者:小刘在C站 ♥️ 个人主页:  小刘主页  ♥️ 努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生! ♥️ 学习两年总结出的运维经验,以及思科模拟器全套网络实验教程。专栏: 云计算技术 ♥️小刘私信可以随便问,只要会绝不吝啬,感谢CSD

    2024年02月11日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包