0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

FPGA学习交流 来源:互联网 作者:佚名 2018-05-31 11:40 次阅读

设计背景:

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

设计原理:

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

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

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

0modulestudy_4 (clk,rst_n,d,q);

1 //输入输出端口

2 inputclk;

3 inputrst_n;

4 input[1:0]d;

5 outputreg[1:0]q;

6

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

8

9 always@(posedgeclk)

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

23endmodule

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

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

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

我们的测试文件如下:

0`timescale1ns/1ps

1

2moduletb;

3

4 regclk;

5 regrst_n;

6 reg[1:0]d;

7 wire[1:0]q;

8

9 initialbegin

10 clk =1;

11 rst_n =0;

12 d =0;

13

14 #200.1rst_n =1;

15

16 #100d =2;

17 #100d =0;

18

19 end

20

21 always#10clk =~clk;

22

23 study_4 dut(

24 .clk(clk),

25 .rst_n(rst_n),

26 .d(d),

27 .q(q)

28 );

29

30endmodule

放真图如下:

image.png

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

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

非阻塞代码如下:

0modulestudy_4 (clk,rst_n,d,q);

1

2 inputclk;

3 inputrst_n;

4 input[1:0]d;

5 outputreg[1:0]q;

6

7 reg[1:0]q1;

8

9 always@(posedgeclk)

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

23endmodule

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

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

image.png

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

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

    关注

    1626

    文章

    21665

    浏览量

    601799
  • 非阻塞赋值
    +关注

    关注

    0

    文章

    10

    浏览量

    9998
收藏 人收藏

    评论

    相关推荐

    FPGA基础篇(一):阻塞阻塞赋值,不只是比原始信号差一个时钟周期的问题!(深入剖析)

    阻塞阻塞赋值 首先从名字上理解,阻塞赋值赋值
    的头像 发表于 09-19 18:32 1.3w次阅读

    Verilog语言中阻塞阻塞赋值的不同

    来源:《Verilog数字系统设计(夏宇闻)》 阻塞阻塞赋值的语言结构是Verilog 语言中最难理解概念之一。甚至有些很有经验的Verilog 设计工程师也不能完全正确地理解:何
    的头像 发表于 08-17 16:18 6348次阅读

    fpga基础篇(一):阻塞阻塞赋值

    `阻塞阻塞赋值首先从名字上理解,阻塞赋值赋值
    发表于 04-05 09:53

    【技巧分享】FPGA至简设计-阻塞赋值阻塞赋值

    阻塞阻塞作者:小黑同学一、 概述1、阻塞赋值对应的电路往往与触发沿没有关系,只与电平的变化有关系。
    发表于 04-24 14:49

    深入理解阻塞阻塞赋值

    这是一个很好的学习阻塞阻塞的资料,对于FPGA学习有很大帮助。
    发表于 04-22 11:00 11次下载

    阻塞赋值阻塞赋值的用法一篇文章就够了

    对于VerilogHDL语言中,经常在always模块中,面临两种赋值方式:阻塞赋值阻塞赋值
    的头像 发表于 01-30 17:41 2.2w次阅读

    verilog中阻塞赋值阻塞赋值到底有什么区别

    1、阻塞赋值操作符用等号(即 = )表示。“阻塞”是指在进程语句(initial和always)中,当前的赋值语句阻断了其后的语句,也就是说后面的语句必须等到当前的
    发表于 04-25 08:00 0次下载
    verilog中<b class='flag-5'>阻塞</b><b class='flag-5'>赋值</b>和<b class='flag-5'>非</b><b class='flag-5'>阻塞</b><b class='flag-5'>赋值</b>到底有什么区别

    IEEE Verilog阻塞赋值阻塞赋值的区别

    阻塞赋值对应的电路往往与触发沿没有关系,只与输入电平的变化有关系。阻塞赋值对应的电路结构往往与触发沿有关系,只有在触发沿时才有可能发生
    的头像 发表于 06-17 11:57 1.1w次阅读
    IEEE Verilog<b class='flag-5'>阻塞</b><b class='flag-5'>赋值</b>和<b class='flag-5'>非</b><b class='flag-5'>阻塞</b><b class='flag-5'>赋值</b>的区别

    VerilogHDL语言:清阻塞赋值阻塞赋值

    对于VerilogHDL语言中,经常在always模块中,面临两种赋值方式:阻塞赋值阻塞赋值
    发表于 11-19 15:48 1125次阅读

    简述阻塞赋值阻塞赋值的可综合性

    阻塞赋值阻塞赋值的可综合性 Blocking Assignment阻塞
    的头像 发表于 05-12 09:45 2691次阅读
    简述<b class='flag-5'>阻塞</b><b class='flag-5'>赋值</b>和<b class='flag-5'>非</b><b class='flag-5'>阻塞</b><b class='flag-5'>赋值</b>的可综合性

    verilog中阻塞赋值阻塞赋值的区别

    阻塞赋值操作符用等号(即 = )表示。“阻塞”是指在进程语句(initial和always)中,当前的赋值语句阻断了其后的语句,也就是说后面的语句必须等到当前的
    发表于 12-19 16:49 7250次阅读

    Verilog中阻塞阻塞赋值金规

    对于VerilogHDL语言中,经常在always模块中,面临两种赋值方式:阻塞赋值阻塞赋值
    的头像 发表于 06-01 09:21 1205次阅读

    一文了解阻塞赋值阻塞赋值

    今天给大家普及一下阻塞赋值阻塞赋值的相关知识
    的头像 发表于 07-07 14:15 2111次阅读
    一文了解<b class='flag-5'>阻塞</b><b class='flag-5'>赋值</b>与<b class='flag-5'>非</b><b class='flag-5'>阻塞</b><b class='flag-5'>赋值</b>

    阻塞赋值阻塞赋值

    ”=“阻塞赋值与”
    的头像 发表于 09-12 09:06 1000次阅读
    <b class='flag-5'>阻塞</b><b class='flag-5'>赋值</b>与<b class='flag-5'>非</b><b class='flag-5'>阻塞</b><b class='flag-5'>赋值</b>

    verilog同步和异步的区别 verilog阻塞赋值阻塞赋值的区别

    Verilog是一种硬件描述语言,用于设计和模拟数字电路。在Verilog中,同步和异步是用来描述数据传输和信号处理的两种不同方式,而阻塞赋值阻塞
    的头像 发表于 02-22 15:33 1546次阅读