《单周期CPU的设计与实现》-实验指导书_第1页
《单周期CPU的设计与实现》-实验指导书_第2页
《单周期CPU的设计与实现》-实验指导书_第3页
《单周期CPU的设计与实现》-实验指导书_第4页
《单周期CPU的设计与实现》-实验指导书_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、电子科技大学计算机科学与工程学院单周期CPU的设计与实现实验指导书计算机组成原理实验张 建2013-12-13目 录前 言11.1 实验内容21.2实验要求22. 实验环境321 硬件平台322 软件平台323 实验主要仪器设备连接框图43. 实验原理531 概述532 单周期CPU的总体电路533 MIPS指令格式634 数据路径设计7341 下一条指令地址的选择7342 ALU的输入端8343寄存器堆的输入端84. 基本功能部件的设计与实现1041 32位2选1选择器的设计与实现1042 32位4选1选择器的设计与实现1843 5位2选1选择器的设计与实现1944 带有异步清零的32位D触

2、发器的设计与实现1945 移位器的设计2046 32位加/减法器的设计与实现205运算器(ALU)的设计与实现216寄存器堆(Register File)的设计与实现247控制器(Control Unit)的设计与实现278. CPU的封装309. 测试3291 指令存储器及测试程序3292 数据存储器及测试数据3393 仿真测试3394 下载到开发板验证35附件:39BTN_Anti_Jitter模块39Hex7seg_decode模块39前 言计算机组成原理是计算机科学专业的一门重要专业基础课。在该课程中的理论学习中系统地阐述了计算机各组成部件的工作原理、逻辑实现和设计方法及将各部件连接成

3、整机的方法,计算机硬件与底层软件的接口,培养了学生对计算机硬件系统的分析、开发与设计的基本技能能力。本实验开设的目的是让学生通过设计一个单周期的CPU,加深对计算机各组成部件功能的理解和掌握,更好地理解计算机的基本工作原理,培养和锻炼学生掌握计算机硬件设计的基本方法和技能。本实验是计算机硬件系列实验的重要实验,是后续计算机系统实验的基础。本实验的先修课程:数字逻辑及Verilog HDL硬件描述语言。对于未修先修课程的学生实验指导教师应对其进行相关知识的培训,培训建议4学时。本实验所针对的教材:计算机组成与设计-硬件/软件接口第4版,(美)David A. Patterson、John L.

4、Hennessy著,机械工作出版社,2012.11. 实验内容与要求1.1 实验内容1. 本实例所设计CPU的指令格式的拟定;2. 基本功能部件的设计与实现;3. CPU各主要功能部件的设计与实现;4. CPU的封装;5. 仿真测试及板级测试。1.2实验要求1. 设计的CPU能够执行20条整数指令,每条指令的编码长度均为32位;2. 指令类型应有:计算类型、访问存储器类型、条件转移类型和无条件转移类型;3. 操作数应有:寄存器操作数、立即数;4. 测试程应不少于10条,将设计成果仿真测试并起先板级验证。2. 实验环境21 硬件平台本实验所需的硬件主要有:PC计算机和FFPEG实验开发板,具体要

5、要求如下:1. IBM PC及兼容计算机:内存1GB,硬盘空间30GB2. FPGA开发套件,本实验采用的是Anvyl Spartan6/XC6SLX453. USB连接线Anvyl Spartan6/XC6SLX45的主要特点: 通用输入接口14个LED:8个红色,2组“红绿灯”模式8个滑动开关4个按键6个7段数码管2组拨码开关(一组4个) 音频接口:I2S Codec接口 视频接口HDMI输出接口12比特VGA接口(800600),使用无源电阻网路 USB接口USB1:JTAG编程及UARTUSB2/3:USB设备接口,可接HID设备或U盘 片外存储器DDR2:256MB SRAM:2MB

6、 QSPI Falsh:32MB OLED:12832蓝色显示 LCD液晶屏:480272全彩色液晶触摸屏 Clock:100MHz单端CMOS晶振22 软件平台1. 操作系统:Windows XP、Win 7;2. 开发平台:Xilinx ISE Design Suite 13.4集成开发系统;3. 编程语言:Verilog HDL硬件描述语言。23 实验主要仪器设备连接框图实验主要仪器设备的连接框图如图2-1所示。图2-1 主要实验仪器设备连接图通过USB连接线将实验开发板与PC计算机连接,USB线的一端接在计算机上任一USB接口上,另一端接在实验板的JTAG(Joint Test Act

7、ion Group;联合测试行动小组)接口上。3. 实验原理31 概述图3-1 时钟周期和单周期CPU指令的执行指令0指令1指令5指令2指令41个时钟周期Clock单周期(Single Cycle)CPU是指CPU从取出1条指令到执行完该指令只需1个时钟周期。一条指令的执行过程包括:取指令分析指令执行指令保存结果(如果有的话)。对于单周期CPU来说,这些执行步骤均在一个时钟周期内完成。32 单周期CPU的总体电路图3-2 单周期CPU总体电路Clock40 1 2 3rsoprtrdfuncWregalucpcsourceSsaInstMemADo+ALUABA_dataA_addrB_add

8、rWriteW_addrB_dataDatafSPCSeSaluimmshiftResultDataMemADoWeSwmemm2reg+DiimmaddrZeroregrtsextjalControlUnit本实验所设计的单周期CPU的总体电路结构如图3-2所示。本实验所设计的CPU主要组成部分有:运算器(ALU)、控制器(Control Unit)、寄存器堆(Register Files)、取指电路及相关基础部件(如选择器)等构成。33 MIPS指令格式MIPS指令系统结构有MIPS-32和MIPS-64两种。本实验的MIPS指令选用MIPS-32。以下所说的MIPS指令均指MIPS-32

9、。MIPS的指令格式为32位。图3-3给出了MIPS指令的3种格式。图3-3 MIPS指令格式263125212016151110650oprsrtrdsafuncR型指令263125212016150oprsrtimmediateI型指令2631250opaddressJ型指令本实验只选取了20条典型的MIPS指令来描述CPU逻辑电路的设计方法。表3-1列出了本实验的所涉及到的20条MIPS指令。表 1 本实验所涉及的20条MIPS指令R型指令指令31:2625:2120:1615:1110: 65:0功能Addrsrtrd寄存器加Subrsrtrd寄存器减Andrsrtrd寄存器与Orrs

10、rtrd寄存器或Xorrsrtrd寄存器异或Sll00000rtrdsa左移Srl00000rtrdsa逻辑右移Sra00000rtrdsa算术右移Jrrsrtrd寄存器跳I型指令Addirsrtimmediate立即数加Andirsrtimmediate立即数与Orirsrtimmediate立即数或Xorirsrtimmediate立即数异或Lwrsrtoffset取数据Swrsrtoffset存数据Beqrsrtoffset相等转移Bnersrtoffset不等转移Lui00000rtimmediate设置高位J型指令Jaddress跳转Jaladdress调用R型指令的op均为0,具体

11、操作由func指定。rs和rt是源寄存器号,rd是目的寄存器号。移位指令中使用sa指定移位位数。I型指令的低16位是立即数,计算时需扩展到32位,依指令的不同需进行零扩展和符号扩展。J型指令的低26位是地址,是用于产生跳转的目标地址。34 数据路径设计CPU的电路包括数据路径(Data path)和控制部件(Control Unit)两大部分。下面介绍路径的设计。341 下一条指令地址的选择下一条指令的地址有4种情况:1. 程序不转移时下一条指令的地址为PC+4;2. 执行beq和bne指令发生转移时,下一条指令的地址是PC加4,再加上符号扩展的偏移量左移2位的和;3. 执行jr指令时转移的目

12、标地址就是rs寄存器中的内容;4. 执行j和jal指令时转移的目标地址是指令中的低26位地址左移2位,再与PC+4的高4位拼接在一起。下一条指令地址的产生和选择电路如图3-3所示。图3-3 下一条指令地址的选择PC+0 1 2 3+A_dataA_addrB_addrB_dataInstMemADoeALUABResultzeroControlUnit4opfuncp4rsrtimmaddrpcsourcealucClock在图3-3中控制器(Control Unit)根据op、func和zero(对于beq和bne指令)信号产生相应的转移控制选择信号pcsource。342 ALU的输入端A

13、LUABA_dataB_dataMUXMUXsaeimmRegFileControlUnitshiftopfunc图3-4 ALU的输入端选择aluimmALU的输入端有2个:A输入端和B输入端。A、B输入端分别有2种输入情况。对于A输入端,有寄存器堆的A_data和移位数sa输入。对于B输入端,有寄存器堆的B_data和符号扩展后的立即数imm输入。其输入数据路径如图3-4所示ALU的A、B端具体输入哪路数据由控制器(Control Unit)根据指令译码产生控制信号shift和aluimm来选择。343寄存器堆的输入端A_dataA_addrB_addrWriteW_addrB_dataD

14、atarsrtMUXrdfMUXALUABDataMemADoWeDiMUXPC+4regetjalm2reg图3-5 寄存器堆的输入寄存器堆的A_addr和B_addr的输入来自指令,分别只有一种输入,W_addr有2种,而Data有4种输入,具体输入见图3-5。寄存器堆的W_addr和Data端的输入信号由控制器(Control Unit)根据指令译码产生的控制信号reget、jal和m2reg来选择。在图3-5中模块f的输入为5位的寄存器号reg_dest和jal,输出为W_addr,其Verilog HDL语句为:Assign W_addr = reg_dest | 5jal;4. 基

15、本功能部件的设计与实现一个CPU主要由ALU(运算器)、控制器、寄存器堆、取指部件及其它基本功能部件等构成。在本实验中基本功能部件主要有:32位2选1多路选择器、32位4选1多路选择器、5位2选1多路选择器、D触发器、移位器及32位加/减法器。41 32位2选1选择器的设计与实现A31:0B31:0O31:0MUXSelFunction:Sel = 0:O = ASel = 1:O = B图4-1 32位2选1逻辑框图多路选择器是计算机逻辑电路设计中最重要的基本逻辑电路之一,也是基于数据选择通路CPU的重要部件。32位2选1选择器的逻辑框图如图4-1所示。1. 设计步骤 Step 1:新建工程

16、启动ISE软件,然后选择菜单FileNew Project,弹出New Project Wizard对话框,在对话框中输入工程名Single_Cycle_CPU,并指定工作路径D:Single_Cycle_CPU(注:工程名并不需要和工作路径同名),如图4-2所示。图4-2 New Project Wizard对话框输入完工程名和工作路径后点击Next进入下一页:Project Settings,设置设备和工程属性,选用Spartan6 XC6SLX45芯片,采用CSG484封装,这是本实验开发板所用的芯片,如图4-3所示。图4-3 Project Settings对话框在图4-3中点击Nex

17、t进入下一页:Project Summary,这里显示了新建工程的信息,确认无误后,点击Finish就可以建立一个新的工程了,如图4-4所示。图4-4 Project Summary对话框 Step 2:模块(Module)设计在ISE集成开发环境中(如图4-5所示),在工程管理区任意位置单击鼠标右键,在弹出的菜单中选择New Source命令,会弹出如图4-6所示的New Source Wizard对话框:Select Source Type。信息显示区源代码编辑区过程管理区工程管理区图4-5 ISE集成开发环境图4-6 Select Source Type对话框在图4-6中选择Verilo

18、g Module,并输入Verilog文件名:MUX32_2_1,代码存放位置(Location)改为D:Single_Cycle_CPUCode。将代码放在D:Single_Cycle_CPUCode文件夹中主要是为了方便管理。然后点击Next按钮进入端口定义对话框:Define Module,如图4-7所示。图4-7 Define Module对话框在图4-7中, Module name栏用于输入模块名,这里是MUX32_2_1,下面的列表框用于端口的定义。Port Name表示端口名称,Direction表示端口方向(可选择为input、output或inout),MSB表示信号最高位,

19、LSB表示信号最低位,对于单信号的MSB和LSB不用填写。端口定义这一步略过,在源程序中自行添加。定义完端口后,点击Next按钮进入下一步,然后点击Finish按钮完成模块创建。输入模块代码:module MUX32_2_1(input 31:0 A,input 31:0 B,input Sel,output31:0 O );assign O = Sel? B : A;endmodule代码输入完成后,首先检查Verilog HDL语法:在工程管理区选中要检查的模块,在过程管理区双击Synthesize XSTCheck Syntax。如果有语法错误,会在信息显示区给出指示,请检查调试。如果没

20、有语法错误,在模拟仿真前要进行Verilog HDL代码综合。 Step 3:综合(Synthesize)所谓综合,就是将HDL语言、原理图等设计输入翻译成由与、或、非门和RAM、触发器等基本逻辑单元的逻辑连接(网表),并根据目标和要求(约束条件)优化生成的RTL(Real Time Logistics)层连接。完成了设计输入及语法检查后就可以进行综合。在工程管理区的View中选择Implementation,并选中要综合的模块MUX32_2_1,然后在过程管理区双击Synthesize-XST,就开始综合过程,如图4-8所示。图4-8 Running: Synthesis综合错误会在信息显示

21、区给出指示,如果代码过于行为化而不能转换成电路,称为不可综合代码,表示ISE无法转换成对应的电路,需要修改你的设计代码。如果综合通过,表示你设计的代码可以转换成RTL层描述,称为可综合代码。你可以通过View RTL Schematic查看综合后的RTL层电路,如图4-9所示。图4-9 模块MUX32_2_1综合结果 Step 4:仿真(Simulation)在工程管理区任意位置单击鼠标右键,在弹出的菜单中选择New Source命令,会弹出如图4-10所示的New Source Wizard对话框:Select Source Type。在图4-10选择Verilog Test Fixture

22、,输入测试文件名:MUX32_2_1_tb,单击Next按钮,进入下一个对话框,如图4-11所示。图4-10 创建仿真模块(1)图4-11 创建仿真模块(2)在图4-11中工程中所有的模块名都会显示出来(由于目前工程中只有一个模块,故只显示了一个模块名),选择要测试的模块MUX32_1,点击Next按钮,再点击Finish按钮,ISE会在源代码编辑区自动生成测试模块的代码,如图4-12所示。图4-12 Verilog Test Fixture MUX32_1在图4-12中示了刚生成的MUX32_1_tb模块,在该模块中添加如下测试代码: / Add stimulus here A = 32ha

23、aaa0000;B = 32hbbbb1111;Sel = 1b0;#100;Sel = 1b1;end endmodule完成测试文件编辑后,确认工程管理区中View选项设置为Simulation,并选中MUX32_2_1_tb模块。 这时在过程管理区会显示与仿真有关的进程,如图4-13中Processes栏所示。图4-13 选择仿真行为在图4-13中右键单击其中的Simulate Behavioral Model项,选择弹出菜单中的Process Properties项,会弹出如图4-14所示的属性设置对话框,其中Simulation Run Time就是仿真时间的设置,可将其修改为任意时

24、长。图4-14 Process Properties对话框仿真参数设置完后,就可以进行仿真。首先在工程管理区选中测试代码,然后在过程管理区双击Simulate Behavioral Model,ISE将启动ISE Simulator,可以得到仿真结果,如图4-15所示。图4-15 模块MUX32_1仿真效果 Step 5:约束(Constraints)与实现(Implementation)要实现设计,还需要为模块中的输入/输出信号添加管脚约束,这就需要在工程中添加UCF(User Constraints File)文件。在工程管理区单击鼠标右键,点击New Source,弹出如图4-6所示对话

25、框,在类型中选择Implementation Constraints File,输入文件名:MUX32_2_1_ucf,选择关联模块:MUX32_2_1。系统会生成一个空白的约束文件并打开。我们就可以为设计添加各种约束。本实验中用Anvyl中的8个Switch对应2组4位二进制输入,用4个LED发光二极管对应输出,BTN0按钮对应选择信号Sel。因为是组合电路,不需要时钟。具体约束内容如下:NET Sel LOC = E6; #switchesNET A LOC= V5;NET A LOC= U4;NET A LOC= V3;NET A LOC= P4;NET B LOC= R4;NET B

26、LOC= P6;NET B LOC= P5;NET B LOC= P8;#LedsNET O LOC=W3;NET O LOC=Y4;NET O LOC=Y1;NET O LOC=Y3;约束完成后,下一个步骤就是实现(Implementation)。所谓实现,是指将综合输出的逻辑网表翻译成所选器件的底层模块和硬件原语,将设计映射到器件结构上,进行布局布线,达到在选定器件上实现设计的目的。在ISE中,执行实现过程,会自动执行翻译、映射和布局布线过程:也可单独执行。在过程管理区双击Implementation Design选项,就可以自动完成实现的3个步骤,如图4-16所示。图4-16 Runni

27、ng Synthesis完成Place & Route后,在图4-16中双击Generate Programming File项生成二进制比特文件mux32_2_1.bit。 Step 5:流代码生成与下载完成Place & Route后,在图4-16中双击Generate Programming File项生成二进制比特文件mux32_2_1.bit。将Anyvl开发板与计算机通过USB线连接好,开发板加电,启动Digilent Adept软件,系统开始自动连接FPGA设备,成功检测到设备后,会显示出JTAG链上所用芯片,如图4-17所示。图4-17 Digilent Adept软件在图4-

28、17中点击Browse按钮,找到刚才生成的二进制比特文件mux32_1.bit,然后点击Program按钮开始下载,下载成功后会在图4-17下面的状态栏中显示Programming Successful。同学们可在开发板上拨动开关SW0SSW7和按钮BTN0,并观察LED0LED3的显示,思考一下观察的结果与设计是否一致。42 32位4选1选择器的设计与实现A31:0B31:0O31:0MUXSel1:0Function:Sel1:0= 00:O = A图4-18 32位4选1逻辑框图C31:0D31:0Sel1:0= 11:O = DSel1:0= 10:O = CSel1:0= 01:O

29、= B32位4选1选择器的逻辑框图如图4-18所示。32位4选1选择器的模块设计步骤可参考32位2选1选择器的设计步骤,下面给出32位4选1选择器的模块代码。module MUX32_4_1(input 31:0 A,input 31:0 B,input 31:0 C,input 31:0 D,input 1:0 Sel,output31:0 O );assign O = (Sel = 2b00)? A : (Sel = 2b01)? B : (Sel = 2b10)? C : D; Endmodule43 5位2选1选择器的设计与实现A4:0B4:0O4:0MUXSelFunction:Se

30、l = 0:O = ASel = 1:O = B图4-19 5位2选1逻辑框图5位2选1选择器的逻辑框图如图4-19所示。5位2选1选择器的模块设计步骤可参考32位2选1选择器的设计步骤,下面给出5位2选1选择器的模块代码。module MUX5_2_1(input 4:0 A,input 4:0 B,input Sel,output4:0 O );assign O = Sel? B : A; Endmodule44 带有异步清零的32位D触发器的设计与实现异步是指清零与时钟无关,只要有效就清零。其设计步骤可参考32位2选1选择器的设计步骤,下面给出其模块Verilog实现代码:module

31、dff32(input 31:0 D,input Clock,input Reset,output reg 31:0 Q ); always (posedge Clock or negedge Reset) beginif(Reset = 0) Q = 0;else Q = D;endendmodule45 移位器的设计移位器的功能是将一个数进行逻辑左移、逻辑右移或算术右移。其设计步骤可参考32位2选1选择器的设计步骤,下面给出其模块Verilog实现代码:module Shifter(input 31:0 D,input 4:0 Sa,input Right,input Arith,outp

32、ut reg 31:0 O );always (*) beginif (!Right) O = D Sa;else O = $signed(D) Sa;endendmodule46 32位加/减法器的设计与实现32位加/减法器的功能是完成32位的加法/减法运算。由于:故可以用加法器实现减法操作。下面给出其模块Verilog实现代码:module addsub32(input 31:0 A,input 31:0 B,input sub,output31:0 Result );cla32 as32(A , B32sub , sub , Result); endmodulemodule cla32(

33、input 31:0 a,input 31:0 b,input c,output31:0 s ); assign s = a + b + c; endmodule 5运算器(ALU)的设计与实现运算器ALU是CPU组成的核心部件之一,其实现方法主要有2种:一种是以加法器为核心,通过改变进位函数实现;另一种是运算部件并行多路选择实现。本实验采用运算部件并行多路选择实现。综合表3-1的指令,ALU只需完成9种运算即可,具体完成的功能如表5-1所示。表5-1:ALU功能真值表ALU_Operation功能描述x000Add(加)x100Sub(减)x001And(与)x101Or(或)x010Xor

34、(异或)x110Lui(设置高位)0011Sll(左移)0111Srl(右移)1111Sra(算术右移)ALU的逻辑框图如图5-1所示。在图5-1中各信号的功能:A31:0B31:0Result31:0ZeroALU_Operation3:0图5-1 ALU电路符号 A:操作数,32位,输入; B:操作数,32位,输入; ALU_Operation:4位操作码,输入; Result:运算结果,32位,输出; Zero:零标志,1位;当运算结果为0时,该位为1,否则为0;在工程管理区任意位置单击鼠标右键,在弹出的菜单中选择New Source命令,选择Verilog Module输入,并输入Ve

35、rilog文件名:ALU,单击Next按钮进入端口定义对话框。其中Module Name栏输入模块名:ALU,单击Next进入下一步,点击Finish完成创建。ALU模块的Verilog程序参考代码:module ALU(input 31:0 A, input 31:0 B,input 3:0 ALU_Operation,output 31:0 Result,output Zero);wire 31:0 d_and = A & B;wire 31:0 d_or = A | B;wire 31:0 d_xor = A B;wire 31:0 d_lui = B15:0,16h0;wire 31:

36、0 d_and_or = ALU_Operation2? d_or:d_and;wire 31:0 d_xor_lui = ALU_Operation2? d_lui:d_xor;wire 31:0 d_as , d_sh;addsub32 as32 (A , B , ALU_Operation2 , d_as);Shifter shift_1 ( B , A4:0 , ALU_Operation2 , ALU_Operation3 , d_sh);MUX32_4_1 sel ( d_as , d_and_or , d_xor_lui , d_sh , ALU_Operation1:0 , R

37、esult); assign Zero = |Result;endmodule对ALU进行仿真。在工程管理区将View设置为Simulation,在任意位置单击鼠标右键,并在弹出的菜单中选择New Source,在类型中选择Verilog Test Fixture,输入测试文件名:ALU_tb,单击Next按钮,这时所有工程中的模块名都会显示出来,选择要进行测试的模块:ALU。点击Next ,再单击Finish按钮,ISE会在源代码编辑区自动生成测试模块的代码。我们看到,ISE已经自动生成了基本的信号并对被测模块做了实例化。对ALU_tb模块,我们可以添加如下所示的测试激励代码。/ Add s

38、timulus hereA = 32h1234;B = 32h5678;ALU_Operation = 4b0000; /add#100A = 32h1234abcd;B = 32hf0f0f0f0;ALU_Operation = 4b001; /and#100A = 32h;B = 32h78;ALU_Operation = 4b0010; /xor#100A = 32h4;B = 32habcd;ALU_Operation = 4b0011; /sll#100A = 32h1234;B = 32h5678;ALU_Operation = 4b0100; /sub#100A = 32h123

39、4;B = 32h0ff;ALU_Operation = 4b0101; /or #100A = 32h1234;B = 32habcd;ALU_Operation = 4b0110; /lui#100A = 32h4;B = 32hf;ALU_Operation = 4b0111; /SRL#100ALU_Operation = 4b1111; /SRA完成测试文件编辑后,确认工程管理区中View选项设置为Simulation,这时在过程管理区会显示与仿真有关的进程。右键单击其中的Simulate Behavioral Model项,选择弹出菜单中的Process Properties项,会

40、弹出属性设置对话框,将其中Simulation Run Time设置为1000ns。仿真参数设置完后,就可以进行仿真。首先在工程管理区选中测试模块ALU_tb,然后在过程管理区双击Simulate Behavioral Model,ISE将启动ISE Simulator,可以得到仿真结果,如图5-2所示。图5-2 ALU仿真结果6寄存器堆(Register File)的设计与实现寄存器堆A_addr4:0B_addr4:0W_addr4:0WriteDataClockA_data31:0B_data31:0RegisterFile图6-1 Register File逻辑结构( Register

41、 File)是CPU组成的重要存储部件,也是数据通路中的重要部件,其主要功能是对数据进行存储。在本实验中将为Register File构建3232的寄存器组,即共有32个寄存器,每个寄存器的位宽都是32位。3232的Register File逻辑结构如图6-1所示。图6-1中的寄存器组有1个数据输入端口,2个数据输出端口,因此可以从该寄存器组中同时输出2个数据。由于没有设置读信号,故在本实验中当A_addr(或B_addr)为0时,并不是选择输出Register0的内容,而是直接输出0。图6-1中各信号引脚的功能: A_addr:A输出端口地址,5位,输入; B_addr:B输出端口地址,5位

42、,输入; 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完成创建。实现Register Files的Verilog程

43、序参考代码:module RegFile( input Clock, input Reset, input 4:0 A_addr, input 4:0 B_addr, input 4:0 W_addr, input 31:0 Data, input Write, output 31:0 A_data, output 31:0 B_data ); reg 31:0 Register1:31; /Read data assign A_data = (A_addr = 0)? 0 : RegisterA_addr; assign B_data = (B_addr = 0)? 0 : Register

44、B_addr; /Write data integer i; always ( posedge Clock or negedge Reset) begin if (Reset = 0) beginfor (i=1 ; i =31 ; i = i+1) Registeri = 0;end else if ( Write ) & ( W_addr != 0) RegisterW_addr = Data; endendmodule对Register File进行仿真。在工程管理区将View设置为Simulation,在任意位置单击鼠标右键,并在弹出的菜单中选择New Source,在类型中选择Ver

45、ilog 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 U

46、nder 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);initial begin/ Initialize InputsClock = 0;Reset = 0;A_addr = 0;B_addr = 0;W_addr = 0;Data = 0;Write = 0;/ Wait 100 ns for global r

47、eset to finish#100;Reset = 1;A_addr = 5b00001;B_addr = 5b00010;W_addr =5b00011;Data =32h;Write =1;Clock = 1; #100; A_addr = 5b00011;B_addr = 5b00100; Write =0;/ Add stimulus hereend endmodule完成测试文件编辑后,确认工程管理区中View选项设置为Simulation,这时在过程管理区会显示与仿真有关的进程。右键单击其中的Simulate Behavioral Model项,选择弹出菜单中的Process P

48、roperties项,会弹出属性设置对话框,将其中Simulation Run Time设置为1000ns。仿真参数设置完后,就可以进行仿真。首先在工程管理区选中测试模块RegFile_tb,然后在过程管理区双击Simulate Behavioral Model,ISE将启动ISE Simulator,可以得到仿真结果,如图6-2所示。图6-2 Register file仿真7控制器(Control Unit)的设计与实现控制器对指令进行译码,根据指令的功能产生相应的控制信号。其逻辑结构如图7-1所示。图5-1 控制器逻辑结构在图7-1中各引脚的功能如下: z:运算结果为零,1位,输入; op

49、5:0:指令操作码,6位,输入; func5: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时表示是j

50、al,否则不是,输出; sext:立即数符号扩展,1位,为1时符号扩展,否则零扩展,输出; aluc3:0:ALU操作控制码,4位输出; pcsource1:0:下一条指令地址选择,2位,输出。在工程管理区任意位置单击鼠标右键,在弹出的菜单中选择New Source命令,选择Verilog Module输入,并输入Verilog文件名:Control_Unit,单击Next按钮进入端口定义对话框。其中Module Name栏输入模块名Control_Unit,单击Next进入下一步,点击Finish完成创建。实现Control_Unit的Verilog程序参考代码:module Control_Unit(input

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论