不能在verilog中使用else始终阻止

时间:2018-11-22 16:24:01

标签: verilog block quartus

我在尝试编译时从Quartus收到此错误:

  

错误(10200):Verilog HDL条件语句错误发生于   time_of_day_FSM.v(166):在以下条件下无法匹配操作数   始终的封闭事件控件中的相应边   构造

这里是一些背景。我正在制作一个时钟,对于这个always块,我想增加并设置某些值以类似于hh:mm:ss格式的时钟行为。我有一个时钟源,它每毫秒都会变高,并且正在使用计数器来设置secondPassed reg。

我希望块中的代码每过一秒钟就更新一次,例如时钟,或者在我的板上按KEY[2]down = 0),因为这是用户用来递增的设置时钟时间时的小时,分​​钟或秒。这是有问题的always块(抱歉,嵌套的if语句,我想不出一种更好的方法):

// every second. Used just to keep time going. Independent of states.
always @(posedge secondPassed, negedge KEY[2], negedge KEY[0]) begin
    if(KEY[0] == 0) begin
        hr1 <= 1;
        hr0 <= 2;
        min1 <= 0;
        min0 <= 0;
        sec1 <= 0;
        sec0 <= 0;
    end 
    else if(secondPassed == 1 || KEY[2] == 0) begin // I don't care about explicitly stating the conditions, as the sensitivity list covers that right?
        if(sec0 == 9) begin
            sec0 <= 0;
            if(sec1 == 5) begin
                sec1 <= 0;
                if(min0 == 9) begin
                    min0 <= 0;
                    if(min1 == 5) begin
                        min1 <= 0;

                        if(hr1 == 1) begin
                                if(hr0 == 2) begin 
                                    hr0 <= 1; // go to 1 o'clock
                                    hr1 <= 0;
                                end
                                else hr0 <= hr0 + 1;
                        end
                        else hr0 <= hr0 + 1;
                    end
                    else min1 <= min1 + 1;
                end
                else min0 <= min0 + 1;
            end
            else sec1 <= sec1 + 1;
        end
        else begin 
            sec0 <= sec0 + 1;
        end
        just_flashed <= ~just_flashed;
    end // end big else 
end // end always

我的问题是:如果我试图使非复位场景像“ JUST AND ELSE”一样,为什么Quartus编译器会抱怨:

 // every second. Used just to keep time going. Independent of states.
 always @(posedge secondPassed, negedge KEY[2], negedge KEY[0]) begin
if(KEY[0] == 0) begin
    hr1 <= 1;
    hr0 <= 2;
    min1 <= 0;
    min0 <= 0;
    sec1 <= 0;
    sec0 <= 0;
end 
else begin // this is causing the issue. compiler complains .
    // same logic to drive clock as above
    just_flashed <= ~just_flashed;
end // end big else 
end // end always

我觉得我已经看到了很多例子,这些例子中人们只是简单地使用代码,而其他代码则以代码结尾。我的代码似乎要我为else if明确地声明敏感度列表的条件。有什么解释吗?我是大型Verilog项目的新手。

1 个答案:

答案 0 :(得分:3)

您正在always块中混合组合逻辑和同步逻辑,这是编码的不良习惯。通常,大多数设计中有2个主要的always块。

组合:

always@(*) // * adds anything under this always block to sensitivity list.
begin      // Which makes this always block combinational.
    count_reg_d <= somelogic;
end

然后将这些组合逻辑依次分配给适当的寄存器 总是阻止:

always@(posedge clk, negedge rst)
begin
    if(~rst)
        count_reg_q <= 0;
    else
    begin
        count_reg_q <= count_reg_d;
    end
end

通过这种编码方式,可以避免混合总是块,并且代码更具可读性,并且更接近于正在合成的硬件。因此,如果您正确更新always块的敏感度列表,则必须解决问题。