BUAA-CO-pre

OWPETER Lv3

现在是北京时间23:28,精神状态不佳

T1:Logisim

硬控我1个小时的 FSM,什么都搞对了,就是 Appearance搞错了…

题目大意

逐个输入数列,根据 type不同,输入的不同。

type = 0时,

type = 1时,

type = 2时,

信号名 方向
clk I
reset I
type [1:0] I
output[31:0] O

对于加法溢出,仅保留低32位;考虑使用Moore机,采用同步复位

Solution

  • 状态转移:既然不同 type对应不同输出,那么必然要用到多路选择器
  • type = 1时需要type = 2时需要前项和,自然需要用到2个寄存器。
  • 要注意同步复位的画法

同步复位

难绷之处

好吧,前面看着都挺简单的,是吗?

最后有这么一句话:

请你的电路图的 Appearance保持与下图一致,否则可能导致评测错误

Apperance

但是本人搭完电路后默认的 Apperance是这样的:

My Apperance

而且本人根本不知道怎么调整这个东西……

于是被硬控了1个小时,期间尝试了各种debug方法,包括但不限于:重新搭、改Lable、调整模块中的 output位置等。而且 Appearance错误的输出我还看不懂,前面两个xx后面一堆0,所以debug也是完全没有头绪

最后多亏了课程组给的 hint以及把考试延长了1个小时,才惊险通过

其实调整 Appearance非常简单,因为 Appearance界面里的所有东西都是可以拖动的,只要把输入输出引脚的位置拖动到要求的位置即可

T2: Verilog

题目大意

给2个32位2进制数,将他们“按位相乘”并统计结果中1的个数

信号名 方向
vector_a[31:0] I
vector_b[31:0] I
answer[5:0] O

额其实是因为原题我不记得了,只记得翻译过后的题,所以直接实现就可以了

Solution

由于是二进制,按位乘其实就是按位 and,(是否在某种层面上解释了为什么 and的符号是)之后用 for循环统计结果中的1,然后输出即可

有几个可能需要注意的点:

  • verilog中的 &是按位与的符号,本人由于忘记了,所以尝试了 &&and&,最终才惊险试出来
  • verilog中的整形变量声明时用的是 integer而不是 int
  • 要么把 answer设成 reg,要么定义一个临时 reg cnt存储结果,总之你需要寄存器
  • 初始化(应该不用说了吧
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
module ans(
input vector_a[31:0],
input vector_b[31:0],
output [5:0] answer
);
reg [31:0] temp;
reg [5:0] cnt;
always @(*) begin
cnt = 0;
temp = vector_a & vector_b;
for(i = 0; i < 32; i = i + 1) begin
if(temp[i] == 1) cnt = cnt + 1;
end
end

assign answer = cnt;
endmodule

T3 MIPS

不想多说,就是一个把C语言翻译成汇编的题,仔细些很快就过了

  • Title: BUAA-CO-pre
  • Author: OWPETER
  • Created at : 2024-09-23 22:46:55
  • Updated at : 2025-01-25 21:06:46
  • Link: https://owpeter.github.io/2024/09/23/BUAA-CO-pre/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments