我目前正在开发一个 Verilog 项目,尝试使用 2x4 解码器运行 4x16 解码器的测试平台。但是,我遇到了输出问题。我提供了下面的代码,并且我相信我已经正确连接了所有端口。如果有人可以帮助我识别和解决问题,并可能解释问题,我将不胜感激。
代码:
module decoder4x16_with_2x4(Y, d, e);
output [15:0] Y;
input [3:0] d;
input e;
wire [3:0] w;
decoder2_to_4 De0(.F({w[3],w[2],w[1],w[0]}), .i({d[1],d[0]}), .e(e)),
De1(.F({Y[3],Y[2],Y[1],Y[0]}), .i({d[3],d[2]}), .e(w[0])),
De2(.F({Y[7],Y[6],Y[5],Y[4]}), .i({d[3],d[2]}), .e(w[1])),
De3(.F({Y[11],Y[10],Y[9],Y[8]}), .i({d[3],d[2]}), .e(w[2])),
De4(.F({Y[15],Y[14],Y[13],Y[12]}), .i({d[3],d[2]}), .e(w[3]));
endmodule
module decoder4x16_with_2x4_tb();
reg [3:0] i;
wire [15:0] f;
decoder4x16_with_2x4 muxi(.Y(f), .d(i), .e(1'b1));
initial begin
$monitor("d = %b --> Y = %b", i, f);
repeat(10) begin
i = $random; #1;
end
end
endmodule
module decoder2_to_4(F, i, e);
output reg [3:0] F;
input [1:0] i;
input e;
always@(i) begin
if (e == 1'b1) begin
case(i)
2'b00 : F = 4'b0001;
2'b01 : F = 4'b0010;
2'b10 : F = 4'b0100;
2'b11 : F = 4'b1000;
default : $display("Invalid data received!!");
endcase
end
else begin
F = 1'b0;
end
end
endmodule
测试台输出:
# d = 0100 --> Y = 0000000000000000
# d = 0001 --> Y = 0000000000000001
# d = 1001 --> Y = 0000000001000000
# d = 0011 --> Y = 0000000000010000
# d = 1101 --> Y = 1000000000000000
# d = 0101 --> Y = 0000000000100000
# d = 0010 --> Y = 0000000000010000
# d = 0001 --> Y = 0000000000010000
# d = 1101 --> Y = 0000000010000000
描述:
我已经使用了提供的 Verilog 代码,尽管仔细连接了所有端口,但我没有得到预期的输出。任何帮助识别问题并提供解决方案的帮助将不胜感激。
在调试有问题的模拟时,您还应该查看内部信号的波形。将值显示到输出文件/控制台通常是不够的。
当我查看
decoder2_to_4
实例的波形时,我发现它运行正常。由于您的测试台中的端口连接也是正确的,因此我得出的结论是您在 decoder4x16_with_2x4
模块中的某个地方犯了错误。那里有很多端口连接,因此您需要将这些代码连接与您拥有的任何原理图模型进行比较。
更好的方法是在更高的抽象级别对设计进行建模。您应该使用行为建模,而不是尝试连接基本块的实例。这是一个完整的代码示例,显示了预期的输出:
module decoder4x16_with_2x4(Y, d, e);
output reg [15:0] Y;
input [3:0] d;
input e;
always @* begin
for (int i=0; i<16; i++) begin
Y[i] = e & (d == i);
end
end
endmodule
module decoder4x16_with_2x4_tb();
reg [3:0] i;
wire [15:0] f;
decoder4x16_with_2x4 muxi(.Y(f), .d(i), .e(1'b1));
initial begin
$monitor("d = %02d --> Y = %b", i, f);
repeat(10) begin
i = $random; #1;
end
end
endmodule
输出:
d = 04 --> Y = 0000000000010000
d = 01 --> Y = 0000000000000010
d = 09 --> Y = 0000001000000000
d = 03 --> Y = 0000000000001000
d = 13 --> Y = 0010000000000000
d = 05 --> Y = 0000000000100000
d = 02 --> Y = 0000000000000100
d = 01 --> Y = 0000000000000010
d = 13 --> Y = 0010000000000000