FPGA学习系列:5.阻塞赋值与非阻塞赋值

描述

设计背景:

阻塞(=)和非阻塞(<=)一直是在我们FPGA中讨论的问题,资深的学者都是讨论的是赋值应该发生在上升下降沿还是在哪里,我们在仿真中看的可能是上升下降是准确的,但是在时间电路中这就是不得而知了,今天我们将学习阻塞和非阻塞的区别,我们不研究他们发生在哪里,之讨论发生的时间和发生的地方。

 

设计原理: 

阻塞:在本语句中“右式计算”和“左式更新”完全完成之后,才开始执行下一条语句;

非阻塞:当前语句的执行不会阻塞下一语句的执行。

 

我们来看一下下面的阻塞的代码

0 module study_4 (clk, rst_n, d, q);

1  //输入输出端口

2  input clk;

3  input rst_n;

4  input [1:0] d;

5  output reg [1:0] q;

6 

7  reg [1:0] q1;    //定义一个寄存器

8 

9  always @ (posedge clk)

10 begin

11  if(!rst_n)   //复位时用阻塞给寄存器输出赋初值

12   begin

13    q1 = 0;

14    q = 0;

15   end

16  else     //阻塞语句进行赋值

17   begin

18    q1 = d;

19    q = q1;

20   end

21 end

22

23 endmodule 

 

always语句块对Clk的上升沿敏感,当发生Clk 0~1的跳变时,执行该always语句。

在begin...end语句块中所有语句是顺序执行的,而且最关键的是,阻塞赋值是在本语句中“右式计算”和“左式更新”完全完成之后,才开始执行下一条语句的。

在上面的代码中在18行当上升沿来到先执行把d的值给q1,然后下一个上升沿把q1赋值给q。

我们的测试文件如下:

0 `timescale 1ns / 1ps

1 

2 module tb;

3 

4  reg clk;

5  reg rst_n;

6  reg [1:0] d;

7  wire [1:0] q;

8 

9  initial begin

10  clk = 1;

11  rst_n = 0;

12  d = 0;

13

14 #200.1 rst_n = 1;

15

16 #100 d = 2;

17 #100 d = 0;

18

19 end

20

21 always #10 clk = ~clk;

22

23 study_4 dut(

24  .clk(clk), 

25  .rst_n(rst_n),

26  .d(d),

27  .q(q)

28 );

29

30 endmodule 

 

 放真图如下:

非阻塞赋值 

 

我们可以清楚的看到第一个上升沿的时候寄存器q为0,第二个上升沿的时候q为2,接下来,再看看非阻塞赋值的情况。

所谓非阻塞赋值,顾名思义,就是指当前语句的执行不会阻塞下一语句的执行。

非阻塞代码如下:

0 module study_4 (clk, rst_n, d, q);

1 

2  input clk;

3  input rst_n;

4  input [1:0] d;

5  output reg [1:0] q;

6 

7  reg [1:0] q1;

8 

9  always @ (posedge clk)

10 begin

11  if(!rst_n)   //复位时用阻塞给寄存器输出赋初值

12   begin

13    q1 <= 0;

14    q <= 0;

15   end

16  else     //阻塞语句进行赋值

17   begin

18    q1 <= d;

19    q <= q1;

20   end

21 end

22

23 endmodule 

 

非阻塞在18行以后是这样执行的,18行的时候d的值给q1,但是不是立马给过去,而是等到上升的时候才给,在上升沿同样执行19行,把q1得值给q,大家要明白的这个时候给值是q1的旧值,然后同样在19行也是在上升沿到来后值才给过去的。

我们两个模块用的是一样的仿真文件,我在这里就不给大家展示了,大家可以直接看仿真图,如下:

非阻塞赋值 

 

大家可以清楚的看到,在第一个上升沿的时候d的值为2,执行18行然后不直接赋值,在等到上升沿来的时候值过去,同样的后面的也是这么执行的,那么我们可以看到图中和我们分析的一样。

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分