文档详情

简单CPU系统设计与实现

博****1
实名认证
店铺
DOC
2.13MB
约30页
文档ID:379795383
简单CPU系统设计与实现_第1页
1/30

数字电路综合实验报告简单CPU系统设计与实现 1设计课题的任务要求设计一个简单的CPU和其外部模块,能够完成机器代码的输入、存储、执行和结果显示基本要求:指令要求至少有空指令,跳转指令,加法指令,存取数据指令 利用自己设计的指令系统编写一段机器语言,可以完成求两个小于256的数的最大公约数机器语言通过拨码开关和按键逐条输入,通过程序执行开关控制程序执行,最后在数码管或LED灯上显示结果提高要求:设计并实现其它指令 2系统设计2.1 设计思路设计的简易CPU系统主要由指令存储器(可以通过拨码和按键读入指令)、控制器、内部寄存器、内存以和ALU构成设计过程重点考虑如下事项:读/写寄存器,读/写存储器以和执行指令通过执行读入的指令以和编写好的求两个数的最大公约数的程序来测试该系统的功能2.2 总体框图2.2.1 系统总体框图由设计思路,可绘制如下的简单CPU系统总体框图:最终在quartusII中连接好的CPU系统图如下所示(其中的ACC属于ALU部件):2.2.2 系统状态转移图录入指令开始执行指令指令执行结束,等待再次执行或等待录入指令如上图,系统共有3个状态:S0、S1、S2分别为S0:在这一状态,通过拨码和按键录入要执行的指令。

S1:在这一状态,CPU执行程序,即S0录入的指令S2:在这一状态,CPU执行完全部程序,等待再次执行或等待录入指令2.2.3 求解最大公约数的程序框图设a,b为给定的两个整数,用辗转相减法求解他们的最大公约数:开始 a<=a-b 成立判断:a=0是否成立?不成立判断:a>b是否成立? 成立不成立b为所求最大公约数程序结束a、b交换 2.3 分块设计2.3.1 DIV(分频器) DIV将电路板所提供的时钟分频,产生CPU工作所需要的时钟以和数码管扫描所需要的时钟 2.3.2 MCU (控制器) MCU 用来产生系统内部所有寄存器、运算单元所需的控制信号,以和执行各条指令所需要的微操作它是整个系统设计的核心所在 2.3.3 ALU(算术逻辑运算单元)ALU完成数据的算术和逻辑运算ALU有5个输入端和2个输出端,其中一个操作数固定来自累加器acc(具体编程时可用变量或信号表示),另一个操作数来自端口mbr_in(通过数据总线接到寄存器MBR)参加运算的操作数在ALU中进行规定的操作运算,运算结束后,一方面将结果送至累加器,同时将操作结果的特征状态送标志寄存器。

2.3.4 MAR (地址寄存器) MAR 存放着要被读取或写入的内存单元地址其中,读操作时,CPU从内存读而写操作时,CPU把数据写入内存2.3.5 MBR (缓冲寄存器) MBR存放了将要存储到内存的数据或者从内存中读取的最新数据MBR连接到系统总线中的地址总线2.3.6 RAM(随机存取存储器) RAM 有着相对独立的输入输出管脚,在本系统设计中它作为内存使用它不是CPU内部的寄存器,不属于CPU的一部分但要测试所设计的CPU的性能,需要把RAM加进系统设计中 2.3.7 SMG (数码管显示 )SMG负责将运算结果转化为BCD码形式,然后用数码馆显示 3 仿真波形和波形分析根据波形图可以看出状态机的运行,其中一个状态占两个时钟周期该仿真相当于CPU执行指令的时序图,反映了程序运行情况还包括了辗转相减法的仿真,和rst的清零仿真可以看出该CPU系统的仿真结果正确,达到下载的要求4 源程序(含注释)各个部件对应的源程序如下(最后的连接是用图形连接完成的):4.1 DIV(分频器) library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity DIV isport( clk_in:in std_logic; clk_out1:out std_logic; clk_out2:out std_logic);end DIV;architecture behave of DIV issignal tmp:std_logic_vector(15 downto 0);beginprocess(clk_in,tmp)begin if(clk_in'event and clk_in='1')then tmp<=tmp+1; end if; clk_out1<=tmp(0); clk_out2<=tmp(1);end process;end behave; 4.2 MCU (控制器) library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity MCU isport( clk:in std_logic; start:in std_logic; opcode:in std_logic_vector(3 downto 0); cmp:in std_logic; ctr:out std_logic_vector(10 downto 0));end MCU;architecture behave of MCU isbeginprocess(clk,start)variable status:std_logic_vector(4 downto 0):="00000";begin if(start='1')then status:="00001"; elsif(clk'event and clk='1')then case status is when"00001"=>ctr<="";status:=status+1; --MBR<-RAM when"00010"=>ctr<="";status:=status+1; --MAR<-MBR when"00011"=> --DECODING case opcode is when"0001"=>status:="00100";ctr<=""; --Store --MBR<-ACC when"0010"=>status:="00101";ctr<=""; --Load --MBR<-RAM when"0011"=>status:="00111";ctr<=""; --Add --MBR<-RAM when"0100"=>status:="01001";ctr<=""; --Sub --MBR<-RAM when"0101"=>status:="11111";ctr<=""; --SHL --ACC<-ACC<<1 when"0110"=>status:="11111";ctr<=""; --SHR --ACC<-ACC>>1 when"0111"=>status:="01011";ctr<=""; --And --MBR<-RAM when"1000"=>status:="01101";ctr<=""; --Or --MBR<-RAM when"1001"=>status:="11111";ctr<=""; --Not --ACC<-NOT ACC when"1010"=>status:="00001";ctr<=""; --Jump when"1011"=>if(cmp='0')then --JumpZ status:="00001";ctr<=""; else status:="00001";ctr<=""; end if; when"1100"=>status:="11111";ctr<="10000000000"; --Smg when"1111"=>status:="00000";ctr<=""; --Halt when others=>ctr<="";status:="11111"; end case; when"00100"=>ctr<="";status:="11111"; --Store --RAM<-MBR when"00101"=>ctr<="";status:=status+1; --Load --BR<-MBR;ACC<-0 when"00110"=>ctr<="";status:="11111"; --ACC<-ACC+BR when"00111"=>ctr<="";status:=status+1; --Add --BR<-MBR when"01000"=>ctr<="";status:="11111"; --ACC<-ACC+BR when"01001"=>ctr<="";status:=status+1; --Sub --BR<-MBR when"01010"=>ctr<="";status:="11111"; --ACC<-ACC-BR when"01011"=>ctr<="";status:=status+1; --And --BR<-MBR when"01100"=>ctr<="";status:="11111"; 。

下载提示
相似文档
正为您匹配相似的精品文档