计算机设计与实践CPU实验报告

编辑:阿文时间:2020-06-13 19:55:08
计算机设计与实践CPU实验报告,的整体结构设计及其细化,指令格式设计,一个节拍完成取指,第四个节拍回写,第一个节拍内,将指令保存在指令寄存器中,第二个节拍内。

cpu实验报告

一.设计概况

本次试验要完成的工作主要包括:指令系统的设计,cpu的整体结构设计及其细化,逻辑设计的具体实现,软件模拟,硬件调试。试验的主要流程如下图所示:

二.指令设计

1.指令格式设计

①单操作数指令

opcode000x

包括:jmp,jz,jc

②寄存器-寄存器指令

opcodereg100000reg2

包括:mov,adc,sbb,or,and

③寄存器-立即数(地址)指令

opcoderegdata

包括:lda,sta,mov, adc,sbb,or,and

④其他类型指令

opcode00000000000

包括:clc,stc

2.指令编码

三.cpu逻辑设计

1.cpu整体框图

2.节拍设计

一个周期采用四个节拍。一个节拍完成取指。第二个节拍完成运算。第三个节拍访存。第四个节拍回写。

3.数据流说明

第一个节拍内,取指模块向访存控制发出访存信号,得到指令后,将指令保存在指令寄存器ir中,并将指令送往后面的运算模块,存储管理模块,回写模块。同时将pc送入运算模块和回写模块。

第二个节拍内,运算管理模块将指令译码。如果是存数指令,则将地址存入addr寄存器,数据存入data存储器,等待下一个节拍访存。如果是取数指令,则将地址存入addr寄存器,等待下一个节拍访存。

如果是其他非访存指令,则将计算结果存入aluout寄存器,送往存储管理模块的rtemp寄存器。

第三个节拍内,存储管理模块将指令译码。如果是存数指令,则向访存控制模块发出访存信号,则将第二个节拍内存好的addr寄存器的内容作为地址,把data寄存器里面的数据存入存储器对应的位置。如果是取数指令,则将第二个节拍内存好的addr寄存器的内容作为地址,从存储器对应的位置取出数据,存入rtemp存储器,并送往回写模块。

如果是其他非访存指令,则将rtemp寄存器里的内容直接送往回写模块。

第四个节拍内,回写模块先将指令译码。根据指令将需要回写的数据回写近响应的寄存器,并将pc+1后回写至取指模块的pc寄存器。

四.各模块详细说明

1、时钟管理模块

功能:产生节拍,控制各个模块的工作

2、取指模块

功能:向访存控制模块发出信号,取得指令

3、运算管理模块

功能:进行各种指令的执行,同时对响应的跳转指令地址和存数、取数指令地址的输出。

4、存储管理模块

功能:对存取数的相应控制信号和数据的管理,负责向访存控制模块发出访存信号;将运算结果送往回写模块。

5、访存控制模块

功能:负责与内存进行数据的交换

6、回写管理模块

功能:对相应该回写数据或地址的数据与地址进行回写管理。

附1:各模块波形与总测试波形

注:单独测试时,由于模块之间没有联系起来,故只测试了模块的单独工作下最基本功能,波形较简单。

时钟管理模块:

取指模块

运算管理模块

存储管理模块

回写模块

访存控制模块

下面是cpu总波形的测试:(由于测试指令太多,导致波形过长,故将波形分为三段):

附二、各模块实现代码

1.时钟管理模块

entity clk_ctrl is

port(

clk:in std_logic;

rst:in std_logic;

k:out std_logic_vector(3 downto 0)

);end clk_ctrl;

architecture behavioral of clk_ctrl is

signal tmp:std_logic_vector(3 downto 0);

begin

process(clk,rst,tmp)

begin

if rst ='1' then --rst=1复位;

--k<="0000";

tmp<="0001";

elsif clk='1' and clk'event then

tmp(0)<=tmp(3);

tmp(3 downto 1)<=tmp(2 downto 0);

end if;

end process; k<=tmp;

end behavioral;

2.取指管理模块

entity irget is

port (

rst : instd_logic;--复位;

pcback : instd_logic_vector (15 downto 0);--pc回写;

pcbacka : instd_logic;--pc回写允许;

k1 : instd_logic;--时钟控制;

order : instd_logic_vector (15 downto 0);--指令

pcout : outstd_logic_vector (15 downto 0);--pc输出;

orderout : outstd_logic_vector (15 downto 0);--指令输出;

addrflag : outstd_logic);--访址标志

end irget;

architecture behavioral of irget is

signal tmppc: std_logic_vector (15 downto 0); --指令地址;

signal ir:std_logic_vector(15 downto 0);--指令寄存器;

begin

process(rst,pcback,pcbacka,k1,order,tmppc)

begin

if rst='1' then

tmppc<="***";

elsif k1='1' then

pcout<=tmppc;

addrflag<='1';--第一个节拍高电平取指;

elsif pcbacka='1' then

tmppc<=pcback;--pc回写允许

---end if;

--addrflag<='0';

else addrflag<='0';

end if ;

orderout<=order;--指令存入指令寄存器;

end process;

--orderout<=ir;--得到指令,准备送往后面的模块;

end behavioral;

3.访存管理模块

entity cpu_tomomery is

port (