FPGA(六)---阻塞赋值和非阻塞赋值

一、阻塞赋值
代码一:

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;
	
	//d = a + b;
	//out = d + c;
	reg [1:0]d;
	
	always@(posedge Clk or negedge Rst_n)
	if(!Rst_n)
		out = 2'b0;
	else begin
		d = a + b;   //阻塞赋值
		out = d + c;
	end
endmodule

在这里插入图片描述
代码二:
交换cout和d的顺序:

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;
	
	//d = a + b;
	//out = d + c;
	reg [1:0]d;
	
	always@(posedge Clk or negedge Rst_n)
	if(!Rst_n)
		out = 2'b0;
	else begin
		out = d + c;
		d = a + b;   //阻塞赋值,out = d + c;在前面
	end	
endmodule

在这里插入图片描述

二、非阻塞赋值
代码三:

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;
	
	//d = a + b;
	//out = d + c;
	reg [1:0]d;
	
	always@(posedge Clk or negedge Rst_n)
	if(!Rst_n)
		out <= 2'b0;
	else begin
		d <= a + b;   //非阻塞赋值
		out <= d + c;
	end
	
endmodule

在这里插入图片描述
代码四:
交换cout和d顺序:
在这里插入图片描述
代码五:手动加入延时

`timescale 1ns/1ps
`define tp 1   //手动模拟延时,公司没说就不能用

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;
	
	//d = a + b;
	//out = d + c;
	reg [1:0]d;
	
	always@(posedge Clk or negedge Rst_n)
	if(!Rst_n)
		out <= 2'b0;
		//out <= #`tp 2'b0;  //加入延时
	else begin
		d <= a + b;   //非阻塞赋值,out = d + c;在前面
		//d <= #`tp a + b; //加入延时
		out <= d + c;
		//out <= d + c; //加入延时
	end	
endmodule

三、结论

1、’在非阻塞赋值中,交换顺序并不会影响最后结果,运算并没有先后
2、结果出现延时的原因可能是寄存器的建立和运算(代码一中出现了一个寄存器,而代码二中出现了两个寄存器,所以代码二延时应该更高)
在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值