HDLBits: 在线学习 SystemVerilog(十三)-Problem 72-79(卡诺图)
创始人
2024-04-03 18:17:15
0

HDLBits: 在线学习 SystemVerilog(十三)-Problem 72-79(卡诺图)

7831ea68785203452adf96f11e30520c.jpeg

HDLBits 是一组小型电路设计习题集,使用 Verilog/SystemVerilog 硬件描述语言 (HDL) 练习数字硬件设计~

网址如下:

https://hdlbits.01xz.net/

关于HDLBits的Verilog实现可以查看下面专栏:

https://www.zhihu.com/column/c_1131528588117385216

缩略词索引:

  • SV:SystemVerilog

从今天开始新的一章-Circuits,包括基本逻辑电路、时序电路、组合电路等。

今天更新整个关于卡诺图部分,数电忘记的,可以先回顾一下。

卡诺图

8cf1a6de6078d31cd632ef2f05f554c6.png

简介

卡诺图(KM或K -map)是一种简化布尔代数表达式的方法。Maurice Karnaugh在 1953年为Edward W. Veitch 1952 Veitch 图做了改进,并介绍了新的Marquand 图,即我们现在熟知的卡诺图。

卡诺图利用人类的模式识别能力减少了对大量计算的需求,还允许快速识别和消除潜在的竞争条件。

所需的布尔结果从真值表转移到二维网格中,在卡诺图中,单元格按格雷码排序,每个单元格位置代表输入条件的一种组合。单元格也称为最小项,而每个单元格值代表布尔函数的相应输出值。识别出最佳的 1 或 0 组,它们表示原始真值表中逻辑的规范形式的项。这些术语可用于编写表示所需逻辑的最小布尔表达式。

示例

卡诺图用于简化布尔代数函数。例如,考虑以下真值表描述的布尔函数。

函数的真值表
序号ABCDf(A,B,C,D)
000000
100010
200100
300110
401000
501010
601101
701110
810001
910011
1010101
1110111
1211001
1311011
1411101
1511110

以下是使用布尔变量A、B、C、D描述未简化布尔代数中相同函数的两种不同符号。

6b932a69b00f47715c7c95a3d65860a3.png

mi是要映射的最小项(即,在真值表中输出为 1 的行)。

b0af9e36dd99cd26a7792c87913cf802.png

mi是要映射的最大项(即,真值表中输出为 0 的行)

28efdbadfeac85d6b7e304d419d6e5f2.png

在上面的例子中,四个输入变量可以用 16 种不同的方式组合,所以真值表有 16 行,卡诺图有 16 个位置。因此,卡诺图以 4 × 4 的网格排列。

行和列索引(显示在卡诺图的顶部和左侧)以格雷码而不是二进制数字顺序排列。格雷码确保每对相邻单元之间只有一个变量发生变化。完整卡诺图的每个单元格都包含一个二进制数字,表示该输入组合的函数输出。

分组

在构建卡诺图之后,它被用来寻找布尔代数最简单的可能形式之一——规范形式——获取真值表中的信息。卡诺图中相邻的 1 代表简化表达式的机会。最终表达式的最小项是通过在地图中圈出 1 组来找到的。Minterm 组必须是矩形的,并且面积必须是 2 的幂(即 1、2、4、8...)。最小项矩形应尽可能大,不包含任何 0。组可以重叠以使每个组更大。下例中的最优分组用绿、红、蓝线标记,红、绿组重叠。红色组是一个 2×2 的正方形,绿色组是一个 4×1 的矩形,重叠区域用棕色表示。

e1fccd102876455e363451cbaa929c8e.png

单元格通常由描述单元格覆盖的输入的逻辑值的简写表示。例如,AD表示一个单元格覆盖了A和D为1的 2x2 区域,即上图中编号为 13、9、15、11 的单元格。另一方面,A D(非)表示A为真且D为假(即D(非)为真)的单元格。

网格是环形连接的,这意味着矩形组可以环绕边缘(见图)。最右边的单元格实际上与最左边的单元格“相邻”,因为相应的输入值仅相差一位;同样,最顶端的和最底端的也是如此。因此,A D(非)可以是一个有效术语——它在顶部包括单元格 12 和 8,并环绕到底部以包括单元格 10 和 14——就像B(非) D(非)一样,它包括四个角。

解决方案

函数 f(A, B, C, D) 的 K-map 显示为对应于最小项的彩色矩形。棕色区域是红色 2×2 正方形和绿色 4×1 矩形的重叠部分。f 的倒数的 K-map 显示为灰色矩形,对应于 maxterms。

ec0b3cb2c98a65779567bd965e1d00d2.png

一旦构建了卡诺图并且相邻的 1 通过矩形和方形框连接起来,就可以通过检查每个框内哪些变量保持相同来找到代数小项。

对于红色分组:

  • A是相同的,并且在整个框中都等于 1,因此它应该包含在红色最小项的代数表示中。

  • B不保持相同的状态(它从 1 变为 0),因此应该被排除在外。

  • C不变。它始终为 0,因此应包括其补码 NOT-C。因此,应包括C。

  • D发生变化,因此被排除在外。

因此,布尔乘积和表达式中的第一个最小项是A C(非)。

对于绿色分组,A和B保持相同的状态,而C和D改变。B为 0,必须先取反才能包含在内。因此,第二项是A B(非)。请注意,绿色分组与红色分组重叠是可以接受的。

同样,蓝色分组给出了术语BC D((非))。

将每一组的解组合起来:电路的最后的化简结果如下:

d814c553155747914df6d3a396d2c0c1.png

还有其他方式,就不展开描述了,可以自行学习。

Problem 72-Kmap1

题目说明

根据卡诺图来实现电路:

997904f7e8d0ce5ae80eda1401021428.png图片来自HDLBits

我们可以尝试最大项之积和最小项之和的形式来完成电路设计。

模块端口声明

module top_module(input a,input b,input c,output out  );

题目解析

按照下图方框化简:

acdf85357e346b2f2c6dd51458638119.png

得到:

f(a,b,c)=a+b+c=a'b'c'(摩根定理)

所以可以有两种方式解决。

module top_module(input logic a,input logic b,input logic c,output logic out  ); assign out = a | b | c;endmodule
3ec728b8ba42a331d7262648ce422f09.png

点击Submit,等待一会就能看到下图结果:

168f41d117bed37016b29612dabe3b70.png

注意图中的Ref是参考波形,Yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。

这一题就结束了。

Problem 73-Kmap2

题目说明

还是根据卡诺图来设计电路,本题为4个变量。

b0fd1f3c001b373f2b378d1e04a82364.png图片来自HDLBits

在编写verilog之前,我们可先化简卡诺图。

模块端口声明

module top_module( input a, b, cin,output cout, sum );

题目解析

根据下图先化简卡诺图得到最小和:

9e9899941b687498f5bf18567708606b.png

f(a,b,c,d) = a'd'+b'c'+ab'd+bcd

module top_module(input logic a,input logic b,input logic c,input logic d,output logic out  ); assign out = ~a&~d | ~b&~c | a&~b&d | b&c&d ;endmodule
2c72ac06fa55f49d77cf64da63f20b1a.png

点击Submit,等待一会就能看到下图结果:

d4253e4958cd4cfa1041b1deb28b071e.png

注意图中的Ref是参考波形,Yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。

这一题就结束了。

Problem 74-Kmap3

题目说明

根据卡诺图实现电路:

3f1ec2e0947842acfa3af5a27278752a.png图片来自HDLBits

还是先化简卡诺图,其中D为don't care值。相当于X。可以一起圈。

模块端口声明

module top_module(input a,input b,input c,input d,output out  );

题目解析

可以这样圈,进行化简:

9d35e007122946799a8f3f9f26f617ba.png

PS:

2^n个方格相邻的最小项,可以合并成1项,消去n个变量。

module top_module(input logic a,input logic b,input logic c,input logic d,output logic out  ); assign out = a | ~b&c ;
endmodule
af8b50c9b5ef1ff8b094314c15fb9e64.png

点击Submit,等待一会就能看到下图结果:

d3703b3bb1804fd1438182e97655dcc2.png

注意图中的Ref是参考波形,Yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。

这一题就结束了。

Problem 75-Kmap4

题目说明

根据卡诺图实现电路:

57cd9f27fe9450b976f8f2643c9f585f.png图片来自HDLBits

模块端口声明

module top_module(input a,input b,input c,input d,output out  );

题目解析

这题没什么能化简的,就老老实实敲代码吧。

module top_module(input logic a,input logic b,input logic c,input logic d,output logic out  );assign out = ~a&b&~c&~d | a&~b&~c&~d | ~a&~b&~c&d | a&b&~c&d| ~a&b&c&d | a&~b&c&d | ~a&~b&c&~d | a&b&c&~d ;endmodule
8c1fe465c8e95ec2b5fe76404fe11b6a.png

点击Submit,等待一会就能看到下图结果:

a17d69202c131b2ff69810aca2facf0f.png

注意图中的Ref是参考波形,Yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。

这一题就结束了。

Problem 76-ece241_2013_q2

题目说明

一个4输入a, b, c, d和一输出的逻辑电路,当输入为2, 7或15时,输出为1, 当输入为0, 1, 4, 5, 6, 9, 10, 13, 或 14 时,输出为0,当输入为3,8,11或12时输出为任意值。举例来说,7对应输入abcd为0,1,1,1.

注意: 该电路的SOP和POS必须均为化简后的最小值

模块端口声明

module top_module (input a,input b,input c,input d,output out_sop,output out_pos
);

题目解析

直接根据题目做出答案比较难,所以我们需要先根据题目画出卡诺图:

fc4ab98169a624acd3765345c67e773a.png

SOP圈法就是圈1,如下:

836c3b40be6c6bdd3cb7af7282a5556b.png

POS圈法就是圈0,如下:

4951ec734d38956caaa32146dabfcc93.png
module top_module (input logic a,input logic b,input logic c,input logic d,output logic out_sop,output logic out_pos
); assign out_sop = c&d | ~a&~b&c ;assign out_pos = c&(~a|b)&(~b|~c|d) ;
endmodule
70b86aefbdf836e961ac794848074cda.png

点击Submit,等待一会就能看到下图结果:

2278d1478b0663fc43c10d09beaa0df7.png

注意图中无波形。

这一题就结束了。

Problem 77-m2014 q3

题目说明

还是根据卡诺图实现电路:

d02f65a8bf7e62f78ee85d110186a650.png图片来自HDLBits

模块端口声明

module top_module (input [4:1] x, output f );

题目解析

没什么难度,与其他没区别。

module top_module (input logic [4:1] x, output logic f );assign f = (~x[1] & x[3]) | (x[1] & x[2] & ~x[3]);
endmodule
9ce1a4e7112a9e4da1c421214c3d02e9.png

点击Submit,等待一会就能看到下图结果:

e9ab6f385a545478adced0b3fddcc710.png

注意图中无波形。

这一题就结束了。

Problem 78-2012_q1g

题目说明

还是根据卡诺图画出电路:

4b2028c845beae675bfcfa5247beb7de.png图片来自HDLBits

模块端口声明

module top_module (input [4:1] x,output f
);

题目解析

都是同一个道理。

module top_module (input logic [4:1] x,output logic f
); assign f = ~x[2]&~x[4] | ~x[1]&x[3] | x[2]&x[3]&x[4] ;
endmodule
c731631ec26bcba1b45f7bfe87c5154f.png

点击Submit,等待一会就能看到下图结果:

8b6d6e9b348d83a20289e2ed0d96ddfa.png

注意图中无波形。

这一题就结束了。

Problem 79-ece241_2014_q3

题目说明

根据题目给出的卡诺图,用一个4-1的多路选择器和尽可能多的2-1多路选择器来实现电路,不允许使用其他逻辑门,必须使用ab作为选择器的输入。

b0672239010e1ca4da0268a1507bd2d6.pngbf98b0fc7af7d39b9f9e69411d4d198e.png图片来自HDLBits

模块端口声明

module top_module (input c,input d,output [3:0] mux_in
);

题目解析

开始题目比较“萌”,因为把东西结合起来了,所以一时难以下手。

d3646fe7f07c79626961f4601e726db1.png

这题如果从选择器入手就比较简单了,从图中看到,当ab为固定值,输出是由cd的输入决定。

接下来就是看卡诺图了,从卡诺图中:

  • 当ab == 2'b00时,化简卡诺图,得到mux_in[0] = c+d=cd;

7d56232b6318312713eb4c2aae2938ee.png
  • 当ab == 2'b01时,化简卡诺图,得到mux_in[1] = 1'b0;

  • 当ab == 2'b10时,化简卡诺图,得到mux_in[2] = d';

  • 当ab == 2'b11时,化简卡诺图,得到mux_in[3] = cd;

515212266be2a287af8857fbcb690473.png

此处需注意mux_in[3:0], 一个高位低位的问题,不要搞反了。

module top_module (input logic c,input logic d,output logic [3:0] mux_in
); assign mux_in = {(c&d),(~d),1'b0, (c|d)};endmodule
926d702a81bea974bb573a9db3e1ff93.png

点击Submit,等待一会就能看到下图结果:

59861ade608ed7b170e0bd8f529e7c02.png

注意图中的Ref是参考波形,Yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。

这一题就结束了。

总结

今天的几道题就结束了,对于理解卡诺图化简的人来说就比较简单了,没学过或者忘记的,可以去回顾一下相关知识。整体比较简单,没有复杂的代码,没有复杂的设计思路,主要在于卡诺图的理解。

最后我这边做题的代码也是个人理解使用,有错误欢迎大家批评指正,祝大家学习愉快~

代码链接:

https://github.com/suisuisi/SystemVerilog/tree/main/SystemVerilogHDLBits

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...