未知的Verilog错误要求在其他之后结束

时间:2015-05-06 01:22:30

标签: verilog

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 

我的上一个问题与我之前提出的问题相比有一个不同的错误,通过为每个end添加begin来解决这个问题。 我遵循wilcroft编码方式,问题仍然存在

1 个答案:

答案 0 :(得分:0)

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

正确缩进,您的}块如下:

always

在第49行放置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 (并相应地向下移动else)会出现您看到的错误,因为当前块中的if语句(第39-49行,插入前) )第42行已经有end条款了!

使用正确的缩进,并仔细检查第49行是它应该去的地方,并且可能在您使用时验证其他else,以确保:)

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

if

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

在第一个示例中,if (<condition>) begin a = 1; b = 1; end 始终执行,无论b = 1;的结果如何。在第二个中,两个语句都取决于if

的结果

if(和If)仅适用于其后的第一个语句,如果第一个“语句”是else,则仅适用于一组语句。使用beginbegin仅对end生成的语句进行分组,如第二个示例所示。