Verilog if-else语句

时间:2015-12-10 19:02:59

标签: if-statement verilog hdl

我正在尝试为BCD计数秒表编写一个模块。当我检查语法时,我得到错误说:

ERROR:HDLCompilers:26 - "../counter.v" line 24 expecting 'end', found 'else'
ERROR:HDLCompilers:26 - "../counter.v" line 25 unexpected token: '='
ERROR:HDLCompilers:26 - "../counter.v" line 25 unexpected token: '+'
ERROR:HDLCompilers:26 - "../counter.v" line 25 expecting 'endmodule', found '1'

在我的代码中间。我不太确定错误的来源,并试图实现更多的开始/结束,但这并不是问题所在。这是我目前的代码:

module BCDCount(en, clk, rst, direction, cTenths, cSec, cTS, cMin);
    input en, clk, rst, direction;
    output [3:0] cTenths, cSec, cTS, cMin;
    reg [3:0] cTenths, cSec, cTS, cMin;

always @(posedge clk)
if(en)
begin

    if(direction == 0)

        if(cMin== 4'b 1001)
                cMin <= 4'b 0000;
            if(cTS == 4'b 0101)
                cTS <= 4'b 0000;
                cMin = cMin +1;

                if(cSec == 4'b 1001)
                    cSec <= 4'b 0000;
                    cTS = cTS +1;
                    if(cTenths == 4'b 1001)
                        cTenths <= 4'b 0000;
                        cSec = cSec+1;
                    else 
                        cTenths = cTenths +1;
                else
                    cSec = cSec+1;
            else
                cTS = cTS + 1;

    if(direction == 1)

        if(cMin== 4'b 0000)
            cMin <= 4'b 1001;
            if(cTS == 4'b 0000)
                cTS <= 4'b 1001;
                cMin = cMin -1;
                if(cSec == 4'b  0000)
                    cSec <= 4'b 1001;
                    cTS = cTS -1;
                        if(cTenths == 4'b 0000)
                            cTenths <= 4'b 1001;
                            cSec = cSec-1;
                        else
                            cTenths = cTenths -1;
                else
                    cSec = cSec-1;
            else
                cTS = cTS - 1;

end
    always @(posedge rst)
        begin
            cMin <= 0;
            cTS <= 0;
            cSec <= 0;
            cTenths <= 0;
        end
endmodule 

1 个答案:

答案 0 :(得分:1)

根据您的缩进结构,看起来您希望这个代码

  ...
        if(cTS == 4'b 0101)
            cTS <= 4'b 0000;
            cMin = cMin +1;
                if(cTenths == 4'b 1001)
  ...
Cmin = cMin + 1的情况下,

cTS == 4'b0101将被执行。但是,在Verilog中,if语句仅适用于紧接在它们之前的语句(就像在C中一样)。为了使它们适用于多个语句,我们需要将这些语句包装在begin - end块中(就像C中的{}一样。)

因此,您发现代码中包含else语句的错误,但无法找到匹配的if

您想要使用以下内容:

  ...
        if(cTS == 4'b 0101)
        begin
            cTS <= 4'b 0000;
            cMin = cMin +1;
                if(cTenths == 4'b 1001)
            ...
        end
        else
  ...

修改 另外值得注意的是 - 您在=块中混合了阻止(<=)和非阻塞(always)分配。对于时钟always块,您应该(基本上)始终使用非阻塞分配。将任何顺序分配移动到他们自己的always@(*)块。

你也会得到信号有多个驱动程序的错误,因为你在多个always块中分配了一些信号值。