今天写了一段Verilog代码 但是仿真的时候总是得不到我想要的结果 ,后来发现是always中的if语句判断出问题
下面是我的代码片段:
if (onesDetected == 1)
begin
tmp_reg[4:0] <= {1'b0, tmp_reg[4:1]};
end
// 若没有检测到连续的1 就直接把缓冲区的数据右移动
else
begin
tmp_reg <= {1'b0, tmp_reg[15:1]};
counter <= counter + 4'b0001;
end
//移动一个字节后重新装载数据
if (counter == 4'b1000)
begin
counter <= 0;
flag <= 1;
inProgress_i <= 0;
tmp_reg[15:8] <= data_reg; //传输开始先要移动两个字节的0 才开始正式的传输有效的的帧
end
我现在要的效果是,当counter=7的周期里面,若 if (onesDetected == 1) 成立 则counter 保持为7,若 if (onesDetected == 1)不成立时counter则变为零。但是我上面的代码做不到这一点
主要是由于counter是采用非阻塞赋值造成counter=7的周期结束时,若 if (onesDetected == 1)不成立 ,counter的值变成了 8.但是if (counter == 4'b1000)的判断还是按照counter= 7来进行的则counter无法再counter=7周期结束时
变为0,最后 我将counter <= counter + 4'b0001这条语句改为阻塞性赋值 counter = counter + 4'b0001;就可以达到我想要的结果,但是在看Verilog的书籍时 都会提出在always的时序逻辑中不要用阻塞性赋值 所以觉得这个解决办法
有些不妥。希望哪位大神给出一个好的解决方案!!!
|