ccen12345 发表于 2015-8-27 11:11:11

请教关于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
请问是为什么?

yerrmin 发表于 2015-8-27 11:23:31

笔误吧
timer <= 1'b0;

yerrmin 发表于 2015-8-27 11:24:04

timer <= 16'd0;

小平别飞 发表于 2015-8-27 11:42:05

好像是你的触发条件是上升沿有效

小平别飞 发表于 2015-8-27 11:57:34

应该等到下一个触发条件到来的时候就会清零了

liubins715 发表于 2015-8-27 12:26:28

timer <=16'd0;

ccen12345 发表于 2015-8-27 13:44:49

yerrmin 发表于 2015-8-27 11:23
笔误吧
timer

似乎编译器自己会处理位数……

ccen12345 发表于 2015-8-27 13:47:19

liubins715 发表于 2015-8-27 12:26
timer

我试过1'd0和16'd0,似乎并没有什么影响,依然不会自动清零

ccen12345 发表于 2015-8-27 13:50:26

小平别飞 发表于 2015-8-27 11:57
应该等到下一个触发条件到来的时候就会清零了

50MHz的CLK下,我给test一个脉宽1us,周期1Hz的低电平脉冲,等一段时间之后仍然会导致Out变高

else的部分没有被执行

zjykwym 发表于 2015-8-27 13:59:14

加长高电平时间看看

ccen12345 发表于 2015-8-27 14:06:02

zjykwym 发表于 2015-8-27 13:59
加长高电平时间看看

CLK的频率远高于test的频率

zjykwym 发表于 2015-8-27 15:03:08

ccen12345 发表于 2015-8-27 14:06
CLK的频率远高于test的频率

那如果改成异步复位有效果吗?

ccen12345 发表于 2015-8-27 15:12:16

zjykwym 发表于 2015-8-27 15:03
那如果改成异步复位有效果吗?

从RTL图来看

顶楼的程序是一个MUX后面接一个D锁存器
照着Altera的counter例程改了一下就变成带CLR的D锁存器了

差不多的逻辑,综合出来也会有这么大的差别吗?

dr2001 发表于 2015-8-27 15:15:24

最好翻过来写逻辑。
目前这么写的综合出来一般是输入带有MUX的Reg/计数器;反过来是带同步Reset的计数器。

如果你用仿真环境,就这段代码而言没什么毛病,看看具体的波形;
如果是FPGA综合,看综合后反向出来的SCH之类的吧。

ccen12345 发表于 2015-9-17 10:32:20

dr2001 发表于 2015-8-27 15:15
最好翻过来写逻辑。
目前这么写的综合出来一般是输入带有MUX的Reg/计数器;反过来是带同步Reset的计数器。
...

改成异步复位就可以了……

反过来写逻辑是什么意思?

我是CPLD的综合
页: [1]
查看完整版本: 请教关于verilog中if-else的行为问题