教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 说明书 >

《单周期CPU的设计与实现》-实验指导书(6)

来源:网络收集 时间:2026-04-12
导读: 计算机组成原理实验单周期CPU的设计与实验 6.寄存器堆(Register File)的设计与实现 寄存器堆(Register File)是CPU组成的重要存储部件,也是数据通路中的重要部件,其主要功能是对数据进行存储。在本实验中将为

计算机组成原理实验单周期CPU的设计与实验

6.寄存器堆(Register File)的设计与实现

寄存器堆(Register File)是CPU组成的重要存储部件,也是数据通路中的重要部件,其主要功能是对数据进行存储。在本实验中将为Register File构建32×32的寄存器组,即共有32个寄存器,每个寄存器的位宽都是32位。32×32的Register File逻辑结构如图6-1所示。

A_addr[4:0] B_addr[4:0] W_addr[4:0] Write Data Clock 图6-1 Register File逻辑结构

Register File A_data[31:0]

B_data[31:0]

图6-1中的寄存器组有1个数据输入端口,2个数据输出端口,因此可以从该寄存器组中同时输出2个数据。由于没有设置读信号,故在本实验中当A_addr(或B_addr)为0时,并不是选择输出Register0的内容,而是直接输出0。图6-1中各信号引脚的功能:

? A_addr:A输出端口地址,5位,输入; ? B_addr:B输出端口地址,5位,输入; ? W_addr:数据写入的寄存器号,5位,输入; ? Write:写信号,1位,输入; ? Data:数据,32位,输入;

? A_data:A端口的输出数据,32位,输出; ? B_data:B端口的输出数据,32位,输出; ? Clock:时钟信号,输入。

在工程管理区任意位置单击鼠标右键,在弹出的菜单中选择New Source命令,选择Verilog Module输入,并输入Verilog文件名:RegFile,单击Next按钮进入端口定义对话框。其中Module Name栏输入模块名:RegFile,单击Next进入下一步,点击Finish完成创建。实现RegisterFiles的Verilog程序参考代码:

module RegFile(

input Clock,

input Reset, input [ 4:0] A_addr, input [ 4:0] B_addr, input [ 4:0] W_addr,

计算机科学与工程学院

24

计算机组成原理实验单周期CPU的设计与实验

input [31:0] Data, input Write, output [31:0] A_data, output [31:0] B_data );

reg [31:0] Register[1:31];

//Read data

assign A_data = (A_addr == 0)? 0 : Register[A_addr]; assign B_data = (B_addr == 0)? 0 : Register[B_addr];

//Write data integer i;

always @ ( posedge Clock or negedge Reset) begin if (Reset == 0) begin

for (i=1 ; i <=31 ; i = i+1) Register[i] <= 0; end else if (( Write ) && ( W_addr != 0)) Register[W_addr] <= Data; endendmodule

对Register File进行仿真。在工程管理区将View设置为Simulation,在任意位置单

击鼠标右键,并在弹出的菜单中选择New Source,在类型中选择Verilog Test Fixture,输入测试文件名:RegFile_tb,单击Next按钮,这时所有工程中的模块名都会显示出来,选择要进行测试的模块:RegFile。点击Next ,再单击Finish按钮,ISE会在源代码编辑区自动生成测试模块的代码。加入如下仿真代码:

module RegFile_tb;

reg Clock; reg Reset;

reg [4:0] A_addr; reg [4:0] B_addr; reg [4:0] W_addr; reg [31:0] Data; reg Write;

wire [31:0] A_data; wire [31:0] B_data;

// Instantiate the Unit Under Test (UUT) RegFile uut (

.Clock(Clock), .Reset(Reset), .A_addr(A_addr), .B_addr(B_addr), .W_addr(W_addr), .Data(Data), .Write(Write), .A_data(A_data), .B_data(B_data) );

计算机科学与工程学院

25

计算机组成原理实验单周期CPU的设计与实验

initial begin

// Initialize Inputs Clock = 0; Reset = 0; A_addr = 0; B_addr = 0; W_addr = 0; Data = 0; Write = 0;

// Wait 100 ns for global reset to finish #100;

Reset <= 1;

A_addr <= 5'b00001; B_addr <= 5'b00010; W_addr <=5'b00011; Data <=32'h12345678; Write <=1; Clock <= 1; #100;

A_addr <= 5'b00011;

B_addr <= 5'b00100; Write <=0;

// Add stimulus here end endmodule

完成测试文件编辑后,确认工程管理区中View选项设置为Simulation,这时在过程管理区会显示与仿真有关的进程。右键单击其中的Simulate Behavioral Model项,选择弹出菜单中的Process Properties项,会弹出属性设置对话框,将其中Simulation Run Time设置为1000ns。

仿真参数设置完后,就可以进行仿真。首先在工程管理区选中测试模块RegFile_tb,然后在过程管理区双击Simulate Behavioral Model,ISE将启动ISE Simulator,可以得到仿真结果,如图6-2所示。

图6-2 Register file仿真

计算机科学与工程学院

26

计算机组成原理实验单周期CPU的设计与实验

7.控制器(Control Unit)的设计与实现

控制器对指令进行译码,根据指令的功能产生相应的控制信号。其逻辑结构如图7-1所示。

图5-1 控制器逻辑结构

在图7-1中各引脚的功能如下: ? z:运算结果为零,1位,输入; ? op[5:0]:指令操作码,6位,输入; ? func[5:0]:指令功能码,6位,输入;

? wmem:写储存器,1位,为1时写储存器,否则不写,输出; ? wreg:写寄存器,1位,为1时写寄存器,否则不写,输出;

? regrt:目的寄存器是rt,1位,为1时目的寄存器是rt,否则是rt,输出; ? m2reg:存储器数据写寄存器信号,1位,为1选择存储器数据,否则t选择

ALU的运算结果,输出;

? shift:ALU的A端口使用移位位数,1位,为1时使用移位位数,否则使用寄

存器数据,输出;

? aluimm:ALU的B端口使用立即数,1位,为1时使用立即数,否则使用寄存

器数据,输出;

? jal:子程序调用,1位,为1时表示是jal,否则不是,输出; ? sext:立即数符号扩展,1位,为1时符号扩展,否则零扩展,输出;

计算机科学与工程学院

27

计算机组成原理实验单周期CPU的设计与实验

? aluc[3:0]:ALU操作控制码,4位输出;

? pcsource[1:0]:下一条指令地址选择,2位,输出。

在工程管理区任意位置单击鼠标右键,在弹出的菜单中选择New Source命令,选择Verilog Module输入,并输入Verilog文件名:Control_Unit,单击Next按钮进入端口定义对话框。其中Module Name栏输入模块名Control_Unit,单击Next进入下一步,点击Finish完成创建。实现Control_Unit的Verilog程序参考代码:

module Control_Unit(

input [5:0] op, input [5:0] func, input z, output wmem, output wreg, output regrt, output m2reg, output [3:0] aluc, output shift, output aluimm, output [1:0] pcsource, output jal,

output sext );

// Register addressing

wire i_add = (op == 6'b000000 & func == 6'b100000)?1:0; wire i_sub = (op == 6'b000000 & func == 6'b100010)?1:0; wire i_and = (op == 6'b000000 & func == 6'b100100)?1:0; wire i_or = (op …… 此处隐藏:2444字,全部文档内容请下载后查看。喜欢就下载吧 ……

《单周期CPU的设计与实现》-实验指导书(6).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/449330.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)