# P0 课上测试游记

P0 课上体验比 Pre 课上好多了,希望 P1 顺利......

通过阅读本文,您可以大致了解 2021 年秋季北航计算机组成课程 P0 课上测试的题目内容、难度和解题思路
P0 课上测试的主要内容是利用 Logisim 软件设计组合逻辑电路和有限状态自动机
题目每年都会发生变化,题意描述大致清晰,但是可能与原题有一定差异

P0 题面还是挺有创意的,跟往年的 2 组合 + 1 时序不太一样,今年是 1 组合 + 2 时序 + 1Debug 题,题目除了 T3 都很传统,1.3h 解决问题

北区机房的电脑屏幕有点暗,但是搞了半天也不会调亮度(太久没用过台式机了...

# T1 投票

大意就是四个人投票,有一个人比较牛逼,有一票否决,其余每个人只可以投同意、反对和弃权三种,如果总同意数大于反对数,且没有一票否决就通过,否则就不通过

可以考虑组合逻辑,分别统计同意的人数和反对的人数,最后加个比较器比较下,然后根据是否一票否决再加个多路选择器就行了

测试也容易,把各种情况都点一下试一试就行了

# T2 字符自动机

大意是写一个 Mealy 型状态机,识别 20212011 两种序列,分别输出 0110 ,输入保证没有其它字符

首先题目非常明显的给出是一个 Mealy 型状态机,减小了识别状态机类型的难度,其次吸取了 Pre 考试失败的经验以后,这次先仔细画了并检查状态机,然后就快速用列表法生成 next state logic 和 output logic,注意最后一位 1 匹配结束之后根据输入不同,转移的位置也不同,这个是可能的坑点

测试的时候可以考虑测一下 20202120112011 两种情况

# T3 递推数列电路

大意是实现一个递推的时序电路(不知道算不算状态机),其中满足

an={0,n=01,n=1,2,3an1+(an2an3),n>3a_n = \begin{cases} 0,n = 0\\ 1,n=1,2,3\\ a_{n-1}+(a_{n-2} \bigwedge a_{n-3}),n>3\end{cases}

这里的\bigwedge 是按位与的意思

输入nn(5bit),输出相应的ana_n(32bit),要求在输出满足要求的数值之前输出保持为 0,然后保持输出为正确结果

这一题还是挺有新意的,来源是 Pre 课下练习中的斐波那契数列,实现本题与那一题类似,需要考虑以下要点

  1. 寄存器如何赋初始值?(加一个多路选择器和计数器,计数器为 0 的时候选择器选择初值 0 输出,否则选择寄存器值输出,寄存器记得勾选那个溢出后保留在最大值不变的选项)
  2. 如何实现递推相加?(可以搞三个寄存器分别保留an1,an2,an3a_{n-1},a_{n-2},a_{n-3},然后每个时钟周期向前推进一个,然后再拿一个寄存器存结果ana_n
  3. 如何实现 “在输出满足要求的数值之前输出保持为 0,然后保持输出为正确结果”?加一个计数器,与输入值nn 比较,小于时一直输出 0,等于时输出ana_n,并把ana_n 刷新到一个结果寄存器里面,大于时输出结果寄存器里面的值,不再刷新结果寄存器的值即可

数据貌似不强,考虑上面要点之后,测一个 4 一个 5 然后大概就都能过了

# T4 调试题

选择题,貌似不算分?但是只能交两次

错误非常的显然,包括 Mealy 机搭成了 Moore 机,子电路的外观不对...... 反正不难看出来,大不了搭一个自己试试也行

但是我自己第一次交就没有检查子电路外观,以为是没问题的

P0 课上只需要过两题就通过了,但是为啥还有一个 3 题的优秀线?反正我不理解

总结起来,本次 P0 最大的错误就是 T2 卡了一会,next state logic 搭了三次才对,还送了一次提交,所以本地先做好测试,注意自动生成的电路的端口顺序,有可能跟想象的不太一样

对了,还有助教问答,问题有一个是怎么实现寄存器的同步复位,我直接讲了我 P0 课下的做法,但是助教说这不是正解,无语,遂糊弄过去,还好助教好心给过了......

回头要找一种什么是正确的同步复位法