我有一个关于T-Bird尾灯的示例代码,它将状态传递给下一个模块。我修改了它不必通过状态的代码,但似乎输出没有改变(一直保持000)
这是我修改过的代码:
module TBird(E,B,L,R,int_clk,L_Light,R_Light);
input E,B,L,R,int_clk;
output [2:0] L_Light;
output [0:2] R_Light;
reg [19:0] C;
wire int_clk;
One_Side U1 (E,B,R,int_clk,R_Light);
One_Side U2 (E,B,L,int_clk,L_Light);
endmodule
module One_Side(e,b,t,clk,light_eb);
input e,b,t,clk;
output reg [2:0] light_eb=3'b000;
always @(posedge clk or e or b or t)
begin
case ({e,b,t})
3'b000: light_eb=3'b000;
3'b0?1: begin
if (light_eb==3'b000) begin
light_eb=3'b001;
end else if (light_eb==3'b001) begin
light_eb=3'b011;
end else if(light_eb==3'b011) begin
light_eb=3'b111;
end else begin
light_eb=3'b000;
end
end
3'b?10: light_eb=3'b111;
3'b10?: begin
if (light_eb!==(3'b000|3'b111)) begin
light_eb=3'b000;
end
light_eb=~light_eb;
end
3'b111: begin
if (light_eb==3'b000) begin
light_eb=3'b001;
end else if (light_eb==3'b001) begin
light_eb=3'b011;
end else if(light_eb==3'b011) begin
light_eb=3'b111;
end else begin
light_eb=3'b000;
end
end
endcase
end
endmodule
我有一些Java经验,但我对verilog一无所知,所以我甚至不知道哪里出错(在Java中,eclipse有断点和调试器等等, )任何建议/建议表示赞赏。
答案 0 :(得分:1)
测试平台和设计中的一些错误。列出如下:
未提供任何时钟信号切换。因此,不会检测到任何posedge
时钟。有许多生成时钟的方法,其中一种方法如下:
always #5 clk = ~clk;
在设计中使用reset
信号是一种很好的做法。从testbench应用重置,将设计中的所有i 内部寄存器设置为初始值。
重要最重要的是你没有为设计提供任何输入激励。必须应用任何随机刺激才能获得输出。您必须提供一些输入才能获得输出,因此您的输出为x
。
initial
begin
forever
begin
#6;
E = $random;
B = $random;
R = $random; // and so on...
end
end
在设计中使用非阻塞(< =)赋值是一种很好的编码习惯。此外,不要混合阻止(=)和非阻止(< =)分配。
a = b; // never use this in sequential circuit.
a<= b; // use this in sequential circuit.
我为您的设计制作了一个有点有效的测试平台,看一下EDAPlayground链接。