请教关于verilog中if-else的行为问题
现在程序中有如下语句input test;
reg timer;
always @ (posedge clk)
begin
if(!test)
timer <= timer + 1'b1;
else
timer <= 1'b0;
end
在调试中发现,当test变为低电平的时候,timer可以正确累加,但是test变高之后timer并不会清零
也就是说else没有被执行
会导致test的低电平时间被累加
把test加到事件列表中没有作用
但是以下程序
always @ (posedge timer or posedge RST)
begin
if(timer)
Out <= 1'b1;
else
Out <= 1'b0;
end
却可以正常地输出1和0
请问是为什么? 笔误吧
timer <= 1'b0; timer <= 16'd0; 好像是你的触发条件是上升沿有效 应该等到下一个触发条件到来的时候就会清零了
timer <=16'd0; yerrmin 发表于 2015-8-27 11:23
笔误吧
timer
似乎编译器自己会处理位数…… liubins715 发表于 2015-8-27 12:26
timer
我试过1'd0和16'd0,似乎并没有什么影响,依然不会自动清零 小平别飞 发表于 2015-8-27 11:57
应该等到下一个触发条件到来的时候就会清零了
50MHz的CLK下,我给test一个脉宽1us,周期1Hz的低电平脉冲,等一段时间之后仍然会导致Out变高
else的部分没有被执行 加长高电平时间看看 zjykwym 发表于 2015-8-27 13:59
加长高电平时间看看
CLK的频率远高于test的频率 ccen12345 发表于 2015-8-27 14:06
CLK的频率远高于test的频率
那如果改成异步复位有效果吗? zjykwym 发表于 2015-8-27 15:03
那如果改成异步复位有效果吗?
从RTL图来看
顶楼的程序是一个MUX后面接一个D锁存器
照着Altera的counter例程改了一下就变成带CLR的D锁存器了
差不多的逻辑,综合出来也会有这么大的差别吗? 最好翻过来写逻辑。
目前这么写的综合出来一般是输入带有MUX的Reg/计数器;反过来是带同步Reset的计数器。
如果你用仿真环境,就这段代码而言没什么毛病,看看具体的波形;
如果是FPGA综合,看综合后反向出来的SCH之类的吧。 dr2001 发表于 2015-8-27 15:15
最好翻过来写逻辑。
目前这么写的综合出来一般是输入带有MUX的Reg/计数器;反过来是带同步Reset的计数器。
...
改成异步复位就可以了……
反过来写逻辑是什么意思?
我是CPLD的综合
页:
[1]