北航计算机组成原理课程设计-2020秋 PreProject-Logisim-2^n mod 5问题
北航计算机学院-计算机组成原理课程设计-2020秋
PreProject-Logisim-2^n mod 5问题
本系列所有博客,知识讲解、习题以及答案均由北航计算机学院计算机组成原理课程组创作,解析部分由笔者创作,如有侵权联系删除。
2^n mod 5
提交要求
使用Logisim搭建电路,该电路串行输入一个二进制无符号数B(先从高位输入,每输入一个数字就相当于之前输入的数左移一位再加上当前输入的数字),输出“2的B次幂”模5的余数的电路并提交。
-
输入: In(1bit 串行输入)
-
输出: S0,S1,S2,S3,S4(独热编码,当 S x S_x Sx 为1表示 2 I n ≡ x ( m o d 5 ) 2^{In}≡x(mod5) 2In≡x(mod5))
-
文件内模块名: mod5
-
注意:切勿使用内置算术器件(如加法器、除法器等)!请搭建有限状态机!
-
输入输出样例:
输入输出样例中每一行表示相邻上升沿之间的开区间时间内的输入和期望输出。
解答
20 % 5 = 1;21 % 5 = 2;22 % 5 = 4;23 % 5 = 3;
24 % 5 = 1;25 % 5 = 2;26 % 5 = 4;27 % 5 = 3;
…
可以证明,2n % 5 = 2n%4 % 5,具有周期性的规律,并且只可能出现四种情况,因此本题不需要真正计算2n,只需要通过上述规律建立状态机即可。
根据题目所述的输入模式,1比特串行输入,这是一个极好的例子帮助我们理解状态机:我们从输入输出样例入手,初始状态输入0,其输出应当为S1 = 1,其他等于0(这里简化称之为输出S1,后面的说法与之相对应),这代表着“20 % 5 = 1”(2In % 5 = Sx),而如果下一个时钟上升沿过后输入变为1,这代表着整体输入的数据为01(先输入高位,每输入一个数字就相当于之前输入的数左移一位再加上当前输入的数字),此时输出应当为S2,21 % 5 = 2,……
正如教程所述,状态机的核心就是设计出状态转移,具体在本题来说就是,设当前输入数据为i,当前输出状态o = 2i % 5,已知下一次输入数据为b(b只能是0或1),求下一个输出o’ = 22i+b % 5。由模除的性质,o’ = 22i+b % 5 = ((2i)2 * 2b) % 5 = (o2 * 2b) % 5,如此,下一个状态只与当前状态以及当前输入有关。
明确这一点就很容易穷举出所有的情况,但在此之前我们还要对状态进行编码,以及将状态对应到输出。上面的分析可以看出S0的输出是恒为0的,因此实际我们只需要使用2位二进制数编码4个状态即可,两个状态位分别记为C1、C0,得到如下的状态转移表(其中输出Sx表示五个输出中Sx为1,其它均为0)。
但需要注意的是:本题最后一句话点出了重要要求,“输入输出样例中每一行表示相邻上升沿之间的开区间时间内的输入和期望输出”,这意味着,题目要求即使在时钟上沿没有到来的时候,如果输入变化,输出也必须随其变化,也就是说题目要求我们搭建Mealy型状态机,输出由输入和当前状态共同决定。具体到题目中,例如如果当前状态为00,2In % 5 = 1,而此时下一个输入已经到来,为1,输出必须相应地变化为S2,而当下一个时钟上沿来临时状态才改变为01。明确这一点之后,才能绘制出符合测评机要求的状态转移表和状态图,如下:
C1 | C0 | b | C1’ | C0’ | 输出 |
---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | S1 |
0 | 0 | 1 | 0 | 1 | S2 |
0 | 1 | 0 | 1 | 1 | S4 |
0 | 1 | 1 | 1 | 0 | S3 |
1 | 0 | 0 | 1 | 1 | S4 |
1 | 0 | 1 | 1 | 0 | S3 |
1 | 1 | 0 | 0 | 0 | S1 |
1 | 1 | 1 | 0 | 1 | S2 |
直观表示为状态转移图如下:
有了上面的分析,我们可以搭建电路。核心设计位于状态转移和状态输出,再将其作为子电路接入Mealy型状态机即可。顶层电路命名为mod5,此外还有两个子电路分别命名为状态转移、状态输出,如下:
状态转移和状态输出严格按照上面绘制好的状态转移表即可,下图展示了使用Logisim自动分析工具打表绘制的电路效果,注意最终需要使用Splitter把C1C0以及C1_C0_合并为2位数据,此处为了展示真值表,保留了两个一位的输入输出形式:
状态转移:
状态输出:
最终顶层电路就是Mealy型状态机,如下:
其中“状态存储”就是2位寄存器,为了可读性加上了Label,“状态转移”、“状态输出”分别是上面我们设计的两个子电路。
到这里,本题就已经结束了,但是我关注到了课程评论区同学们的讨论,在此再详细讨论一下“将输出接在状态转移之后而不是状态存储之后,就可以顺利通过测评”这一方法。问题的起因是,有同学发现自己设计的Moore型状态机,输出仅和当前状态有关,在相邻时钟上升沿之间如果改变输入,输出不会随之改变,而是等到下一个时钟上升沿才会改变,这样无法完全通过测评。有同学这样支招,被老师标记为答案:
还有另一则讨论如下:
我们仔细思考,将输出接在状态转移之后,而非状态存储之后,实质上是将下一个时钟周期的输出“提前输出”了,不等时钟上升沿到来,就输出了下一个结果,这种做法实质上是错误的,“提前输出”并不解决Moore型状态机和Mealy型状态机的本质区别。但这种做法却可以通过测评,原因就在于,上图的最后一句话“本题之所以能够直接接在状态转移电路的正后方,是因为本题的输出逻辑和下一状态逻辑一样”。观察上面我们列出的状态转移表,输出的状态是正好与C1’、C0’相对应的,因此若不考虑独热码的译码,输出逻辑和状态转移逻辑完全是一一对应的。也就是说,本题我们还可以设计这样的Moore型状态机:
这与上面的Mealy型状态机的状态转移条件是完全相同的,只不过输出移到了当前状态的圆圈里,与当前输入无关,设计状态机电路将会变成如下的样子:
此时就复现了上面两位同学的问题:输出之和当前状态有关,在时钟上升沿到来之前,输入的变化是不会改变输出的。这与题目的要求不符。此时由于输出状态实际和下一状态是一一对应的,即“本题的输出逻辑和下一状态逻辑一样”,我们可以直接借用状态转移来作为状态输出,只改一根线将Moore型状态机改为Mealy型,如下:
所以本题核心的逻辑,并不是“提前一个时钟周期就可以通过测评”,而是我们借用了状态转移电路作为输出逻辑,将Moore型状态机改为了非典型Mealy型状态机。
作为初学者,笔者建议大家还是严格设计Mealy型状态机,领悟Moore型和Mealy型之间的差别。