未知的 Verilog 错误要求 End after else

Unknown Verilog error asking for End after else

always@(posedge clk or negedge rst)
begin
if(~rst)
Tp <= 0 ;

    else 
    begin 
         if(g3 == 255)
          sum_x <= sum_x + x3;

         else
         begin
               if((x3 == 0) && (y3 == 0))
               Tp<=0;
               sum_x=0;
               x4 = quotient1;

                else
                begin
                     if (x3 == 200)
                         r4 = 200;
                         g4 = 200;
                         b4 = 0;
                 end  
         end 
    end
end
endmodule 

我的错误与我问的上一个问题不同,后者是通过为每个 begin 添加 end 来解决的。 我遵循了 wilcroft 编码方式,问题仍然存在

这很可能将您的 beginend 匹配 - 它们就像 C/C 中的大括号({}) ++,因为它们需要与它们捕获的结构相匹配。因此,相应地缩进它们会很有帮助。

正确缩进后,您的 always 块如下所示:

always@(posedge clk or negedge rst)        //Line 34
begin                                      
    if(~rst)                               
        Tp <= 0 ;                          //Line 37
    else 
    begin                                 
        if(g3 == 255)                      //Line 40
            sum_x <= sum_x + x3;
        else
        begin                              //Line 43
            if((x3 == 0) && (y3 == 0))
                Tp<=0;
            sum_x=0;                       //Line 46
            x4 = quotient1;
        end
    end                                    //Line 49
end
endmodule

在第 49 行放置一个 else(并相应地将 end 向下移动)给出了您看到的错误,因为当前块中的 if 语句(第 39-49 行,前-insertion) 第 42 行已经有一个 else 子句!

使用适当的缩进,并仔细检查第 49 行是否在它应该去的地方,并且可能在你检查它的时候验证其他 if,只是为了确定 :)


附录: 重要的是要注意,在 Verilog 中:

begin
if (<condition>)
    a = 1;
b = 1;
end

不同于

if (<condition>)
begin
    a = 1;
    b = 1;
end

在第一个示例中,b = 1; 始终 执行,而不管 if 的结果如何。在第二个中,两个语句都取决于 if.

的结果

If(和 else)仅适用于它后面的第一个语句,或者如果第一个 "statement" 是 begin 的一组语句。使用 beginend 仅将语句 运行 作为 if 的结果进行分组,如第二个示例。