马上注册,看完整文章,学更多FPGA知识。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
6.2 D触发器
本文档编号:001100000062
需要看对应的视频,请点击视频编号:001100000069
1. 本节主要介绍,时序逻辑的代码,一般有两种:同步复位时序逻辑和异步复位时序逻辑(本教学统一采用异步时钟逻辑);D型触发器的介绍,包括:D触发器的结构、波形、代码以及如何看FPGA波形;时钟的介绍,时钟的意义,时钟频率和时钟周期的换算;时序逻辑代码和硬件的关系,即评估verilog代码好坏的最基本标准,不是看代码行数而是看硬件;阻塞赋值和非阻塞赋值,前者位顺序赋值,后者位同时赋值。
2. ALTERA和VIVADO文档
数字电路中介绍了多种触发器,如JK触发器、D触发器、RS触发器、T触发器等。在FPGA中使用的是最简单的触发器——D触发器。
6.2.1D触发器结构
图1.3- 37是D触发器的结构图,读者可以将其视为一个芯片,该芯片拥有4个管脚,其中3个是输入管脚:时钟clk、复位rst_n、信号d;1个是输出管脚:q。 该芯片的功能如下:当给管脚rst_n给低电平(复位有效),即赋值为0时,输出管脚q处于低电平状态。如果管脚rst_n为高电平,则观察管脚clk的状态,当clk信号由0变1即处于上升沿的时候,将此时d的值赋给q。若d是低电平,则q也是低电平;若d是高电平,则q也是高电平。
6.2.2D触发器波形
图1.3- 38为D触发器的功能波形图,该波形图反映了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触发器代码
首先,观察如下这段时序逻辑的代码: | 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,在clk由0变1即上升沿的时候,将现在d的值赋给q,d是低电平,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_n由1变0时,q立刻变成0。 在第2个时钟上升沿,看到rst_n为0。按代码功能,q仍然为0。 在第3个时钟上升沿,看到rst_n为0。按代码功能,q仍然为0。 在第4个时钟上升沿,看到rst_n为1,d值为1,q值为0。按代码功能,q变成1。 在第5个时钟上升沿,看到rst_n为1,d值为1,q值为1。按代码功能,q变成1。 在第6个时钟上升沿,看到rst_n为1,d值为0,q值为1。按代码功能,q变成0。 在第7个时钟上升沿,看到rst_n为1,d值为1,q值为0。按代码功能,q变成1。 在第8个时钟上升沿,看到rst_n为1,d值为0,q值为1。按代码功能,q变成0。 在第9个时钟上升沿,看到rst_n为1,d值为0,q值为0。按代码功能,q变成0。 在第10个时钟上升沿,看到rst_n为1,d值为1,q值为0。按代码功能,q变成0。
|