BUAA-CO-P0
P0_Logisim
部件及状态机设计
目录 :
[toc]
组合逻辑
组合逻辑电路是指这样一类电路,它不具有像寄存器这样的与时序有关的器件。组合逻辑电路在输出被给出后极短时间内给出相应的输出;
P0_L0_CRC
便是典型的组合逻辑,我们一次性地给出一个8位二进制被除数和一个4位二进制除数,在输入给出后的极短时间内反馈它的11位CRC
校验码。根据题目描述易得我们需要完成8次4位除4位的模二除法,每次输出3位余数即可,由此我们考虑创建一个实现模二除法的子电路div。利用div就能很快实现该题目。P0_L1_foti
是一个组合电路问题,将输入16位数利用splitter分离为sign,exponent,float三部分。根据exponent进行分支,如果进入分支的判段为真,则利用一个三态缓冲器(controlled buffer)激活该分支电路。
时序逻辑
时序逻辑电路一般具有寄存器,触发器这样的器件,它具有记忆功能,能够存储电路的状态信息,并根据输入信号和当前状态产生输出;
P0_L0_GRF
是一个复杂的具有时序逻辑的电路。我们首先考虑实现一张端口定义表和功能表来清晰化我们要做的事情端口定义表:端口名称 + I/O方向 + 端口描述
| 端口名称 | 方向 | 端口描述 |
| ———— | ——- | ———— |
| reset | input | 复位信号 |
| clock | input | 时钟信号 |功能表:序号 + 功能名称 + 具体描述
| 序号 | 功能名称 | 具体描述 |
| —— | ———— | —————————————————————- |
| 1 | 同步复位 | 当reset位高电平且时钟处于上升沿时复位寄存器 |
| 2 | 异步复位 | 当reset位高电平时复位寄存器 |该题的时序逻辑主要体现在“当
WE
有效且时钟上升沿到来时,将WD
的值写入A3
所对应的寄存器”,注意到这里对时钟要求的是上升沿到来而非高电平(注意体会两种表述的差别),我们不能直接将时钟和WE
用一个与门连接(否则会变为后者)。考虑到寄存器是上升沿触发的,我们只需将WE
连到DMX
的使能端即可。P0_L1_navigation
是一个典型的有限状态机,根据计小组所在的位置将状态机的状态确定为5个,利用A1
,A2
,A3
,3位来编码。由于位移方向有4种,用D1
,D2
,2位来编码。由A1
,A2
,A3
,D1
,D2
的当前状态可以推出A1
,A2
,A3
的下一状态。由此我们可以画出5位输入3位输出的真值表,利用Windows
+Conbinational Analysis
功能输入真值表,自动生成“状态转移”模块的电路。P0_L0_FSM
同样是一个有限状态机的问题,在这里我们借这个题重点讲清楚两个事情:(1)同步复位:
同步复位要求当时钟处于上升沿且reset信号位1时复位寄存器。问题的关键在于我们要求的是上升沿这一瞬间reset为高电平,所以我们不能简单的用一个与门将
reset
和clk
连接到寄存器的使能端,这样做会引发的问题在于:设reset在上升沿到来前为0,上升沿结束后瞬间变为1,通过与门连接到寄存器的信号仍然会使寄存器复位,这是我们不希望看到的。解决方法是将原本要输入寄存器的信号与0通过一个MUX
连接到寄存器的输入端,这个MUX
的选择端连接到reset,当reset为高电平选择0,低电平选择原本输入信号。同时寄存器正常的接上时钟。(2)Mealy状态机:
考虑这样一个情景,当我们输入的字符序列中存在
buaa
这样的子串的时候输出为1,否则为0;由此划分状态机状态:0状态,
b
,bu
,bua
,buaa
五种。- Moore型状态机的工作原理是:接受一个字符输入 => 改变当前状态 => 储存改变后的状态 => 根据储存状态输出。直观地说就是当我输入第二个a后,需要等到最近的一个时钟上升沿更新储存电路状态后才能输出1
- Mealy型状态机的工作原理是:输出由当前输入和当前储存状态决定。也就是说,若我目前储存的状态时
bua
这个子串,当我得到输入端为第二个a的一瞬间,我便能够输出1。也就是说,Mealy型状态机会比Moore型状态机“快”一些。
为了实现Mealy机的这个差别,我们需要将输入信号直接接到输出电路,并据此来涉及输出逻辑。
有限状态机:
使用 Logism
设计有限状态机的过程基本上可以分为三个步骤:
(1) 设计实现状态存储模块
(2) 设计实现状态转移模块
(3) 设计实现输出模块
需要指出的是,状态转移模块和输出模块内是纯组合逻辑,不涉及时序逻辑;而状态存储模块则需要存储每个周期有限状态机的具体状态,涉及时序逻辑。
它们之间的关系是,状态转移模块根据当前有限状态机的状态(即状态存储模块所存储的值)和当前的输入计算出有限状态机的下一状态值,当时钟上升沿到来时,这个新的状态值被存入状态存储模块中。
输出模块的逻辑分为两种,根据输出逻辑的不同,有限状态机又被分为 Moore 型状态机和 Mealy 型状态机。
Moore型有限状态机:
Moore 型状态机的输出逻辑仅与有限状态机当前状态值有关
Mealy型有限状态机:
Mealy 型状态机的输出逻辑则与有限状态机的当前状态和当前输入有关
器件使用
(1)多路选择器MUX
:
- 从给出的多个输入中选择一个输出
- 选择数据位宽n决定了
MUX
有$2^n$个输入数据 - 数据位宽规定了输入数据的位宽
MUX
在使能端非0时根据选择输出(使能端空接认为是非0 的,即MUX
正常工作)MUX
在使能端为0时输出可设置为0或者未定义(高阻态,这时利用probe观察得到xxx
)
(2)解复用器DMX
:
- 将给定的输入传到选择的输出路
- 选择数据位宽和数据位宽定义同上
DMX
在使能端非0时根据选择输出(使能端空接认为是非0 的,即DMX
正常工作)DMX
在使能端为0时输出可设置为0或者未定义(高阻态,这时利用probe观察得到xxx
)
(3)寄存器(register)
- 寄存器的选区中提供了两个选项,数据位宽和触发方式,其中触发方式可以选择上升沿,下降沿,高电平,低电平四种
- 寄存器中初始值默认为0
- 输出端:输出端总是保证输出寄存器中存着的数,而不受任何的时序逻辑影响
- 时钟端口:每当时钟信号满足触发条件时更新寄存器的内容
- 使能端:使能端为0时忽略输入,使能端非0(包括空接高阻态)时总是允许在满足触发条件的情况下更新寄存器内容
- 复位端:复位端输入为1时异步清零寄存器内容
(4)分离器(splitter)
- 分离器既可以将一个数字拆分为多个数字,也可以将多个数字合并为一个数字
- 输出参数规定了将一个数字拆分为及部分
- 位宽参数规定了输入数字的位数,在外观参数下方可以调整每个位出现在哪个分支部分
(5)位扩展器(bit-extender)
在此我们仅讨论不同的扩展方式,设我们将位数少的A扩展为位数多的B
- 以0填充:将A的高位补0
- 以1填充:将A的高位补1
- 符号数扩展:将A的高位补A的符号位
- 单独输入:将A的高位补另一个给定的输入数
(6)移位器(shifter)
在此我们仅讨论不同的移位类型
- 逻辑左:高位溢出舍弃,低位补0
- 逻辑右:低位溢出舍弃,高位补0
- 算数右:低位溢出舍弃,高位补符号位
- 左旋转:左旋转n位指将该数左起n位移动到低位 如:10101011(左旋转2)得到10101110
- 右旋转:右旋转n位指将该数右起n位移动到高位 如:10101101(右旋转2)得到01101011
(7)解码器(Decd
)
- 数据长度n决定了解码器有$2^n$个输出口
- 输入数据决定了哪个输出口为高电平(剩下的端口可设置为低电平或高阻态)
(8)优先编码器(Pri
)
- 当
Pri
的输入区域有多个高电平的时候,选择输出最高位的高电平所在位置(如:1-7端口输入均为高电平,则输出111)
Logisim
一般性的方法总结
- 复杂电路设计开始之前需要实现一张模块接口定义表与一张功能定义表,这是由于复杂情况下往往不能直接通过端口的定义看出模块的功能;
- 使用Tunnel代替复杂接线,通过Tunnel的合理命名增加电路可读性。同时,由于Tunnel代替了连线,我们可以将实现不同子功能的电路在一张图中分开,这同样增加了电路可读性;