资源描述:
《基于fpga的简单risc_cup设计》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、基于FPGA的简单RISC_CUP设计计算机科学学院计算机科学与计算专业蓝潇莹摘要:CPU即中央处理单元,它是计算机的核心部件。RISC即精减指令集计算机。它是一种20世纪80年代才出现的CPU,与一般的CPU相比不仅仅是简化了指令系统,而且还通过简化指令系统使计算机结果更加简单合理,从而提高了运算速度。关键字:FPGARISC_CPU取指令分析指令执行指令一、总体概述计算机进行信息处理可分为两个步骤:(1)将数据和程序(即指令序列)输入到计算机的存储器中;(2)从第一条指令的地址起开始执行该程序,得到程序所需的结果,结束运行。它必须具有以下基
2、本功能:取指令——当程序已在存储器中时,首先根据程序入口地址取出一条程序,为此发出指令地址及控制信号。分析指令——即指令译码,这是对当前取得的指令进行分析,指出它要求什么操作,并产生相应的操作控制命令。执行指令——根据分析指令时产生的“操作命令”形成相应的操作控制信号序列,通过运算器、存储器及输入/输出设备的执行,实现每条指令的功能,其中包括对运算结果的处理以及下条指令的形成。RISC_CPU是一个复杂的数字逻辑电路,但他的基本部件的逻辑并不复杂。我们可以把它分成8个基本部件来考虑:(1)时钟发生器;(2)指令寄存器;(1)累加器;(2)RIS
3、C_CPU算术逻辑运算单元;(3)数据控制器;(4)状态控制器;(5)程序计数器;(6)地址多路器。三、总体框图RISC_CPU中部件的相互连接关系三、各模块功能说明及主要程序代码(1)时钟发生器时钟发生器clk_gen利用外来的时钟信号clk生成一系列时钟信号clk1、fetch、alu_clk,并送往CPU其他部件。其中,fetch是外来时钟clk的8分频信号,利用fetch的上升沿来触发CPU控制器来执行一条指令,同时fetch信号还将控制地址多路器输出指令地址和数据地址;clk1信号用于指令寄存器、累加器、状态控制器的时钟信号;alu_
4、clk则用于触发算术逻辑运算单元。如下为时钟发生器原理图:其主要的verilog代码见下面模块:moduleCLC_GEN(clk,reset,clk1,clk2,clk4,fetch,alu_clk);inputclk,reset;outputclk1,clk2,clk4,fetch,alu_clk;wireclk,reset;regclk2,clk4,fetch,alu_clk;reg[7:0]state;parameters1=8'b,s2=8'b,s3=8'b,s4=8'b,s5=8'b,s6=8'b,s7=8'b,s8=8'b,idl
5、e=8'b;assignclk1=~clk;always@(negedgeclk)if(reset)beginclk2<=0;clk4<=1;fetch<=0;alu_clk<=0;state<=idle;endelsebegincase(state)s1:beginclk2<=~clk2;alu_clk<=~alu_clk;state<=s2;ends2:beginclk2<=~clk2;clk4<=~clk4;alu_clk<=~alu_clk;state<=s3;ends3:beginclk2<=~clk2;state<=s4;ends4
6、:beginclk2<=~clk2;clk4<=~clk;fetch<=~fetch;state<=s5;ends5:beginclk2<=~clk2;state<=s5;ends6:beginclk2<=~clk2;clk4<=~clk;state<=s7;ends7:beginclk2<=~clk2;state<=s8;ends8:beginclk2<=~clk2;clk4<=~clk;fetch<=~fetch;state<=s1;endidle:state<=s1;default:state<=idle;endcaseendEndmod
7、ule(1)指令寄存器指令寄存器的触发时钟是clk1,在clk1正沿触发下,寄存器将数据总线送来的指令存入高8位或低8位寄存器中,但并不是每个clk1的上升沿都寄存数据总线的数据,因为数据总线上有时传输指令,有时传输数据。什么时候寄存,什么时候不寄存由CPU状态控制器的load_ir信号控制。而当前取得是高8位还是低8位,由变量state记录。State为0表示取的是高8位,存入高8为寄存器时,同时将变量state置为1.下次再寄存时,由于state为1,可知取的是低8位,存入低8位寄存器中。主要的verilog代码见下面模块:modulere
8、gister(opc_iraddr,data,ena,clk1,rst);output[15:0]opc_iraddr;input[7:0]data;