C 语言的 Flip Flop 设计流程





3.00/5 (5投票s)
使用所有 4 种类型的触发器设计数字电路
引言
该项目实现了所有4种类型的触发器。它们以状态机图作为输入,并生成触发器输入。然后,使用制表法计算电路表达式,并使用AND、OR逻辑门进行显示。
逻辑门
逻辑门是数字电路的基本构建块。大多数逻辑门有两个输入和一个输出。在任何给定时刻,每个端子都处于两种二进制状态之一:低(0)或高(1),由不同的电压电平表示。端子的逻辑状态可以改变,并且通常会经常改变,因为电路在处理数据。在大多数逻辑门中,低状态约为零伏特(0 V),而高状态约为正五伏特(+5 V)。条件
有七种基本逻辑门:AND、OR、XOR、NOT、NAND、NOR和XNOR。
但是,我们的应用程序仅使用AND和OR门。
AND门之所以得名,是因为如果将0称为“假”,将1称为“真”,则该门的操作方式与逻辑“and”运算符相同。下图和表格显示了AND门的电路符号和逻辑组合。(在符号中,输入端在左侧,输出端在右侧。)当两个输入都为“真”时,输出为“真”。否则,输出为“假”。
AND门
输入 1 | 输入 2 | 输出 |
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
OR门之所以得名,是因为它的行为方式类似于逻辑上的“inclusive or”。如果一个或两个输入为“真”,则输出为“真”。如果两个输入都为“假”,则输出为“假”。
OR门
输入 1 | 输入 2 | 输出 |
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
触发器
时序逻辑是一种二进制电路设计形式,它使用一个或多个输入和一个或多个输出,其状态由明确定义的规则相关联,这些规则部分取决于先前状态。每个输入和输出可以达到两种状态之一:逻辑0(低)或逻辑1(高)。
采用时序逻辑的电路的一个常见例子是触发器,也称为双稳态门。简单的触发器有两个稳定状态。触发器会无限期地保持其状态,直到接收到称为触发器的输入脉冲。如果接收到触发器,触发器的输出将根据定义的规则更改其状态,并保持在该状态直到接收到另一个触发器。
有几种不同类型的触发器电路,其设计符包括D、T、J-K和R-S。触发器电路相互连接以构成数字集成电路(IC)中的逻辑门,例如存储器芯片和微处理器。RS触发器
(或“RS触发器”)一种“置位/复位”{触发器},其中激活“S”输入会将其切换到一种稳定状态,激活“R”输入会将其切换到另一种状态。基本SR触发器的输出会在其R或S输入适当更改时更改。带有时钟的SR触发器具有额外的时钟输入,该输入启用或禁用另外两个输入。当它们被禁用时,输出将保持不变。如果我们将两个带有时钟的SR触发器连接起来,使得第一个“主”触发器的Q和/Q输出驱动第二个“从属”触发器的S和R输入,并且用主时钟的反相版本驱动从属时钟输入,那么我们就拥有了一个{边沿触发}RS触发器。该器件的外部R和S输入会在时钟的一个边沿(转换)(例如,下降沿)被锁存,并且输出仅会在下一个相反的(上升)边沿更改。如果R和S输入都处于活动状态(启用时),则会发生{竞争条件},并且输出将处于不确定的状态。{JK触发器}可以避免这种情况。
JK触发器
一种{边沿触发}的{SR触发器},带有额外的逻辑,使得R和S输入中的一个仅在任何时候都处于启用状态。这可以防止在RS触发器的两个输入同时处于活动状态时可能发生的{竞争条件}。在JK触发器中,R和S输入被重命名为J和K(以{Jack Kilby}的名字命名)。置位输入(J)仅在触发器复位时启用,K在触发器置位时启用。如果J和K输入都保持活动状态,则输出将在每个时钟下降沿切换(“翻转”)。JK触发器可用于构建带有复位输入的{二进制计数器}。
D触发器
一种数字逻辑器件,当其时钟输入进行特定转换(从低到高或从高到低)时,它会存储其“D”输入的当前状态。输出“Q”显示当前存储的值。
T触发器
一种数字逻辑器件,当其时钟输入进行特定转换(从低到高或从高到低)时,它会存储其“T”输入的当前状态。如果时钟输入为0,输出将与时钟输入相同;否则,将翻转时钟输入。
激励表
激励表重新排列了特性表。特性表输入不再是触发器的控制位和Q,输出为Q+,而是现在输入为Q和Q+,“输出”是触发器的控制位。
S-R flip-flop design: Q Q* S R ------------- 0 0 0 X 0 1 1 0 1 0 0 1 1 1 X 0 J-K flip-flop design: Q Q* J K ------------- 0 0 0 X 0 1 1 X 1 0 X 1 1 1 X 0 D flip-flop design: Q Q* D ----------- 0 0 0 0 1 1 1 0 0 1 1 1 T flip-flop design: Q Q* T ----------- 0 0 0 0 1 1 1 0 1 1 1 0
制表法
Quine–McCluskey算法(或素蕴含项法)是一种用于最小化布尔函数的方法。
它在功能上与Karnaugh图相同,但其表格形式使其在计算机算法中的使用效率更高,并且它还提供了一种确定性的方法来检查布尔函数的最小形式是否已达到。有时也称为制表法。
该方法包括两个步骤:
- 找到函数的所有素蕴含项。
- 使用那些素蕴含项在素蕴含项图中找到函数的必要素蕴含项,以及覆盖函数所需的其他素蕴含项。
复杂性
尽管比Karnaugh图更实用(当处理超过四个变量时),但Quine-McCluskey算法也有其局限性,因为它解决的问题是NP难的:Quine-McCluskey算法的运行时间会随着输入大小指数级增长。可以证明,对于一个具有n个变量的函数,素蕴含项的数量上限是3n/n。如果n = 32,则可能有超过6.5 * 1015个素蕴含项。具有大量变量的函数必须使用可能非最优的启发式方法进行最小化,其中Espresso启发式逻辑最小化器是事实上的世界标准。
示例
步骤1:查找素蕴含项
最小化任意函数
A B C D f m0 0 0 0 0 0 m1 0 0 0 1 0 m2 0 0 1 0 0 m3 0 0 1 1 0 m4 0 1 0 0 1 m5 0 1 0 1 0 m6 0 1 1 0 0 m7 0 1 1 1 0 m8 1 0 0 0 1 m9 1 0 0 1 x m10 1 0 1 0 1 m11 1 0 1 1 1 m12 1 1 0 0 1 m13 1 1 0 1 0 m14 1 1 1 0 x m15 1 1 1 1 1
可以很容易地从该表中形成标准的积之和表达式,只需将函数评估为1的最小项(不包括无关项)相加即可。
- fA,B,C,D = A'BC'D' + AB'C'D' + AB'CD' + AB'CD + ABC'D' + ABCD
当然,这肯定不是最小的。因此,为了优化,所有评估为1的最小项首先被放入最小项表中。无关项也被添加到此表中,以便它们可以与最小项组合。
Number of 1s Minterm Binary Representation -------------------------------------------- 1 m4 0100 m8 1000 -------------------------------------------- 2 m9 1001 m10 1010 m12 1100 -------------------------------------------- 3 m11 1011 m14 1110 -------------------------------------------- 4 m15 1111
此时,可以开始组合最小项。如果两个项只有一个数字变化,则该数字可以用连字符替换,表示该数字无关紧要。无法进一步组合的项用“*”标记。从大小2转到大小4时,将“-”视为第三个位值。例如:-110和-100或-11-可以组合,但不能是-110和011-。(技巧:先匹配“-”。)
Number of 1s Minterm 0-Cube | Size 2 Implicants | Size 4 Implicants ------------------------------|-------------------|---------------------- 1 m4 0100 | m(4,12) -100* | m(8,9,10,11) 10--* m8 1000 | m(8,9) 100- | m(8,10,12,14) 1--0* ------------------------------| m(8,10) 10-0 |---------------------- 2 m9 1001 | m(8,12) 1-00 | m(10,11,14,15) 1-1-* m10 1010 |-------------------| m12 1100 | m(9,11) 10-1 | ------------------------------| m(10,11) 101- | 3 m11 1011 | m(10,14) 1-10 | m14 1110 | m(12,14) 11-0 | ------------------------------|-------------------| 4 m15 1111 | m(11,15) 1-11 | | m(14,15) 111- |
步骤2:素蕴含项图
此时,无法进一步组合任何项,因此我们构建一个必要素蕴含项表。侧边是刚刚生成的素蕴含项,顶部是前面指定的最小项。无关项不放在顶部 - 它们在此部分省略,因为它们不是必需的输入。
4 | 8 | 10 | 11 | 12 | 15 | ||
m(4,12)* | X | X | -100 | ||||
m(8,9,10,11) | X | X | X | 10-- | |||
m(8,10,12,14) | X | X | X | 1--0 | |||
m(10,11,14,15)* | X | X | X | 1-1- |
在这里,每个必要素蕴含项都已用星号标出 - 第二个素蕴含项可以被第三个和第四个“覆盖”,第三个素蕴含项可以被第二个和第一个“覆盖”,因此它既不是必要项。如果素蕴含项是必要的,那么正如预期的那样,它必须包含在最小化的布尔方程中。在某些情况下,必要素蕴含项无法覆盖所有最小项,在这种情况下,可以使用额外的图表简化程序。最简单的“额外程序”是试错法,但更系统的方法是Petrick方法。在当前示例中,必要素蕴含项并未处理所有最小项,因此,在这种情况下,可以将必要素蕴含项与两个非必要项之一组合,得到以下两个方程之一:
这两个最终方程在功能上都等同于原始的(非常浪费面积的)方程:
关注点
实际应用程序的实现和主题的掌握。
更新
请将“BGI”文件夹复制到“C:\TC\”位置。并确保路径为“C:\TC\BGI”,因为该项目需要图形应用程序。