chapter 14 时序逻辑
14.3 改进交通灯控制器,修改表所示的交通灯控制器FSM,使其在某一个方向上变为绿灯之前,使得两个方向都变为红灯,持续一个周期。给出新得FSM得状态表和状态图
状态 | 下一个状态 | 输出 | |
---|---|---|---|
carew = 0 | carew = 1 | ||
GNS | GNS | YNS | 100 001 |
YNS | GEW | GEW | 010 001 |
GEW | YEW | YEW | 001 100 |
YEW | GNS | GNS | 001 010 |
要使得变为路灯之前,两个方向下变为红灯,可以发现原表格只有当一个状态变为黄灯之后,下一个状态才会时一个方向为绿灯,另外也给方向为红灯,现在修改为下一个状态为两个方向设置为红灯,之后的状态才是一个红灯一个绿灯
状态 | 下一个状态 | 输出 | |
---|---|---|---|
carew = 0 | carew = 1 | ||
GNS | GNS | YNS | 100 001 |
YNS | REW,RNS | REW,RNS | 010 001 |
REW,RNS | GEW | GEW | 001 001 |
GEW | YEW | RNS | 001 100 |
YEW | REW,RNS | REW,RNS | 001 010 |
REW,RNS | GNS | GNS | 001 010 |
14.4 改进交通灯的控制器,为14.3中改进的交通灯控制器选择一个状态分配,并导出计算下一个状态和输出的逻辑函数。给出下雨给状态变量和输出变量的卡诺图,以及FSM的门级示意图
为了识别两个方向为红灯之后,下一个状态哪个方向应该输出绿灯,哪一个状态应该输出红灯,新增加两个状态,分别为上一个状态为YNS,下一个状态为两个方向红灯,以及上一个状态为YEW,下一个状态为两个方向红灯,具体编码如下表所示。
状态 | 编码 |
---|---|
GNS | 000 |
YNS | 001 |
RNS,REW | 011 |
GEW | 010 |
YEW | 110 |
RNS,REW | 100 |
根据当前状态计算出下一状态真值表如下图所示,一个方向为绿灯或者为黄灯,另外一个方向必为红灯
状态 | carew | 下状态(ns2ns1 ns0) | 备注 |
---|---|---|---|
000 | 0 | 000 | 南北方向绿灯,carew=0 |
000 | 1 | 001 | 当前状态ns上为绿灯,carew=1 |
001 | 0 | 011 | 当前状态为NS方向上为黄灯,下一状态全红灯,carew = 0 |
001 | 1 | 011 | 当前状态为NS方向上为黄灯,下一状态全红灯,carew = 1 |
011 | 0 | 010 | 上一状态NS方向为黄灯,下一状态EW为绿灯,carew = 0 |
011 | 1 | 010 | 上一状态NS方向为黄灯,下一状态EW为绿灯,carew = 1 |
010 | 0 | 110 | 上一状态两个方向为红灯,下一状态EW为黄灯,carew = 0 |
010 | 1 | 110 | 上一状态两个方向为红灯,下一状态EW为黄灯,carew =1 |
110 | 0 | 100 | 上一状态EW方向上为绿灯,下一状态为全红灯,carew=0 |
110 | 1 | 100 | 上一状态EW方向上为绿灯,下一状态为全红灯,carew=1 |
100 | 0 | 000 | 上一状态为EW方向上为黄灯,下一状态为NS为绿灯,carew=0 |
100 | 1 | 000 | 上一状态为EW方向上为黄灯,下一状态为NS为绿灯,carew=1 |
可得到真值表ns2
c ns2\s1s0 | 00 | 01 | 11 | 10 |
---|---|---|---|---|
00 | 0 | 0 | 0 | 1 |
01 | 0 | 0 | 0 | 1 |
11 | 0 | 0 | 0 | 1 |
10 | 0 | 0 | 0 | 1 |
ns2 = s0' * s1
同理可以得到ns1的真值表如下所示
c ns2\s1s0 | 00 | 01 | 11 | 10 |
---|---|---|---|---|
00 | 0 | 1 | 1 | 1 |
01 | 0 | 0 | 0 | 0 |
11 | 0 | 0 | 0 | 0 |
10 | 0 | 1 | 1 | 1 |
ns1 = s2' * (s0 + s1)
可得到ns0的真值表如下
c ns2\s1s0 | 00 | 01 | 11 | 10 |
---|---|---|---|---|
00 | 0 | 1 | 0 | 0 |
01 | 0 | 0 | 0 | 0 |
11 | 0 | 0 | 0 | 0 |
10 | 1 | 1 | 0 | 0 |
ns0 = (s1' * s2') * (s0 + c)
可以得到输出变量的逻辑函数如下所示。
gns = s0' * s1' * s2'
yns = s0 * s1' * s2'
rns = s1 + s2
gew = s0' * s1 * s2'
yew = s0' * s1 * s2
rns = (s0‘ * s1)'
可以的到逻辑图如下所示。经验证设计符合要求
chapter 16数据通路的时序逻辑
16.8. 斐波那契数列,画出使用数据通路电路计算16位斐波那契数列的框图,在每个周期内,电路输出下一位斐波那契数(复位后从0开始)。当下一个数字大于16时,电路应该发出指示信号
每个周期,顺序输出0,1,2,3,5,8,13.....当复位信号来的时候,恢复输出从0开始,电路如下所示。
寄存器a保存当前计算的结果,寄存器b保存上一次计算的结果,下一次的结果通过两次寄存器的值相加给出,要是超出16位,则vfo为1.
控制信号:当为上升沿时,寄存器a的结果打到b,寄存器a的结果为上一次两个寄存器相加的结果,要是两个寄存器都是初始态0,则寄存器a的结果为1,当发生复位时,res为1,两个寄存器的值都将会被清0。
经过验证,电路可以得到预期的结果,产生斐波那契数。