SparkRoad FPGAによる小型プログラム実装(1)

演習問題出处:《搭建你的数字积木——数字电路与逻辑设计》第3章 3.7練習問題

1.グレイコード変換

8ビット2進数からグレイコードへの基数変換を実装する。FPGAによる検証を行う。

実装:

グレイコードへの変換は、隣接するビット同士の排他的論理和(XOR)演算によって実現できる。i番目のグレイコードビットは、2進数のi番目と(i+1)番目ビットのXORとして計算される。最上位ビットはそのまま保持される。

module binary_to_gray (
    input [7:0] binary_data,
    output [7:0] gray_code
);

    assign gray_code[0] = binary_data[1] ^ binary_data[0];
    assign gray_code[1] = binary_data[2] ^ binary_data[1];
    assign gray_code[2] = binary_data[3] ^ binary_data[2];
    assign gray_code[3] = binary_data[4] ^ binary_data[3];
    assign gray_code[4] = binary_data[5] ^ binary_data[4];
    assign gray_code[5] = binary_data[6] ^ binary_data[5];
    assign gray_code[6] = binary_data[7] ^ binary_data[6];
    assign gray_code[7] = binary_data[7];

endmodule

本実装では、各出力を個別にassign文で記述しているが、パラメータ化された汎用的なモジュール設計も検討に値する。入力ビット幅をパラメータとして受け取ることで、異なるビット幅に対応可能なモジュールが実現可能である。

ピンアサインメント:

set_pin_assignment { binary_data[0] } { LOCATION = P8; }
set_pin_assignment { binary_data[1] } { LOCATION = N6; }
set_pin_assignment { binary_data[2] } { LOCATION = P6; }
set_pin_assignment { binary_data[3] } { LOCATION = M6; }
set_pin_assignment { binary_data[4] } { LOCATION = T6; }
set_pin_assignment { binary_data[5] } { LOCATION = T5; }
set_pin_assignment { binary_data[6] } { LOCATION = R5; }
set_pin_assignment { binary_data[7] } { LOCATION = T4; }
set_pin_assignment { gray_code[0] } { LOCATION = P5; }
set_pin_assignment { gray_code[1] } { LOCATION = N5; }
set_pin_assignment { gray_code[2] } { LOCATION = P4; }
set_pin_assignment { gray_code[3] } { LOCATION = M5; }
set_pin_assignment { gray_code[4] } { LOCATION = N4; }
set_pin_assignment { gray_code[5] } { LOCATION = N3; }
set_pin_assignment { gray_code[6] } { LOCATION = M4; }
set_pin_assignment { gray_code[7] } { LOCATION = M3; }

検証結果:

入力値8'b11010110に対して、出力は8'b10111101となる。LED表示については、点灯状態を「0」、消灯状態を「1」として解釈する。


2.2重優先エンコーダ

2重優先エンコーダは、最高優先度と次最高優先度の要求コードを 반환する。入力として16ビットreq要求信号と2ビット優先度エンコード信号を受け取り、4ビット優先度コードと4ビット次優先度コードを出力する。

動作解析:

通常の優先エンコーダは、入力のうち最も高い位置の「1」のみを検出し、その位置番号を出力する。一方、2重優先エンコーダは、入力に含まれる上位2つの「1」の位置を同時に検出する。

例えば、入力[7:0]が8'b01011010の場合、第7ビットは「0」、第6ビットは「1」、第5ビットは「0」となる。この場合、最高優先度は「6」、次最高優先度は「4」として出力される。

入力が1ビットのみの場合は、当該ビットが最高優先度となり、次優先度は「7」が出力される(入力が2ビット以上の場合、次優先度が「7」となることは論理的にあり得ない)。

真理値表:

実装にあたっては、alwaysブロック内のcase文を用いた多方向分岐処理を習得する必要がある。


4.コンパレータ回路

if-else文の代わりにcase文を使用して、2ビット数値の大小比較回路を実装する。

実装:

2つの2ビット数値を比較し、大なり、等しい、小なりの3つの結果をcase文を用いて判定する。入力信号を連結して4ビット幅のベクトル化し、case条件として評価することで、簡潔かつ効率的な記述が可能となる。

module comparator_2bit (
    input [1:0] value_a,
    input [1:0] value_b,
    output reg greater,
    output reg equal,
    output reg less
);

    always @(*) begin
        case ({value_a, value_b})
            4'b0001, 4'b0010, 4'b0011,
            4'b0110, 4'b0111, 4'b1011: less = 1'b1;
            4'b0100, 4'b1000, 4'b1001,
            4'b1100, 4'b1101, 4'b1110: greater = 1'b1;
            4'b0000, 4'b0101, 4'b1010,
            4'b1111: equal = 1'b1;
            default: begin
                less = 1'b0;
                greater = 1'b0;
                equal = 1'b0;
            end
        endcase
    end

endmodule

default句を追加することで、網羅性(コンプリートケース)を担保し、意図しない出力状態的发生を防いでいる。

ピンアサインメント:

set_pin_assignment { value_a[0] } { LOCATION = R5; }
set_pin_assignment { value_a[1] } { LOCATION = T4; }
set_pin_assignment { value_b[0] } { LOCATION = T6; }
set_pin_assignment { value_b[1] } { LOCATION = T5; }
set_pin_assignment { greater } { LOCATION = M3; }
set_pin_assignment { equal } { LOCATION = M4; }
set_pin_assignment { less } { LOCATION = N3; }

ハードウェア検証においては、LED表示により比較結果を確認することができる。

タグ: FPGA Verilog SparkRoad 格雷码 グレイコード

9月28日 03:14 投稿