基于FPGA的简易CPU设计课题名称:简易CPU的设计姓名:学号:专业班级:指导老师:摘要目前以硬件描述语言(Verilog或VHDL)所完成的电路设计,可以经过简单的综合与布局,快速的烧录至FPGA上进行测试,是现代IC设计验证的技术主流。这些可编辑元件可以被用来实现一些基本的逻辑门电路(比如AND、OR、XOR、NOT)或者更复杂一些的组合功能比如解码器或数学方程式。在大多数的FPGA里面,这些可编辑的元件里也包含记忆元件例如触发器(Flip-flop)或者其他更加完整的记忆块。系统设计师可以根据需要通过可编辑的连接把FPGA内部的逻辑块连接起来,就好像一个电路试验板被放在了一个芯片里。一个出厂后的成品FPGA的逻辑块和连接可以按照设计者而改变,所以FPGA可以完成所需要的逻辑功能。计算机最核心的部分叫做中央处理器,也就是我们常说的CPU,计算机所做的所有工作都需要经过CPU的处理,本设计以verilogHDL位基础设计一个简易的CPU。关键字:CPUVerilogFPGA目录摘要..............................................................................................................................Ⅰ目录.............................................................................................................................Ⅱ第一章CPU简介........................................................................................................11.1概述..................................................................................................................11.2CPU内部框架..................................................................................................11.3CPU内部工作原理..........................................................................................1第二章CPU各个模块的设计及分析........................................................................32.1PC部分的设计.................................................................................................32.2存储器的设计..................................................................................................42.3指令解码器的设计.........................................................................................62.4算术逻辑运算单元(ALU)..............................................................................82.5控制单元........................................................................................................102.6CPU顶层设计................................................................................................13第三章仿真结果.......................................................................................................153.1PC部分...........................................................................................................153.2存储器部分....................................................................................................153.3指令解码器部分............................................................................................163.4算术逻辑运算单元部分(ALU).....................................................................163.5控制单元部分................................................................................................163.6CPU顶层设计部分........................................................................................17第四章总结...............................................................................................................18参考文献.....................................................................................................................19Ⅰ第一章CPU概述1.1简介计算机最核心的部分叫做中央处理器,也就是我们常说的CPU,计算机所做的工作都是由CPU来完成的。当然,作为学习,我们不能够设计出类似奔腾处理器(Pentiummicroprocessor)的CPU,我们用一个能够完成简单功能的简单的CPU作为讲解,麻雀虽小,五脏俱全,这个简单的cpu具有一般CPU的全部基本特征。众所周知,cpu只能识别二进制数据,也就是机器码。所以,在CPU内部靠不同的二进制序列来区别不同的机器码。我们把这些机器码存储在一个存储器中,共CPU读取使用。同时,为了用户和程序员能够更好的记住机器码的含义,采用相应的助记符来表示这些机器码,如:用LDA表示二进制的000等。这些助记符通常被称为汇编语言,不同架构的计算机的汇编语言通常都是各不相同的。1.2CPU内部框架如图1-1是本设计的一个CPU内部结构框架。图1-1CPU内部结构框架1.3CPU的内部工作原理不同架构的计算机工作原理也是不同的,此处仅以本课本中讲授的CPU工作存储器ALU控制器指令解码器PCⅠ原理为例讲解。首先,CPU的指令是存储在存储器中的,所以cpu执行指令的第一步是从存储器中取出(fetch)指令,第二步,将取出的指令解码,第三步,根据指令解码出的功能决定是否再从存储器中取出需要处理的数据,第四步,根据解码出的指令决定进行相应的计算,这由(ALU)完成。第五步,根据解码出的指令决定是否将计算结果存入存储器,第六步,修改PC指针,为下一次取指令做准备。整个执行过程由控制器控制。在介绍具体的CPU硬件架构之前,我们先确定一些CPU能够执行的指令,在这里,为了教学演示,我们设定6个计算机指令,分别为:LDA指令、STA指令、ADD指令、SUB指令、AND指令和HLT指令。指令集表示的含义见下表:操作码助记符执行的功能000LDAaddr将地址为addr处的存储器中的内容装载到A寄存器001STAaddr将A寄存器的内容存储到存储器中的addr地址处010ADDaddr将A寄存器的内容加上存储器中的addr地址处的内容011SUBaddr将A寄存器的内容减去存储器中的addr地址处的内容100ANDaddr将A寄存器的内容与上存储器中的addr地址处的内容101HLT停止指令的执行前两条指令,“LDA”和“STA”是数据传输指令,就像助记符表示的那样,这些指令在A寄存器和存储器之间传送数据。对于LDA指令,“源”数据是存储器的addr地址处的值(也称为内容),目的寄存器是A寄存器;对于STA指令,“源”数据是A寄存器,目的寄存器是存储器的addr地址处的存储空间。我们把这段程序放在存储器的开始(更方便程序的启动)。由于在代码中我们用到了存储器地址为01011和01100中的数据,所以我们可以在那两个位置放置一些要处理的数据。现在,我们逐步分析汇编程序的执行情况,根据上表,我们看到,前三条指令的目的是将01011地址处对应的数据和01100处对应的数据进行相加,并且把结果存储到地址01101处。见下表阴影处。由于计算结果为11111111,所以,影响标志位NF。第3,4,5条指令是将01011地址处对应的数据和01100处对应的数据进行相“与”,并且把结果存储到地址01110处。此时,与运算的结果为00000000,所以影响标志位ZF,同时将NF标志清0。接下来的3条指令是将01011地址处对应的数据和01100处对应的数据进行相“减”,并且把结果存储到地址01110处。此时,相减运算的结果为00000000,所以影响标志位ZF,同时将NF标志清0。Ⅰ第二章CPU各个模块的设计及分析2.1PC部分的设计PC(程序计数器)负责生成存储器的地址值(在下一步骤中会将对应地址的存储器中的指令取出),然后将自身+1,使其指向下一条将要执行的指令,为取下一条指令的执行做好准备。根据这些,我们设计的PC端口有以下时钟端clock:异步复位端reset,也可以设计成同步复位En,使能端,当en为高电平的时候,允许pc工作Pc,当前程序计数器的值,此处拟设计的计算机可以寻址32个字节,故pc是一个5位宽总线在模块内部有pc_next,指向下一个pc(即:pc+1),五位宽。在下一个时钟信号上升沿的时候将pc+1赋值给pc。模块原理图如2-1所示图2-1PC模块原理图测试程序源代码:modulepc(clock,reset,en,pc);inputclock,reset,en;outputreg[4:0]pc;reg[4:0]pc_next;always@(posedgeclockorposedgereset)beginif(reset)PC模块enclockresetPCⅠpc=0;elseif(en)pc=pc_next;elsepc=pc;endalways@(posedgeclockorposedgereset)beginif(reset)pc_next=0;elseif(en)pc_next=pc+1;elsepc_next=pc_next;endendmodule2.2存储器的设计根据实际应用进行简化,实际的