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编码方式,问题仍然存在
答案 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
,则仅适用于一组语句。使用begin
和begin
仅对end
生成的语句进行分组,如第二个示例所示。