这个verilog程序哪错了啊?

来源:百度知道 编辑:UC知道 时间:2024/06/03 17:15:51
我做的是当接收到1110010时输出1,综合的时候没错,但是仿真的时候出错了

module er(en,p,q);
input en,p;
output reg q;
reg [2:0]A;
parameter s0 =3'b000,s1 = 3'b001,s2=3'b010,s3=3'b011,s4=3'b100,s5=3'b101,s6=3'b110;
always @(p or en)
begin
if(en)
case(A)
s0: begin if(p==1)begin A= s1;q=0; end else A=s0; end
s1: begin if(p==1)begin A= s2;q=0; end else A=s0; end
s2: begin if(p==1)begin A= s3;q=0; end else A=s0; end
s3: begin if(p==0)begin A= s4;q=0; end else A=s0; end
s4: begin if(p==0)begin A= s5;q=0; end else A=s0; end
s5: begin if(p==1)begin A= s6;q=0; end else A=s0; end
s6: begin if(p==0)begin A= s0;q=1; end else A=s0; end
default: begin A=s0;q=0;end
endcase
end

endmodule

你的问题在于always@(p or en),这个always快只有当p或者en的值改变的时候才会被激活,所以当输入是连续的1或者0的时候,这个always块不会激活,状态也就不会改变了。
所以输出永远不可能达到1

建议改为时钟驱动。

可能是你没有给对EN的值,你要让EN在0和1之间切换否则可能导致无法让状态机运行(由于要EN或者P变化你的状态机才动),我建议你采用时钟驱动。