有一个错误实在是改不出来了,这是一个verilog语言交通灯程序,求高手帮忙,急!!

2024-12-26 23:09:51
推荐回答(3个)
回答1:

我用注释符做修改,修改如下:

module deng (S,CPB,R1,Y1,G1,R2,Y2,G2,CPA);
output R1,Y1,G1,Y2,G2,CPB,S; //R2也要输出
input CPA;
reg R1,Y1,R2,Y2,G2;
reg CPB;
reg [2:0]i;
reg [3:0]j;
reg [2:0]S;
always @ (posedge CPA)
begin
if(i==4)
begin i<=0;CPB<=1;end
else
begin
i<=i+1;CPB<=0;
end
end
always @ (posedge CPB)
begin if(j==11) //这里有j=11,下面也有,在逻辑上不建议这么写,应该把他们写在一起
begin S=3'b101;end
else if(j<4)
S=3'b000;
else if (j==4)
S=3'b001;
else if(j==5)
S=3'b010;
else if(j>5&&j<10)
S=3'b011;
else if(j==10)
S=3'b100;
else if(j==11) //j=11如果前一句满足条件了,这一句就不会执行,而且在时序逻辑中,一般用非阻塞赋值,不用阻塞赋值语句,更不能混合使用,所以建议你把这些阻塞赋值语句全部改过来。
S=3'b101;
if(j==11) //j=11这一句在逻辑上有错吧?可以和上一句写在一起,单独写在这里,和下面的else语句每次总有一个执行,而且用阻塞赋值,总是有延迟,执行的情况就不可控了
begin j<=0;end
else j<=j+1; //这句应该放在每一句j不等于11的语句中,不能单独放在这里
end

下面的这个always块中也应该使用非阻塞赋值语句
always @(S)
begin
case(S)
3'b000;
begin R1=0;Y1=0;G1=1;R2=1;Y2=0;G2=0;
end
3'b001;
begin G1=~CPA;R2=1;
end
3'b010;
begin Y1=1;G1=0;R2=1;
end
3'b011;
begin
R1=1;Y1=0;R2=0;G2=1
end
3'b100;
begin
G2=~CPA;R1=1;
end
3'b101;
begin Y2=1;G2=0;R1=1;
end
endcase
end
endmodule

总结:R2没有输出,所以有语法错误,但是在赋值中,阻塞和非阻塞赋值混合使用,可能产生意想不到的逻辑错误。一般时序逻辑用非阻塞赋值,组合逻辑用阻塞赋值。希望能帮到你。

回答2:

首先,你要搞清楚是语法错误还是逻辑错误。

回答3:

R2没有输出口