跳转至

实验练习

说明

  1. 每一次实验我们会为大家准备若干练习题目。不同的题目有着不同的难度,请大家量力而行;
  2. 你可以查阅任何开源资料完成实验练习,但不能直接抄袭。一经发现,我们将取消所有抄袭参与者本次的实验成绩。情节特别严重的,我们将按照学校的有关规定进行处理;
  3. 部分题目我们提供了代码框架,你需要在框架指定的位置完成代码内容。你也可以自由修改框架代码,但需要根据题目要求完成练习;
  4. 如果你使用了我们预料之外的方法完成练习也没有关系,我们将根据思考量与任务量单独确定给分情况;
  5. 本次实验的必做部分与选择性必做第二题都需要上板验证,具体的端口变量与对应关系请按照题目要求设定。

必做内容

每一名同学都需要完成必做部分的内容。

题目 1:编码器 Pro(2 分)

输入为 4 bit 独热或非零信号,输出编码值,并用 en 表示输入是否有效。

顶层模块名固定为 user_module,模块接口如下:

端口 方向 位宽 说明
I 输入 4 待编码输入
Y 输出 2 编码结果
en 输出 1 有效输入标志

I=4'b0000 表示无有效输入,其他输入均视为有效。若多个 bit 同时为 1,优先编码最高位的 1。

en=1 表示 I 至少有一位为 1,en=0 表示 I=0。Y 输出最高有效位的下标。en=0 时 Y 没有有效编码含义,评测不比较它;但为了避免组合逻辑中产生锁存器,仍需为其赋予确定值。

4 输入编码器真值表
编码器真值表

本题没有宏定义,是组合逻辑题。所有输入组合下的输出都应有确定值。请补全下面的 Verilog 代码:

user_module.v
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
module user_module(
    input  [3:0] I,
    output [1:0] Y,
    output       en
);

// Write your code here

// End of your code
endmodule

提示

先确定是否有有效输入,再处理多个输入同时有效时的优先级。

题目 2:2bits 半加器(3 分)

输入两个 2 bit 无符号数,输出 2 bit 低位结果和最高进位。

顶层模块名固定为 user_module,模块接口如下:

端口 方向 位宽 说明
a 输入 2 第一个加数
b 输入 2 第二个加数
out 输出 2 加法结果低 2 bit
Cout 输出 1 加法最高进位

a 和 b 均按 2 bit 无符号数解释。{Cout, out} 表示 a + b 的 3 bit 结果。

2 bit 半加器真值表
2bits 半加器真值表

本题没有宏定义,是组合逻辑题。请不要使用加号 + 或减号 -。请补全下面的 Verilog 代码:

user_module.v
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
module user_module(
    input  [1:0] a,
    input  [1:0] b,
    output [1:0] out,
    output       Cout
);

// Write your code here

// End of your code
endmodule

提示

可以从 1 bit 半加器开始,逐位处理进位。

选择性必做内容

选择性必做内容是针对不同层次学生设计的分层内容。不同难度的题目对应不同的分值,请大家根据自身实际情况进行选择。

请在下面的题目中任选一题完成。多选按选择的第一题计分。

题目 1:三位十进制加法器(4 分)

对两个 3 位 BCD 8421 十进制数求和。输入是两个 3 位 BCD 8421 编码的十进制数,输出它们的 BCD 和。

顶层模块名固定为 user_module,模块接口如下:

端口 方向 位宽 说明
a 输入 12 第一个三位 BCD 数
b 输入 12 第二个三位 BCD 数
out 输出 12 三位 BCD 低位和
cout 输出 1 千位进位

a[3:0]、a[7:4]、a[11:8] 分别是个位、十位、百位,b 同理。测试数据保证每个 BCD 数码均在 0 到 9 之间。

out 使用相同的 BCD 位序。若三位相加后产生千位进位,cout=1。

本题没有宏定义,是组合逻辑题,允许使用加号和减号。请补全下面的 Verilog 代码:

user_module.v
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
module user_module(
    input  [11:0] a,
    input  [11:0] b,
    output [11:0] out,
    output        cout
);

// Write your code here

// End of your code
endmodule

提示

按十进制位处理时,每一位超过 9 都需要向高一位产生进位。

题目 2:8bits 5 的倍数检测器(5 分)

输入是 8 bit 无符号数,输出它是否能被 5 整除。

顶层模块名固定为 user_module,模块接口如下:

端口 方向 位宽 说明
a 输入 8 待检测的无符号数
is_multiple 输出 1 是 5 的倍数时为 1

a 按 0 到 255 的无符号数解释,0 也视为 5 的倍数。当 a 能被 5 整除时,is_multiple=1;其余情况为 0。

本题没有宏定义,是组合逻辑题。实验要求使用 2 bit 加法器思想完成检测:将 8 bit 输入按 2 bit 分组,利用各组在模 5 意义下的贡献进行组合判断。不要使用完整查找表、长除法或转为十进制后观察末位的方式完成。平台只检查最终行为,结构限制由题面约束。

user_module.v
1
2
3
4
5
6
7
8
9
module user_module(
    input  [7:0] a,
    output       is_multiple
);

// Write your code here

// End of your code
endmodule

提示

可以利用二进制位权在模 5 意义下的周期性来化简问题。

题目 3:Logisim 译码器(3 分)

请使用 Logisim 搭建一个 38 译码器,即输入为 3bits,输出为 8bits。

译码器的真值表如下图所示:

Image title
38译码器真值表

选做内容

选做内容为扩展内容,不计入实验成绩。大家可以根据兴趣自行完成。

题目:闰年判断

输入一个年份,输出它是否为闰年。

顶层模块名固定为 user_module,模块接口如下:

端口 方向 位宽 说明
year 输入 16 年份
is_leap 输出 1 闰年标志

year 按无符号数解释。满足“能被 4 整除且不能被 100 整除,或能被 400 整除”的年份,is_leap 输出 1;其他年份输出 0。

本题没有宏定义,是组合逻辑题。请补全下面的 Verilog 代码:

user_module.v
1
2
3
4
5
6
7
8
9
module user_module(
    input  [15:0] year,
    output        is_leap
);

// Write your code here

// End of your code
endmodule

提示

整百年份需要单独检查能否被 400 整除。

评论