首页 > 其他分享 >FPGA快速入门06:阻塞与非阻塞?这是个问题

FPGA快速入门06:阻塞与非阻塞?这是个问题

时间:2025-01-20 11:57:17浏览次数:3  
标签:语句 begin end FPGA 阻塞 M1 06 赋值

目录

前言

一、什么是begin end?

二、什么是阻塞赋值和非阻塞赋值?

三、阻塞与非阻塞的实质

四、使用说明和注意事项

总结


前言

本人承诺本专栏不会开启付费专栏,如觉得有帮助可以点点关注和打赏感谢,本文为专栏部分内容,完整部分请查看专栏!

我们在明晰assign语句与always语句中了解到了begin end语句,本文我们就来探讨一下他的奥秘。


一、什么是begin end?

我们在前文了解到如果always语句中如果有多条赋值语句必须由begin和end包裹,就像这样

这个模块可以实现一个全加器,我们可以看到这个全加器的赋值语句被框住了,在begin和end之间,也能看到他们被等号所连接,属于是阻塞赋值,其实他们之间还有另一种赋值方式--非阻塞赋值!

可以知道的是,begin end之间的赋值语句有阻塞赋值与非阻塞赋值之分!

二、什么是阻塞赋值和非阻塞赋值?

如果你接触过C语言这类的编程语言,你就会知道他是从main函数开始,一句一句的顺序执行(不考虑中断之类的),阻塞赋值也是这样的,语句顺序执行,前面的执行完才能执行后面的。

赋值符号 =

赋值目标1 = 表达式1;//只有赋值语句1完成

赋值目标2 = 表达式2;//才会完成赋值语句2

而非阻塞赋值相反,它不需要参考赋值语句1,所有语句并行执行。

赋值符号:<=

赋值目标1 <= 表达式1;//赋值语句1不会阻塞赋值语句2

赋值目标2 <= 表达式2;//赋值语句1和赋值语句2并行执行

不清楚什么是表达式的可以参考链接:

FPGA快速入门03:操作符--表达式的灵魂

举例比较一下:

阻塞赋值:

begin

  m=a*b;

  y=m;

end

当 m=a*b 执行完才能执行 y=m 。

当 m 赋值完成后,才能执行 y 的赋值,y 得到的是 m 的新值。

非阻塞赋值:

begin

  m <= a*b

  y <= m;

end

m=a*b 和 y=m 并行执行 。

m 和 y 的赋值并行执行,y 得到的是 m 的旧值。

三、阻塞与非阻塞的实质

阻塞赋值的实质:右边表达式的计算和对左边寄存器变量的赋值是一个统一的原子操作中的两个动作,这两个动作之间不能再插入其他任何动作。

备注:原子操作:是指在多线程编程中,不会被线程调度机制打断的操作,一旦开始,就一直运行到结束。

举个栗子;

always @ (A,B) //设A、B同时由0变1,激活前:M1=0,M2=0,Q=0

begin //激活后:

  M1=A; //先计算A=1,马上赋值给M1

  M2=B&M1; //再计算B&M1=1,马上赋值给M2

  Q=M1|M2; //再计算M1|M2=1,马上赋值给Q

end

非阻塞赋值的实质:首先按顺序计算右边表达式的值,但是并不马上赋值,而是要等到过程结束时再按顺序赋值。

举个栗子;

always @ (A,B) //设A、B同时由0变1,激活前:M1=0,M2=0,Q=0

begin //激活后:

  M1 <= A; //先计算A=1,(等待,不赋值)

  M2 <= B&M1; //再计算B&M1=0,(等待,不赋值)

  Q <= M1|M2; //再计算M1M2=0,(等待,不赋值)

end //过程结束

先赋值给M1=1

再赋值给M2=0

再赋值给Q=0


四、使用说明和注意事项

  1. 设计组合电路时常用阻塞赋值;

  2. 设计时序电路时常用非阻塞赋值,但不是绝对的。

  3. 不建议在一个always块中混合使用阻塞赋值和非阻塞赋值


总结

以上就是今天要讲的内容,本文介绍了什么是begin end 还有什么是阻塞与非阻塞赋值,我们离数字的世界又进了一步。

标签:语句,begin,end,FPGA,阻塞,M1,06,赋值
From: https://blog.csdn.net/x2410369939/article/details/145259249

相关文章

  • [oeasy]python062_提示符是怎么来的_[词根溯源]prompt_input_输入函数_提示符
    提示符是怎么来的_[词根溯源]prompt_input_输入函数_提示符回忆上次内容上次讲的是从键盘输入变量的值 input函数可以接收到输入字符串存在变量里   添加图片注释,不超过140字(可选) input函数的参数叫prompt......
  • Java初学者笔记-06、Stream流
    什么是Stream流JDK8开始新增的一套API,可以用于链式操作集合或者数组的数据。优势:Stream流大量的结合了Lambda的语法风格来编程,功能强大,性能高效,代码简洁,可读性好。list.stream().filter(s->s.startswith("张")).filter(s->s.Length()==3).collect(Collectors.toList());......
  • Mysql 5.7解决windows本地无法开启服务-1067
    出现原因:我切换mysql8服务后,切换回去mysq5.7,然后报下面的问题。删除后应该可以 但是可能因为我有两个服务,一个5.7,一个8.0然后我继续报错:D:\Monkey\mysql-5.7.33-winx64\bin>netstartMySQL57mysql57服务正在启动.mysql57服务无法启动。服务没有报告任何错误。......
  • 奥运奖牌计数(信息学奥赛一本通-1064)
    【题目描述】2008年北京奥运会,A国的运动员参与了n天的决赛项目(1≤n≤17)。现在要统计一下A国所获得的金、银、铜牌数目及总奖牌数。输入第1行是A国参与决赛项目的天数n,其后n行,每一行是该国某一天获得的金、银、铜牌数目。输出4个整数,为A国所获得的金、银、铜牌总数及总奖牌......
  • 工程师思维是什么?FPGA工程师要有哪些思维习惯?
    芯片工程师(包括FPGA工程师)仅仅拥有知识基础和工作技能是不够的。思维方式同样至关重要。正如柏拉图所说,“思维是灵魂的自我谈话”。在FPGA行业,良好的思维习惯对工程师来说尤为重要。那么,FPGA工程师应该具备哪些核心思维习惯呢?全局思维全局思维是指考虑问题时能够由点及线,由......
  • SpringCloudAlibaba:从0搭建一套快速开发框架-06 告别重复代码,使用Freemarker轻松生成
    序言:上篇主要优化完善公共模块,本篇主要创建一个生成代码的独立模块,提升开发效率,避免繁琐的重复的crud操作。由于内容较多,我就分两节写了。本节我们主要以创建项目并简单的生成数据库实体类即可,下节我们会直接搞完。Freemarker是什么Freemarker是一个基于Java的模板引擎......
  • RK3506到底有多香?抢先看核心板详细参数配置
    RK3506是瑞芯微Rockchip在2024年第四季度全新推出的入门级芯片平台,三核Cortex-A7+单核Cortex-M0多核异构设计,具备最高-40~85℃的工业宽温性能、发热量小,IO接口丰富,即时性高,低延迟,反应速度快等特点!触觉智能已推出RK3506核心板,抢先了解核心板详细参数配置。产品概述触觉智......
  • 51c大模型~合集106
    我自己的原文哦~   https://blog.51cto.com/whaosoft/13115290#GPT-5、Opus3.5为何迟迟不发新猜想:已诞生,被蒸馏成小模型来卖「从现在开始,基础模型可能在后台运行,让其他模型能够完成它们自己无法完成的壮举——就像一个老隐士从秘密山洞中传递智慧。」最近几个月,......
  • 阻塞赋值和非阻塞赋值
    理论学习        阻塞赋值用                =        表示,这种对应的电路结构常常与触发器没有关系,只与输入电平的变化有关系。可以将阻塞赋值的操作看作只有一个步骤的操作,即将计算赋值符号的右边赋值给左边,在未执行完之前,不允......
  • SpringBoot实验课程管理系统8t062(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表学生,实验老师,班级,实验室,实验室预约,课程类型,课程信息,课表信息开题报告内容一、选题背景与意义随着信息技术的快速发展和教育改革的深入,实验课程管理在教......