always @(posedge clk or negedge rst_n) begin
if(~rst_n) begin
result <=0;
end else begin
case ({A,B})
2'b00: result <= 4'b0001;
2'b01: result <= 4'b0010;
2'b10: result <= 4'b0100;
2'b11: result <= 4'b1000;
default: result <= result;
end
end
问题描述:
在A=1,B=0时,出现result=0情况,而不是正常的4'b0001。
分析方法一:
always @(posedge clk or negedge rst_n) begin
if(~rst_n) begin
result <=0;
end else begin
case ({A,B})
2'b00: result <= 4'b0001;
2'b01: result <= 4'b0010;
2'b10: result <= 4'b0100;
2'b11: result <= 4'b1000;
default: result <= 4'b1010;
end
end
来判断result是否进入case语句。发现波形显示result=1010,说明程序执行default语句。
always @(posedge clk or negedge rst_n) begin
if(~rst_n) begin
result <=0;
end else begin
case ({A,B})
2'b00: result <= 4'b0001;
2'b01: result <= 4'b0010;
2'b10: result <= 4'b0100;
2'b11: result <= 4'b1000;
default: begin
result <= 4'b1010;
$display("%h, %h, %h", A, B, {A,B});
end
end
end
通过display,此时A=0,B=0;
原因A、B判断时间和clk时钟上升沿对应问题,因此,将上升沿触发(posedge clk)改成下降沿触发(negedge clk),只是在这个时钟周期有影响(能正常执行case语句),对后面的时钟周期无影响。
always @(negedge clk or negedge rst_n) begin
if(~rst_n) begin
result <=0;
end else begin
case ({A,B})
2'b00: result <= 4'b0001;
2'b01: result <= 4'b0010;
2'b10: result <= 4'b0100;
2'b11: result <= 4'b1000;
default: result <= result;
end
end