logo资料库

基于 Q-M 算法的逻辑代数化简C语言的程序实现报告.docx

第1页 / 共30页
第2页 / 共30页
第3页 / 共30页
第4页 / 共30页
第5页 / 共30页
第6页 / 共30页
第7页 / 共30页
第8页 / 共30页
资料共30页,剩余部分请下载后查看
数电实验报告册 学年学期: 课程名称: 数字电路与逻辑设计 学生学院: 通信与信息工程学院 专业班级: 学生学号: 学生姓名: 联系电话: 页 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
分享到:
收藏