明德扬论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信扫一扫,快捷登录!

查看: 127|回复: 0

【FPGA至简设计原理与应用】第一篇第三章硬件描述语言Verilog第6节D触发器

[复制链接]
发表于 2020-9-7 19:07:09 | 显示全部楼层 |阅读模式

马上注册,看完整文章,学更多FPGA知识。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
大家好,近期我们会连载《FPGA至简设计原理与应用》一书,有兴趣的同学可以学习,也希望大家可以对我们的书提出宝贵的意见和建议。


FPGA至简设计原理与应用》书籍连载索引目录

http://www.fpgabbs.cn/forum.php?mod=viewthread&tid=989


读过的朋友可积极在贴后留言,书籍正式出版时,我们会从留言者中挑选20位幸运读者,幸运读者可获潘老师亲笔签名书籍一本。

注:手机浏览可能格式会乱,建议用电脑端进行浏览。




6.2 D触发器
数字电路中介绍了多种触发器,如JK触发器、D触发器、RS触发器、T触发器等。在FPGA中使用的是最简单的触发器——D触发器。

6.2.1D触发器结构


1.3- 37D触发器的结构图,读者可以将其视为一个芯片,该芯片拥有4个管脚,其中3个是输入管脚:时钟clk、复位rst_n、信号d1个是输出管脚:q
该芯片的功能如下:当给管脚rst_n给低电平(复位有效),即赋值为0时,输出管脚q处于低电平状态。如果管脚rst_n为高电平,则观察管脚clk的状态,当clk信号由01即处于上升沿的时候,将此时d的值赋给q。若d是低电平,则q也是低电平;若d是高电平,则q也是高电平。


6.2.2D触发器波形
1.3- 38D触发器的功能波形图,该波形图反映了D触发器各个信号的变化情况,从左到右表示时间的走势。从图中可以看到时钟信号有规律地进行高低变化。
按照从左向右的顺序观察波形图可以发现:
?  开始状态下,rst_n等于1,d等于0,q等于1。
?  随后rst_n由1变0,此时输出信号q立即变成0。对应的功能是:当给管脚rst_n低电平,也就是赋值为0时,输出管脚q处于低电平状态。
?  在rst_n为0期间,即使在有时钟或信号d发生变化的情况下q仍然保持为低电平。
?  在rst_n由0变成1撤消复位后,q没有立刻发生变化。
?  在第4个时钟上升沿时,此时rst_n等于1,而d等于1,因此q变成了1。
?  第5个时钟上升沿,仍然是同样情况,rst_n=1,d=1,因此q=1。
?  在第6个时钟上升沿,rst_n=1,d=0,因此q=0。
?  第7~10个时钟沿也是按同样方式判断。对应的功能是:如果管脚rst_n为高电平,则观察管脚clk,在clk由0变1即上升沿的时候,将现在d的值赋给q。若d是低电平,q也是低电平;若d是高电平,q也是高电平。

6.2.3  D触发器代码
首先,观察如下这段时序逻辑的代码:
1
  
2
  
3
  
4
  
5
  
6
  
7
  
8
always  @(posedge clk or negedge rst_n)begin
  
    if(rst_n==1'b0)begin
  
        q <= 0;
  
    end
  
    else begin
  
        q <= d;
  
    end
  
end
从语法上分析该段代码的功能为:该段代码总是在“时钟clk上升沿或者复位rst_n下降沿”的时候执行一次。具体执行方式如下:
1.      如果复位rst_n=0,则q的值为0;
2.      如果复位rst_n=1,则将d的值赋给q(注意,前提条件是时钟上升沿的时候)。

上例的功能与本案例的功能是相同的:当给管脚rst_n给低电平,也就是赋值为0时,输出管脚q就处于低电平状态。如果管脚rst_n为高电平则观察管脚clk,在clk01即上升沿的时候,将现在d的值赋给qd是低电平,q也是低电平,d是高电平,q也是高电平。
因此可以看出这段代码的功能与D触发器的功能是一样的,即该代码其实就是在描述一个D触发器,也就是D触发器的代码。

前文中已经讲过在FPGA设计中可以用原理图的形式来设计,也可以用硬件描述语言来设计。当用原理图来设计时几个D触发器还可以忍受,但如果出现几千几万个D触发器则必定是头晕眼花,而用硬件描述语言Verilog则不存在这一问题。

6.2.4 怎么看FPGA波形
下面来讨论如下图所示的波形,先请读者观察在第4个时钟上升沿的时刻,思考一下此时看到的信号q的值是多少?是0还是1?或者观察到的是q的上升沿?

首先明确一点:Verilog代码对应的是硬件,因此应该从硬件的角度来分析这个问题。再来理清一下代码的因果关系:先有时钟上升沿,此为因,然后再将d的值赋给q,这才是结果。这个因果是有先后关系的,对于硬件来说这个“先后”无论是多么地迅速,也一定会占用一定时间,所以q的变化会稍后于clk的上升沿。例如下图就是硬件的实际变化情况。

1.3- 40中就很容易看出,第4个时钟上升沿时刻对应的q值为0,也就是变化前的值。上面的波形虽然更将近于实际,但这样画图使这一过程非常复杂,且非必要操作。因此笔者给出的建议是只需掌握这种看波形规则,即时钟上升沿看信号,是看到变化之前的值。
所以第4个时钟上升沿时,看到q值为0;在第6个时钟上升沿时,看到q值为1;在第7个时钟上升沿时,看到q值为0;在第8个时钟上升沿时,看到q值为1;在第10个时钟上升沿时,看到q值为0。注意一下,复位信号是在系统开始时刻或者出现异常时才使用,一般上电后就不会再次进行复位,也可以认为复位是一种特殊情况。

下面考虑正常使用的情况:无论是从功能上还是波形上,都可以看到信号q只在时钟上升沿才变化,而绝对不会在中间发生变化。在一般的数字系统中大部分信号之间的传递都是在同一个时钟下进行的,即大部分都是同步电路。跨时钟的电路占比非常小,属于特殊的异步电路。在本教材中,如果没有提前说明所有的案例、练习都默认为同步电路。

下面具体分析每个时钟下q信号的情况:
rst_n10时,q立刻变成0
在第2个时钟上升沿,看到rst_n0。按代码功能,q仍然为0
在第3个时钟上升沿,看到rst_n0。按代码功能,q仍然为0
在第4个时钟上升沿,看到rst_n1d值为1q值为0。按代码功能,q变成1
在第5个时钟上升沿,看到rst_n1d值为1q值为1。按代码功能,q变成1
在第6个时钟上升沿,看到rst_n1d值为0q值为1。按代码功能,q变成0
在第7个时钟上升沿,看到rst_n1d值为1q值为0。按代码功能,q变成1
在第8个时钟上升沿,看到rst_n1d值为0q值为1。按代码功能,q变成0
在第9个时钟上升沿,看到rst_n1d值为0q值为0。按代码功能,q变成0
在第10个时钟上升沿,看到rst_n1d值为1q值为0。按代码功能,q变成1

相关视频:







上一篇:【FPGA至简设计原理与应用】第一篇第三章硬件描述语言Verilog第6节时序逻辑always语句
下一篇:【FPGA至简设计原理与应用】第一篇第三章硬件描述语言Verilog第6节时钟
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


QQ|手机版|小黑屋|MDYBBS ( 粤ICP备16061416号-1

GMT+8, 2020-9-25 09:09 , Processed in 0.611825 second(s), 14 queries , File On.

Powered by Discuz! X3.4

本论坛由广州健飞通信有限公司所有

© 2001-2019 Comsenz Inc.

快速回复 返回顶部 返回列表