头歌:ALU 实验
实验目的本关任务1、理解 ALU 的工作原理。2、掌握 ALU 的设计方法。3、熟悉 MIPS 指令集中的运算指令学会对这些指令进行归纳分类。4、加强运用 Verilog HDL 进行硬件设计的能力。5、熟悉 Vivado 的设计流程具备硬件的设计仿真和测试能力。实验原理运算器是计算机中实现数据加工的部件主要完成数据的算术和逻辑运算。根据附录 E 中列举的的 CPU 准备实现的 20 条 MIPS 指令的功能设计 ALU 的功能(如表 5-1 所示)。参加运算的两个 32 位数据分别为 n[31:0] 和 b[31:0] 运算器的功能由控制信号(即操作码) aluc[3:0] 决定r[31:0] 为输出结果z 为运算后的零标志位。注*表示这一位既可以是1也可以是0。实验内容和要求1.学习 MIPS 指令集,熟知指令类型了解指令功能和编码,归纳基础的 ALU 运算指令归纳确定实验中准备实现的 ALU 运算。2.熟悉硬件平台掌握利用显示屏观察特定信号的方法学习软件平台和设计流程。3.自行设计实验方案画出结构图如图 5-1 所示操作码采用二进制编码确定 ALU 的功能。4.根据设计的实验方案使用 Verilog HDL 编写相应代码。5.对编写的代码进行仿真得到正确的波形图。6.将以上设计作为一个单独的模块设计一个外围模块去调用该模块如图 5-2 所示。外围模块需调用封装好的 LCD 触摸屏模块显示 ALU 的两个源操作数、操作码和运算结果,并且需要利用触摸功能输入源操作数。操作码可以考虑用 LCD 触摸屏输入也可以用拨码开关输入。7. 将编写的代码进行综合布局布线非下载到 FPGA 实验箱进行硬件测试,做好实验记录,验证此设计的功能。8. 撰写实验报告实验报告内容包括:程序设计、仿真分析、硬件测试和实验操作步骤以及源程序代码、仿真波形图、数据记录和实验结果分析等。实验步骤1.创建工程新建一个文件夹 ALU 创建本实验的工程。启动 Vivado 软件选择 “File → Project → New” 菜单命令出现新建工程向导输入工程名 “alu” 选择工程的文件位置。2.模块设计1添加源文件Verilog HDL 代码都是以 “.v” 为后缀的文件可以在其他文件编辑器中写好再添加到新建的工程中也可以在工程中新建一个文件后进行编辑。添加 Verilog HDL 文件的方法为在左侧工程管理区 PROJECT MANAGER 中单击 “Add Sources” 在弹出的对话框中选择 “Add or create design sources”。如果已经编辑好了设计文件则单击 “Add Files” 按钮选择 “alu.v” 。如果是在工程中创建那么单击 “Create File” 按钮在出现的对话框中输入文件名 “alu” 。ALU 有 2 个 32 位的数据输入端和 1 个 4 位的控制信号输入端产生 1 个 32 位的运算结果和 1 个结果为零的标志位。2添加外围展示模块为了测试实验结果需要设计一个外围模块 alu_display.v 用于在触摸屏上直观地显示输入和输出结果。该外围模块既要调用 alu.v 又要调用触摸屏模块。把该模块添加到工程。在项目管理区中单击 “Add Sources” 在出现的对话框中选中 “Add or create design sources” 然后单击 “Next” 按钮在出现的对话框中单击 “Add Files” 然后选择 “alu_display.v” 单击 “OK” 按钮。在工程管理区可以看到各模块间的层次关系顶层模块 alu_display 调用了两个子模块一个为 alu 即算逻运算器主体代码另一个为 lcd_module 即 LCD 触摸屏的模块。后续实验的外围展示模块可以仿照 alu_display.v 进行编辑。lcd_module 模块前有 “?” 表示该模块还未添加。实验配套资源设计时将 lcd_module 模块封装为一个黑盒的网表文件只需调用即可而不必过分关注或迷失在 LCD 触摸屏的实现中。继续单击 “Add Sources” 添加 lcd_module.dcp 。3.功能仿真1仿真测试模块在进行功能仿真时需要先建立一个测试模块。一个比较完备的测试模块能够产生输入激励信号送入要测试的模块然后读出其执行结果并与预期的结果进行比较以此验证模块的正确性。本实验需要产生的输入激励是 2 个参与运算的数和 1 个控制信号该激励输入 ALU 后会输出运算结果和零标志位信号。仿真的过程会产生波形文件可以通过观察波形文件确定功能的正确性。如果出错可以定位错误位置。单击 “Add Source” 在出现的对话框中选中 “Add or create simulation sources” 添加 “alu_tb.v”。添加 alu_tb.v 后工程管理区如图 5-15 所示如果 alu_tb.v 前没有 top 标志那么右击 alu_tb.v 在弹出的快捷菜单中选择 “Set as Top” 命令。2波形仿真在左侧的导航栏中单击 “Run Simulation” 然后选择 “Run Behavioral Simulation” 。在仿真界面左上方的 “Scopes” 图 5-16 左上第一个窗格选择要观察信号所在源文件对象然后在 “Objects” 窗口图 5-16 左上第二个窗格可以看到该对象所有的信号选中要观察的信号在弹出的快捷菜单中选择 “Add To Wave Window” 添加该信号到波形窗口。另外当前波形窗口显示的数据均为二进制数 32 位的数不便于观察可以在波形窗口的 Name 列中选择信号然后在弹出的快捷菜单中选择 “Radix” 可以选择数据显示的进制。本实验选择十六进制后可以检查几组数据。如aluc0 时ALU 实现加法运算aaaaaaaa 55555555 ffffffff正确。4.实验方案设计通过 LCD 触摸屏输入两个 32 位数据和控制信号并显示运算结果和零标志位。外围展示模块 alu_display.v 的功能是调用 LCD 触摸屏。5.引脚绑定在项目管理区中单击 “Add Sources”在弹出的对话框中选中 “Add or create constraints”然后单击 “Next” 按钮在出现的对话框中添加或创建约束文件 “alu.xdc” 。因为 LCD 触摸屏相关引脚的绑定是固定不变的所以实验需要用到 LCD 触摸屏时可以先添加已有的 XDC 文件再根据需求修改 LED 和拨码开关等引脚的绑定即可。引脚绑定后就可以对工程进行综合、布局布线和产生可烧写文件了。6.文件下载双击 “Generate Bitsteam”会自动进行综合、布局布线并产生可烧写文件可以选择 Open Implemented Design 查看实现结果。生成的可烧写的文件后缀为 .bit。module alu(a,b,aluc,r,z);input[31:0]a,b;input[3:0]aluc;output[31:0]r;output z;/*begin*/ reg[31:0]r_reg;always (*)begin case(aluc)// *000: 算术加法(支持 0000 和1000)4b0000, 4b1000: r_rega b;// *001: 逻辑与(支持 0001 和1001)4b0001, 4b1001: r_regab;// *010: 逻辑异或(支持 0010 和1010)4b0010, 4b1010: r_rega ^ b;// *100: 算术减法(支持 0100 和1100)4b0100, 4b1100: r_rega - b;// *101: 逻辑或(支持 0101 和1101)4b0101, 4b1101: r_rega|b;// *110: 将 b 逻辑左移16位(LUI类似操作支持 0110 和1110)4b0110, 4b1110: r_regb16;// *011: 将 b 逻辑左移 a[4:0]位(SLL型支持 0011 和1011)4b0011, 4b1011: r_regba[4:0];// 0111: 将 b 逻辑右移 a[4:0]位(SRL型)4b0111: r_reg b a[4:0]; // 1111: 将 b 算术右移 a[4:0] 位 (SRA型使用 $signed 进行符号位扩展) 4b1111: r_reg$signed(b)a[4:0];default: r_reg32b0; endcase end // 输出赋值 assign r r_reg; // 零标志位判断当运算结果为 0 时z 为 1否则为 0 assign z (r_reg 32b0)?1b1 : 1b0;/*end*/ endmodule