我最近开始在Verilog工作,并尝试制作状态机。因为我不断出错,请让我知道我做错了什么。它表示endmodule
附近的错误,但没有指定。我试图改变一些东西并在底部添加额外的结尾和类似的东西,以防我错过了一个。它继续给我一个错误。我确信这是一件我想念的简单事。请帮我。我真的很困惑为什么它不起作用。
module FSM(input KEY0, SW0, SW1, SW2, SW3, SW4,
output [6:0] HEX0, HEX1, HEX2, HEX3, output reg [2:0] state,
output reg [1:0] Z, output reg [4:0] LED_SW0, LED_SW1, LED_SW2, LED_SW3, LED_SW4);
reg [2:0] nextstate;
localparam start=3'b000, state1=3'b001, state2=3'b011, state3=3'b100;
always @ (posedge KEY0 or posedge SW0)
if(SW0) begin
state <=start;
end
else
state <= nextstate;
always @ (*) begin
nextstate = state;
Z=2'b0;
LED_SW0='b0;
LED_SW1='b0;
LED_SW2='b0;
LED_SW3='b0;
LED_SW4='b0;
HEX0 = 7'b0;
HEX1 = 7'b0;
HEX2 = 7'b0;
HEX3 = 7'b0;
if(SW0)
LED_SW0=1;
else
LED_SW0=0;
if(SW1)
LED_SW1=1;
else
LED_SW1=0;
if(SW2)
LED_SW2=1;
else
LED_SW2=0;
if(SW3)
LED_SW3=1;
else
LED_SW3=0;
if(SW4)
LED_SW4=1;
else
LED_SW4=0;
case(state)
start:begin
Z=2'b00;
HEX0[6]=1; HEX0[5]=1; //b
HEX1[6]=1; HEX1[5]=1; HEX1[4]=1; HEX1[3]=1; HEX1[1]=1; //r
HEX2[3]=1; //A
HEX3[2]=1; //g
if(~SW0&&SW1&&~SW2&&~SW3&&~SW4)
nextstate = state1;
else
nextstate = start;
end
state1: begin
Z=2'b00;
HEX0[0]=1; HEX0[3]=1; HEX0[4]=1; HEX0[5]=1; HEX0[6]=1;
HEX1[6]=1;
HEX2[0]=1; HEX2[1]=1; HEX2[2]=1; HEX2[4]=1; HEX2[5]=1; HEX2[6]=1;
HEX3[1]=1; HEX3[4]=1;
if(~SW0&&~SW1&&SW2&&~SW3&&~SW4)
nextstate = state2;
else
nextstate = state1;
end
state2 : begin
Z=2'b10;
HEX0[2]=1; HEX0[5]=1;
HEX1[6]=1;
HEX2[0]=1; HEX2[1]=1; HEX2[2]=1; HEX2[4]=1; HEX2[5]=1; HEX2[6]=1;
HEX3[1]=1; HEX3[4]=1;
if(~SW0&&~SW1&&~SW2&&~SW3&&SW4)
nextstate = state1;
else if(~SW0&&~SW1&&~SW2&&SW3&&~SW4)
nextstate = state3;
else
nextstate = state2;
end
state3:begin
Z=2'b11;
HEX0[1]=1; HEX0[2]=1;
HEX1[6]=1;
HEX2[0]=1; HEX2[1]=1; HEX2[2]=1; HEX2[4]=1; HEX2[5]=1; HEX2[6]=1;
HEX3[1]=1; HEX3[4]=1;
if(~SW0&&~SW1&&SW2&&~SW3&&~SW4)
nextstate = state1;
else if(~SW0&&~SW1&&~SW2&&~SW3&&SW4)
nextstate = start;
else
nextstate=state3;
end
endcase
endmodule
答案 0 :(得分:0)
检查您是否end
always
阻止,我认为您不是。并且通常会为每个语句重新检查所有end
s。此外,正确对齐代码的内容,以便更好地澄清和发现此类错误(一般建议)。
答案 1 :(得分:0)
我在你的代码中看到了2个问题
always @ (posedge KEY0 or posedge SW0)
没有相应的begin
或end
always @(*)
与end
没有对应的begin
。它应该在endcase
是的,适当的缩进始终有助于识别此类错误。一般来说,您应该始终从一开始就引入begin
- end
(在需要的地方),然后在两者之间插入代码。