0

Verilog とそのテストを使用して 4x16 デコーダーを実装しました。いずれの場合も、デコーダは 1 つのビットのみが高い 16 ビットの数字を出力する必要があります。プログラムを実行すると、必要なすべての出力を得ることができません。Decoder とテストのコード、およびコンソールでの出力は次のとおりです。

4x16 デコーダー:

module Decoder4x16 (input [3:0] select, input enable, output reg [16:0] out);

always @(select, enable)
begin

    if(enable == 1'b0)
        out = 16'b0000000000000000;
    else if(enable == 1'b1)
        if(select == 4'b0000)
            out <= 16'b0000000000000001;
        else if(select == 4'b0001)
            out <= 16'b0000000000000010;
        else if(select == 4'b0010)
            out <= 16'b0000000000000100;
        else if(select == 4'b0011)
            out <= 16'b0000000000001000;
        else if(select == 4'b0100)
            out <= 16'b0000000000010000;
        else if(select == 4'b0101)
            out <= 16'b0000000000100000;
        else if(select == 4'b0110)
            out <= 16'b0000000001000000;
        else if(select == 4'b0111)
            out <= 16'b0000000010000000;
        else if(select == 4'b1000)
            out <= 16'b0000000100000000;
        else if(select == 4'b1001)
            out <= 16'b0000001000000000;
        else if(select == 4'b1010)
            out <= 16'b0000010000000000;
        else if(select == 4'b1011)
            out <= 16'b0000100000000000;
        else if(select == 4'b1100)
            out <= 16'b0001000000000000;
        else if(select == 4'b1101)
            out <= 16'b0010000000000000;
        else if(select == 4'b111)
            out <= 16'b0100000000000000;
        else if(select == 4'b1111)
            out <= 16'b1000000000000000;
    end

endmodule

テスト:

module Decoder4x16_test;

reg [3:0] select;
reg enable;
wire [16:0] out;

parameter sim_time = 2800;

Decoder4x16 decoder(select, enable, out);
initial #sim_time $finish;
initial
begin
    select = 4'b0000;
    enable = 1'b0;

    repeat(16) #10 begin
        enable = 1'b1;
        #85 $display("select = %b \t out = %b", select, out);
        select = select + 4'b0001;
    end
end
endmodule

プログラムを実行すると、入力が 1101 であるテスト ケースに到達するまで、正しい出力が出力されます。その後、デコーダーは、表示するはずの間違った値を出力します。出力は次のとおりです。

select = 0000    out = 00000000000000001
select = 0001    out = 00000000000000010
select = 0010    out = 00000000000000100
select = 0011    out = 00000000000001000
select = 0100    out = 00000000000010000
select = 0101    out = 00000000000100000
select = 0110    out = 00000000001000000
select = 0111    out = 00000000010000000
select = 1000    out = 00000000100000000
select = 1001    out = 00000001000000000
select = 1010    out = 00000010000000000
select = 1011    out = 00000100000000000
select = 1100    out = 00001000000000000
select = 1101    out = 00010000000000000
select = 1110    out = 00010000000000000
select = 1111    out = 01000000000000000
4

2 に答える 2

4

この簡単なコードを試してください。

module Decoder4x16 (input [3:0] select, 
                    input enable, 
                    output wire [16:0] out);

assign out = {17{enable}} & (1'b1 << select);

endmodule

ISEでも合成。

于 2016-03-18T04:44:39.907 に答える
4

ここで、outは、割り当てられた値を保持regすることを意味します。に条件はありません。したがって、は からの以前の値を保持または保持します。つまり、表示される値を保持します。else ifselect=4'b1110out select=4'b1101out00010000000000000

したがって、条件を追加すると、コードは正常に機能します。else ifselect=4'b1110

  else if(select == 4'b1110)
            out <= 16'b0100000000000000;

また、デコーダは純粋な組み合わせ回路です。組み合わせロジックを作成するときは、ブロッキング代入( =) を使用することをお勧めします。したがって、次の構文を使用します。

  else if(select == 4'b1110)
            out = 16'b0100000000000000; // blocking

もう 1 つ詳しくalways@(*)説明すると、手動のSensitivity listの代わりに使用します。これは、機密リストの混乱を減らすのに役立ちます。

于 2016-03-18T04:14:16.153 に答える