单周期CPU设计参考
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单周期CPU及其Verilog HDL设计
一、指令的设计
MIPS32的指令的三种格式的参考:
R类型:
I类型:
J类型:
R类型指令的op为0,具体操作由func指定。rs和rt是源寄存器号,rd是目的寄存器号。只有移位指令使用sa来指定移位位数。I类型指令的低16位是立即数,计算时要把它扩展到32位。依指令的不同,有零扩展和符号扩展两种。J类型指令右边26位是字地址,用于产生跳转的目标地址。具体的指令格式和内容请参考MIPS32。
设计报告中需自行设计所有指令的二进制格式和对应的汇编指令格式。
二、单周期CPU的设计
我们把时钟的电平从低到高变化的瞬间称为时钟上升沿,两个相邻时钟上升沿之间的时间间隔称为一个时钟周期。单周期CPU指的是一条指令的执行在一个这样的时钟周期内完成,然后开始下一条指令的执行,即一条指令用一个周期。
2.1执行一条指令所需的硬件电路
我们的目的地是要设计CPU的硬件电路,使其能够从存储器中读出一条条指令并执行指令所描述的操作。从存储器中读取指令的动作一般与指令本身的意义无关,可以以同样的方法把指令从存储器中取出。而执行指令则与指令本身的意义密切相关,因此最重要是首先搞清楚CPU要执行的每条指令的意义。下面以两种类型的电路来举例。
2.1.1与取指令有关的电路
指令存储在存储器中。CPU取指令时把程序计数器(PC)中的内容作为存储器的地址,根据它来访问存储器,从PC值指定的存储单元中取来一条32位指令。如果取来的指令执行时没有引起转移,PC的值要加4;如果转移,要把转移的目标地址写入PC,以便在下一个时钟周期取出下一条指令。
图2.1 取指令时用到的硬件电路和指令寄存器
如图2.1所示,PC是一个简单的32位寄存器,由32个D触发器构成。指令存储器(Inst Mem)的输入端a是地址、输出端do是数据输出,即指令。图中的加法器专供PC+4使用,它的输出接到多路器的一个输入端。如果取来的指令没有引起转移或跳转,则选择PC+4,在时钟上升沿处将其打入PC;若引起转移或跳转,则用多路器选择下一条指令该打入的PC值。
2.1.2寄存器计算类型指令执行时所需电路
寄存器类型的指令有add等。如图2.2所示是执行它们所需的部分硬件电路。大多数MIPS指令属于三操作数指令。指令格式中的rs和rt是两个5位的寄存器号,由它们从寄存器堆(Regfile)中读出两个32位的数据。由于寄存器号有5位,所以能从32个寄存器中选出一个。32个寄存器合在一起称为寄存器堆(Register File)。从寄存器堆读出的两个32位数据分别被送到ALU的a和b的输入端。
图2.2 执行寄存器计算类型指令所需电路
具体的计算由ALU完成。ALU的计算控制码aluc由控制部件(Control Unit)产生。这里的控制部件是简单的组合电路,输入信号是指令的操作码op和功能码func,输出信号3个,它们分别是ALU的操作码aluc、计算结果是否写入寄存器堆的控制信号wreg和下一条指令的地址选择信号pcsource。ALU的计算结
果要写入寄存器堆。到底要写入32个寄存器中的哪一个,由5位目的寄存器号rd指定。
2.2寄存器堆设计
寄存器堆有两个读端口和一个写端口。每个端口都有一个5位寄存器号,用于指定一个寄存器;还有32位的数据端,用于写数据。寄存器堆的参考电路如图2.3,其中,dec5e是一个带有使能端的5-32译码器,mux32x32是一个32位的32选1的多路器,reg32由许多D触发器组成。可以用功能描述风格的Verilog HDL代码来实现,关键部分是类似于二维数组的寄存器变量:reg[31:0]register[1:31](寄存器0的内容永远是0)。
图2.3 寄存器堆regfile的电路图
2.3数据存储器和指令存储器设计
我们利用Xilinx ISE自带的IP核实现数据存储器和指令存储器的设计。在使用IP核时,可以将其作为一个黑盒子,只关注核的功能和参数配置,不需要了解核内部的实现电路。下面以指令存储器的设计为例。
2.3.1指令存储器的设计
1、双击“ISE Design Suite 14.2”启动软件,建立好project。
2、编辑初始化存储器的文档。在工程目录下生成一个txt文档,内容格式为:
图2.4 初始化ROM的文件格式
文件前两行是格式说明,第一行说明数据格式是16进制,第二行说明是初始向量,每个单元内的数据用逗号隔开,结束用分号。这里的数据是机器指令代码。完成后将后缀改成.coe。
3、在工程管理区任意位置单击鼠标右键,在弹出的菜单中选择New Source 命令。在弹出如图2.5的窗口,选择IP(Core Generator&Architecture Wizard),设置好后点next进入IP核选择,如图2.6。
图2.5 选择源文件类型
图2.6 选择所需的存储器IP核生成器
4、IP核参数设置。第1页,直接点next。第2页,修改Memory Type选择项为:Single Port Rom。其余不变。第3页修改Write Width和Write Depth为需要的值,其余不变。第4页在Load Init File处打钩,用之前写好的后缀为.coe的文件初始化存储器。选择Show可以看到存储器里的内容。以后这个关联文件内容修改后都要重新做一个Regenerate Core。第
5、6页不用修改。点击Generate 系统自动生成My_Rom只读存储器模块。
生成完后ISE的工程管理区会增加一个模块:My_Rom(My_Rom.xco),选中My_Rom(My_Rom.xco),在过程管理区会出现核生成器菜单。
5、双击过程管理区的View HDL Instruction Template在代码逻辑区会给出My_Rom的调用参数,你可以像一般模块那样调用。YourInstanceName改成喜欢的名字即可。
数据存储器的设计和指令存储器类似,只是注意Memory Type要选择Single Port Ram。
设计报告中应包括完整的CPU结构图和完整Verilog HDL代码。
三、单周期CPU的测试
CPU测试分为两个内容的工作:1. 通过Xilinx的仿真环境仿真CPU的工作过程;2.编写测试程序测试CPU的功能的正确性。
对于“2.编写测试程序测试CPU的功能的正确性”要求用软件实现一个从汇编指令到二进制指令的解释器,输出的内容作为ROM的内容供CPU执行。CPU的测试程序个数需5个以上,能够完全覆盖所设计的所有指令和寄存器。
四、课程设计要求及评分标准
1. 设计一个单周期CPU内核,至少应有10条以上指令;
2. 开发从汇编指令到二进制的解释器。
3. 设计测试程序,5个以上,能完全覆盖所有的指令和寄存器。
4. 支持指令的个数越多,内核越强大,设计报告书写越工整,测试程序越丰富,成绩越高。