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


    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

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

    模块端口声明

    1. module top_module(
    2.     input a,
    3.     input b,
    4.     input c,
    5.     output out  );

    题目解析

    按照下图方框化简:

    acdf85357e346b2f2c6dd51458638119.png

    得到:

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

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

    1. module top_module(
    2.     input logic a,
    3.     input logic b,
    4.     input logic c,
    5.     output logic out  
    6.     ); 
    7.     
    8.  assign out = a | b | c;
    9.     
    10. endmodule
    3ec728b8ba42a331d7262648ce422f09.png

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

    168f41d117bed37016b29612dabe3b70.png

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

    这一题就结束了。

    Problem 73-Kmap2

    题目说明

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

    b0fd1f3c001b373f2b378d1e04a82364.png图片来自HDLBits

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

    模块端口声明

    1. module top_module( 
    2.     input a, b, cin,
    3.     output cout, sum );

    题目解析

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

    9e9899941b687498f5bf18567708606b.png

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

    1. module top_module(
    2.     input logic a,
    3.     input logic b,
    4.     input logic c,
    5.     input logic d,
    6.     output logic out  
    7.     ); 
    8.     assign out = ~a&~d | ~b&~c | a&~b&d | b&c&d ;
    9.     
    10. endmodule
    2c72ac06fa55f49d77cf64da63f20b1a.png

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

    d4253e4958cd4cfa1041b1deb28b071e.png

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

    这一题就结束了。

    Problem 74-Kmap3

    题目说明

    根据卡诺图实现电路:

    3f1ec2e0947842acfa3af5a27278752a.png图片来自HDLBits

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

    模块端口声明

    1. module top_module(
    2.     input a,
    3.     input b,
    4.     input c,
    5.     input d,
    6.     output out  );

    题目解析

    可以这样圈,进行化简:

    9d35e007122946799a8f3f9f26f617ba.png

    PS:

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

    1. module top_module(
    2.     input logic a,
    3.     input logic b,
    4.     input logic c,
    5.     input logic d,
    6.     output logic out  ); 
    7.     assign out = a | ~b&c ;
    8. endmodule
    af8b50c9b5ef1ff8b094314c15fb9e64.png

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

    d3703b3bb1804fd1438182e97655dcc2.png

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

    这一题就结束了。

    Problem 75-Kmap4

    题目说明

    根据卡诺图实现电路:

    57cd9f27fe9450b976f8f2643c9f585f.png图片来自HDLBits

    模块端口声明

    1. module top_module(
    2.     input a,
    3.     input b,
    4.     input c,
    5.     input d,
    6.     output out  );

    题目解析

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

    1. module top_module(
    2.     input logic a,
    3.     input logic b,
    4.     input logic c,
    5.     input logic d,
    6.     output logic out  
    7.     );
    8.     
    9.     assign out = ~a&b&~c&~d | a&~b&~c&~d | ~a&~b&~c&d | a&b&~c&d
    10.                  | ~a&b&c&d | a&~b&c&d | ~a&~b&c&~d | a&b&c&~d ;
    11. 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必须均为化简后的最小值

    模块端口声明

    1. module top_module (
    2.     input a,
    3.     input b,
    4.     input c,
    5.     input d,
    6.     output out_sop,
    7.     output out_pos
    8. );

    题目解析

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

    fc4ab98169a624acd3765345c67e773a.png

    SOP圈法就是圈1,如下:

    836c3b40be6c6bdd3cb7af7282a5556b.png

    POS圈法就是圈0,如下:

    4951ec734d38956caaa32146dabfcc93.png
    1. module top_module (
    2.     input logic a,
    3.     input logic b,
    4.     input logic c,
    5.     input logic d,
    6.     output logic out_sop,
    7.     output logic out_pos
    8. ); 
    9.     assign out_sop = c&d | ~a&~b&c ;
    10.     assign out_pos = c&(~a|b)&(~b|~c|d) ;
    11. endmodule
    70b86aefbdf836e961ac794848074cda.png

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

    2278d1478b0663fc43c10d09beaa0df7.png

    注意图中无波形。

    这一题就结束了。

    Problem 77-m2014 q3

    题目说明

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

    d02f65a8bf7e62f78ee85d110186a650.png图片来自HDLBits

    模块端口声明

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

    题目解析

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

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

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

    e9ab6f385a545478adced0b3fddcc710.png

    注意图中无波形。

    这一题就结束了。

    Problem 78-2012_q1g

    题目说明

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

    4b2028c845beae675bfcfa5247beb7de.png图片来自HDLBits

    模块端口声明

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

    题目解析

    都是同一个道理。

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

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

    8b6d6e9b348d83a20289e2ed0d96ddfa.png

    注意图中无波形。

    这一题就结束了。

    Problem 79-ece241_2014_q3

    题目说明

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

    b0672239010e1ca4da0268a1507bd2d6.png bf98b0fc7af7d39b9f9e69411d4d198e.png图片来自HDLBits

    模块端口声明

    1. module top_module (
    2.     input c,
    3.     input d,
    4.     output [3:0] mux_in
    5. );

    题目解析

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

    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], 一个高位低位的问题,不要搞反了。

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

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

    59861ade608ed7b170e0bd8f529e7c02.png

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

    这一题就结束了。

    总结

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

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

    代码链接:

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

  • 相关阅读:
    智能手机收入和出货量双双下滑,造车成本不断增长,小米集团仍面临风险
    代码随想录算法训练营第53天 | 1143.最长公共子序列 1035.不相交的线 53. 最大子序和
    Nvm的使用
    线上HTTP请求导致OOM【max-http-header-size配置不当引起】
    深度解析四大主流软件架构模型:单体架构、分布式应用、微服务与Serverless的优缺点及场景应用
    学习UI第一天
    782 变为棋盘——Leetcode天天刷(2022.8.23)【数学:降维计算】
    苍穹外卖(八) 使用WebSocket协议完成来单提醒及客户催单功能
    为什么需要森林防火气象站?
    别再用 System.currentTimeMillis 统计耗时了,太 Low,试试 Spring Boot 源码在用的 StopWatch吧,够优雅!
  • 原文地址:https://blog.csdn.net/Pieces_thinking/article/details/127644518