1

第５章 論理ゲートとバス記述
NS-Draw で 利 用 可 能 な 基 本 的 な 論 理 ゲ ー ト の サ ン プ ル ラ イ ブ ラ リ がns-tools\example\CHAPTER_5(LOGIC&BUS)\に用意されています。このフォルダ内のGates.nsd はその一覧になっていますので、Gates.nsd を開いてください。

NS-Draw Drawing
nakamura@NAKAMURA-PC4
2010 / 03 / 04
Path: C:\Design\ns-tools\example\CHAPTER_5(BUS&ARRAY)\Gates.nsd
Last Modified : 2010/03/04 13:30:42
nakamura@NAKAMURA-PC4

INVERTERSi1

invx1

invx1 i1

invx2i1
NAND gatesnand2x2

nand2x2i2

invx2 i1

invx4

invx4 i1

invx8

invx8

i1
i2i1
i2i3

nand3x2i1i2
i3

nor3x2

nand3x2

nand4x2

nand4x2

nor4x2

nor4x2i3i4i1
nand2x4

nand2x4

nor2x2

nor2x2i2

i1
NOR gatesi2

Combined gates

AOI21x2

i1
i2

i1
i2
nor3x2i3
i4
OAI21x2

i1
i2
aoi21x2

oai21x2

i3(spice) # .param Lp=0.18u Ln=0.18u Wp=2u Wn=1u LD=0.4u WD=0u

i3(spice) # .param Vdd=1.8V Tcyc=1n Tr=0.1n
AOI22x2

i1
i2

OAI22x2

i1
i2
aoi22x2(spice) # .include MOS_018.bsim3
oai22x2i3i4(spice) # VVDD Vdd 0 DC 'Vdd'i3i4(spice) # VGND Gnd 0 DC 0V(spice) # VIN1 i1 0 PULSE ('Vdd' 0V 'Tcyc/10' 'Tr' 'Tr' 'Tcyc/2-Tr' 'Tcyc')(spice) # VIN2 i2 0 PULSE ('Vdd' 0V 'Tcyc/10' 'Tr' 'Tr' 'Tcyc-Tr' 'Tcyc*2')

i1

i1

XOR/XNOR Gates

xor2x2xor2x2i2

xnor2x2

i2

iodffx4i2clk(spice) # VIN3 i3 0 PULSE ('Vdd' 0V 'Tcyc/10' 'Tr' 'Tr' 'Tcyc*2-Tr' 'Tcyc*4')(spice) # VIN4 i4 0 PULSE ('Vdd' 0V 'Tcyc/10' 'Tr' 'Tr' 'Tcyc*4-Tr' 'Tcyc*8')i2

D-FFx4
D-Flip/Flops

xnor2x2

i3

i4

preclri

D-FFx4oclk(spice) # .tran 'Tcyc/100' 'Tcyc*9'(spice) # .print v(i1) v(i2) v(i3) v(i4)dffpcx4(spice) # .print v(invx1) v(invx2) v(invx4) v(invx8)(spice) # .print v(nand2x2) v(nand2x4) v(nand3x2) v(nand4x2)(spice) # .print v(nor2x2) v(nor3x2) v(nor4x2)

i1i1(spice) # .print v(aoi21x2) v(aoi22x2) v(oai21x2) v(oai22x2)(spice) # .print v(xor2x2) v(xnor2x2) v(dffx4) v(dffpcx4) v(onex2) v(zerox2)

Pull-Up/Down

H
onex2

onex2
zerox2Lzerox2

図１ 基本ゲートのライブラリ一覧(Gates.nsd)
図１は、NS-Draw の回路図をクリップボード経由で文書にペーストしたものです。
NS-Draw の回路図はベクトルデータとしてコピーされますので、他のソフトへ貼付けた後にグループ解除を行えば、図形編集をすることもできます。
このサンプルでは、インバータとして、サイズの異なるもの４種類、４入力までのNAND ゲート、３入力までの NOR ゲート、４種類の複合ゲート、XOR,XNOR ゲート、d-F/F2（リセット無し、付き）、固定 H／L 出力ゲートの計２１個の論理ゲートから構成されています。この Gates.nsd は、そのままシミュレーション可能で、その結果を図２に示します。
v ( i1 )v ( i2 )v ( i3 )v ( i4 )v ( in v x 1 )v ( in v x 2 )v ( in v x 4 )v ( in v x 8 )v (n a n d 2 x 2 )v (n a n d 2 x 4 )v (n a n d 3 x 2 )v (n a n d 4 x 2 )v (n o r2 x 2 )v (n o r3 x 2 )v (n o r4 x 2 )v ( a o i2 1 x 2 )v ( a o i2 2 x 2 )v ( o a i2 1 x 2 )v ( o a i2 2 x 2 )v (x o r2 x 2 )v (x n o r2 x 2 )v (d f f x 4 )v (d f f p c x 4 )v (o n e x 2 )v (z e ro x 2 )-00-10-20-30-40-5002n4n6n8ntime

図２

Gates.nsd のシミュレーション結果

シミュレーション波形を参照して、各論理ゲートの動作が正しいことを確認してくだ
さい。Gates.nsd 内の各論理ゲート内の各トランジスタのゲート幅は：Wp,Wn、ゲート長は Lp,Ln というパラメータ値を使って表現されているので、これらの各パラメータを.param 文で再定義し、.include するモデルファイル名を変更することで、異なるデザインルールのものにも容易に対応させることができると思います。また、後の章では、
この Gates.nsd の基本ゲート群を用いて、HDL 記述から論理合成を行う方法も説明します。
次に、論理ゲートを使って書かれた selff4b.nsd を開いてください。この回路はクロックに同期する信号バッファの４ビット分の回路になっていて、そのまま回路図を作成
すると図３のような回路図とシンボル図になります。

3NS-Draw Drawing
nakamura@NAKAMURA-PC4
2010 / 03 / 04
Path: C:\Design\ns-tools\example\CHAPTER_5(LOGIC&BUS)\Selff4b1.nsd
Last Modified : 2010/03/04 15:05:15
nakamura@NAKAMURA-PC4

SelectD-FFx4i

nand2x2
in0o

invx2

out0(spice) # .param Lp=0.18u Ln=0.18u Wp=2u Wn=1u LD=0.4u WD=0u(spice) # .param Vdd=1.8V Tcyc=1n Tr=0.1nclk(spice) # .include MOS_018.bsim3

D-FFx4inand2x2
in1oinvx2

out1(spice) # VVDD Vdd 0 DC 'Vdd'$name
SelFF4bSelect

Sel

in0

in0

out0

out0

in1

in1

out1

out1

in2

in2

out2

out2

in3

in3

out3

out3

(spice) # VGND Gnd 0 DC 0Vclk(spice) # VCLK clk 0 PULSE ('Vdd' 0V 'Tcyc/10' 'Tr' 'Tr' 'Tcyc/2-Tr' 'Tcyc')(spice) # VIN0 in0 0 PULSE ('Vdd' 0V 'Tcyc/4' 'Tr' 'Tr' 'Tcyc-Tr' 'Tcyc*2')
D-FFx4inand2x2in2oinvx2out2(spice) # VIN1 in1 0 PULSE ('Vdd' 0V 'Tcyc/4' 'Tr' 'Tr' 'Tcyc*2-Tr' 'Tcyc*4')(spice) # VIN2 in2 0 PULSE ('Vdd' 0V 'Tcyc/4' 'Tr' 'Tr' 'Tcyc*4-Tr' 'Tcyc*8')

clk(spice) # VIN3 in3 0 PULSE ('Vdd' 0V 'Tcyc/4' 'Tr' 'Tr' 'Tcyc*8-Tr' 'Tcyc*16')(spice) # VSel select 0 PWL 0 'Vdd' 'Tcyc*10' 'Vdd' 'Tcyc*10.1' 0 'Tcyc*100' 0D-FFx4inand2x2
in3oinvx2out3clk(spice) # .tran 'Tcyc/100' 'Tcyc*20'(spice) # .print v(clk) v(select) v(in3) v(in2) v(in1) v(in0)(spice) # .print v(out3) v(out2) v(out1) v(out0)

clk
Property: nameclk(a)回路図
図３(b)シンボル図

バス記述を用いない回路の例（selff4b1.nsd）

ここでまず、端子のバス化を行います。例えば、図３では入力の端子名がin3,in2,in1,in0 となっていますが、これを図４のように in[3],in[2],in[1],in[0]と変更します。これにより、シンボル図側では、端子をまとめてバス化した in[3:0]という表現が可能になり、シンボル図が図４(b)のように簡略化できるようになります。

NS-Draw Drawing
nakamura@NAKAMURA-PC4
2010 / 03 / 04
Path: C:\Design\ns-tools\example\CHAPTER_5(LOGIC&BUS)\Selff4b2.nsd
Last Modified : 2010/03/04 15:05:47
nakamura@NAKAMURA-PC4

Select(spice) # .param Lp=0.18u Ln=0.18u Wp=2u Wn=1u LD=0.4u WD=0u

D-FFx4nand2x2iin[0]oinvx2out[0](spice) # .param Vdd=1.8V Tcyc=1n Tr=0.1nclk(spice) # .include MOS_018.bsim3(spice) # VVDD Vdd 0 DC 'Vdd'

D-FFx4nand2x2

iin[1]

oinvx2out[1](spice) # VGND Gnd 0 DC 0V$name
SelFF4bSelectSelin[3:0]in[3:0]clk(spice) # VCLK clk 0 PULSE ('Vdd' 0V 'Tcyc/10' 'Tr' 'Tr' 'Tcyc/2-Tr' 'Tcyc')(spice) # VIN0 in[0] 0 PULSE ('Vdd' 0V 'Tcyc/4' 'Tr' 'Tr' 'Tcyc-Tr' 'Tcyc*2')(spice) # VIN1 in[1] 0 PULSE ('Vdd' 0V 'Tcyc/4' 'Tr' 'Tr' 'Tcyc*2-Tr' 'Tcyc*4')

D-FFx4nand2x2

iin[2]

oinvx2out[2](spice) # VIN2 in[2] 0 PULSE ('Vdd' 0V 'Tcyc/4' 'Tr' 'Tr' 'Tcyc*4-Tr' 'Tcyc*8')out[3:0]out[3:0]clk(spice) # VIN3 in[3] 0 PULSE ('Vdd' 0V 'Tcyc/4' 'Tr' 'Tr' 'Tcyc*8-Tr' 'Tcyc*16')(spice) # VSel select 0 PWL 0 'Vdd' 'Tcyc*10' 'Vdd' 'Tcyc*10.1' 0 'Tcyc*100' 0
D-FFx4nand2x2

in[3]ioinvx2

out[3](spice) # .tran 'Tcyc/100' 'Tcyc*20'(spice) # .print clk select in[3:0]clk(spice) # .print out[3:0]clk
Property: nameclk(a)回路図図４(b)シンボル図

端子をバス化した回路図(selff4b2.nsd)

次に、回路図のほうも、内部信号線のバス化と、回路のアレイ（配列）化を行って簡略化します。図５を参照してください。図５のインバータ回路においては、回路の名前が inv[3:0]、入力の信号線名は b[3:0]となっています。これは、インバータ回路が４個存在し、４個のインバータには、それぞれ、b[3],b[2],b[1],b[0]の信号が入力されることになります。同様に出力はそれぞれ out[3],out[2],out[1],out[0]が接続されま4す。２入力 NAND 回路では、片方の入力は、select 信号（1bit）なので、ここでは、４つに展開される NAND 回路の入力は共通に Select に接続されることになります。ここで、回路のアレイ数と、接続される信号線のバス幅は、一致しているか、あるいは１bit のどちらかでなければなりません。（この条件を満たさない場合、ネットリスト出力時にバス幅不一致エラーが出力されます。）また信号線名が付与されていない信号線は、すべて１bit 幅と解釈されるので、配列化された回路間の配線の部分には、図５の a[3:0]
や b[3:0]のように必ずバス幅を明記した信号線名をつけてください。
NS-Draw Drawing
nakamura@NAKAMURA-PC4
2010 / 03 / 04
Path: C:\Design\ns-tools\example\CHAPTER_5(LOGIC&BUS)\Selff4b3.nsd
Last Modified : 2010/03/04 15:04:09
nakamura@NAKAMURA-PC4(spice) # .param Lp=0.18u Ln=0.18u Wp=2u Wn=1u LD=0.4u WD=0u(spice) # .param Vdd=1.8V Tcyc=1n Tr=0.1n(spice) # .include MOS_018.bsim3

ff[3:0]na[3:0]
Selectnand2x2
in[3:0]inv[3:0]

D-FFx4a[3:0]
iclk(spice) # VVDD Vdd 0 DC 'Vdd'b[3:0]
oinvx2out[3:0](spice) # VGND Gnd 0 DC 0V(spice) # VCLK clk 0 PULSE ('Vdd' 0V 'Tcyc/10' 'Tr' 'Tr' 'Tcyc/2-Tr' 'Tcyc')(spice) # VIN0 in[0] 0 PULSE ('Vdd' 0V 'Tcyc/4' 'Tr' 'Tr' 'Tcyc-Tr' 'Tcyc*2')

clk(spice) # VIN1 in[1] 0 PULSE ('Vdd' 0V 'Tcyc/4' 'Tr' 'Tr' 'Tcyc*2-Tr' 'Tcyc*4')(spice) # VIN2 in[2] 0 PULSE ('Vdd' 0V 'Tcyc/4' 'Tr' 'Tr' 'Tcyc*4-Tr' 'Tcyc*8')(spice) # VIN3 in[3] 0 PULSE ('Vdd' 0V 'Tcyc/4' 'Tr' 'Tr' 'Tcyc*8-Tr' 'Tcyc*16')(spice) # VSel select 0 PWL 0 'Vdd' 'Tcyc*10' 'Vdd' 'Tcyc*10.1' 0 'Tcyc*100' 0(spice) # .tran 'Tcyc/100' 'Tcyc*20'(spice) # .print clk select in[3:0](spice) # .print out[3:0]図５

信号線のバス化と回路をアレイ化した回路図(selff4b3.nsd)

以上、図３、図４、図５の回路はネットリスト出力すると、基本的に同一の回路になり、シミュレーションで確認すると、結果も同一であることがわかります。
次に、このバス化された I/O を持つシンボルをさらに上位の回路図で接続する場合ですが、図６に示すように、回路の I/O とバス幅が同一になるように、上位でも信号線にバス幅を明示して接続する必要があります。バスは、a[7:4],a[3:0]のように分離して表現したり、a[0]のようにその中の１ビットだけを指定することもできます。図６(a)の回路図では、バスの分岐を説明するために、最上位４ビット側の最終段のインバータ部分を分離して表記しています。バス信号線から、一部を取り出す場合は、信号線を分離して、名前を付け分けることで行います。図 6(a)の回路図では、b[7:4]の信号を、名前を付け替えて b[7]と b[6:4]の２つに分離していますが、これらの間は配線（青色）ではなく、図形描画の線（黒）で結ばれていることに注意してください。同一の配線にバス幅の異なる２つの名前をつけるとエラーになりますので、ここでは、このようにして対処しています。

5NS-Draw Drawing
nakamura@NAKAMURA-PC42010 / 03 / 04
Path: C:\Design\ns-tools\example\CHAPTER_5(LOGIC&BUS)\Selff8b1.nsd
Last Modified : 2010/03/04 16:05:29
nakamura@NAKAMURA-PC4

i2[7]
b[7]

SelFF4b
SelectSelin[7:4]in[3:0]

invx8

i1[7:4]a[7:4]
out[3:0]out[7]

i2[6:4]b[7:4]

invx2

invx8

out[6:4]b[6:4]$ n a meSe l F F 8 b
Se l e c t Se l

SelFF4bSeli1[3:0]a[3:0]
in[3:0]in[3:0]out[3:0]i2[3:0]b[3:0]

invx2

invx8

out[3:0]i n [ 7 : 0 ]i n [ 7 :o0 ]u t [ 7 : 0 ]o u t [ 7 : 0 ]c l kclk

Pr o p e r t y:(a)回路図
図６n a me(b)シンボル図

上位回路でのバスの接続例１(selff8b1.nsd)

さらに、図６の回路を回路のアレイを使って表現すると、図７のような形にできます。

NS-Draw Drawing
nakamura@NAKAMURA-PC4
2010 / 03 / 04
Path: C:\Design\ns-tools\example\CHAPTER_5(LOGIC&BUS)\Selff8b2.nsd
Last Modified : 2010/03/04 15:29:03
nakamura@NAKAMURA-PC4$ n a meselff[1:0]

Se l F F 8 bSe l e c t Se l

SelFF4b
SelectSelin[7:0]in[3:0][7:0]a[7:0]
out[3:0][7:0]b[7:0]

invx2

invx8

out[7:0]i n [ 7 : 0 ]i n [ 7 :o0 ]u t [ 7 : 0 ]o u t [ 7 : 0 ]c l kclk

Pr o p e r t y:(a)回路図
図７n a me(b)シンボル図

上位回路でのバスの接続例２(selff8b2.nsd)