新手学习verilog的两个问题
时间:10-02
整理:3721RD
点击:
大家好,刚刚学习verilog有两个问题想请教以下
1. 为什么在verilog中的进位是从9进位,但是实际是10有效呢?
比如一个秒表中的进位程序如下
always_ff @(posedge clk)
begin
if (reset)
begin
count1 <= '0;
count2 <= '0;
count3 <= '0;
count4 <= '0;
end
else if(enable)
begin
if (count1 == 4'b1001)
begin
count1 <= '0;
if (count2 == 4'b1001)
begin
count2 <= '0;
if (count3 == 4'b1001)
begin
count3 <= '0;
if (count4 == 4'b1001)
begin
count4 <= '0;
end
else
count4 <= count4 + 1'b1;
end
else
count3 <= count3 + 1'b1;
end
else
count2 <= count2 + 1'b1;
end
else
count1 <= count1 + 1'b1;
end
end
endmodule
程序比较简单,但是为什么进位时的判定条件是 if (count1 == 4'b1001)
而不是if (count1 == 4'b1010) 呢? 从C的角度看,应该是等于10才归零才进位呀?
2.为什么这个程序会陷入死循环? pos和an一直等于0,不管我按了reset没有。
always_ff @(posedge clk)
if (reset)
begin
pos <= '0; // set all bits to 0
an <= '0; // set all bits to 0
end
1. 为什么在verilog中的进位是从9进位,但是实际是10有效呢?
比如一个秒表中的进位程序如下
always_ff @(posedge clk)
begin
if (reset)
begin
count1 <= '0;
count2 <= '0;
count3 <= '0;
count4 <= '0;
end
else if(enable)
begin
if (count1 == 4'b1001)
begin
count1 <= '0;
if (count2 == 4'b1001)
begin
count2 <= '0;
if (count3 == 4'b1001)
begin
count3 <= '0;
if (count4 == 4'b1001)
begin
count4 <= '0;
end
else
count4 <= count4 + 1'b1;
end
else
count3 <= count3 + 1'b1;
end
else
count2 <= count2 + 1'b1;
end
else
count1 <= count1 + 1'b1;
end
end
endmodule
程序比较简单,但是为什么进位时的判定条件是 if (count1 == 4'b1001)
而不是if (count1 == 4'b1010) 呢? 从C的角度看,应该是等于10才归零才进位呀?
2.为什么这个程序会陷入死循环? pos和an一直等于0,不管我按了reset没有。
always_ff @(posedge clk)
if (reset)
begin
pos <= '0; // set all bits to 0
an <= '0; // set all bits to 0
end
手机端只能看到第一个问题。
这是一个边沿敏感的always块,你根据数电里面时序电路的知识,把波形图画出来就一目了然了。
<= 非阻塞赋值,改变信号将来(上升沿之后)的值;当进入always块时,count1为9,引用处都为9,等到块结束后值才会变化。
