跳转至

实验 1:运算器与存储器

新手建议

如果你先前没有修读过「数字电路实验」课程,或从来没有接触过 Verilog 硬件描述语言,请抓紧时间阅读「数字电路实验课」的 Lab1:Verilog 代码设计Lab2:仿真Lab3:上板运行的相关内容。

如果你忘记了 Vivado 的操作流程,可以阅读使用 Vivado 构建完整项目进行复习。

任务 1:完成 ALU、RF 模块的设计

Task 1-1

设计实现支持 12 种运算模式的 ALU。模块的端口定义如下:

ALU 端口定义
1
2
3
4
5
6
module alu (
    input   [31 : 0]    src0    ,      // 操作数0
    input   [31 : 0]    src1    ,      // 操作数1
    input   [3  : 0]    op      ,      // 运算功能
    output  [31 : 0]    res            // 运算结果
);

op 控制 ALU 执行的运算操作,具体的对应关系如下表所示。

Image title
ALU 功能表

本项任务不需要上板,请参考如下的仿真文件验证设计的正确性。

ALU 仿真文件
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
module ALU_tb();
    //...
    initial begin
        src0=32'hffff; src1=32'hffff; sel=4'H0;
        repeat(12) begin
            sel = sel + 1;
            #20;
        end
    end
    //...
endmodule

检查实验时,你需要向助教展示仿真的波形图,并现场修改部分输入以检验正确性。

值得注意的点
  • 在 Verilog 中,算数右移运算符 >>> 仅在有符号类型 $signed() 时能给出正确结果
  • 请多尝试一些可能的输入,以避免遗漏部分情况

Task 1-2

设计寄存器堆模块。要求 x0 寄存器始终为 0;读操作为写优先的(同时读写时优先读出即将写入的值)。读优先的寄存器堆模块参考代码如下,你可能需要进行一定的修改。

RF 示例代码
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
module  RF (
    input   [0 : 0]         clk     ,       // 时钟
    input   [4 : 0]         ra0, ra1,       // 读地址
    output  [31: 0]         rd0, rd1,       // 读数据
    input   [4 : 0]         wa      ,       // 写地址
    input   [31: 0]         wd      ,       // 写数据
    input   [0 : 0]         we              // 写使能
);
reg [31:0] r[0:31];     // 寄存器堆

assign rd0 = r[ra0];    // 读操作
assign rd1 = r[ra1];

always  @(posedeg clk)
    if (we)  
        r[wa] <= wd;   // 写操作
endmodule

你可以使用如下的仿真文件验证设计的正确性。

RegFile_tb
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
module RegFile_tb ();
    reg                 clk;
    reg     [ 4 : 0]    ra0, ra1, wa;
    reg     [ 0 : 0]    we;
    reg     [31 : 0]    wd;
    wire    [31 : 0]    rd0;
    wire    [31 : 0]    rd1;

    REG_FILE regfile (
        .clk    (clk),
        .rf_ra0    (ra0),
        .rf_ra1    (ra1),
        .rf_wa     (wa),
        .rf_we     (we),
        .rf_wd     (wd),
        .rf_rd0    (rd0),
        .rf_rd1    (rd1)
    );

    initial begin
        clk = 0;
        ra0 = 5'H0; ra1 = 5'H0; wa = 5'H0; we = 1'H0; wd = 32'H0;

        #12
        ra0 = 5'H0; ra1 = 5'H0; wa = 5'H3; we = 1'H1; wd = 32'H12345678;

        #5
        ra0 = 5'H0; ra1 = 5'H0; wa = 5'H0; we = 1'H0; wd = 32'H0;

        #5
        ra0 = 5'H3; ra1 = 5'H2; wa = 5'H2; we = 1'H1; wd = 32'H87654321;

        #5
        ra0 = 5'H0; ra1 = 5'H0; wa = 5'H0; we = 1'H0; wd = 32'H0;

        #5
        ra0 = 5'H3; ra1 = 5'H0; wa = 5'H0; we = 1'H1; wd = 32'H87654321;

        #10
        $finish;
    end
    always #5 clk = ~clk;
endmodule

Image title
RF 参考的仿真结果

在检查时,请向助教展示你的仿真结果,并介绍写优先的实现思路。

任务 2:分布式存储器与块式存储器

Task 2

请分别例化一个分布式存储器和一个块式存储器,二者均设定为单端口 RAM 存储器,容量为 1024 x 32 bits。讨论二者在读写时时序的异同。你需要设计合适的仿真文件以验证你的结论。

任务 3:排序模块 SRT

Task 3-1

请基于 PPT 介绍内容,完成硬件冒泡排序模块 SRT 的设计。

Image title

你需要在开发板上完成这项任务,相关外设与控制信号的对应关系如下:

Image title

我们强烈建议大家优先完成仿真测试,通过后再进行上板测试。板子的时钟周期设定为 10ns(100MHz)。你可以参考数电实验的 信号处理有限状态机Verilog 常见错误分析 等章节的内容完成设计。

1024 个待排序数据需要通过 COE 文件载入存储器。这些数据需要自行生成,且应当包括至少 256 个不同的整数(毕竟排序 1024 个相同的数意义不大)。检查时,请现场上板运行排序程序,并展示最终结果以及运行时间。

限制文件

不同的开发板所需的限制文件不同,本课程实验所需的限制文件请点击这里。在使用文件时,请将需要连接的接口的注释符号去掉,修改好对应接口的名字即可。

开发板的数码管显示

这里是一个参考实现。

Task 3-2

基于 Vivado 的工具查看 SRT 综合后的电路资源和性能。请在实验报告中给出 LUT、FF 等资源的使用情况,以及电路正常工作的最高时钟频率。

选做任务(二选一)

Task X-1

使用块式存储器实现 SRT;比较其与分布式实现的电路资源和性能差异。

Task X-2

使用快速排序替代冒泡排序,其中 pivot 固定选择最后一个元素;比较其与原实现的电路资源和性能差异。

延伸(不计分)

在硬件层面,还有什么方式能降低排序所需要的期望时间?SRT 在排序 1024 个数据时期望时间最低能达到多少?

实验检查与提交

本次实验布置时间为 2025-03-19,持续一周。相应的 DDL 节点如下:

检查 DDL 报告提交 DDL
2025-03-26 21:00 2025-04-02 23:59

检查与报告延迟一周以内(含)的,至多只能得到 80% 分数;延迟一周以上、两周以内(含)的,至多只能得到 60% 分数;延迟超过两周的不得分。

提醒

实验的 DDL 为当天晚上 21:00。助教有权利在 21:00 准时停止检查,请大家合理安排好自己的时间。

关于实验报告

实验报告需要大家提交 PDF 格式。我们推荐大家使用 Markdown 或者 Latex 撰写实验报告,这样可以直接导出为 PDF。大家也可以使用 Word、WPS 等进行报告撰写,最后转换为 PDF 格式。我们不推荐也不拒绝大家手写实验报告,但请将其拍照扫描成 PDF 文件后再上传。我们不接受任何因为文件格式错误而导致成绩异常的申诉请求!

在实验报告中,你需要给出每一项任务的答案,并附上必要的说明过程(或截图)。

特别地:实验报告的字数和排版与最终得分无关。影响得分的仅有内容正确性与完整性。

实验报告请提交至 BB 平台。

评论