《高级计算机体系结构》实验
三、实验环境
软件:QuartusII 6,ModelSim
硬件平台:GW48-SOPC/DSP EP1C6Q240
四、实验步骤
1. 各个子模块的设计和Verilog实现 (1) PC寄存器
PC(program counter)是专用寄存器,CPU使用它从存储器中取指令。每执行一条指令PC加4。Clk为时钟信号,rst为复位信号。PC寄存器的部分程序:
always @(posedge clk) begin if(rst) //当有复位信号时,输出为0; dout =32'h00000000; else dout = din; end
(2) 二选一的数据选择器
二选一的数据选择器电路框图如图二所示: 输入端是a、b,输出端为c,sel为控制端。当sel为0时,输出端c输出a信号,当sel为1时,输出端c输出b信号,w为数据宽度参数。程序为:
module mux1(a,b,sel,c); parameter w = 32;
《高级计算机体系结构》实验
input [w-1:0] a,b; input sel; output [w-1:0] c; assign c = (sel == 0)?a:b; endmodule
(3) 符号扩展和移位
本实验中的符号扩展是在数据使用之前进行0扩展或符号扩展,是把16位的数据扩展成32的数据。din为16位输入数据,dout为32为输出数据,程序如下:
module signextend(din,dout); input [15:0] din; output [31:0] dout; assign dout[15:0] = din; assign dout[31:16] = 16'h0000; endmodule
(4) 寄存器RegFile模块
根据输入的寄存器地址读写寄存器,n1为源操作数1的寄存器地址, n2为源操作数2的寄存器地址,we为写寄存器信号,nd 写寄存器的地址,di 写寄存器的数据,q1为源操作数1的数据,q2为源操作数2的数据。当we为0时,q1输出以源操作数1为地址的数据,q2输出以源操作数2为地址的数据,当we为1时,把di输入的数据写到以nd为地址的寄存器中。部分程序如下:
reg [31:0] r[31:0]; //定义寄存器; assign q1 = (n1==0)?0:r[n1]; assign q2 = (n2==0)?0:r[n2]; always @(posedge clk) begin if(we) r[nd] = di; end endmodule
(5) ALU模块
算术逻辑单元(ALU:aritl-irnetic logic unit)的设计是CPU设计中重要的一个环节。可以这样说,微处理器中最重要的地方是ALU,它是CPU真正处理数据的地方。ALU使用的数据来自寄存器(Register),它读取寄存器中的数据并进行一些计算(如对两个数据相加、对两个数据进行逻辑或运算等等),然后把计算结果返回到寄存器中,最后再把寄存器中的结果返回到主内存中。根据控制信号aluc确定执行功能如图三所示:
assign zero = (c==0)?1:0; always @(a,b,aluc) begin case(aluc) ADD: c = a + b; SUB: c = a - b; AND: c = a & b;
《高级计算机体系结构》实验
end
OR: c = a | b; SLT: c = (a
(6) Inst Mem模块和Data Mem模块的实现
Inst Mem是32位的指令寄存器,存放着指令数据。Data Mem是数据寄存器,当we信号为1时,写寄存器。部分程序如下:
reg [31:0] ram[31:0]; always @(negedge clk ) begin if (we) begin
ram[addr] = wd;
end
data = ram[addr]; end
(7) Control控制器模块
由指令操作码op和功能码func确定指令的具体功能如下表所示:
控制器中有8条信号线,分别是:jump,memtoreg,branch,whitemem,aluc[2:0],alusrcb,writereg,regdes,分别控制不同的器件。如下表所示:
《高级计算机体系结构》实验
控制器的部分程序为:
assign madd = (op[5:0]== 6'b000000 && func[5:0] == 6'b100000 )?1:0; assign msub = (op[5:0] == 6'b000000 && func[5:0] == 6'b100010 )?1:0; assign mand = (op[5:0] == 6'b000000 && func[5:0] == 6'b100100 )?1:0; assign mor = (op[5:0] == 6'b000000 && func[5:0] == 6'b100101 )?1:0; assign mslt = (op[5:0] == 6'b000000 && func[5:0] == 6'b101010 )?1:0; assign mlw = (op[5:0] == 6'b100011 )?1:0; assign msw = (op[5:0] == 6'b101011 )?1:0; assign mbeq = (op[5:0] == 6'b000100 )?1:0; assign mj = (op[5:0] == 6'b000010 )?1:0; assign alusrcb = (mlw || msw)?1:0; assign writereg = (mand || mor || madd || mslt || mlw ||msub)?1:0; assign aluc[2] = (msub || mslt || mbeq)?1:0; assign aluc[1] = (msw || msub || madd || mslt || mlw || mbeq)?1:0; assign aluc[0] = (mor || mslt)?1:0; assign branch = (mbeq && zero)?1:0; assign jump = (mj)?1:0; assign memtoreg = (mlw)?1:0; assign regdes = (mlw)?1:0; assign writemem = (msw)?1:0; (8)
2. 编译和仿真
(1)对源程序进行语法检查和编译。
对程序进行分析综合,检查语法规范;如果没有问题则编译整个程序,使用 。如果出现问题,则对源程序进行修改,直至没有问题为止。 (2)波形仿真。
Quartus II内置波形编辑程序(Waveform Editor)可以生成和编辑波形设计文件,从而设计者可观察和分析模拟结果。Quartus II中的仿真包括功能仿
《高级计算机体系结构》实验
真和时序仿真,功能仿真检查逻辑功能是否正确,不含器件内的实际延时分析;时序仿真检查实际电路能否达到设计指标,含器件内的实际延时分析。两种仿真操作类似,只需在Processing菜单中选择Simulater Tool,在其Simulater mode中进行选择即可。
现以时序仿真为例,介绍仿真的具体操作过程:
① 新建一个波形文件,只是在弹出页式对话框后选择Other Files页面的Vector Waveform File。
② 在波形文件中加入所需观察波形的管脚:在Name中单击右键,选择Insert Node or bus...选项,出现Insert Node or bus对话框,此时可在该对话框的Name栏直接键入所需仿真的管脚名,也可点击Node Finder...按钮,将所有需仿真的管脚一起导入。在Pins下拉列表框中选择合适的选项,点击List按钮,将所需仿真的管脚移至Select Noder框中。点击OK进入波形。
③ 给输入管脚指定仿真波形 :分别选中输入管脚,使用波形编辑器对其输入波形进行编辑。最后保存波形文件。 ④ 点击按钮,进行波形仿真。
3. 引脚配置及测试数据
选择Assignment菜单的pins选项,进入管脚分配界面。在管脚分配之前确定类别栏按钮,管脚过滤栏和分色显示按钮都处于有效状态,按下类别栏的Pin按钮。管脚分配也与实际电路密切相关,在管脚分配栏中,将程序中的输入输出脚分配到管脚上,并保存。并进行整体编译文件。 4、 下载。
实验电路板接电源,确保其供电正常;连接下载电缆;点击进入下载界面,进行下载。击Start按钮开始下载。 五、思考题
相关推荐: