
设计一个状态机,我用Verilog语言编写的程序如下: 但编译不了,有哪些错误啊,求高手指教
moduleSellmachine(X,Y,S1,S2,S3,S4,CAN,CLK,RETURN,Now);inputX,Y,S1,S2,S3,S4,CAN,CLK;ou...
module Sellmachine(X,Y,S1,S2,S3,S4,CAN,CLK,RETURN,Now);
input X,Y,S1,S2,S3,S4,CAN,CLK;
output [2:0] RETURN,Now;
parameter [2:0] INIT=3'b000,
A=3'b001,
B=3'b010,
C=3'b011,
D=3'b100,
RECORD=3'b101;
reg [2:0] P,S,REG,Now,Next,RETURN;
always @ (posedge CLK)
Now<=Next;
always @ (X or Y or S1 or S2 or S3 or S4)
begin
if((X==0)&&(Y==0))
P=3'b000;
else if((X==1)&&(Y==0))
P=3'b001;
else if((X==0)&&(Y==1))
P=3'b010;
else if((S1|S2|S3|S4)==0)
S=3'b000;
else if((S1==1)&&(S2==0)&&(S3==0)&&(S4==0))
S=3'b001;
else if((S1==0)&&(S2==1)&&(S3==0)&&(S4==0))
S=3'b010;
else if((S1==0)&&(S2==0)&&(S3==1)&&(S4==0))
S=3'b011;
else if((S1==0)&&(S2==0)&&(S3==0)&&(S4==1))
S=3'b100;
end
always @ (X or Y or S1 or S2 or S3 or S4)
if(CAN==0)
case(Now)
INIT:begin if((S1|S2|S3|S4)==0)
begin Next=RECORD;
REG=P;
RETURN=3'b000;
end
else if((X==1)&&(Y==0)&&(S1==1)&&(S2==0)&&(S3==0)&&(S4==0))
begin Next=A;
RETURN=P-S;
end
if((X==0)&&(Y==1)&&(S1==1)&&(S2==0)&&(S3==0)&&(S4==0))
begin Next=A;
RETURN=P-S;
end
else begin Next=INIT;
RETURN=3'b000;
end
end
default: begin Next=INIT;
RETURN=3'b000;
REG=3'b000;
end
endcase
else begin RETURN=P;
Next=INIT;
end
endmodule 展开
input X,Y,S1,S2,S3,S4,CAN,CLK;
output [2:0] RETURN,Now;
parameter [2:0] INIT=3'b000,
A=3'b001,
B=3'b010,
C=3'b011,
D=3'b100,
RECORD=3'b101;
reg [2:0] P,S,REG,Now,Next,RETURN;
always @ (posedge CLK)
Now<=Next;
always @ (X or Y or S1 or S2 or S3 or S4)
begin
if((X==0)&&(Y==0))
P=3'b000;
else if((X==1)&&(Y==0))
P=3'b001;
else if((X==0)&&(Y==1))
P=3'b010;
else if((S1|S2|S3|S4)==0)
S=3'b000;
else if((S1==1)&&(S2==0)&&(S3==0)&&(S4==0))
S=3'b001;
else if((S1==0)&&(S2==1)&&(S3==0)&&(S4==0))
S=3'b010;
else if((S1==0)&&(S2==0)&&(S3==1)&&(S4==0))
S=3'b011;
else if((S1==0)&&(S2==0)&&(S3==0)&&(S4==1))
S=3'b100;
end
always @ (X or Y or S1 or S2 or S3 or S4)
if(CAN==0)
case(Now)
INIT:begin if((S1|S2|S3|S4)==0)
begin Next=RECORD;
REG=P;
RETURN=3'b000;
end
else if((X==1)&&(Y==0)&&(S1==1)&&(S2==0)&&(S3==0)&&(S4==0))
begin Next=A;
RETURN=P-S;
end
if((X==0)&&(Y==1)&&(S1==1)&&(S2==0)&&(S3==0)&&(S4==0))
begin Next=A;
RETURN=P-S;
end
else begin Next=INIT;
RETURN=3'b000;
end
end
default: begin Next=INIT;
RETURN=3'b000;
REG=3'b000;
end
endcase
else begin RETURN=P;
Next=INIT;
end
endmodule 展开
1个回答
展开全部
大致看了下,具体的没细看,你这里面有很明显的错误就是,你的状态机里面用的是阻塞赋值,尝试非阻塞赋值看看,那样应该就没什么问题了,即将“=”改为“<=”
更多追问追答
追问
编译的时候显示有致命的错误,如下,难道逻辑有问题?
追答
你写的有点混乱,最好能将第一个always @ (X or Y or S1 or S2 or S3 or S4)块和第二个always @ (X or Y or S1 or S2 or S3 or S4)块放在一起,而且要有周期的概念,你写的是状态机,不是组合逻辑,PS的值有先后之分的,你写的我是没怎么看懂的
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询