模拟电路论文作业程序实现隐含表Word格式.docx
《模拟电路论文作业程序实现隐含表Word格式.docx》由会员分享,可在线阅读,更多相关《模拟电路论文作业程序实现隐含表Word格式.docx(13页珍藏版)》请在冰豆网上搜索。
隐含表法是一种比较传统的方法,更适合于编程实现。
在计算机高速发展的今天,硬件设计越来越复杂,例如从简单的机电产品设计到巨型计算机以至于智能机器人的制造,使其在各方面的应用越来越广泛。
在同步时序电路设计中要求对原始状态表进行化简,以实现电路设计最简,成本最低,人工的方法费时费力并且在状态数很大时很难化简。
本文给出一种用程序化简的方法不但可以适合状态数较大的情况,而且使化简的效率大大地提高提高了工作效率。
正文:
本文是用C语言程序将完全给定的同步时序电路的原始状态表转化为隐含表,一直按隐含表法的解题步骤对隐含表进行化简。
现将根据所给定的完全状态表做出隐含表,然后顺序比较隐含表中所有的状态,将比较结果填入相应的位置上。
比较结果分三种情况。
①第一种是两个状态不等价(输出不同,即不等效),相应的格填1;
②第二种是两个状态等价(输出相同,即等效),相应的格填2;
③第三种情况是状态是否等价取决于是否满足隐含条件(输出相同,状态不全部相同且不交错,即不一定等效。
)第三种情况出现时系统会进一步对它进行比较,直到查明待查状态等效或不等效为止。
本程序从原始状态表出发,根据隐含表法的步骤,完成做出隐含表,顺序比较隐含表,关联比较的步骤,以确定状态之间的等效关系。
具体过程如下:
⑴定义数据结构——使用结构体structotuint保存原始状态表中的数据结构体中的status单元保存状态,effect单元保存输出结果。
使用结构体structhtuint保存隐含表中的数据,结构体中的flag单元的内容作为标记,用来判断是否等效当为1时不等效,为2时等效;
为3时看后继状态是否等效,并用链表保存后继状态。
⑵建立原始状态表——本文通过createtable()函数建立原始状态表。
在函数中要求从键盘输入一个存放原始状态表数据文件的文件名,对文件内容的要求是第一个数据为状态数;
第二个数据为输入变量数;
接着是一个状态;
一个输出间隔出现;
数据之间用空格。
用循环语句将文件中的数据取出保存在otable数组中。
⑶建立隐含表——通过chtable()函数建立隐含表,在函数中对otable数组中的数据进行扫描,确定hidetable数组中的数据,当输出不同时hidetable[i][j].flag1赋于表示不等效;
当输出相同,状态相同或交错时hidetable[i][j].flag2赋于表示等效;
当输出相同,状态不同且不交错,hidetable[i][j].flag3赋于等待判断。
(4)进行比较——通过函数对隐含表进行关联比较,如果出现第一或二种情况直接把状态填入相应的位置。
当出现第三种情况的时候继状态进行处理,按上述继续对第三种情况继续进行关联比较,直到确定状态之间的等效关系。
例如:
一下例题中所给的状态转换表,利用隐含表法的思路对他进行化简体现做隐含表,顺序比较以及关联比较的步骤。
原始状态表
X1X2
Sn
00
01
11
10
A
B
C
D
E
F
G
H
D/0
C/1
G/0
B/1
B/0
F/0
E/1
A/0
(a)隐含表
ABCDEFG
(b)顺序比较
X
AF
BD/AF
DF/AF
DF
√
BD
BG/AF
DG/AF
BC/AF
BC
BC/DF
ABCDEFG
(c)关联比较
BD/AF/X
DF/AF/X
DF/X
BD/X
DG/AF/X
BG/AF/X
BC/DF/X
最简状态转换表
X1X2
00
B1
D0
G0
B0
A0
E1
Sn+1
具体程序如下:
#include"
math.h"
stdlib.h"
stdio.h"
ctype.h"
#defineNULL0
structotunit
{
charstatus;
inteffect;
};
structcstatus
charchrow;
charchcol;
structcstatus*next;
};
structhtunit
{
intflag;
structcstatus*head;
intvn,sn;
structotunitotable[30][30];
structhtunithidetable[30][30]
main()
createtable();
chtable();
comparehtable();
outputtable();
}
createtable()
FILE*fp;
inti,j,number1,number2;
charch[4],str[20];
printf("
pleaseinputafilename:
"
);
scanf("
%s"
str);
if((fp=fopen(str,"
r"
))==NULL)
printf("
filecan'
topenfile"
exit(0);
fscanf(fp,"
%d%d"
&
sn,&
vn);
for(i=1;
i<
=sn;
i++)
for(j=1;
j<
=exp(vn*log
(2))+1;
j++)
{
fscanf(fp,"
%s%d"
ch,&
number2);
otable[i][j].status=toupper(ch[0]);
otable[i][j].effect=number2;
}
fclose(fp);
chtable()
inti,j,m,flag,flag1;
structcstatus*new,*p;
for(i=2;
=i-1;
{
flag=0;
hidetable[i][j].head=NULL;
for(m=1;
m<
m++)
if(otable[i][m].effect!
=otable[j][m].
effect)flag=1;
if(flag==1)hidetable[i][j].flag=1;
else
if(otable[i][m].status!
=otable[j][m].status)
{
flag=1;
flag1=0;
p=hidetable[i][j].head;
while(p!
=NULL)
if(p->
chrow==otable[i][m].status&
&
p->
chcol==otable[j][m].status||p->
chrow==otable[j][m].status&
chcol==otable[i][m].status)
flag1=1;
p=p->
next;
if(flag1==0)
new=(structcstatus*)malloc(sizeof(structcstatus));
new->
chrow=otable[i][m].status;
chcol=otable[j][m].status;
next=NULL;
if(hidetable[i][j].head==NULL)
hidetable[i][j].head=new;
else
while(p->
next!
p=p->
p->
next=new;
}
if(flag==0)hidetable[i][j].flag=2;
elsehidetable[i][j].flag=3;
comparehtable()
inti,j,n,l,t,flag,flag1;
structcstatus*p,*q,*m,*head,*new;
for(i=2;
for(j=1;
if(hidetable[i][j].flag==3)
{
p=hidetable[i][j].head;
q=p;
n=0;
while(p!
n=n+1;
flag=0;
if(p->
chrow==i+64&
chcol==j+64||p->
chrow==j+64&
chcol==i+64)
{
flag=1;
if(n==1&
next==NULL)
{
hidetable[i][j].flag=2;
m=p;
next;
else
if(n==1)
hidetable[i][j].head=p;
q->
next=p->
p=q->
free(m);
}
if(flag==0)
flag1=0;
while(flag1==0)
flag1=1;
for(i=2;
for(j=1;
if(hidetable[i][j].flag==3)
q=p;
l=p->
chrow-64;
n=p->
chcol-64;
flag=flag++;
if(l<
n)
t=l;
l=n;
n=t;
if(hidetable[l][n].flag==1)
hidetable[i][j].flag=1;
p=NULL;
else
if(hidetable[l][n].flag==2)
if(flag==1&
next==NULL)
if(flag==1)
hidetable[i][j].
head=p->
free(m);
if(hidetable[l][n].flag==3&
flag==1)
p=p->
outputtable()
inti,j;
structcstatus*p;
for(i=2;
for(j=1;
%d"
hidetable[i][j].flag);
while(p!
%c%c"
p->
chrow,p->
chcol);
参考文献:
北京交通大学图书馆数据库
清华大学图书馆数据库
XX文库
C语言程序设计·
谭浩强著
数字电子技术基础·
侯建军主编·
高等教育出版社