实验练习
说明
- 每一次实验我们会为大家准备若干练习题目。不同的题目有着不同的难度,请大家量力而行;
- 你可以查阅任何开源资料完成实验练习,但不能直接抄袭。一经发现,我们将取消所有抄袭参与者本次的实验成绩。情节特别严重的,我们将按照学校的有关规定进行处理;
- 部分题目我们提供了代码框架,你需要在框架指定的位置完成代码内容。你也可以自由修改框架代码,但需要根据题目要求完成练习;
- 如果你使用了我们预料之外的方法完成练习也没有关系,我们将根据思考量与任务量单独确定给分情况;
- 本次实验的必做部分与选择性必做第二题都需要上板验证,具体的端口变量与对应关系请按照题目要求设定。
必做内容
每一名同学都需要完成必做部分的内容。
题目 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 没有有效编码含义,评测不比较它;但为了避免组合逻辑中产生锁存器,仍需为其赋予确定值。
本题没有宏定义,是组合逻辑题。所有输入组合下的输出都应有确定值。请补全下面的 Verilog 代码:
| user_module.v | |
|---|---|
1 2 3 4 5 6 7 8 9 10 | |
提示
先确定是否有有效输入,再处理多个输入同时有效时的优先级。
题目 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 结果。
本题没有宏定义,是组合逻辑题。请不要使用加号 + 或减号 -。请补全下面的 Verilog 代码:
| user_module.v | |
|---|---|
1 2 3 4 5 6 7 8 9 10 11 | |
提示
可以从 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 | |
提示
按十进制位处理时,每一位超过 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 | |
提示
可以利用二进制位权在模 5 意义下的周期性来化简问题。
选做内容
选做内容为扩展内容,不计入实验成绩。大家可以根据兴趣自行完成。
题目:闰年判断
输入一个年份,输出它是否为闰年。
顶层模块名固定为 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 | |
提示
整百年份需要单独检查能否被 400 整除。
