概述
文章目录
- 数字系统
- 信息的表示与数字系统基础
- 数制与算数运算
- 数制
- 数制转换
- 非十进制到十进制
- 十进制到非十进制
- 2 1 , 2 3 , 2 4 2^1,2^3,2^4 21,23,24进制之间的转换
- 算术运算
- 编码
- BCD码
- 字符编码
- ASCII码
- GBK(中国码)
- Unicode码(万国码)
- 格雷码
- 校验位
- 布尔代数
- 布尔代数基础
- 布尔代数常用公式
- 对偶
- 反函数
- 基本公式
- 标准形式
- 最小项和最大项
- 主析取范式和主合取范式
- 积之和和和之积形式
- 应用:布尔函数化简
- 评判标准以及深入理解
- 代数化简
- 卡诺图化简(重点)
- 基本思路
- 优化方向
- 理论技巧
- 组合逻辑电路设计
- 基础流程:设计一个BCD码到余三码转换电路
- 规范化
- 形式化
- 优化
- 卡诺图优化
- 共享电路和其他优化方法
- 工艺映射
- 电路概要图
- 映射到与非门/或非门
- 验证
- 人工逻辑分析
- 逻辑仿真
- 组合逻辑功能模块
- 组合功能模块
- 基本逻辑函数
- 单变量函数(一入一出)
- 多位函数(n入n出)
- 使能函数
- 译码和译码器
- 基本概念
- n − 2 n n-2^n n−2n 译码器设计思路
- 带使能译码器
- 基于译码器的组合电路
- 译码器原理
- 译码器应用实例:实现标准积之和函数
- 编码和编码器
- 基础编码器——十进制转BCD编码
- 优先编码器
- 选择和复用器
- 基于复用器的组合电路——格雷码转二进制
- m位宽 2 n − 1 2^n-1 2n−1多路复用器
- m位宽 2 n − 1 − 1 2^{n-1}-1 2n−1−1多路复用器
- 组合逻辑算数模块
- 迭代组合电路
- 二进制加法
- 半加器(不行)
- 全加器(最终目标)
- 4位的加法器举例
- 二进制减法(兼容加法)
- 溢出
- 其他功能
- 压缩
- 递增/递减
- 乘除以常数
- 0填充/符号扩展
- 时序电路
- 基础概念
- 基本储存单元
- 锁存器
- S-R锁存器(基本或非门锁存器)
- S ‾ − R ‾ overline{S}-overline{R} S−R锁存器(基本与非门锁存器)
- 时钟S-R锁存器
- D锁存器
- 触发器
- 主从S-R触发器
- 边沿触发器
- 直接输入的正边沿D触发器
- 时序电路分析
- 基本模型
- 状态表
- 状态图
- 状态图类型
- 状态图等价
- 时序电路设计:子序列识别器
- 规范化
- 形式化
- 状态分配
- 确定方程及优化
- 工艺映射
- 验证
- 状态机设计
- 有限状态机FSM(Finite State Machine)
- 状态机图
- 初步理解
- 转移和输出条件依赖举例理解
- 宏观总结
- 约束检查
- 转移(TC)约束检查
- 输出(OC)约束检查
- 例子
- 其他
- 数字硬件实现——寄存器&储存器
- 北理工数字逻辑大作业:1分59秒99分秒跑步计时器
数字系统
信息的表示与数字系统基础
信息就是信息。
信息用信号承载:
- 数字信号:离散的物理量
- 模拟信号:连续的物理量
数字系统用数字信号来实现,0和1代表真假,输入输出处理都是用01实现,听起来很不可思议,但是确实大家实现了,因为本质上这些都是信息的表示,而二进制可以稳定表示信息,经过层层抽象,可以表示巨量的信息,所以成功是必然的。
其实万物皆有阴阳二性,其实二进制或许才是世界的尽头,期待量子世界的发现。
但是实际中比如电压的高低,并不是离散的而是连续的,这就需要从连续到离散,比如高和低,而为了防止误判,设置一个中间带,既不是高也不是低,保持原状,作为缓冲。
数制与算数运算
数制
老生常谈的东西了。n进制的基底就是n,然后通过数字的位置加权,最后得出值。
数制转换
非十进制到十进制
直接按权展开。
十进制到非十进制
- 整数部分。除n取余,倒序排列。
- 小数部分。乘n取整,顺序排列。
注意小数部分是不一定被完全转化的,所以这就是2进制表示10进制的系统缺陷,无法消除的极小位数误差。
2 1 , 2 3 , 2 4 2^1,2^3,2^4 21,23,24进制之间的转换
这三个进制比较特殊,可以截取转化。
- 2进制到8/16进制。从小数点开始向两边分节,末端不够就补0,最后按节转化。
- 8/16进制到2进制。直接将每一节展开。
算术运算
进制内的加减如同10进制一样,满n就进,不够就借位。
进制内乘除也和10进制一样,按位乘,高位要往左移动一位。
编码
你懂编码吗?
我不是很懂,但是现在有一点感觉了,就是编码实际上是一种映射,比如2位二进制有四种组合,每种组合对应一个物体,这样就是给四个物体编码了。
所谓编码,就是用二进制去对现实世界进行映射。
BCD码
用四位二进制编码0-9的十个数。
很显然,二进制利用的不够充分,但是还是有用的。
首先要明白,BCD码不是二进制数,你如果按照二进制去翻译BCD,值一定和原来的10进制不一样。
BCD码其实就是二进制的皮,十进制的灵魂。
字符编码
ASCII码
最初美国的编码,128个,8位二进制。老生常谈了。
GBK(中国码)
各个国家都有自己的一套编码,中国的GBK现在很多软件都在用。
Unicode码(万国码)
世界要统一编码,所以需要更多位表示。
Unicode定长有点浪费,所以本着节约精神,产生了多种变长编码:
现在之所以UTF-8大行其道,主要是因为他向后兼容ASCII码。
格雷码
格雷码也是二进制,但是有个特性:相邻值的格雷码,只有一位二进制数不同。
这个特性看起来很鸡肋,但是后面数字逻辑的卡诺图优化就是依赖于格雷码的,所以记住了。
其实格雷码还有很多应用,他的小变化给他带来稳定性特点,可以应用在光学轴角编码器
低功耗体现在每次自增,甚至是循环归0,也只需要改一位二进制即可。
格雷码怎么编呢?
偶数位格雷码采用对称编码方式,先编一半,另一半参照这一半快速生成,这也是格雷码叫做反射码的原因。
校验位
虽然二进制比较稳定,但是传输过程中不免出现某个0变成1,某个1变成0,这时如果可以校验0,1数量,发现不对还可以让传输端重新传输一次。
奇偶校验检验的对象是1,如果1的个数对应名称,就将校验位置0.
以上是奇偶校验的思路,奇偶校验是最简单的校验,只能确定有没有错,不知道错在哪里。
布尔代数
布尔代数基础
基础的,与或非运算。
除此之外还有一些扩展的,与非,或非,异或,同或运算。
其中异或需要注意一下,n输入异或又名奇函数,说的是当其中的1为奇数个,则输出1,2输入的异或只是n=2的特殊情况。
相应的,硬件有与门,或门,反相器(非门),与非门,或非门,各种门。
门是实际的硬件,具有延迟,输入端做出的改变,响应要等一段时间,这个时间叫做传播延迟,单个门通常为1ns以内,一般简单电路不考虑,只需直到一个电路的延迟=从头到尾一条支路延迟之和的最大值即可。
布尔表达式可以对应于一个门电路,而为了简化门电路,需要简化布尔表达式,数字系统的理论基于布尔代数。
布尔代数常用公式
对偶
对偶就是说把一个布尔等式,左右两边同时对偶化,是同样成立的。后面的公式基本都是先给出一个,然后用对偶去变出另一个。
对偶原则:
- 0 1 反
- 与或反
- 布尔变量不应该改变,这也是保证了变化以后的公式保留一定原来的面貌。
反函数
给一个函数取反就是反函数了。挺草率一个概念,其实就是demorgan的另一种解释。
基本公式
- 图1:貌似是叫同一律
- 图2:经典交换结合分配三连定律。请务必注意第二个分配率,最后一个 X + Y Z = ( X + Y ) ⋅ ( X + Z ) X+YZ=(X+Y)·(X+Z) X+YZ=(X+Y)⋅(X+Z) 很多人都没见过,他是对偶出来的。也只有在布尔代数是一定成立的。
- 图3:demorgan同样经典。
标准形式
这一部分涉及到离散数学中的主范式。
所谓主范式,就是一种标准但是麻烦的表示形式,这种表示形式有个好处,就是给出逻辑输入,可以非常快的得出结果是真是假
更本质说,其实是将真值表转化为表达式形式了。
最小项和最大项
参考:最大项和最小项
合取式:若干个项之积。可以理解为所有项合起来都得是1才行。
析取式:若干个项之和。可以理解为从一堆项中提取一个为1即可。
析取范式:若干个合取式之和。即积的和
合取范式:若干个析取式之积。即和的积
最小项:项中不缺变量,是积的形式。最小项是积,最终是要向着1出发的,所以每有一个位值为1,角标相应的位置就是1,所以
X
Y
Z
=
m
7
XYZ=m_7
XYZ=m7
最大项:项中不缺变量,是和的形式。最大项是和,最终是要向着0出发的,所以每有一个位值为0,角标响应的位置就是1,所以
X
Y
Z
=
M
0
XYZ=M_0
XYZ=M0
另一种理解角标的方式就是,最大项和最小项对同样的输入,其角标是互补的。
主析取范式和主合取范式
将布尔表达式转化为主范式是有一套算法的,如下:
其实还有别的操作,需要用到demorgan,取反,分配。
直接化简比较麻烦,好在,我们不需要操作很多变量,一般也就3-4个,所以可以暴力点,可以直接用真值表转化。写出真值表,找出为1的,都是最小项,直接写出来就好。这也是我们前面谈到的本质,说白了这就是真值表的转化。
积之和和和之积形式
可以感觉到,虽然人读起来很方便,但是电路实现太复杂了,所以我们需要将主范式变成更简化的积之和/和之积形式。
转化为和之积形式或者积之和形式,电路就可以用二级结构实现,可能并不是最简的,但是一定是延迟较短的形式。
应用:布尔函数化简
评判标准以及深入理解
G=L+T(+I)
- 文字成本L。所有文字数。凡是符号,不管重复不重复,都算一个文字。一个文字代表一条引线,所以不管是否重复,引线每扇出一条支路,就增加一个文字成本。
- 门输入成本T。除单个文字以外的全部项数。一项代表这一项的门引出的导线,所以叫门输入成本,这也是为什么单个文字不算的原因,单输入没必要过门增加导线。
- 反相器成本I(可选)。计算比较麻烦,所以一般不用。
这里需要说一些特殊的情况,以及深入理解一下。
直接给出结论:
- 文字成本就是输入的导线数量
- 门输入成本就是,在子项经过门运算产生结果后,合成大项需要引出的导线数量
接下来给出情况,看最下面的五种情况,从一般到特殊,当你理解了本质,你看公式的时候,脑子里面就会自动把导线脑补出来,哈哈:
- 这是最常见的情况。
- AB+C的情况,为什么C不算门输入成本呢,因为C不需要经过门,不需要引出额外导线。
- AB的情况,也不算门输入成本,这是因为这一个表达式就他一个子项,不需要合并子项,自然也就不需要再加门加导线。
- A+B的情况,和AB类似。
- A的情况,这类的成本为0,因为如果M作为其他门的输入,那A也可以直接作为输入,所以不需要先将A转换为M,也就是说这个变量替换其实没啥意义。
代数化简
代数化简就是通过布尔代数化简,但是不推荐,因为你没办法确定最简,只能凭感觉。
上限高,下限低。
小电路推荐用卡诺图。简单粗暴,几乎最简。
卡诺图化简(重点)
基本思路
卡诺图的理论我直接跳过,到操作方法来。
-
根据变量画出格雷码方格。
对于4变量,每一条轴都有两个变量进行组合,对于一条轴上的两个变量,按照00,01,11,10的格雷码编写,两条轴都是格雷码可以保证结果的组合也都是格雷码。
方格的0,1选择,一般按照升序排列,最终结果应该如下:方格括起来的就代表这变量为1,读的时候比较方便。
-
将1填入,0默认为空即可。
-
用矩形括起来,括起来的1必须是1,2,4,8,16中的数,不允许出现空括,可以括X。
以上是积之和形式,如果要和之积形式,需要做如下:
- 对0进行框选,得到 F ‾ overline{F} F,这是F反函数的积之和形式
- 对 F ‾ overline{F} F取反运用demorgan定律,得到F的和之积形式
优化方向
- 矩形越大越好:这样保证结果的项里面的文字足够少,降低文字成本。如果有X,可以利用X尽可能扩大矩形,但是不要一个矩形里一个1都没有。
- 矩形越少越好:这样保证结果的项数足够少,降低门输入成本
- 一般都是先找个最大的,然后慢慢补,从大找到小。
理论技巧
我觉得找那个蕴含项,主蕴含项,质主蕴含项就是脑残行为,本来卡诺图也就只能优化4变量16种组合,就那么点东西,凭直觉完全够,非要整个蕴含项。
这部分我不打算写了,一点用都没有,考出来就考出来吧,反正也不会占用多少分数。
组合逻辑电路设计
基础流程:设计一个BCD码到余三码转换电路
规范化
将输入,输出用标准语言,比如真值表,或者函数来描述。
形式化
真值表来表示模块,如果可以用公式,表达式,更好。
这道题没办法用公式直接描述,用真值表来形式化
优化
卡诺图优化
将公式优化,简化,如果变量数目≤4,可以运用卡诺图简化,甚至用卡诺图生成公式。
这道题,四个输入,四个输出,所以要做四个公式,用四个卡诺图。
Z是单项,所以不算,前面已经谈到过了。
共享电路和其他优化方法
共享电路采用牺牲延迟,换取低成本的方法。
如果采用共享电路,就相当于增加了电路的级数,但是会减少成本。
具体做法类似于提取公因数。
如下是一种提取。
这时发现该可以有更好的提取方法,这里 C ‾ D ‾ overline{C} quad overline{D} CD只算2的文字成本,没有门输入成本,原因前面谈到了。
工艺映射
将公式做成电路图,进一步将电路图实现。
电路概要图
这个图是公式的直接转化,保留了与门或门反相器。
映射到与非门/或非门
这里以与非门举例,或非门与此相同。
先进行1,之后电路中就只剩下反相器和与非门
反相器最简如4步描述,我的理解实际上就是,与与非门直接相连的导线支路上最多只有一个反相器。
然后再反复进行2,3步,直到反相器最简。
2步的意义在于,尽可能将反相器推到支路上,让反相器在支路上汇合,消去。
验证
通过理论验证或者仿真手段来验证
人工逻辑分析
最终目标是证明
简化方程式
≡
equiv
≡ 规范方程式
做法可以是算出简化方程式的真值表,或者干脆进行逻辑演算。
逻辑仿真
用vivado写Verilog,大体思路是:
- 实现电路模块
- 生成模拟信号,作为模块输入
- 将输出与期望值进行比较
组合逻辑功能模块
组合功能模块
实际上就类似于函数。
基本逻辑函数
单变量函数(一入一出)
四种,取0,取1,原样和取反。
多位函数(n入n出)
这个不是多变量函数。多变量是多入一出,多位函数就是一位函数的向量,n入n出,一一映射。
分出的位子集,就是这n个函数的子集。
使能函数
实际上就相当于一个开关。
译码和译码器
基本概念
- 编码。将信息转换为码
- 译码。将码还原为信息
- 码比信息短,这很合理,同时 2 n 2^n 2n的上限限制是有门道的,直观看就是指数规律,这是递归分解的思路,后面会写。
- 编码和译码互逆。
- 本质上就是映射
n − 2 n n-2^n n−2n 译码器设计思路
这个图需要说一下,一般导线输出都是分叉为两条导线,但是下面哪个1-2译码器,一个输出被分叉成4条导线,和上面的2-4译码器地位相等,这也保证了最后8个与门的输入导线为8+8=16
带使能译码器
使能思路是,本来是一个2-4译码器,但是为了配合使能,额外增加一层与门,再加一个EN输入。
将其设计成(2+1)-(4+1)译码器,其赋值第一位是使能位,如果是0,则全部变成固定值,如果是1,就正常译码。
另一种角度理解,实际上是把3-8译码器的四种情况合并为1种。
这个译码器还可以理解为多路分配器,把EN当输入,然后通过
A
1
,
A
0
A_1,A_0
A1,A0来决定把EN分配到哪个输出.
基于译码器的组合电路
译码器原理
到现在为止,译码器的原理比较模糊,我自己的理解如下:
- 从2的n次方,以及真值表来看,所谓译码,就是将n个二进制输入进行全排列枚举,然后对应到 2 n 2^n 2n 长度的二进制数上的某一位,这个位就是二进制全排列的实际值
- 译码器本身是死的,或者说这是狭义的译码器,就专指一个位数映射
- 可能有变化,比如改变这个映射关系,以及减少输出。
所以,到现在为止,就把译码器理解为一个位数映射就好。实际用的时候,主要是这一句话:
对于n位输入的全排列,每次只有一个输出是1,其他为0
这是不是非常像真值表的最小项?对每一个全排列输入,只对应一个最小项。
那么,如果把这些最小项输入用或门连在一起,是不是就是积之和形式?
译码器的厉害之处在于:
任何一个电路,都可以用译码器实现
换句话说,任何一个布尔函数,都可以用译码器来实现。
缺点在于成本高,需要后续优化。
译码器应用实例:实现标准积之和函数
第二个例子:
X+Y+Z=S(C为进位)
先列出真值表,然后用译码器表示出来,用或门链接,分别表示S,C函数
编码和编码器
译码是编码的逆过程。
基础编码器——十进制转BCD编码
重点在于如何得到公式,如果用卡诺图,10输入不太行,此时可以转换思路,用译码器思路来搞。
- 10个输入,用10位来指代,相当于译码器的输出
- 然后用译码器思路直接用四个或门组合出四个输出。
这种方式的缺点在于,n个输入就得n位输入,且n位中只能有一个1,比较僵化,万一有其他1,就会出错。
优先编码器
针对上面多位输入为1的情况,我们可以将这种划归为一位为1的情况,即只选择一位,忽略其他位。这种就叫优先编码。被忽略的就是卡诺图中的不确定输入
优先编码通常位数不多,毕竟是优先,所以对于4以内的输入,可以用卡诺图配合真值表直接得出最优结果。
这里额外增加了一行一列,一行为全0,一列V为区分用的
如果输入偏多,那么就只能直接列出,再进行优化。这里因为有不确定项,所以失去了其他都为0的假设前提,必须要人为加上其他约束,就是把乘积项整个列出。具体到实际电路,还得加一些反相器和与门。并且进行一些优化。
可能你看到这有些懵逼,千万别觉得没了卡诺图你就写不出公示了,你肯定是能写出来的,大不了一种情况一种情况列出,只不过不够优化罢了。
比如下面的A1在什么时候为1呢?找到左边,D2为1,D3D4为0的时候,再并上D4为0,D3为1的时候。
很简单,很直接,很本质,这就是逻辑的最初形态,不优化的原生态,卡诺图做法只不过是优化罢了。
这里进行一些优化,解释一下:
- 将 D 4 ‾ overline{D_4} D4提取出来以后,相当于确定了大前提,那么剩下的两项用了 X + X ‾ Y = X + Y X+overline{X}Y=X+Y X+XY=X+Y
-
A
0
A_0
A0的优化也用了这个思路
选择和复用器
通过观察上面的电路,归纳得到一般步骤:
多路复用器实现对信号的选择功能。实际上,我们前面学的译码器本身就具有选择功能,只不过,只是对
2
n
2^n
2n个输出中选择一个给1,其他给0.
基于此,可以用
2
n
2^n
2n个信号,与这些输出绑定(与门),每次译码,只选择其中一个。
结果通过或门整合起来。
我们还可以进一步整合,公用一个译码器,然后绑定不同的信号,生成m个单输出,作为一个输出位向量。这就是对向量的选择:
基于复用器的组合电路——格雷码转二进制
m位宽 2 n − 1 2^n-1 2n−1多路复用器
这个就沿用我们前面的经典方法。
X比较简单,就等于c。
YZ需要进行映射,首先进行排序,译码给出8个待绑定端口。然后用对应的信号绑定端口就ok,最后会根据译码选定这些信号。
这里看出,信号是给的固定信号,其实不一定是固定,这也是后面要优化的。
m位宽 2 n − 1 − 1 2^{n-1}-1 2n−1−1多路复用器
这里还是按照升序排列。可以注意到,对于两个连续的信号,AB都是相同的,C互反,且对应的输出信号也互反。
这个互反将C与输出绑定起来,所以,根据这个互反关系,可以将门输入成本减少一半。
具体改法就是,将C和C反单独作为信号,而不采用固定信号。举例分析:
000和001,对应的y分别是0和1
000和001的AB是相同的,所以译码器选择D00端口,绑定C信号
如果C是0,则输出0,C是1则输出1
完美!
这里也可以看出这个方法的缺陷了,不是所有码都能保证两个互反同时出现,这也是这个方法不能广泛适用的原因。
组合逻辑算数模块
迭代组合电路
当一个电路模块的输出和输入是同一个类型时,就可以迭代调用,比如二进制加法的进位,是输入也是输出。
二进制加法
简单的二进制加法可以用卡诺图化简,但是当位数逐渐增加,比如int型就是32位,这种只能用迭代思路求解,其实就是我们平时做加法的思路,进位。
设计一个子函数模块:
半加器(不行)
半加器不适合迭代,因为没有进位输入。
全加器(最终目标)
全加器是我们最终要的子函数模块:
如果XY同时有,必然进位,或者,在XY有一个(奇函数)时再有个进位(Z)的时候,也可以。
解释下:
- 奇函数通过多级异或实现,AB先异或,结果再和C异或,形成ABC的奇函数,输出S
- AB首先进行与门操作
- 第一级AB异或扇出,和C进行一个与门操作
- 两个与门用或门整合,输出C
4位的加法器举例
二进制减法(兼容加法)
在加法的基础上构建减法,非常便捷。
规律就是,
A
−
B
=
A
+
B
(补)
=
A
+
B
(反)
+
1
A-B=A+B(补)=A+B(反)+1
A−B=A+B(补)=A+B(反)+1
取反和加一可以统一通过一个开关实现:
这个S设计的非常精巧,同时担任了取反和+1操作。
溢出
溢出可能出现在
- 同号相加
- 异号相减
核心思路就是检测符号位的进位输入和进位输出是否一致,具体实行起来前期百怪,了解一下就行了。
其他功能
压缩
压缩就是对一个电路进行特异化。
所谓特异化,就是把某一个输入信号固定为0/1,则可根据布尔代数进行化简,得到简化电路。
递增/递减
这就是对加法电路进行压缩,固定第二个加的数。
乘除以常数
就是移位的高级操作。
0填充/符号扩展
字面意思,左填充或者右填充。
符号扩展就是增加位数,也是填充。
时序电路
基础概念
时序电路就是在组合电路上,增加时间维度。
组合电路的输入增加当前状态(由上一状态生成),输出增加下一状态(用于下一次的输入)
时序电路有两种,同步时序电路和异步时序电路,定义比较抽象,后面再回来看就ok。
现在只需要知道,同步时序电路搭配触发器,异步时序电路搭配锁存器。
基本储存单元
锁存器
S-R锁存器(基本或非门锁存器)
S-R锁存器由两个交叉耦合的或非门制成。
基本特性:按S将Q置1,S松开保持Q,按R将Q置0,R松开保持Q。
S ‾ − R ‾ overline{S}-overline{R} S−R锁存器(基本与非门锁存器)
既然有或非门的,自然也会有与非门锁存器。
基本特性:和S-R反过来,1和1是常态,哪个按下为0,就到达哪个状态。
时钟S-R锁存器
就是给输入加了时钟信号,如果时钟不让通过,外部按键就不会影响状态。
但是还没有解决未定义状态的问题,万一哪个小孩手贱同时按下去了呢。
D锁存器
加了个反相器,确保对S-R锁存器的输入只有0-1,1-0两种状态。
至此,D锁存器已经大成,成为通用锁存器。
但是锁存器其实还是有个问题,不稳定。
触发器
锁存器的本质问题在于,锁存器的值依赖于当前的状态,产生的状态如果作为输入,就会产生鸡生蛋,蛋生鸡的循环,导致系统不断变化不稳定,所以需要将锁存器的传递截断,截断,怎么截断呢?就是时钟!
主从S-R触发器
两个时钟S-R触发器串联而成,第二个时钟信号被反相器取反。
时钟为1,主锁存器改变,时钟变0,将影响传递下去到从锁存器,同时截断对主锁存器的改变。
这样,施加在主锁存器左边的变化,需要等一个时钟脉冲才可以传递到右边。
确实妙。
这里说脉冲触发会有1箝位问题,说白了,1箝位就是在时钟还没反应过来的时候连续变了两下,第二下将第一下覆盖掉了,没来得及传过去。(但是说实话我上网搜不到1箝位问题,感觉这玩意就是无病呻吟)
边沿触发器
边沿触发器只在边沿的时候触发。
其实边沿触发器和脉冲触发没啥本质区别,只不过理解方式不一样了。
脉冲触发器将信息输入的区间理解为C=1的时候,而边沿触发不看前面,只看触发时的瞬间状态,管你前面覆盖不覆盖,反正我只看瞬间,果然是眼不见心不烦,虽然1箝位仍然存在,但是我们已经不管了,相当于消灭了。所以我们姑且认为边沿触发解决了1箝位问题吧,虽然只是把理解方式变了。
这个延迟比较玄学,这里把反相器延迟,锁存器延迟忽略了,C一变,Q秒变,这其中要经过两个反相器+一个从锁存器也是合理的,毕竟状态切换间不会有其他行为,所以等待时间忽略就ok,不影响结果。
实际中我们是不管延迟的,毕竟只有1ns。
直接输入的正边沿D触发器
果然叠Buff才能出成果。加了S-R直接输入,D触发器也算修成正果,成为业界标准的触发器了。
时序电路分析
基本模型
状态表
一位状态表就是单纯列举,其实平时都是用1维的。
二维状态表,针对当前的状态,举出四种AB可能,举出X的两种可能,将所有变化方向揭示出来,准备进行马尔科夫过程。
状态图
状态图类型
注意状态图有两种:
- Moore,圆圈:当前状态/输出,线:输入,代表输出只和当前状态有关,故绑定在一起
- Mealy,圆圈:当前状态线:输入/输出代表输出还和输入有关,所以绑定在一起。
- 混合型。有时候这两种混起来用。无论是那种,在到下一状态前,已经输出了,所以无论是输出放在状态还是输入上,是可以互相转的
状态图等价
可以从不同地方来,但是一定会去同一个地方去。等价以后,将来源合并,去向合并
从图形角度理解,就是去线完全相同
时序电路设计:子序列识别器
规范化
规范化说明问题,分析到位。
形式化
形式化开始准备状态表和状态图。
先做状态图,再出状态表。
这里的状态图有两种:Mealy和Moore型。
Moore型比较简单,输入只会影响状态的转移,不会影响输出,输出只和状态绑定,所以写到圆圈里。
Mealy型适用于复杂情况,输入和状态共同决定输出,所以把输出写到边上。
状态分配
很多人觉得这个无所谓,但是其实这一步影响也不小。
你的编码决定了你卡诺图的形态,可能换一种编码就会导致完全不同的结果复杂度,有时间可以三种都试一下,再不济格雷码也得试一下。
确定方程及优化
方程包括状态方程以及输出方程,但是本质上都一样,一个卡诺图就OK。时序逻辑只不过是被时钟控制更新,但是逻辑和组合逻辑是一样的。
第一张图是顺序编码的结果,可以看到比较散乱,第二张图是格雷码结果,非常优美,所以说编码影响还是不小的。自然,我们采用格雷码。你问为什么不用单热点?四位状态,成本高了。
工艺映射
先给初始结果
再进行与非门优化。
验证
自己在vivado上写个testbench就好。
状态机设计
有限状态机FSM(Finite State Machine)
听起来高大上,实际上就是有限个状态根据输入,互相转换,并且输出。
我们前面的状态图就是FSM的表现方式。
状态机图
初步理解
状态图需要在每条边上写输入,而且是完全列举出来,输出也是,可以想到,这是枯燥重复的,凡是重复的,你都要用函数,代数的思路去化简。重复的部分我是不是可以用一个字母表示?
状态机图和状态图有什么区别呢?
除了上面说的代数思维,还有一个就是状态图中输出和转移是绑定的,这里将TC和OC分离,转移不一定输出,其他没啥别的区别了。FSM这个东西变化性不强。
所以说,各种转移类型就是状态机图的核心,接下来重点解释。
转移和输出条件依赖举例理解
接下来对这一张图里出现的做一个判断。在此之前我已经将这四种用图形化方式画出来了。
首先可以看到,圆圈外接一个箭头代表转移,接一条直线代表输出。其中,转移是有条件的,转移弧上加个TC。输出也可能伴有条件,就是OC/输出。
宏观总结
理解完了,我们再跳出来,宏观理解一下这些表达方式。
其实这些表达是可以互相替代的,但是肯定有优先级。
再回到这张图,给出第一种理解,可以让你快速认出:
- Moore就是前面的Moore,输出完全和状态绑定,TCD就是Mealy。
- TCI相当于Moore给输出加了个独立的判断条件,TOCD相当于给Mealy在TC的基础上,对输出又加了一层条件,给你一种if嵌套if的感觉。
以上是一种理解方式,其实还有另一种理解,可以让你画出好图:
- 首先要明白,这几种是可以互相替代的,那怎么选择最好的就是个问题了。
- 把Moore和TCI(Moore加强版)放在一起,这两个有个特点,不和特定的转移弧有关联,所以可以应用于所有的转移弧上,所以要优先画这两个。
- 当然,Moore/TCI不一定能完全涵盖所有转移弧,所以这个时候就需要有人来补充,这里就把TCD(Mealy)和TOCD放在一起,这两个的特点是输出和转移绑定,适合描述一些细化到转移弧上的转移。一般地弧上输出用TCD就够了,什么时候用TOCD呢?当转移弧上有多个输出,你需要通过条件给他们分个类,而不是逐一列举。
约束检查
一个状态图画的对不对,需要进行检查。而状态图的约束就是检查的重点。
转移(TC)约束检查
- 不同的转移应该互斥。很好理解,不能既从A到B,又从A到C把,你到底去哪?
- 不同的转移之概率和一定是1。很好理解,应该把所有可能性都覆盖。
输出(OC)约束检查
- 输出如果互斥,条件一定互斥。否则就应该合并。这个输出互斥指的是输出变量是对应但相反的,比如 X − X ‾ X-overline{X} X−X
- 对于一个输出变量,则其所有输出条件之和为1。如果不够一,说明还有一些输出漏掉了。
例子
下图告诉我们,前面的积和和都是逻辑运算意义上的。
其他
不学,非专业没啥用。
数字硬件实现——寄存器&储存器
略过
北理工数字逻辑大作业:1分59秒99分秒跑步计时器
短跑计时器设计与实现(难度系数0.9)
短跑计时器描述如下:
◼ 短跑计时器显示分、秒、毫秒;
◼ “毫秒”用两位数码管显示:百位、十位;
◼ “秒”用两位数码管显示:十位、个位;
◼ “分”用一位 LED 灯显示,LED 灯“亮”为 1 分;
◼ 最大计时为 1 分 59 秒 99,超限值时应可视或可闻报警;
◼ 三个按键开关:计时开始/继续(A)、计时停止/暂停(B)、复位/清零(C)
百度网盘 提取码cyyy
最后
以上就是故意荷花为你收集整理的数字逻辑笔记数字系统布尔代数组合逻辑电路设计时序电路数字硬件实现——寄存器&储存器北理工数字逻辑大作业:1分59秒99分秒跑步计时器的全部内容,希望文章能够帮你解决数字逻辑笔记数字系统布尔代数组合逻辑电路设计时序电路数字硬件实现——寄存器&储存器北理工数字逻辑大作业:1分59秒99分秒跑步计时器所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复