type
status
date
slug
summary
tags
category
icon
password
“分析”是指,分析一个组合逻辑电路的实际功能。
4.1.1 组合逻辑电路的分析步骤
从上图中得到的组合逻辑电路分析的步骤为:由于逻辑电路图通常是使用门电路表示的,因此可以通过逻辑电路图直接得到一个逻辑表达式。下来就需要对该逻辑表达式进行化简以得到最简结果。此时有可能可以直接通过逻辑表达式看出组合逻辑电路的功能,此时直接进行功能描述即可;若此时无法直接根据逻辑表达式看出组合逻辑电路的功能的话,就需要画出真值表以便看出输入输出之间的关系,进而再总结出组合逻辑电路的功能。
4.2 组合逻辑电路的设计
“设计”是指,根据一个逻辑需求,设计出一个能实现该逻辑需求的组合逻辑电路
4.2.1 组合逻辑电路的设计步骤
- 逻辑抽象与赋值
分析事件的因果关系,以确定输入变量和输出变量。然后定义各个逻辑变量的含义,即以“0”、“1”分别表示输入和输出的不同状态。
后面无论是组合逻辑电路的设计还是时序逻辑电路的设计,第一步都是先进行逻辑抽象并赋值
- 列出真值表(根据因果关系)
- 导出表达式 or 卡诺图
- 化简或变换
- 画出逻辑电路图
在设计过程中可能会出现输出无效的情况,这个时候就需要判断这个输出不确定的原因是什么,如果是由于该输出对应的输入不可能出现的话,那么在卡诺图中d也可以被圈。
4.3 典型组合逻辑电路的设计
4.3.1 基本运算电路
在基本运算电路部分,通常会给出基本运算电路对应的Verilog代码,在这里会将Verilog代码贴出来以练习一下Verilog代码的编写。
4.3.1.1 半加器
- 半加器特点:半加器与全加器相比,半加器不考虑低位的进位输入。
但是半加器是有本位进位的。
- 半加器Verilog代码(数据流级描述)
4.3.1.2 全加器
- 使用逻辑门构成的全加器
- 全加器特点
- 全加器需要考虑低位的进位
- 全加器输入输出之间的逻辑表达式为:
- 全加器的Verilog代码(数据流级描述)
这个逻辑表达式比较重要,应该要背下来。当然这里Ci是可以展开的,使用展开之后的式子应该也是可以的。
- 集成全加器
- 引脚图
关于这种集成的全加器,感觉只需要知道这个集成全加器会给出本位计算结果和向高位的进位即可,这样就可以做级联了。
- 串行4位加法器
这个感觉更像是例题了
4位串行加法器的电路原理图如下:
这里初始进位接地,就表示是没有初始进位的。此外这里是可以在做有符号运算,后面会涉及到溢出的判断。
这里直接根据上面加法器的逻辑表达式以及4位串行加法器的电路原理图,写出串行4位加法器的Verilog代码(数据流级描述)
这里还有另一种写法,就是使用数组直接将运算整合起来:
- 超前进位加法器(并行加法器)
- 并行加法器特点
串行加法器的执行速度的主要限制条件为进位信息在全加器之间的传递速度。而并行加法器为了提高运算速度,减小或消除了由于进位逐级传递所浪费的时间。
实际上就跟计组里面的并行加法器处理是一样的,也就是把进位信息直接带入到逻辑表达式中,然后提前得到高位的进位信息。以四位并行加法器为例,只要给出两个四位的操作数,就可以同时得到各位的进位信息。
至于并行加法器的Verilog实现,只需要根据逻辑表达式写assign语句即可(只是assign语句可能会写的比较长。。。),这里就不再赘述了。
4.3.1.3 全减器
减法运算实际上就是在加法器的基础上,做计组中的变补操作,这里就不再赘述了。
- 全减器特点
- 全减器需要考虑低位的借位
- 全减器的逻辑表达式为:
这个逻辑表达式没有全加器那么重要,应该不用背。
- 全减器的Verilog代码
需要注意的是,全加器和全减器也可以使用行为级进行描述,只不过这里采用的是数据流级。因为这里是已经算出了逻辑表达式,所以使用数据流级会更好一点
4.3.2 数值比较电路
4.3.2.1 一位比较器
- 一位比较器的特点
- 一位比较器有三个输出,分别表示(输入信号为a、b):a>b、a<b、a=b
- 一位比较器Verilog代码(数据流级描述)
- 首先需要先写出模块的名称,在这里是comp1bit
- 接下来需要为该模块命名,在这里将comp1bit命名为了U1
- 然后为模块传参。这里可以使用”.”制定模块的参数,然后在后面使用”()”指明需要传入的参数。如( .a (sw[1]) 就表示需要将sw[1]作为参数传递给模块的形式参数a。
ppt中在这里第一次涉及到了模块的调用:
这里就稍微提一下模块调用的方式:
4.3.2.2 四位比较器
- 四位比较器的逻辑也比较简单,就是从高位到低位诸位比较。这里给出四位比较器的逻辑表达式
这里虽然给出了逻辑表达式,但是由于这个逻辑表达式比较复杂,因此如果需要使用Verilog来描述四位比较器的话,就会使用行为级进行描述。
- 四位比较器的Verilog代码
4.3.2.3 集成比较器
集成比较器的电路原理图如下:
集成比较器实际上就是将若干个四位比较器级联起来。
在这里可能会觉得这个比较器不太符合我们比较的逻辑:从高位到低位诸位比较。但实际上级联比较器仍然是优先比较高位的。下面解释一下愿意:从电路图上看,高位和低位是同时输入到电路中的,并且实际上某一个四位比较器的输出结果优先将由该比较器的输入决定,只有当四位比较器的两个输入相等时,才会直接将低位比较的结果传递到高位。因此仍然是高位优先比较的逻辑。
另外需要注意的是,最低位的四位比较器的级联输入端应该输入“010“,以便保证最低位的比较结果是正确的。
4.3.3 编码器
4.3.3.0 编码器相关概念
- 编码:是指用文字、符号和数码来表示某种信息的过程。
在数字系统中,由于采用二进制运算处理数据,因此通常将信息编成若干位二进制代码。在逻辑电路中,信号都是以高、低电平的形式给出。
- 编码器:实现编码的数字电路,把输入的每个高低电平信号编成一组对应的二进制代码。
假设某编码器有n个输入端,I0, I1 …,In-1 ,有m个输出端Y0,Y1 …,Ym-1 。为了不使输出发生混乱而产生错误,普通编码器规定,在任何给定的时刻,n个输入端中只能有一个有效,其余n-1个都不能出现。同时也可以知道,输入端的个数与输出端的个数有以下关系:2^m≥n(这是为了所有的输入都可以被成功编码)
4.3.3.1 二进制编码器
- 二进制编码器:又被称为二进制编码器(2^n线-n线编码器),二进制编码的组合电路。
二进制编码器就是把输入信号编成二进制码。目前我见到的所有编码器应该都是二进制编码器
- 二进制编码器注意点
- 输入信号可以是低电平有效或高电平有效的形式
- 编码器的输出码可以是原码形式也可以是反码形式。
- 与十进制数数值对应的二进制码为原码。
- 把原码各位取反得到的码为反码。
同样的,由于原码和反码通常是用于表示有符号数的,而编码器的输出通常代表一个无符号数。因此这里说的原码和反码应该都是隐含了一个符号位“0”,而该符号位不会在输出中体现出来,因此这里说的原码和反码的关系就是按位取反的关系。或者换句话说,就是输出也可以是高电平有效或低电平有效的形式
因此ppt上说:
- 例1——4线-2线编码器(输入输出均为高电平有效)
- 4线-2线编码器逻辑表达式
- 4线-2线编码器Verilog代码
约束条件为:
其中i≠j,且i,j≤3,i,j≥0。
这里如果直接通过真值表可能还得不到这么简单的表达式。这里是第二章中提到的有无关项的逻辑表达式化简。这里可以通过卡诺图的方式进行化简,这里不再赘述。有必要说的是这个逻辑表达式也可以通过约束条件进行化简(这里仅以其中一项为例):
数据流级描述:
行为级描述:
同样的,可以在顶层文件中调用该模块:
- 例2——8线-3线编码器(输入为低电平有效,输出为高电平有效)
8线-3线编码器的逻辑表达式与4线-2线编码器的相似,这里不再赘述。唯一需要注意的是,由于这里输入是低电平有效,因此最终输出的逻辑表达式中最好使用输入低电平有效的符号。这是因为我们虽然在代码里面规定了输入变量的符号为~I,但是实际上输入的变量就是~I,而不是I。举一个更具体的例子就是:在一个输入为低电平有效的电路中,如果有一路的输入为0,那么应该是~I=0,而不是I=0。
4.3.4 译码器
4.3.3.0 译码器相关概念
- 译码:译码是编码的逆过程,其功能是将具有特定含义的不同二进制代码“翻译”出来
或者说是将二进制码翻译成更易于理解的信号,所以下面的七段数码管也算是一个译码器。
4.3.3.1 二进制译码器
- 二进制译码器特点:
- 二进制译码器属于完全译码器
- 二进制译码器通常情况下有一个使能端
- 控制译码器的状态
- 当E=1时,译码器处于工作状态;
- 当E=0时,译码器处于非工作状态。
- 用于译码器的扩展:可以理解为是将使能端作为了片选信号
- 与编码器相同,译码器的输入信号也既可以是高电平有效,也可以是低电平有效;输出信号既可以是原码表示,也可以是反码表示。
若一个译码器有n个输入和m个输出,且m=2^n,则称该译码器为完全译码器;反之则称为部分译码器。
没有使能的时候,在真值表中的体现为:输入为d,输出全为1。这个可以理解为,没有使能的时候,输入信号被切断了,导致输入到译码器中的信号不确定,而在输出上也自然不能输出有效信号(即在输出反码的情况下,所有的输出信号都为1)
使能段的作用为:
- 例1——3线-8线译码器(输入为高电平有效,输出为原码表示)
- 3线-8线译码器的逻辑表达式
- 3线-8线译码器的Verilog代码
数据流级描述:
行为级描述:
同样可以在顶层文件中调用:
- 2-4译码器的作用——数据分配器
但是我觉得这个数据分配器有点不太对劲,他利用了2-4译码器未使能时输出全部无效的性质。因此这里我就直接贴图了,不想做过多解释。
4.3.3.2 二-十进制译码器
这个就是部分译码器了,因为有4个输入,但是输出只有10个。
- 二-十进制译码器的功能为:将8421BCD码翻译成十个不同点位的指定电平。
- 二-十进制译码器的逻辑表达式
这里可能会疑惑,为什么在这种译码器中明明有无关项,但是这里给出的逻辑表达式没有进一步进行化简。这样处理的原因为:当输入为无关项时,所有的输出都应该是无效的(在输出反码的情况下应该是全1),因此在写逻辑表达式的时候也不会涉及到无关项(因为在输出反码的情况下,写逻辑表达式的时是找0,但无关项的输出全是1)。
4.3.3.3 数字显示译码器
也就是FPGA上的七段数码管了。
- 数字显示译码器的特点
- 信号与数码管的对应关系为:
- 数字显示译码器的输入通常为8421BCD码
数字显示译码器实际上有两个部分组成:一是七段译码器,负责将8421BCD码转换为七段信号;二是数字显示单元,其可以根据输入的七段信号点亮对应的数码管。因此不难发现,实际上只有第一部分是一个译码器。
由于输入通常为8421BCD,因此需要一个七段译码器,已将8421BCD编码的信号转换为可以在数码管上显示的信号(也就是得到a-dp的值):
- 数字显示译码器的逻辑表达式
这里得到了逻辑表达式,因此后面可以直接使用数据流级进行描述。但是这个逻辑表达式太复杂了,因此通常情况下都是使用行为级进行描述。
- 数字显示译码器的Verilog代码
数据流级描述:
行为级描述:
这里学到一点,就是case语句的各个case条件不仅仅能使用基数形式,也可以直接使用十进制形式。
同样,给出顶层文件调用:
4.3.3.4 译码器的应用
74LS138的逻辑表达式为(74LS138输入高电平有效,输出反码):
即:
因此输出低电平有效的译码器又被称为最大项发生器(因为每一个输出对应了一个最大项)
相反,输出高电平有效的译码器又被称为最小项发生器。
而所有的逻辑表达式都可以使用最大项与式或最小项和式进行表示,因此实际上所有的逻辑表达式都可以使用对应的译码器进行表示。
4.3.5 数据选择器
在数据选择器之前还有一个代码转换电路,但是ppt太卡了,而且那一块比较简单,所以这里就不记了
数据选择器的功能:通过选路引脚选择将某个输入数据在输出端输出。
4.3.5.1 二选一数据选择器
- 二选一数据选择器逻辑表达式(当选路引脚s为0时,输出a;为1时,输出b)
- 二选一数据选择器Verilog代码
门级描述:
数据流级描述:
行为级描述:
这里学到一点:“?”表达式也算是行为级描述方式。
4.3.5.2 四选一数据选择器
- 四选一数据选择器逻辑表达式
- 四选一数据选择器Verilog代码
门级描述:
在门级描述中,内置门电路可以有多个输入(比如与门并不一定是二输入与门)
数据流级描述:
行为级描述:
4.3.5.3 四位二选一多路选择器
跟二选一数据选择器相比只是输入输出变成了四位,其他都没啥变化。
- 四位二选一多路选择器
数据流级描述:
这里又学到一点:“?”表达式也可以算是数据流级描述。因此无论题目说是用数据流级描述还是用行为级描述,都可以使用“?”表达式。
行为级描述:
这里也可以给出顶层文件:
4.3.5.4 数据选择器的应用
利用2n路数据选择器可以很方便地实现任一个n变量的逻辑函数表达式。
具体操作就是将逻辑表达式的输出直接放在数据选择段,然后输入信号输入到选路信号中。
但是通常情况下这样构造的电路都不是最优的。下面是一个化简数据选择电路的方式:
说白了就是在数据选择电路(这里以四选一数据选择器为例)中,只需要选择两个变量作为选择信号即可,其余变量都可以放到数据输入端。
使用数据选择实现某个逻辑功能有两种方法:
- 卡诺图法
也就是在圈卡诺圈的时候按照数据选择器的逻辑表达式来圈卡诺圈。如下面的卡诺图:
这里是选择AB作为数据选择引脚。需要注意的是,卡诺图中的顺序是格雷码序,所以从卡诺图得到数据选择器的输入信号时需要小心。
- 代数法
也就是直接在逻辑功能对应的逻辑表达式上做变换,以得到数据选择器的标准形式。
4.4 组合逻辑电路的险象
4.4.1 竞争
- 竞争的概念:由于电路中各个信号通过的路径不同,可能加到某个门电路的两个信号同时向相反方向变化。这一现象这就是组合逻辑电路的竞争现象。
4.4.2 险象(冒险)
- 险象的概念:由于存在竞争,使电路的输出出现瞬间的逻辑错误称为险象。工程上也称为毛刺。
- 险象产生的原因
- 该门电路的两个输入信号的变化时间差异极小
- 该门电路的两个输入信号的信号边沿变化时间存在差异
首先需要知道有竞争不一定有险象,但是有险象一定有竞争。
这里看书上的内容会更好理解一点。
4.4.3 险象的分类
按输出是否变化,可以将险象分为:
- 静态险象:若在输入变化而输出不应发生变化的情况下,输出产生的险象,称为静态险象。
- 动态险象:若在输入变化而输出应该发生变化的情况下,输出在变化过程中产生的险象,称为动态险象。
因此主要是看输出变量是否应该变化。另外,险象只有可能在输入信号变化的时候出现。
按错误信号类型分类,可将险象分为:
- “0”型险象:若错误输出为负脉冲称“0”型险象。
- “1”型险象:若错误输出为正脉冲称“1”型险象。
因此主要是看错误输出的信号是什么。
这里给出一张图以便理解:
4.4.4 险象的判定
4.4.4.1 代数法
在逻辑表达式中,令除了某个逻辑变量(如变量A)及该变量的非(如~A)以外的其它变量为某个恒定值后,若出现A&~A或A|~A,则必然存在险象。
若出现 ,则存在“1”型险象;若出现 ,则存在“0”型险象。
4.4.4.2 卡诺图法
在一个逻辑表达式的卡诺图中,如果两个不同的卡诺圈相切,且相切部分又未被其他卡诺圈圈住,则该电路必然存在险象。
感觉这个方法不如代数法直观,所以还是用代数法吧
4.4.5 险象的消除或减弱
险象的消除/减弱有三种方式:
- 引入封锁脉冲(由于同步问题不易实现)
- 增加冗余项
这个方法比较重要,当出现“1”型险象时,需要通过其余变量(与险象产生无关的变量)构造出一个冗余项,使逻辑输出一定为“0”,反之同理。
- 输出加低通滤波电路
相当于是只允许通过变化频率较低的信号。而毛刺的变化频率通常较快,因此就会被低通滤波电路滤除。这里给出一个简单的、通过电容实现的低通滤波电路:
疑问
去看一下多位变量是怎么并行运算每一个位的
“?”表达式到底是算行为级还是算数据流级?
下面这个ppt是不是描述有问题?
我是觉得这里的两点是险象产生的原因。有竞争不一定有险象,只有临界竞争才会产生险象。而当一个竞争满足上述两个条件之一时,就会出现险象。
错题
这一题主要是因为输出信号有d。这里由于题目说了是一个8421BCD码,所以这里输出为d是由输入信号不可能出现导致的,因此在卡诺图中d也被正常圈了。
这一题主要是因为题目要求是“或非门”,第一个“或”就表示逻辑变量之间应该是“或”的关系,因此应该使用最大项与的形式,即在卡诺图上圈0
这题中学到的主要是:补码应该只是用来表示有符号数的。就算说是无符号数的补码表示,那么也是隐含了一个“0”符号位的
这个输血电路可以考虑一下Verilog怎么写
这个加减法电路挺重要的。
- 作者:Noah
- 链接:https://imnoah.top/article/DigLogic/Chapter4
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。