BUAA-CO-PRE

BUAA-CO-PRE

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

T1:Logisim

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

题目大意

逐个输入数列\(a_n\),根据type不同,输入的\(a_n\)不同。

type = 0时,\(a_n = 0\);

type = 1时,\(a_n = a_{n-1} + 1\);

type = 2时,\(a_n = \sum\limits_{i=1}^n a_{n-1}\);

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

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

Solution

  • 状态转移:既然不同type对应不同输出,那么必然要用到多路选择器
  • type = 1时需要\(a_{n-1}\),type = 2时需要前\(n-1\)项和,自然需要用到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的符号是×\times)之后用for循环统计结果中的1,然后输出即可

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

  • verilog中的&是按位与的符号,本人由于忘记了,所以尝试了&&and&,最终才惊险试出来
  • verilog中的整形变量声明时用的是integer而不是int
  • 要么把answer设成reg,要么定义一个临时reg cnt存储结果,总之你需要寄存器
  • 初始化~~(应该不用说了吧~~
answer
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语言翻译成汇编的题,仔细些很快就过了

作者

OWPETER

发布于

2024-09-23

更新于

2024-12-02

许可协议

评论