首页 > 其他分享 >FPGA入门笔记005——阻塞赋值和非阻塞赋值的区别

FPGA入门笔记005——阻塞赋值和非阻塞赋值的区别

时间:2023-11-21 16:44:56浏览次数:34  
标签:FPGA 代码 阻塞 视图 Rst 赋值 out

定义一个示例模组,代码如下:

module block_nonblock(
	Clk,
	Rst_n,
	a,
	b,
	c,
	out
);
	
	input Clk;
	input Rst_n;
	input a,b,c;
	output reg[1:0]out;
	
	//out = a + b + c,out最大为3,所以设置为两位;
	
	//d = a + b;
	//out = d + c;
	
	reg [1:0]d;

阻塞赋值:

阻塞赋值1:

功能代码如下:

	always@(posedge Clk or negedge Rst_n)
	if(!Rst_n)
		out = 2'b0;
	else begin
		d = a + b;
		out = d + c;
	end

RTL视图如下:

微信截图_20231121143145

阻塞赋值2:

功能代码如下:

	always@(posedge Clk or negedge Rst_n)
	if(!Rst_n)
		out = 2'b0;
	else begin
		out = d + c;	//更改代码顺序
		d = a + b;
	end

RTL视图如下:

微信截图_20231121143624

可以看见,当代码顺序不同时,RTL视图也不同,其out的结果和代码顺序有关。

非阻塞赋值

非阻塞赋值1:

功能代码如下:

	always@(posedge Clk or negedge Rst_n)
	if(!Rst_n)
		out <= 2'b0;
	else begin
		out <= d + c;
		d <= a + b;
	end

RTL视图如下:

微信截图_20231121143948

非阻塞赋值2:

功能代码如下:

	always@(posedge Clk or negedge Rst_n)
	if(!Rst_n)
		out <= 2'b0;
	else begin
		d <= a + b;	//更改代码顺序
		out <= d + c;
	end

RTL视图如下:

微信截图_20231121144134

可以看见,当代码顺序不同时,RTL视图相同,其out的输出结果和代码顺序无关。

后仿真结果如下:

微信截图_20231121162147

当时钟信号处于上升沿1时:

a=0,b=1,随后d经过一段时间的延时从00->01;

d=00,c=0,随后out经过一段时间的延时从01->00;

当时钟处于上升沿2时:

a=0,b = 1,随后d不变;

d=01,c=0,随后out经过一段时间的延时从00->01;

所以非阻塞赋值时,其out的输出结果只与时钟信号处于上升沿时 d 的状态和 c 的状态有关。

标签:FPGA,代码,阻塞,视图,Rst,赋值,out
From: https://www.cnblogs.com/little55/p/17846924.html

相关文章

  • FPGA入门笔记004——BCD计数器设计与使用
    1、设置一个最大值为10的四位计数器,Verilog代码如下:moduleBCD_Counter( Clk, Cin, Rst_n, Cout, q); inputClk; //计数器基准时钟 inputCin; //计数器进位输入 inputRst_n; //系统复位 // outputRegCout; //计数器进位输出 outputCout; //计数器进位输出 out......
  • 功能“合并赋值”在 C 7.3 中不可用。请使用 8.0 或更高的语言版本。
    https://blog.51cto.com/u_11283245/5237505在使用using等新语法时,在VisualStudio2019会自动判断框架版本,如在net45就不会自动使用最新版本的语法,需要修改项目文件在使用C#8.0之前,请在官网下载最新的VisualStudio2019版本如果在编译时提示“Using声明”在C#......
  • FPGA入门笔记003——计数器IP核调用与验证
    FPGA设计方式主要有三种:1、原理图(不推荐);2、VerilogHDL设计方式;3、IP核输入方式计数器IP核调用与验证步骤如下:1、添加IP核文件打开QuartusII,新建一个项目,名称为counter_ip。选择Tools->MegaWizardPlug-InManager。选择第一个选项。在搜索栏中输入COUNTER,单击LPM_COU......
  • c语言 指针的赋值
    @TOC前言如果一个指针指向一个变量的地址,如何通过指针来改变该变量的值呢?一、指针的赋值例如:int*p;inta=3,b=4;p=&a;//指针p指向变量a的地址。p=&b;//指针p重新指向变量b的地址。二、注意点指针变量也是变量,可以以装别的地址,但是要是同类型的。重新赋值,也叫......
  • python 赋值、浅拷贝、深拷贝的区别
    b=a: 赋值引用,a和b都指向同一个对象。b=a.copy(): 浅拷贝,a和b是一个独立的对象,但他们的子对象还是指向统一对象(是引用)。b=copy.deepcopy(a): 深度拷贝,a和b完全拷贝了父对象及其子对象,两者是完全独立的。对于可变的序列,切片操作符:是浅拷贝 比如:a=b[:]......
  • python:第十六章:赋值运算符
    一,什么是赋值运算符?赋值运算符的执行顺序赋值运算符=它用来把值赋给变量。运算符右边的表达式先计算得到结果,再将结果赋值给左边的变量12345#赋值x=5y=x+3print("x=",x)print("y=",y)运行结果:x=5y=8二,链式赋值就是同时给......
  • vector赋值操作
    给vector容器进行赋值vector&operator=(constvector&vec);//重载等号操作符assign(beg,end);//将[beg,end)区间中的数据拷贝赋值给本身。assign(n,elem);//将n个elem拷贝赋值给本身。示例:#include<vector>​voidprintVector(vector<int>&v){​......
  • FPGA和ZYNQ 开发平台
    FPGA,全称为Field-ProgrammableGateArray,即现场可编程门阵列,是一种FPGA,全称为Field-ProgrammableGateArray,即现场可编程门阵列,是一种数字集成电路。它是一种半定制电路,既能解决定制电路的不足,又克服了通用器件的缺点。FPGA的基本结构主要包括可编程输入/输出单元(I/O)、可编程逻......
  • Mutiny Uni阻塞操作变响应式的方法示例
    以下代码片段为模拟一个这样的操作:在多台服务器上下载文件列表内的文件。其中,获取服务器、获取文件列表、在服务器执行下载操作均为阻塞方法。importcn.hutool.core.collection.CollUtil;importio.quarkus.test.junit.QuarkusTest;importio.smallrye.mutiny.Multi;impor......
  • HTTP 响应字段 Transfer-Encoding 赋值成 chunked 的作用介绍
    Transfer-Encoding:chunked是HTTP/1.1协议中定义的一种数据传输方式。在HTTP/1.1之前,HTTP协议的响应数据通常是一次性发送的,也就是说,服务器必须把所有的响应数据准备好后,一次性发送给客户端。这种方式的缺点是,如果响应数据很大,或者数据的产生需要花费一定的时间,那么服务器......