本文主要介绍的是中国大学mooc上“计算机硬件系统设计”课程中的一个实验。首先,我对本课程的课程组深表感谢,开发了这么好的学习资源供学生在线学习。
下面介绍的是这个实验的设计过程。感兴趣的朋友可以前往https://www.icourse163.org/course/HUST-1205809816 亲自尝试!
在学习了数字电路后,大概有了时序电路设计的印象,但只能在纸上画画状态图,解解题,不能很好地运用起来,因此借这次机会好好总结一下。
这是本次实验“运动码表”的功能要求,输入由四个功能按键构成,输出是数码管。有了功能要求之后,就可以开始该数字系统的设计了。(备注:Store键要求记录当前码表值,若已有记录,则和当前待记录的值作对比,然后显示相对较小的值)
首先对功能进行拆解,得到所需的电路部件,如下表
功能 | 部件 |
---|---|
Start 计时 | 计数器 |
Store 记录 | 16位寄存器 |
Store 记录值比较 | 数据比较器、数据选择器MUX |
数码管显示 | 数码管驱动 |
这里包括输入输出接口和内部控制接口的定义。
输入为Start、Stop、Store、Reset四个接口
输出为控制4个数码管的32个接口
内部控制接口有 ”计数器使能“、“计数器复位”、“16位寄存器使能”、“数据选择器选择端”等
数字系统设计中需要重点关注的是“数据流”和“控制流”两部分,即解决“数据是如何进行传递的”和“如何控制数据在合适的条件下进行传递”两大问题。
这是,首先关注”数据流“,可以画表来梳理数据的流向,然后逐步进行电路部件的连接。
部件 | 输入来源 | 备注 |
---|---|---|
16位寄存器 | 计数器计数值 or 系统复位后的值“9999” | 需另加数据选择器 |
比较器 | 计数器计数值 和 寄存器中存储的值 | |
数码管驱动 | 计数器计数值 or 寄存器中存储的值 | 需另加数据选择器 |
有了数据流向的认识后,进行部件连线就不会无从下手了。
将部件连接起来后,最后接上各个控制接口即可。
控制单元,用于对“系统输入控制”、“系统内部控制”和“系统输出控制”进行封装。清楚了电路的数据流向后,便可以建立控制单元来控制各个部件在“什么条件下”进行传递了。
这里便用到了数电中“时序电路设计”的知识,时序电路中的组合逻辑部分,可拆分为“状态转换电路”和“输出转换电路”两部分。
在数字电路中,数据传递便是“0”和“1”的传递。与C语言编程不同,C语言可以定义不同变量并对它们赋值,然后后续对这些变量进行操作,而对应在数字电路设计中,我们便需要把这些一个个变量(电路状态)和控制信号,转换成二进制编码,然后利用“组合逻辑”来对这些编码进行操作、转化。
对该系统允许的状态进行编码,如下表
状态 | 编码 |
---|---|
复位状态(清零+更新存储) | 000 |
计数状态 | 001 |
停止状态 | 010 |
存储状态(更新寄存器存储并显示) | 011 |
停止状态(不更新寄存器存储,直接显示旧的存储值) | 100 |
清零状态(为了实现“按计数键重新从0计数”功能而引人的中间态) | 101 |
有了状态编码后,就到画状态图FSM了,想想状态在不同情况下会发生怎样的改变?
状态图FSM中 ↓ 第一幅图有误,按start键后 为000–>001而非000–>110
以上分别对应000到100五种状态随按键输入的变化,依照这个FSM,就可以写真值表,得到逻辑表达式,构建“状态转换电路”来实现状态的转换了。
如果说“状态转换电路”将“按键输入”与“系统状态”联系在一起的话,那么“输出函数电路”就是从“系统状态”到“内/外部控制输出”的过程(Moore型电路)。因此,我们需要找出“系统各个状态”与“内/外部控制输出”的关系,从而实现各部件的控制。
如下表
状态 | 编码 | 控制信号产生 |
---|---|---|
复位状态(清零+更新存储) | 000 | 计数器复位(TM-Reset=1,SD-SEL=0) |
计数状态 | 001 | 计数器使能(…) |
停止状态 | 010 | 计数器失能(…)、打开数据选择器 |
存储状态(更新寄存器存储并显示) | 011 | … |
停止状态(不更新寄存器存储,直接显示旧的存储值) | 100 | … |
偷懒了hh,表格没有写全,关键核心在于清楚不同状态下,控制器要控制什么,从而产生对应的控制信号(0或1),填写真值表得到逻辑表达式,然后自动生成对应电路,如下图。
相信大家都知道Moore型和Mealey型电路的定义,前者的输出仅与现态有关,而后者的输出与现态、输入都有关系,但是真正在设计数字系统时,它们的区别又是什么呢?
笔者认为Moore型电路相对来说,抗干扰性更高,因为在一个时钟周期内的任意时刻都可能发生变化,而Moore型电路则能很好地避免输入噪声对输出的影响。
同时,在进行设计时,Moore型电路的设计思路相对清晰,能分别进行“状态转换”和“输出函数”的逻辑电路设计。
一直知道寄存器有存储的功能,却不知道为什么在时序电路中需要用寄存器来作存储(大雾),现在终于明白了,有了时钟节拍,结合寄存器暂存数据,就能使数据在时钟的驱动下,逐步向前流动。另外,用作反馈时就能使次态重新作为下一刻的现态输入到组合逻辑中啦!