使用 2x4 解码器的 4x16 解码器无法正常工作

问题描述 投票:0回答:1

我目前正在开发一个 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 代码,尽管仔细连接了所有端口,但我没有得到预期的输出。任何帮助识别问题并提供解决方案的帮助将不胜感激。

verilog system-verilog fpga modelsim decoder
1个回答
0
投票

在调试有问题的模拟时,您还应该查看内部信号的波形。将值显示到输出文件/控制台通常是不够的。

当我查看

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
© www.soinside.com 2019 - 2024. All rights reserved.