数电实验报告册
学年学期:
课程名称:
数字电路与逻辑设计
学生学院:
通信与信息工程学院
专业班级:
学生学号:
学生姓名:
联系电话:
页 1
一、 实验名称
基于 Q-M 算法的逻辑化简程序 C 语言的实现,实现一个能处理十变量及以上
的逻辑函数化简工具
二、 实验目的
掌握对逻辑表达式化简的方法,加强对化简本质的认识,锻炼应用 C 语言解决
实际问题的能力。
三、 实验要求
3.1 变量个数及字母表示正确
3.2 化简输出表达式正确
3.3 表达式输出排序正确
3.4 边界条件输出正确
3.4 实现一个能处理十变量及以下的逻辑函数化简
四、 化简原理
概述:搜索所有本原蕴含项,然后从这些本原蕴含项中提取出覆盖开状态集
合的最小集合。
具体步骤:
1. 搜索本原蕴含项
以最小项形式列出开状态集合和无关项集合中所有元素,元素用二进制表
示。第一列中,根据二进制数含 1 的个数分组。第一组只能和第二组比较,
第二组只能和第三组比较,依此类推。如果比较的元素只有一位不同,那
么他们所代表的最小项在 n 维布尔空间是相邻的,并由这两个元素得到蕴
含项,将其放入下一列,如果一个元素对新的蕴含项没有贡献,则其为本
原蕴含项,并将其保存。对新的列,重复进行上述操作,直到找到所有本
原蕴含项为止。
2. 寻求最小覆盖
如果某一个最小项只被某个本原蕴含项蕴含一次,则此本原蕴含项为本质
本源蕴含项,最终必定要输出。然后寻找能够实现对其余最小项覆盖的本
源蕴含项。然后输出。
五、程序流程图
开始
页 2
是
结束
保存比较后的本
源项到新的列中
否
判断此列是否全
为本原蕴含项
是
输入查询次数
是否达到查询次
数
否
编写链表操作源程序
分别构建链表用以储存最
小项,无关项及最小项
输入最小项
无关项
对最小项无关项按
1 个数分组
对 相 邻 组 元 素 依
次进行比较
是否为相邻
此列是否比较
是
否
是
记录本原蕴含项
记录最小项被本原蕴
含项标记的次数
记录本质本源项到最终链表,并删除
最小项链表中其所包含的最小项
重新标记,记录包含最多最
小项的本原项到最终链表
最终链表元素排序后输
出
清空各链表
页 3
否
六、 算法说明
6.1 相邻组比较函数
先找到组号为 i 的第一个数据,然后寻找组号为 i+1 的第一个数据,比较后
寻找组号为 i+1 的第二个数据,直到比较完毕。然后循环寻找组号为 i+1 的
第一个数据,然后寻找组号为 i+2 的第一个数据,比较后寻找组号为 i+1 的
第二个数据,直到比较完毕。
依此类推。比较完毕。
6.2 最终链表元素排序函数
为每一位变量设置优先级数,确保列如 A 的优先级>A’BCD…所有优先级之
和,A’ 的优先级>BCD…所有优先级之和,然后输出优先级最大的本质本源
项。设为第 i 位变量的优先级, 为第 i 位反变量优先级,其数学解释为
=−1+−2+…+1
= +−1+−2+…+1=2
6.3 最小覆盖查找.
使去掉本质本源项的剩余本源项对剩余的最小项进行标记,然后寻找包含最
小项最多的本源项,输出并删除其所包含的最小项。如果包含的最小项一样
多则取第一个本源项输出。直到最小项链表为空。
6.4 其余各函数不再详细说明
七、 测试样例
1.四变量测试
页 4
2.五变量 六变量
3.变量个数为 0,卡诺图仅包含 0 和 X,卡诺图仅包含 1 和 X
页 5
变量个数为 0,输出 0;卡诺图仅包含 0 和 X,输出 0;卡诺图仅包
含 1 和 X 输出 1。
4.变量个数为 1,无关项个数为 0;变量个数不唯一,无关项个数为 0
页 6
八、 程序代码
“main.c”
#include
#include
#include
#include
#define TIMES_MAX 10
#define Num_columns 2
#define _Not_yet_Printf 0
#define _Have_Printf 1
extern int Variate;
typedef struct priority_element
{
int Counter_Variate_Priority;
int Variate_Priority;
*Ultimate_List,Minimum
Least_Cover(LNode
*Ultimate_List,Minimum
Is_Label_1(LNode
}Priority_Element;
void
*head_node_Minimum,LNode *head_ESSENT_PRIME);
void
*head_node_Minimum,LNode *head_ESSENT_PRIME);
void Print_Variate(LNode *Ultimate_List);
void Creat_Priority_Sheet(Priority_Element Priority_Sheet[]);
void
Priority_Sheet[]);
void Last_Operation(LNode *Ultimate_List);
int num_Essent_Prime=0;//本质本源项个数
int num_Prime=0;//非本质本源项个数
int main()
{
Set_Priority_Mark(LNode
*Ultimate_List,Priority_Element
int times,i,n;
int Num_min[TIMES_MAX],Num_Irelev[TIMES_MAX];
LNode *copy_head_LNode;
LNode *copy_head_ESSENT_PRIME;
LNode *head_LNode[TIMES_MAX];
Minimum *head_Mini[TIMES_MAX];
//定义优先级表
Priority_Element
//为最小项创建一个头结点
Minimum *head_node_Minimum;
head_node_Minimum=(Minimum*)malloc(sizeof(Minimum));
//列指针初始化
Priority_Sheet[Num_Bits];
页 7
int column=1;
LNode *Columns_LNode[Num_columns];
Columns_LNode[column]=(LNode*)malloc(sizeof(LNode));
Columns_LNode[column]->next=NULL;
Columns_LNode[column]->data=NO_DATA;
Columns_LNode[column]->Mark=NO_MARK;
Columns_LNode[!column]=(LNode*)malloc(sizeof(LNode));
Columns_LNode[!column]->next=NULL;
Columns_LNode[!column]->data=NO_DATA;
Columns_LNode[!column]->Mark=NO_MARK;
//本质本愿列初始化
LNode *head_ESSENT_PRIME;
head_ESSENT_PRIME=(LNode*)malloc(sizeof(LNode));
head_ESSENT_PRIME->next=NULL;
head_ESSENT_PRIME->data=NO_DATA;
head_ESSENT_PRIME->Mark=NO_MARK;
//最终链表初始化
LNode *Ultimate_List;
Ultimate_List=(LNode*)malloc(sizeof(LNode));
Ultimate_List->next=NULL;
Ultimate_List->data=NO_DATA;
Ultimate_List->Mark=NO_MARK;
Ultimate_List->Bits[0]=-1;
//指针数组初始化
for(i=0;i