官方论坛
官方淘宝
官方博客
微信公众号
点击联系吴工 点击联系周老师

时序逻辑代码和硬件

发布时间:2023-04-13   作者:admin 浏览量:

本节的文档编号:001100000062

需要看对应的视频,请点击视频编号:001100000071

1、本节主要介绍,时序逻辑的代码,一般有两种:同步复位时序逻辑和异步复位时序逻辑(本教学统一采用异步时钟逻辑);D型触发器的介绍,包括:D触发器的结构、波形、代码以及如何看FPGA波形;时钟的介绍,时钟的意义,时钟频率和时钟周期的换算;时序逻辑代码和硬件的关系,即评估verilog代码好坏的最基本标准,不是看代码行数而是看硬件;阻塞赋值和非阻塞赋值,前者位顺序赋值,后者位同时赋值。
2、这是ALTERA和VIVADO文档

6.4 时序逻辑代码和硬件

先来分析一下下面这段代码:
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 <= a + d;
  
    end
  
end
仍然从语法上分析该段代码的功能。该段代码总是在“时钟clk上升沿或者复位rst_n下降沿”的时候执行一次。

具体执行方法如下:
1.      如果复位rst_n=0,则q的值为0;
2.      如果复位rst_n=1,则将(a+d)的结果赋给q(注意,前提条件是时钟上升沿的时候)。

假设用信号c表示a+d的结果,则第2点可改为:如果复位rst_n=1,则将c的值赋给q(注意,前提条件是时钟上升沿的时刻)。很明显这是一个D触发器,输入信号为d,输出为q,时钟为clk,复位为rst_n,其电路示意图如下图所示:


可知ca+d的结果,因此其自然是通过一个加法器实现,画出上面代码所对应的电路结构图,可以看出在D触发器的基础上增加了一个加法器。

很容易分析出上面电路的功能:信号a和信号b相加得到cc连到D触发器的输入端。当clk出现上升沿时,将c的值传给q。这与代码功能是一致的。
下面是代码和硬件所对应的波形图。


先看信号c的波形:c的产生只有与ad有关,与rst_nclk无关。ca+d的结果,按照二进制加法:0+0=00+1=11+1=0可以画出c的波形。
在第1个时钟期间,a=0d=0,所以c=0+0=0
在第2个时钟期间,a=1d=0,所以c=1+0=1
在第3个时钟期间,a=1d=1,所以c=1+1=0
在第4个时钟期间,a=0d=1,所以c=0+1=1
在第5到第6个时钟期间,a=0d=0,所以c=0+0=0
在第7个时钟期间,a=1d=1,所以c=1+1=0
在第8个时钟期间,a=0d=1,所以c=0+1=1
在第9个时钟期间,a=0d=0,所以c=0+0=0
在第10个时钟期间,a=0d=1,所以c=0+1=1

再看信号q的波形:qD触发器的输出,其只在rst_n的下降沿或者clk的上升沿才变化,其他时刻不变化,即adc发生变化时,q不会立刻发生改变。

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

在讨论时序逻辑的加法器时,笔者对加法器的输出cD触发器的输出q分开进行讨论,就像两块独立的电路。同样的道理,在设计Verilog代码时也可以将其分开来进行编写。
先将下面的硬件电路用Verilog描述出来:

该电路对应的电路可以写成:
1
  
2
  
3
always  @(*)begin
  
    c = a + d;
  
end
也可以写成:
1
assign c = a + d;
上面的两段代码,都是描述同一加法器硬件电路。接着用Verilog对触发器进行描述。

其代码的写法如下:
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 <= c;
  
    end
  
end
最后可以看到,两段代码都有信号c,说明这两段代码是相连的,利用硬件连接起来可以变成如下图所示的电路。

由此可见,下面两段代码所对应的硬件电路是一模一样的。
1
  
2
  
3
  
4
  
5
  
6
  
7
  
8
  
9
  
10
  
11
  
12
  
13
  
14
always  @(posedge clk or negedge rst_n)begin
  
    if(rst_n==1'b0)begin
  
        q <= 0;
  
    end
  
    else begin
  
        q <= c;
  
    end
  
end
  
  
  
always  @(*)begin
  
    c = a + d;
  
end

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 <= a + d;
  
    end
  
end
有的读者也许会问:这两种代码哪一种比较好呢?答案是这两段代码并无区别,因为两者的硬件是相同的。由此也可以得知评估verilog代码好坏的最基本标准,即不是看代码行数而是看硬件。
上一篇:时钟
   拓展阅读