Pre上机logisim部分——俄罗斯方块

一.题目的回忆

1.关于输入输出
namewidth
input8
reset1
clk1
output2
2.题意

​ 我们利用mealy型状态机实现俄罗斯方块的模拟。假设我们有一个1行8列的空间,在每个时钟周期进行一个8位的输入,这个输入以独热码形式,如00000001表示在第一块空间放入方块,对于放置方块的输出有如下要求:

  1. 若尝试放置处已有方块,则当前想要放入的方块被阻挡,输出01.
  2. 若尝试放置处无方块且其他位置处至少有一处无方块,则成功放入方块,输出10
  3. 若尝试放置处无方块,此外每个位置都有方块,则清空所有方块,输出得分 11
3.电路模块外观

​ 这部分对于题意倒是无关紧要 后续题解补充,唯一的坑点在于我们搭建好的电路可能与标准要求的电路外观不同,涉及到修改子电路外观。

二.题意理解

​ 对于这道题目,由于要求搭建状态机,我的思路被局限在pre教程中提示过的利用真值表的解法。事实上,mealy状态机的下一状态逻辑和输出逻辑的输入是相同的,即电路的上一状态和当前输入。我们粗略的考虑一下打表的复杂度,输入为独热码,共八种状态,可能的状态有2^8-1种,即除去满方块的状态,这样打表的复杂度是2^11显然是不合理的。

所以我们应当摒弃打表这种想法,进一步思考题目的要求。

​ 题目中只涉及到三种状态的判断,一是放置位置处已经有方块,这时放置失败,输出01,并将原来的状态更新为只有将要放置的这一块地方有方块(即相当于输入的一行把原来的状态顶替掉),二是想要放置的位置没有方块,且其他位置至少还有一个空块,这时输出10,三是想要放置的地方没有方块,且放置后刚好满一行,清空这一行,输出得分11

​ 我们考虑如何判断放置位置处有没有方块呢?我们知道输入为8位独热码,只有表示方块的那一位为1,如果此时状态中那一位已经有方块,我们知道,这两位的与运算为1。经过分析我们知道,判断放置位置处是否为空可以用与运算,而且当前输入与状态的与运算八位中最多只会有一位出现1。

​ 我们考虑如何更新状态呢?我们想要的更新状态是在可以放入方块的情况下,而这“放入”的操作是可以通过位运算“或”来实现的,注意,在填入方块后,我们还需要考虑是不是每一位都是1,如果都是1,则说明满足情况3,需要清除所有方块。

​ 在大体明白的情况下,考虑一下细节。如何判断与运算中是否有1?将与运算的结果的8位进行或运算。如何判断或运算是否已经填满?使用与运算。

​ 在大致逻辑明白的情况下,我们可以进行搭建电路。

三.电路搭建

俄罗斯方块电路

​ 这里我附上mealy状态机的原型图

mealy

​ 我们可以知道下方的或门是用来更新状态,或门之后的与门用来判断是否清空。clk与reset信号则直接控制寄存器。这里只有一个状态更新是由上面部分的电路提供的,即放置位置已有方块,这时更新为input的状态。多路选择器选择1引脚输出,大部分情况下(2,3)都是选择0引脚输出,即下方电路产生的下一状态。同时我们可以发现,电路的输出是控制选择常量输出。

四.编辑子电路外观

在我们搭建好的电路中,默认的外观为

原电路外观

​ 题目要求的外观为输出锚点在右上角,这就需要我们修改子电路外观。

编辑后外观

​ 如上即可正确测评。