更新履歴
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)