370 likes | 675 Views
演算回路. 花泉研究室 伏木 厳穣. 今回扱う演算回路. ・加算回路 ・減算回路 ・定数加算回路 ・バレル・シフタ ・乗算回路. を HDL を用いて記述する. 加算回路. module adder( a, b, q, ); input [3:0] a, b; output [3:0] q; assign q = a + b; endmodule. cin. q. a. cout. b. 1 章 図 1.4(b). 1 章で示されたものとは違い入出力に桁上がりが付加されてる。.
E N D
演算回路 花泉研究室 伏木 厳穣
今回扱う演算回路 ・加算回路 ・減算回路 ・定数加算回路 ・バレル・シフタ ・乗算回路 をHDLを用いて記述する
加算回路 module adder( a, b, q, ); input [3:0] a, b; output [3:0] q; assign q = a + b; endmodule cin q a cout b 1章 図1.4(b) 1章で示されたものとは違い入出力に桁上がりが付加されてる。 加算演算子による桁上げ入出力付き加算回路 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 得られた出力のうち、最上位ビットを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 add0 ( a[0], b[0], cin, q[0], ca[0] ); fulladd2 add1 ( a[1], b[1], ca[0], q[1], ca[1] ); fulladd2 add2 ( a[2], b[2], ca[1], q[2], ca[2] ); fulladd2 add3 ( a[3], b[3], ca[2], q[2], ca[3] ); endmodule CIN Q module fulladd2( A, B, CIN, Q, COUT ); input A, B, CIN output Q, COUT; assign { COUT, Q } = A + B + CIN; endmodule A COUT B フルアダーを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 [3:0] a; output [3:0] q; parameter CON = 4’h5; assign q = a + CON; endmodule +5 4 4 a q Parameterを宣言することによって定数を設定
フルアダー呼び出しをによる4ビット定数加算フルアダー呼び出しをによる4ビット定数加算 固定されたネット信号を定数とみなし module add_const_ripple( a, q); input [3:0] a; output [3:0] q; wire [3:0] cout; wire [3:0] CON = 4’h5; fulladd add0 ( a[0], CON[0], 1’b0, q[0], cout[0] ); fulladd add1 ( a[1], CON[1], cout[0], q[1], cout[1] ); fulladd add2 ( a[2], CON[2], cout[1], q[2], cout[2] ); fulladd add3 ( a[3], CON[3], cout[2], q[3], cout[3] ); endmodule 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 module multi ( a, b, q ); input [3:0] a, b; output [7:0] q; assign q = a * b; endmodule 8 q 4 b 4ビット2入力(a,b)の乗算を8ビットの出力(q)で行う。 乗算演算子を用いた記述 assign q = a * b ; を論理合成することも可能だが、回路規模の縮小や動作の高速化の点からすると、別のコンパイルド・セルを準備したほうがよい。
4.6 比較回路4.7 組み合わせ回路で作るROM4.83ステート信号の記述4.9 組み合わせ回路の論理合成4.6 比較回路4.7 組み合わせ回路で作るROM4.83ステート信号の記述4.9 組み合わせ回路の論理合成 花泉研究室 修士1年 李 文皓
4.6 比較回路 比較回路とは、二つの入力の大小や一致を比較する回路である。 (a) 大小比較回路 (b) 一致比較回路 a>b a=b a a_eq_b b a a_eq_b b 8 8 8 8 // 大小比較 module comp_GT( a, b, a_gt_b ); input [7:0] a, b ; output a_gt_b; assign a_gt_b = (a > b ) ? 1’b1: 1’b0; endmodule // 一致比較 module comp_EQ( a, b, a_gt_b ); input [7:0] a, b ; output a_gt_b; assign a_gt_b = (a == b ) endmodule 比較回路の本体 関係演算や等号演算の結果は、“真”なら“1”、偽なら“0”の1ビットの値を返す これをそのまま出力に代入する。 1
4.7 組み合わせ回路で作る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 addr data 4 8 回路図 組み合わせ回路で作るROMの理由 回路規模が少ない タイミング上の制約が少ない 欠点 大きなROMを、この方法は 現実ではない 2
4.63ステート信号の記述 論理回路によるシステムでは、3ステートのバス信号がよく用いられる。 3ステート出力には、出力を制御する入力(enable)がある。 動作 “1”:バッファとして動作する “0”:出力が高いインピーダンスとなる (a) 3ステート出力 module tri_out( DOUT,… ); output [7:0] DOUT; … wire [7:0] bus; assign DOUT = ( enable ) ? bus: 8’hzz; … edmodule enable bus 8 8 DOUT enable 信号が“1”ならbusの内容をDOUTに出力し、 “0”ならば出力を高インピーダンス(8’hzz)にする。 3
(b) 双方向出力 enable bus 8 8 DIO 8 DIOに対する出力の制御は、3ステ ート出力と同じ、入力として用いる場 合は単純にDIO信号を記述の中の 信号として扱うだけ 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 レジスタ信号dinは、入出力端子DIOが 入力のときの入力レジスタである。DIO 端子の値をつねにdinレジスタに取り 込んでいる。 4
(c) 内部3ステート・バス enable1 bus1 8 enable2 8 8 内部3ステート・バスdbusは 信号は外部に出力されない ため、inout宣言が不要であ る。これ以外双方向端子と同 じである 8 bus2 enable3 bus3 8 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.1SRフリッププロップ 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となるのは禁止とされ ている。
SB Q QB RB 真 真 偽 真 真 偽 真 偽 図5.1SRフリッププロップ (a) 回路図 真理値表 (b) プリミティブ・ゲートによる Verrilog HDL記述 (c) 論理式によるVerrilog HDL記述
D Q G (a) 回路図 5.1.2Dラッチ 図5.2Dラッチ ‘1’:入力Dから出力Qへデータが筒抜け ‘0’:入力Gが‘0’になる直前の入力値Dの値を保持し、 Qに出力となる Gが1のとき出力Qに入力Dの値が伝わる (b) Verilog HDL記述 Gが0のとき出力Qは変化しない
D Q CK 5.1.3Dフリップフロップ 図5.3Dフリッププロップ (a) 回路図 クロックの立ち上がりにDからQへ代入 クロックの立ち上がりにDからQへ代入 それ以外Qは変化しない (b) Verilog HDL記述
SB D Q QB CK RB 5.1.4 非同期セット/リセット付きDフリップフロップ 図5.4非同期セット/リセット付きDフリッププロップ (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は 代入が実行される
SB Q J CK K RB 5.1.5 非同期セット/リセット付きJKフリップフロップ 図5.5非同期セット/リセット付きJKフリッププロップ (b) Verilog HDL記述 (a) 回路図 CKの立ち上がり、RB、SBの立下りの動作条件で リセットRBを最優先、セットSB、case({J,K})の順で記述し実行行う RBが0のときQに0を代入実行、SBが0のときQに1を代入実行、 それ以外caseを実行。 表5.1JKフリップ プロップ基本動作
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と なる次のクロックの立ち上がりまで維持
RB Q CK 5.1.6 非同期セット/リセット付きJKフリップフロップ 図5.6非同期リセット付きTフリッププロップ (b) Verilog HDL記述 (a) 回路図 RBが立下りのとき、Qはリセットされる、 RBが立ち上がり、クロックが立ち上がり したときQは反転
RBが0なので、Qは0 RBが0ではない、実行優先順位がCKに移る、Qは反転する
5.2.1 同期SRフリップフロップ モジュール宣言 入出力宣言 Always文(Qを決定) クロックの立ち上がりでの動作を記述 クロックが立ち上がった時の「RB」、「SB」それぞれの値で「Q」の値が決まる。 「RB」、「SB」が同時に“0”の時は「RB」を優先させる。 assign文(QBを決定)
5.2.2 同期セット/リセット付きDフリップフロップ5.2.2 同期セット/リセット付きDフリップフロップ モジュール宣言 入出力宣言 Always文(Qを決定) クロックの立ち上がりでの動作を記述 信号の優先順位が 「RB > SB > LD」 となる。 assign文(QBを決定)
5.2.3 同期セット/リセット付きJKフリップフロップ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」 となる。