关于verilog HDL中的竞争问题(对变量的多重驱动)的笔记

本文探讨了在Verilog中实现FPGA电子时钟时遇到的竞争冒险问题。通过对时计数器hor_cnt的多驱动源分析,揭示了按键操作导致数值混乱的原因,并提出了解决方案,即通过分离调整逻辑到独立的always块来规避竞争条件。
摘要由CSDN通过智能技术生成

多个驱动源问题:

        当一个变量有两个以上的赋值源时,不论其赋值源在同一个always 块还是在不同的always块均称该变量存在多驱动源。如果多个驱动源对同一变量赋值发生在同一时刻,并且赋值结果又未加以规定,则竞争冒险就难以避免。在一个以上always 块中对同一个变量进行赋值时,由于各个always 块是平行执行的,并没有前后之分,导致竞争冒险的可能性依然存在,即使使用非阻塞赋值也可能会产生竞争冒险甚至错误。

近几天在用verilog写FPGA开发板的电子时钟时,遇到了一个关于竞争的问题。下面是存在竞争的时钟的时计时模块代码:

module counter24(clk,rst,Min_count,key_flag,key_value,H_H,H_L);
	input clk,rst,Min_count,key_flag;
	input[1:0] key_value;
	output[3:0] H_H,H_L;
	
	reg[19:0] clk_cnt;
计时	
	reg[4:0] hor_cnt;
	always@(posedge Min_count or negedge rst or posedge key_flag)
	begin
		if(key_flag)//调时
		begin
			if(key_value==2'b10) begin//加
				hor_cnt<=hor_cnt+1'b1;
				if(hor_cnt>=5'd24)
					hor_cnt<=5'b0;
			end
			else if(key_value==2'b01) begin
				if(hor_cnt<=5'd0)
					hor_cnt<=5'd23;
				else
					hor_cnt<=hor_cnt-1'b1;
			end
		end
		else
		begin
			if(!rst)
				hor_cnt<=5'b0;
			else
			begin
				if(Min_count) begin
					hor_cnt<=hor_cnt+1'b1;
					if(hor_cnt>=5'd23) begin
						hor_cnt<=5'b0;
					end
				end
			end
		end
	end
	
	assign H_H=(hor_cnt/10);
	assign H_L=(hor_cnt%10);
	
endmodule

调试效果:当加或者减的按键按下时,数码管显示的值乱跳,也就是hor_cnt的值没有按照预期趋势变化。

当在另外的一个always模块中对hor_cnt1(时钟的时计数器的另定义一变量)进行同样的操作,再把hor_1在第一个always模块中赋值给hor_cnt,问题得到解决。

修改后的代码如下:

module counter24(clk,rst,Min_count,key_flag,key_value,H_H,H_L);
	input clk,rst,Min_count,key_flag;
	input[1:0] key_value;
	output[3:0] H_H,H_L;
	
	//reg[19:0] clk_cnt;
计时	
	reg[4:0] hor_cnt;
	always@(posedge Min_count or negedge rst or posedge key_flag)
	begin
		if(key_flag)//调时
		hor_cnt<=hor_cnt1;
		else
		begin
			if(!rst)
				hor_cnt<=5'b0;
			else
			begin
				if(Min_count) begin
					hor_cnt<=hor_cnt+1'b1;
					if(hor_cnt>=5'd23) begin
						hor_cnt<=5'b0;
					end
				end
			end
		end
	end
	
	reg[4:0] hor_cnt1;
	always@(posedge key_flag)
	begin
		if(key_flag)//调时
		begin
			if(key_value==2'b10) begin//加
				hor_cnt1<=hor_cnt1+1'b1;
				if(hor_cnt1>=5'd23)
					hor_cnt1<=5'b0;
			end
			else if(key_value==2'b01) begin
				if(hor_cnt1<=5'd0)
					hor_cnt1<=5'd23;
				else
					hor_cnt1<=hor_cnt1-1'b1;
			end
		end
	end
	
	assign H_H=(hor_cnt/10);
	assign H_L=(hor_cnt%10);
	
endmodule


原因是............疑问



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值