演算回路 花泉研究室 伏木 厳穣 今回扱う演算回路 ・加算回路 ・減算回路 ・定数加算回路 ・バレル・シフタ ・乗算回路 をHDLを用いて記述する 加算回路 cin a q b cout module adder( a, b, q, ); input [3:0] a, b; output [3:0] q; assign q = a + b; endmodule 1章 図1.4(b) 加算演算子による桁上げ入出力付き加算回路 module addca( a, b, cin, q, cout ); input [3:0] a, b; input cin; output [3:0] q; output cout; assign { cout, q } = a + b + cin; endmodule 1章で示されたものとは違い入出力に 桁上がりが付加されてる。 得られた出力のうち、最上 位ビットをcoutとし、残り4 ビットを出力qとなる。 フルアダー呼び出しによる加算回路 module addca_ripple( a, b, cin, q, cout); input [3:0] a, b; input cin; output [3:0] q; output cout; wire [2:0] ca; fulladd2 fulladd2 fulladd2 fulladd2 add0 add1 add2 add3 endmodule ( ( ( ( a[0], a[1], a[2], a[3], b[0], b[1], b[2], b[3], cin, ca[0], ca[1], ca[2], q[0], q[1], q[2], q[2], CIN A B ca[0] ca[1] ca[2] ca[3] ); ); ); ); Q COUT module fulladd2( A, B, CIN, Q, COUT ); input A, B, CIN output Q, COUT; assign { COUT, Q } = A + B + CIN; endmodule フルアダーを4個並べれば、4ビット加算回路を実現することが出来る 減算回路 1、加算回路と全く同様の処理手順でプログラムの加 算の部分を減算にしたもの 2、加算回路を用いた減算回路。つまり反転させた値 を加算することにより減算を実現させる。 a+(-b)=a-b この方法を用いる際の約束事 ・-bの表現 -b→ ~b + 1’b1 ・cinを1に固定し、使用しないcoutはdumyを宣言し、 出力する(使用しない) 定数加算回路 入力に対し定数を加算した後に出力する回路 テキストでは加算される定数を”5”とし、回路HDL記 module add _const( a, q ); 述の例を示している。 input output 4 +5 a q 4 [3:0] [3:0] a; q; parameter CON = 4’h5; assign q = a + CON; endmodule Parameterを宣言することによって定数を設定 フルアダー呼び出しをによる4ビット定数加算 module add_const_ripple( a, q); input [3:0] a; output [3:0] q; wire [3:0] cout; wire fulladd fulladd fulladd fulladd [3:0] add0 add1 add2 add3 endmodule 固定されたネット信号を定 数とみなし CON = 4’h5; ( a[0], CON[0], 1’b0, q[0], cout[0] ( a[1], CON[1], cout[0], q[1], cout[1] ( a[2], CON[2], cout[1], q[2], cout[2] ( a[3], CON[3], cout[2], q[3], cout[3] ); ); ); ); 1ビット毎に分解して、 フルアダーへ入力 バレル・シフタ 8ビットの入力をsftの値に設定されたビット数だけ左 側へシフトさせる回路 クロックを必要とせず入力を定めればすぐに出力が 得られる シフトによって生じた下位ビットには自動的に“0”が 詰められる 10110101 左へ3ビット 10110101000 シフトした3ビット分0を詰める バレル・シフタHDL記述 module barrel ( din, sft, dout ); input [7:0] din; input [2:0] sft ; output [7:0] dout; assign dout = din << sft ; endmodule 8ビット程度ならこのシフト演算子を用 いることにより簡単にシフト回路を実 現できるが対象が16や32ビットの際 にはセレクタなどを用いるべき 乗算回路 4 a q 4 b 8 module multi ( a, b, q ); input [3:0] a, b; output [7:0] q; assign q = a * b; endmodule 4ビット2入力(a,b)の乗算を8ビットの出力(q)で行う。 乗算演算子を用いた記述 assign q = a * b ; を論理合成することも可能だが、回路規模の縮小や動作の 高速化の点からすると、別のコンパイルド・セルを準備した ほうがよい。 4.6 4.7 4.8 4.9 比較回路 組み合わせ回路で作るROM 3ステート信号の記述 組み合わせ回路の論理合成 花泉研究室 修士1年 李 文皓 4.6 比較回路 比較回路とは、二つの入力の大小や一致を比較する回路である。 (a) 大小比較回路 (b) 一致比較回路 a>b a=b 8 8 8 a a_eq_b b // 大小比較 module comp_GT( a, b, a_gt_b ); input [7:0] a, b ; output a_gt_b; 8 比較回路の本体 a a_eq_b b // 一致比較 module comp_EQ( a, b, a_gt_b ); input [7:0] a, b ; output a_gt_b; assign a_gt_b = (a > b ) ? 1’b1: 1’b0; assign a_gt_b = (a == b ) endmodule endmodule 関係演算や等号演算の結果は、“真”なら“1”、偽なら“0”の1ビットの値を返す これをそのまま出力に代入する。 1 4.7 組み合わせ回路で作るROM 4 addr data 8 回路図 組み合わせ回路で作るROMの理由 回路規模が少ない タイミング上の制約が少ない 欠点 大きなROMを、この方法は 現実ではない // 組み合わせ回路で作るROM module rom( addr, data ); input [3:0] addr ; output [7:0] data; function [7:0] romout; input [3:0] addr; case( addr ) 4’d0 : romout= 8’d0 4’d1 : romout= 8’d1; 4’d2 : romout= 8’d4; 4’d3 : romout= 8’d9; 4’d4 : romout= 8’d16; 4’d5 : romout= 8’d25; 4’d6 : romout= 8’d36; 4’d7 : romout= 8’d49; 4’d8 : romout= 8’d64; 4’d9 : romout= 8’d81; 4’d10 : romout= 8’d100; 4’d11 : romout= 8’d121; 4’d12: romout= 8’d144; 4’d13: romout= 8’d169; 4’d14: romout= 8’d225; 4’d15: romout= 8’hxx; endcase endfunction assign data = romout ( addr ) ; endmodule 2 4.6 3ステート信号の記述 論理回路によるシステムでは、3ステートのバス信号がよく用いられる。 3ステート出力には、出力を制御する入力(enable)がある。 動作 “1”:バッファとして動作する “0”:出力が高いインピーダンスとなる (a) 3ステート出力 enable bus 8 8 DOUT module tri_out( DOUT,… ); output [7:0] DOUT; … wire [7:0] bus; assign DOUT = ( enable ) ? bus: 8’hzz; … edmodule enable 信号が“1”ならbusの内容をDOUTに出力し、 “0”ならば出力を高インピーダンス(8’hzz)にする。 3 (b) 双方向出力 enable bus 8 8 DIO 8 module tri_io( DIO, … ); inout [7:0] DIO ; … wire [7:0] bus; reg [7:0] din; always @( posedge ck ) begin din <= DIO; … end assign DIO = ( enable ) ? bus: 8’hzz; … endmodule DIOに対する出力の制御は、3ステ ート出力と同じ、入力として用いる場 合は単純にDIO信号を記述の中の 信号として扱うだけ レジスタ信号dinは、入出力端子DIOが 入力のときの入力レジスタである。DIO 端子の値をつねにdinレジスタに取り 込んでいる。 4 (c) 内部3ステート・バス enable1 bus1 enable2 bus2 enable3 bus3 8 8 8 8 8 内部3ステート・バスdbusは 信号は外部に出力されない ため、inout宣言が不要であ る。これ以外双方向端子と同 じである wire [7:0] dbus; assign dbus = ( enable1 ) ? Bus1: 8’hzz; assign dbus = ( enable1 ) ? Bus1: 8’hzz; assign dbus = ( enable1 ) ? Bus1: 8’hzz; 5 4.9 組み合わせ回路の論理合成 case文による4to1セレクタを論理合成した結果 // case文による4to1セレクタ module sel4to1_case( in, sel, out ) input [3:0] in; input [1:0] sel; output out; function select; input [3:0] in; input [1:0] sel; case ( sel ) 0: select= in[0]; 1: select= in[1]; 2: select= in[2]; 3: select= in[3]; endcase endfunction assign out = select ( in, sel ) endmodule AND-NOR による2 to 1セレクタを2段積み 上げて4 to1セレクタを作成する。 6 for文によるエンコーダを論理合成した結果 // for文によるエンコーダ module encoder_for( din, dout ); input [7:0] din; onput [2:0] dout; function [2:0] enc; input [7:0] din; integer i ; begin: LOOP enc = 0; for ( i=7; i>=0; i=i-1) if ( din [i] ) begin enc = i ; disable LOOP; end end endfunction assign dout = enc ( din ); endmodule 7 第5章 順序回路のHDL記述 5.1 非同期フリップフロップ 5.1.1 SRフリッププロップ SR(セットリセット)フリップフロップは入力端子S、リセット端子R、出力端子 Q、Qバー(QのNOT)を有している SRフリップフロップは端子S、Rをともに0とすると、出力端子Qは以前の状態 を維持する。端子Sを0、端子Rを1とすると、端子Qは0となる、端子Sを1、端 子Rを0とすると、端子Qは1となる、端子S、Rがともに1となるのは禁止とされ ている。 図5.1 SRフリッププロップ SB Q RB QB (a) 回路図 真理値表 命題A 真 真 偽 偽 (b) プリミティブ・ゲートによる 命題B A NAND B 真 偽 偽 真 真 真 偽 真 Verrilog HDL記述 真 真 偽 偽 真 偽 真 真 (c) 論理式によるVerrilog HDL記述 5.1.2 Dラッチ 図5.2 Dラッチ D Q G ‘1’:入力Dから出力Qへデータが筒抜け ‘0’:入力Gが‘0’になる直前の入力値Dの値を保持し、 Qに出力となる (a) 回路図 Gが1のとき出力Qに入力Dの値が伝わる (b) Verilog HDL記述 Gが0のとき出力Qは変化しない 5.1.3 Dフリップフロップ 図5.3 Dフリッププロップ D Q CK (a) 回路図 クロックの立ち上がりにDからQへ代入 クロックの立ち上がりにDからQへ代入 それ以外Qは変化しない (b) Verilog HDL記述 5.1.4 非同期セット/リセット付きDフリップフロップ 図5.4 非同期セット/リセット付きDフリッププロップ D SB CK Q QB RB (a) 回路図 (b) Verilog HDL記述 CKの立ち上がり、RB、SBの立下りの動作条件で、リセッ トRBを最優先、セットSB、入力Dの順で記述し実行する RBが0のときQに0を代入し実行、 SBが0のときQに1を代入し実行、 それ以外QにDを代入し実行。 出力QBはQの反転出力 RBが0なので、Q は0 出力QBはQの反転出力 RBが0ではない、実行優先順位 がSBに移る、SBが0なのでQは1 RBが0ではない、SBが0ではない、 クロックの立ち上がりでDからQは 代入が実行される 5.1.5 非同期セット/リセット付きJKフリップフロップ 図5.5 非同期セット/リセット付きJKフリッププロップ J (a) 回路図 SB (b) Verilog HDL記述 Q CK K RB J 0 0 1 1 K 0 1 0 1 Q Q(保持) 0 1 Q(反転) CKの立ち上がり、RB、SBの立下りの動作条件で リセットRBを最優先、セットSB、case({J,K})の順で記述し実行行う 表5.1 JKフリップ RBが0のときQに0を代入実行、SBが0のときQに1を代入実行、 プロップ基本動作 それ以外caseを実行。 RBが0なので、Qは0 RBが0ではない、実行優先順位がSBに移る、 SBが0なのでQは1 RBが0ではない、SBが0ではない、クロックの立ち上がりで caseが実行される、表5.1よりJが1Kが0のときQが1、Qは0と なる次のクロックの立ち上がりまで維持 5.1.6 非同期セット/リセット付きJKフリップフロップ 図5.6 非同期リセット付きTフリッププロップ RB CK (b) Verilog HDL記述 Q (a) 回路図 RBが立下りのとき、Qはリセットされる、 RBが立ち上がり、クロックが立ち上がり したときQは反転 RBが0なので、Qは0 RBが0ではない、実行優先順位がCKに移る、Qは反転する 5.2 同期型フリップフロップ 荻原 5.2.1 同期SRフリップフロップ モジュール宣言 入出力宣言 Always文(Qを決 定) クロックの立ち上がりでの動作を記述 クロックが立ち上がった時の「RB」、 「SB」それぞれの値で「Q」の値が決ま る。 「RB」、「SB」が同時に“0”の時は 「RB」を優先させる。 assign文(QBを決定) 5.2.2 同期セット/リセット付きDフリップフロップ モジュール宣言 入出力宣言 Always文(Qを決 定) クロックの立ち上がりでの動作を記述 信号の優先順位が 「RB > SB > LD」 となる。 assign文(QBを決定) 5.2.3 同期セット/リセット付きJKフリップフロップ モジュール宣言 入出力宣言 Always文(Qを決 定) クロックの立ち上がりでの動作を記述 信号の優先順位が 「RB > SB > {J,K}」 となる。 5.2.4 同期リセット付きTフリップフロップ モジュール宣言 入出力宣言 Always文(Qを決 定) クロックの立ち上がりでの動作を記述 信号の優先順位が 「RB > EN」 となる。 5.2.5 同期設計用フリップフロップの構成 モジュール宣言 入出力宣言 Always文(Qを決 定) クロックの立ち上がりでの動作を記述 信号の優先順位が 「RES > LD」 となる。
© Copyright 2025 ExpyDoc