ライブラリー解説書
Ver.1.000 2007.3.21

更新履歴
2007.3.21 新規作成

【はじめに】

このデジタル回路シミュレーションは、ネットリストが書きやすいように構造体を使っています。
原案は、過去にインタフェース誌に掲載されていたものです。もう処分しましたので何時の頃か判然としません。

たとえば,
typedef struct{
LOGIC G1;
LOGIC G2A;
LOGIC G2B;
LOGIC A;
LOGIC B;
LOGIC C;
LOGIC Y0;
LOGIC Y1;
LOGIC Y2;
LOGIC Y3;
LOGIC Y4;
LOGIC Y5;
LOGIC Y6;
LOGIC Y7;
nand4_type SN7420_1;
nand4_type SN7420_2;
nand4_type SN7420_3;
nand4_type SN7420_4;
nand4_type SN7420_5;
nand4_type SN7420_6;
nand4_type SN7420_7;
nand4_type SN7420_8;

nor3_type SN7427_1;

inv_type SN7404_1;
inv_type SN7404_2;
inv_type SN7404_3;
inv_type SN7404_4;
inv_type SN7404_5;
inv_type SN7404_6;
inv_type SN7404_7;

}sn138_type;
これはSN74138の構造体であるsn138_typeの宣言ですが、このもとの回路はSN74LS138から起こしたものです。

       図 138_type.cの回路図
たとえば、
sn138_type SN74138_1;
と宣言すれば,
端子は
SN74138_1.G1
SN74138_1.G2A
SN74138_1.G2B
SN74138_1.A
SN74138_1.B
SN74138_1.C
SN74138_1.YO
SN74138_1.Y1
SN74138_1.Y2
SN74138_1.Y3
SN74138_1.Y4
SN74138_1.Y5
SN74138_1.Y6
SN74138_1.Y7
という具合で,構造体のメンバーなので,.をつければいいわけです。たとえば,ここではSN74138_1の内部のSN7404_7の出力は
SN7404.SN7404_7.out  SN74138_1.SN7404_7.out
という具合にピリオードをつければ構成する内部まで読み書きできます。

これのもとは
int sn74138 (sn138_type *p)
{
int tran=0;


LOGIC A_;
LOGIC B_;
LOGIC C_;
LOGIC A__;
LOGIC B__;
LOGIC C__;


SN7404_1.in=G1;
tran=tran+not(&SN7404_1);


SN7427_1.in1=SN7404_1.out;
SN7427_1.in2=G2A;
SN7427_1.in3=G2B;
tran=tran+nor3(&SN7427_1);


SN7404_2.in=A;
tran=tran+not(&SN7404_2);
A_=SN7404_2.out;

SN7404_3.in=B;
tran=tran+not(&SN7404_3);
B_=SN7404_3.out;

SN7404_4.in=C;
tran=tran+not(&SN7404_4);
C_=SN7404_4.out;

SN7404_5.in=A_;
tran=tran+not(&SN7404_5);
A__=SN7404_5.out;

SN7404_6.in=B_;
tran=tran+not(&SN7404_6);
B__=SN7404_6.out;

SN7404_7.in=C_;
tran=tran+not(&SN7404_7);
C__=SN7404_7.out;

SN7420_1.in1=SN7427_1.out;
SN7420_1.in2=A_;
SN7420_1.in3=B_;
SN7420_1.in4=C_;
tran=tran+nand4(&SN7420_1);

SN7420_2.in1=SN7427_1.out;
SN7420_2.in2=A__;
SN7420_2.in3=B_;
SN7420_2.in4=C_;
tran=tran+nand4(&SN7420_2);

SN7420_3.in1=SN7427_1.out;
SN7420_3.in2=A_;
SN7420_3.in3=B__;
SN7420_3.in4=C_;
tran=tran+nand4(&SN7420_3);

SN7420_4.in1=SN7427_1.out;
SN7420_4.in2=A__;
SN7420_4.in3=B__;
SN7420_4.in4=C_;
tran=tran+nand4(&SN7420_4);

SN7420_5.in1=SN7427_1.out;
SN7420_5.in2=A_;
SN7420_5.in3=B_;
SN7420_5.in4=C__;
tran=tran+nand4(&SN7420_5);

SN7420_6.in1=SN7427_1.out;
SN7420_6.in2=A__;
SN7420_6.in3=B_;
SN7420_6.in4=C__;
tran=tran+nand4(&SN7420_6);

SN7420_7.in1=SN7427_1.out;
SN7420_7.in2=A_;
SN7420_7.in3=B__;
SN7420_7.in4=C__;
tran=tran+nand4(&SN7420_7);

SN7420_8.in1=SN7427_1.out;
SN7420_8.in2=A__;
SN7420_8.in3=B__;
SN7420_8.in4=C__;
tran=tran+nand4(&SN7420_8);

Y0=SN7420_1.out;
Y1=SN7420_2.out;
Y2=SN7420_3.out;
Y3=SN7420_4.out;
Y4=SN7420_5.out;
Y5=SN7420_6.out;
Y6=SN7420_7.out;
Y7=SN7420_8.out;

return(tran);
}
というネットリストですがこれの宣言メンバーのみp->をつける
int sn74138 (sn138_type *p)
{
int tran=0;


LOGIC A_;
LOGIC B_;
LOGIC C_;
LOGIC A__;
LOGIC B__;
LOGIC C__;


p->SN7404_1.in=p->G1;
tran=tran+not(&p->SN7404_1);


p->SN7427_1.in1=p->SN7404_1.out;
p->SN7427_1.in2=p->G2A;
p->SN7427_1.in3=p->G2B;
tran=tran+nor3(&p->SN7427_1);


p->SN7404_2.in=p->A;
tran=tran+not(&p->SN7404_2);
A_=p->SN7404_2.out;

p->SN7404_3.in=p->B;
tran=tran+not(&p->SN7404_3);
B_=p->SN7404_3.out;

p->SN7404_4.in=p->C;
tran=tran+not(&p->SN7404_4);
C_=p->SN7404_4.out;

p->SN7404_5.in=A_;
tran=tran+not(&p->SN7404_5);
A__=p->SN7404_5.out;

p->SN7404_6.in=B_;
tran=tran+not(&p->SN7404_6);
B__=p->SN7404_6.out;

p->SN7404_7.in=C_;
tran=tran+not(&p->SN7404_7);
C__=p->SN7404_7.out;

p->SN7420_1.in1=p->SN7427_1.out;
p->SN7420_1.in2=A_;
p->SN7420_1.in3=B_;
p->SN7420_1.in4=C_;
tran=tran+nand4(&p->SN7420_1);

p->SN7420_2.in1=p->SN7427_1.out;
p->SN7420_2.in2=A__;
p->SN7420_2.in3=B_;
p->SN7420_2.in4=C_;
tran=tran+nand4(&p->SN7420_2);

p->SN7420_3.in1=p->SN7427_1.out;
p->SN7420_3.in2=A_;
p->SN7420_3.in3=B__;
p->SN7420_3.in4=C_;
tran=tran+nand4(&p->SN7420_3);

p->SN7420_4.in1=p->SN7427_1.out;
p->SN7420_4.in2=A__;
p->SN7420_4.in3=B__;
p->SN7420_4.in4=C_;
tran=tran+nand4(&p->SN7420_4);

p->SN7420_5.in1=p->SN7427_1.out;
p->SN7420_5.in2=A_;
p->SN7420_5.in3=B_;
p->SN7420_5.in4=C__;
tran=tran+nand4(&p->SN7420_5);

p->SN7420_6.in1=p->SN7427_1.out;
p->SN7420_6.in2=A__;
p->SN7420_6.in3=B_;
p->SN7420_6.in4=C__;
tran=tran+nand4(&p->SN7420_6);

p->SN7420_7.in1=p->SN7427_1.out;
p->SN7420_7.in2=A_;
p->SN7420_7.in3=B__;
p->SN7420_7.in4=C__;
tran=tran+nand4(&p->SN7420_7);

p->SN7420_8.in1=p->SN7427_1.out;
p->SN7420_8.in2=A__;
p->SN7420_8.in3=B__;
p->SN7420_8.in4=C__;
tran=tran+nand4(&p->SN7420_8);

p->Y0=p->SN7420_1.out;
p->Y1=p->SN7420_2.out;
p->Y2=p->SN7420_3.out;
p->Y3=p->SN7420_4.out;
p->Y4=p->SN7420_5.out;
p->Y5=p->SN7420_6.out;
p->Y6=p->SN7420_7.out;
p->Y7=p->SN7420_8.out;

return(tran);
}
とすれば,ライブラリーとして完成します。


【ゲート】

#include "../define/gate.h"
#include "../define/gate.c"


1.多入力ゲート


多入力ゲートはand2,and3,an4,or2,or3,or4,nand2,nand3,nand4,nor2,nor3,nor4,exorまであります。

typedef struct {
LOGIC in1;   入力1
LOGIC in2;   入力2
LOGIC out;   出力
state cond;   状態変化監視
}and2_type;

これはand2の宣言です。

使い方は,

宣言 
and2_type SN7408_1
などとします。SN7408_1は論理セル名です。

端子の読み書きは
SN7408_1.in1
SN7408_1.in2
SN7408_1.out
で出来ます。

and3,4などは入力が3,4あるだけの違い。

実行

int and2(and2_type *p)

です。返り値は、出力が前と変化したとき1,変化なしの時0を返します。

先の例では
  and2(&SN7408_1)
となります。&が必要になります。


2.NOT

宣言 
inv_type SN7404_1
などとします。SN7404_1は論理セル名です。

端子の読み書きは
SN7404_1.in
SN7404_1.out
で出来ます。

実行

int not(inv_type *p)

です。返り値は、出力が前と変化したとき1,変化なしの時0を返します。

先の例では
  not(&SN7404_1)
となります。&が必要になります。



【FF】

#include "../define/ff.h"
#include "../define/ff.c"


以下のものがあります。

T_FF     Tフリップフロップ
D_FF     Dフリップフロップ
SR_FF    SRフリップフロップ S,RともHならSが優先されます。
RS_FF    RSフリップフロップ S,RともHならRが優先されます。
JK_FF    JKフリップフロップ
GD_FF    Gate Dフリップフロップ。 G=HならDフリップフロップでG=LではHoldとなります。

いずれもprs(プリセット)端子,clr(クリア)端子のみ負論理の非同期となっています。その他の端子は正論理です。また、クロックの立ち上がりで変化します。


1.D-FF

宣言 

D_FF SN7474_1

端子
SN7474_1.d
SN7474_1.clk
SN7474_1.prs
SN7474_1.clr
SN7474_1.Q
SN7474_1.Q_

実行

int dff(D_FF *p)
です。返り値は、出力が前と変化したとき1,変化なしの時0を返します。


 dff(&SN7474_1)

2.T-FF

宣言 

T_FF FF_1

端子
FF_1.t
FF_1.clk
FF_1.prs
FF_1.clr
FF_1.Q
FF_1.Q_

実行

int tff(T_FF *p)
です。返り値は、出力が前と変化したとき1,変化なしの時0を返します。


 tff(&FF_1)

3.JK-FF

宣言 

JK_FF FF_1

端子
FF_1.j
FF_1.k
FF_1.clk
FF_1.prs
FF_1.clr
FF_1.Q
FF_1.Q_

実行

int jkff(T_FF *p)
です。返り値は、出力が前と変化したとき1,変化なしの時0を返します。


 jkff(&FF_1)


4.SR-FF

宣言 

SR_FF FF_1

端子
FF_1s
FF_1.r
FF_1.clk
FF_1.prs
FF_1.clr
FF_1.Q
FF_1.Q_

実行

int srff(SR_FF *p)
です。返り値は、出力が前と変化したとき1,変化なしの時0を返します。


 srff(&FF_1)

5.RS-FF

宣言 

RS_FF FF_1

端子
FF_1s
FF_1.r
FF_1.clk
FF_1.prs
FF_1.clr
FF_1.Q
FF_1.Q_

実行

int rsff(RS_FF *p)
です。返り値は、出力が前と変化したとき1,変化なしの時0を返します。


 rsff(&FF_1)

6.GD-FF

宣言 

GD_FF FF_1

端子
FF_1g
FF_1.d
FF_1.clk
FF_1.prs
FF_1.clr
FF_1.Q
FF_1.Q_

実行

int gdff(GD_FF *p)
です。返り値は、出力が前と変化したとき1,変化なしの時0を返します。


 gdff(&FF_1)


【MSI】

1.sn138_type SN74138

#include "../define/sn138_type.h"
#include "../define/sn138_type.c"

宣言 

sn138_type SN74138_1

端子

SN74138_1.G1
SN74138_1.G2A
SN74138_1.G2B
SN74138_1.Y0
SN74138_1.Y1
SN74138_1.Y2
SN74138_1.Y3
SN74138_1.Y4
SN74138_1.Y5
SN74138_1.Y6
SN74138_1.Y7

実行

int sn74138(sn138_type *p)
です。返り値は、出力が前と変化したとき1,変化なしの時0を返します。

例 
 sn74138(&SN74138_1)