演算回路

演算回路
花泉研究室 伏木 厳穣
今回扱う演算回路
・加算回路
・減算回路
・定数加算回路
・バレル・シフタ
・乗算回路
を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」
となる。