多个驱动源问题:
当一个变量有两个以上的赋值源时,不论其赋值源在同一个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
原因是............