计算机组成原理-CPU设计实验报告_第1页
计算机组成原理-CPU设计实验报告_第2页
计算机组成原理-CPU设计实验报告_第3页
计算机组成原理-CPU设计实验报告_第4页
计算机组成原理-CPU设计实验报告_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

武汉大学计算机学院计算机科学与技术专业CPU设计实验报告 实验名称:开放式实验CPU设计 课题名称: 计算机组成原理 班 级: 计科2班 指导教师: 徐 爱 萍 组 长: 组 员: 二零一五年三月目录目录21 实验环境 (张航宇)41.1 Quartus 介绍41.2 硬件描述语言(VHDL)41.3实验的主要成果42 实验要求(彭阳坤)52. 1 指令格式要求52. 2 指令流程及微信号序列分析52.2.1 ADD指令分析52.2.2 ADC指令分析52.2.3 SUB指令分析62.2.4 SBC指令分析62.2.5 INC指令分析62.2.6 DEC指令分析62.2.7 SHL指令分析72.2.8 SHR指令分析72.2.9 MOVR指令分析72.2.11 MOVD指令分析72.2.12 LDRR指令分析82.2.13 STRR指令分析82.2.14 JMP指令分析82.2.15 JRZ指令分析82.2.16 JRC指令分析93.部件仿真实验(彭阳坤)103.1 八个通用寄存器设计与仿真103.1.1 设计代码103.1.2 RTL连接图163.1.3 仿真过程163.2算术逻辑单元设计与仿真173.2.1 设计代码173.2.2 RTL连接图223.2.3 仿真过程234. CPU设计(彭阳坤)244.1取指设计244.2 时序节拍设计254.3指令译码的设计264.4执行部分设计294.5存储器部分设计314.6通用寄存器组设计324.7寄存器输出设计384.8顶层实体设计385. 测试报告(张航宇)425.1规则文件425.2测试文件425.3指令测试446 实验总结466.1 彭阳坤的小结466.1.1 实验收获466.1.2 建议与意见466.2张航宇的小结466.2.1 实验收获466.2.2 建议与意见47参考资料471 实验环境 (张航宇)1.1 Quartus 介绍Quartus提供了方便的设计输入方式、快速的编译和直接易懂的器件编程。能够支持逻辑门数在百万门以上的逻辑器件的开发,并且为第三方工具提供了无缝接口。Quartus支持的器件有:Stratix 、Stratix GX、Stratix、Mercury、MAX3000A、MAX 7000B、MAX 7000S、MAX 7000AE、MAX 、FLEX6000、FLEX10K、FLEX10KA、FLEX10KE、Cyclone、Cyclone 、APEX 、APEX20KC、APEX20KE和ACEX1K系列。Quartus软件包的编程器是系统的核心,提供功能强大的设计处理,设计者可以添加特定的约束条件来提高芯片的利用率。1.2 硬件描述语言(VHDL)VHDL语言是一种用于电路设计的高级语言。它在80年代的后期出现。最初是由美国国防部开发出来供美军用来提高设计的可靠性和缩减开发周期的一种使用范围较小的设计语言 。VHDL翻译成中文就是超高速集成电路硬件描述语言,主要是应用在数字电路的设计中。它在中国的应用多数是用在FPGA/CPLD/EPLD的设计中。当然在一些实力较为雄厚的单位,它也被用来设计ASIC。VHDL主要用于描述数字系统的结构,行为,功能和接口。除了含有许多具有硬件特征的语句外,VHDL的语言形式、描述风格以及语法是十分类似于一般的计算机高级语言。VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可视部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。1.3实验的主要成果熟悉对Quartus和VHDL的使用,完成一个16位8个寄存器的简单CPU,实现18条指令。2 实验要求(彭阳坤)2. 1 指令格式要求2. 2 指令流程及微信号序列分析2.2.1 ADD指令分析指令T1T2T3ADD DR,SRMem_AddrpcWe1Data_readobIRdata_readPc_incpc+1resultDR+SRgenerate z_tmpgenerate c_tmppcpc_incDRresultZ_outz_tmpC_outc_tmp2.2.2 ADC指令分析指令T1T2T3ADC DR,SRMem_AddrpcWe1Data_readobIRdata_readPc_incpc+1resultDR+SR+c_tmpgenerate z_tmpgenerate c_tmppcpc_incDRresultZ_outz_tmpC_outc_tmp2.2.3 SUB指令分析指令T1T2T3SUB DR,SRMem_AddrpcWe1Data_readobIRdata_readPc_incpc+1resultDR-SRgenerate z_tmpgenerate c_tmppcpc_incDRresultZ_outz_tmpC_outc_tmp2.2.4 SBC指令分析指令T1T2T3SBC DR,SRMem_AddrpcWe1Data_readobIRdata_readPc_incpc+1resultDR-SR-Cgenerate z_tmpgenerate c_tmppcpc_incDRresultZ_outz_tmpC_outc_tmp2.2.5 INC指令分析指令T1T2T3INC DRMem_AddrpcWe1Data_readobIRdata_readPc_incpc+1resultDR+1generate z_tmpgenerate c_tmppcpc_incDRresultZ_outz_tmpC_outc_tmp2.2.6 DEC指令分析指令T1T2T3DEC DRMem_AddrpcWe1Data_readobIRdata_readPc_incpc+1resultDR-1generate z_tmpgenerate c_tmppcpc_incDRresultZ_outz_tmpC_outc_tmp2.2.7 SHL指令分析指令T1T2T3SHL DRMem_AddrpcWe1Data_readobIRdata_readPc_incpc+1resultDR*2generate z_tmpgenerate c_tmppcpc_incDRresultZ_outz_tmpC_outc_tmp2.2.8 SHR指令分析指令T1T2T3SHR DRMem_AddrpcWe1Data_readobIRdata_readPc_incpc+1resultDR/2generate z_tmpgenerate c_tmppcpc_incDRresultZ_outz_tmpC_outc_tmp2.2.9 MOVR指令分析指令T1T2T3MOVR DR,SRMem_AddrpcWe1Data_readobIRdata_readPc_incpc+1ResultSRpcpc_incDRresult2.2.11 MOVD指令分析指令T1T2T3MOVD DR,DATAMem_AddrpcWe1Data_readobIRdata_readPc_incpc+1Mem_Addrpc_incwe1data_readobDRdata_readpcpc+22.2.12 LDRR指令分析指令T1T2T3LDRR DR,SRMem_AddrpcWe1Data_readobIRdata_readPc_incpc+1Mem_AddrSRwe1data_readobDRdata_readpcpc_inc2.2.13 STRR指令分析指令T1T2T3STRR DR,SRMem_AddrpcWe1Data_readobIRdata_readPc_incpc+1Mem_AddrDRwe0obSRpcpc_inc2.2.14 JMP指令分析指令T1T2T3JMP ADRMem_AddrpcWe1Data_readobIRdata_readPc_incpc+1Mem_Addrpc_incwe1data_readobpcdata_read2.2.15 JRZ指令分析指令T1T2T3JRZ ADRMem_AddrpcWe1Data_readobIRdata_readPc_incpc+1Generatec_z_j_flaggeneratesjmp_addrIf c_z_j_flag=1Thenpcsjmp_addrelse pcpc_inc2.2.16 JRC指令分析指令T1T2T3JRC ADRMem_AddrpcWe1Data_readobIRdata_readPc_incpc+1Generatec_z_j_flaggeneratesjmp_addrIf c_z_j_flag=1Thenpcsjmp_addrelse pcpc_inc3.部件仿真实验(彭阳坤)3.1 八个通用寄存器设计与仿真3.1.1 设计代码寄存器reglibrary ieee;use ieee.std_logic_1164.all;entity reg is port (reset: instd_logic;d_input: instd_logic_vector(15 downto 0);clk:instd_logic;write: instd_logic; sel: instd_logic;q_output: outstd_logic_vector(15 downto 0) );end reg;architecture a OF reg isbeginprocess(reset,clk)beginIF reset = 0 thenq_output = x0000; elsif clkevent and clk = 0 then -时钟下降沿触发if sel =1 and write = 1 thenq_output = d_input;end if;end if;end process;end a;3-8译码器 Decoder_3_to_8.vhdlibrary ieee;use ieee.std_logic_1164.all;entity decoder_3_to_8 is port ( sel: in std_logic_vector(2 downto 0); sel00: out std_logic; sel01: out std_logic; sel02: out std_logic; sel03: out std_logic; sel04: out std_logic; sel05: out std_logic; sel06: out std_logic; sel07: out std_logic );end decoder_3_to_8;architecture behavioral of decoder_3_to_8 isbeginsel00 = (not sel(2) and (not sel(1) and (not sel(0);sel01 = (not sel(2) and (not sel(1) and sel(0) ;sel02 = (not sel(2) and sel(1) and (not sel(0) ;sel03 = (not sel(2) and sel(1) and sel(0) ;sel04 = sel(2) and (not sel(1) and (not sel(0);sel05 = sel(2) and (not sel(1) and sel(0);sel06 = sel(2) and sel(1) and (not sel(0);sel07 out_put out_put out_put out_put out_put out_put out_put out_put = input7;end case;end process;end behavioral;通用寄存器组 regfilelibrary ieee;use ieee.std_logic_1164.all;use work.exp_cpu_components.all;entity regfile isPort ( DR: in std_logic_vector(2 downto 0); -目的寄存器号SR: in std_logic_vector(2 downto 0); -源寄存器号 reset: in std_logic;write: in std_logic;-写寄存器信号 clk: in std_logic;d_input: in std_logic_vector(15 downto 0); -写寄存器的数据change_z: in std_logic;-如果为1,则重新设置z标志change_c: in std_logic; c_in: in std_logic; z_in: in std_logic;output_DR: out std_logic_vector(15 downto 0); output_SR: out std_logic_vector(15 downto 0);c_out: out std_logic;z_out: out std_logic );end regfile;architecture struct of regfile issignal reg00, reg01, reg02,reg03,reg04,reg05,reg06,reg07: std_logic_vector(15 downto 0);signal sel00, sel01, sel02,sel03,sel04,sel05,sel06,sel07: std_logic;beginz_c_proc: process(reset,clk) -对指令执行结束后的z、c标志进行处理begin if reset = 0 thenz_out = 0;c_out = 0;elsif clkevent and clk = 0 then if change_z = 1 thenz_out = z_in; end if;if change_c = 1 thenc_out reset,d_input= d_input,clk= clk,write= write, sel= sel00,q_output= reg00);Areg01: reg port map(-寄存器R1reset= reset,d_input= d_input,clk= clk,write= write, sel= sel01,q_output= reg01);Areg02: reg port map(-寄存器R2reset= reset,d_input= d_input,clk= clk,write= write, sel= sel02,q_output= reg02);Areg03: reg port map(-寄存器R3reset= reset,d_input= d_input,clk= clk,write= write, sel= sel03,q_output= reg03);Areg04: reg port map(-寄存器R4reset= reset,d_input= d_input,clk= clk,write= write, sel= sel04,q_output= reg04);Areg05: reg port map(-寄存器R5reset= reset,d_input= d_input,clk= clk,write= write, sel= sel05,q_output= reg05);Areg06: reg port map(-寄存器R6reset= reset,d_input= d_input,clk= clk,write= write, sel= sel06,q_output= reg06);Areg07: reg port map(-寄存器R7reset= reset,d_input= d_input,clk= clk,write= write, sel= sel07,q_output= reg07);des_decoder: decoder_3_to_8 port map(-3 4译码器sel = DR, sel00 = sel00,sel01 = sel01,sel02 = sel02,sel03 = sel03,sel04 = sel04,sel05 = sel05,sel06 = sel06,sel07 = sel07 );muxA: mux_8_to_1 port map(-目的寄存器读出8选1选择器input0 = reg00, input1 = reg01,input2 = reg02,input3 = reg03,input4 = reg04, input5 = reg05,input6 = reg06,input7 = reg07,sel = DR,out_put = output_DR);muxB: mux_8_to_1 port map(-源寄存器读出8选1选择器input0 = reg00, input1 = reg01,input2 = reg02,input3 = reg03,input4 = reg04, input5 = reg05,input6 = reg06,input7 = reg07,sel = SR,out_put = output_SR);end struct;3.1.2 RTL连接图3.1.3 仿真过程 仿真结果正确3.2算术逻辑单元设计与仿真3.2.1 设计代码Exe_unit.vhdlibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;use work.exp_cpu_components.all;entity exe_unit isport( t1: in std_logic;op_code:in std_logic_vector(2 downto 0);zj_instruct: in std_logic; cj_instruct: in std_logic; pc: in std_logic_vector(15 downto 0);pc_inc:in std_logic_vector(15 downto 0);c_in: in std_logic; -以前指令产生的进位C z_in: in std_logic; -以前指令产生的ZMem_Write: in std_logic; -为1时,写存储器c_tmp:out std_logic;z_tmp:out std_logic;c_z_j_flag: out std_logic; -为1时进行条件转移r_sjmp_addr:in std_logic_vector(15 downto 0); -相对转移地址DW_intruct: in std_logic;sjmp_addr:out std_logic_vector(15 downto 0); -条件转移指令的转移地址SR_data: in std_logic_vector(15 downto 0);DR_data: in std_logic_vector(15 downto 0);Mem_Addr: out std_logic_vector(15 downto 0);cl_stc: in std_logic_vector(1 downto 0); -Stc clc 标记result: out std_logic_vector(15 downto 0) -运算结果 );end exe_unit;architecture behav of exe_unit issignal A,B :std_logic_vector(15 downto 0);signal result_t: std_logic_vector(16 downto 0);beginc_z_j_flag = (not c_in) and cj_instruct) or (not z_in) and zj_instruct);A = DR_data;B = SR_data;sjmp_addr = pc_inc + r_sjmp_addr;Mem_Addr_proc: process(t1,SR_data,pc,DW_intruct) -选择存储器地址Mem_Addrbeginif t1 = 1 thenMem_Addr = pc;elseif DW_intruct = 1 thenMem_Addr = pc_inc;elsif Mem_Write = 1 thenMem_Addr = DR_data;elseMem_Addr result_t result_t result_t result_t result_t result_t result_t result_t = 00 & A(15 downto 1);end case;end process;result = result_t(15 downto 0);c_tmp = (cl_stc(1) and result_t(16)xor (not cl_stc(1) and cl_stc(0);-if (cl_stc(1)=1) then -c_tmp = result_t(16);-else-c_tmp = cl_stc(0);-end if;z_tmp = (not result_t(15) and (not result_t(14) and (not result_t(13) and (not result_t(12) and (not result_t(11) and (not result_t(10) and (not result_t(9) and (not result_t(8) and (not result_t(7) and (not result_t(6) and (not result_t(5) and (not result_t(4) and (not result_t(3) and (not result_t(2) and (not result_t(1) and (not result_t(0);end behav;decoder_unit.vhdlibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;use work.exp_cpu_components.all;entity decoder_unit isport (IR: in std_logic_vector(15 downto 0); SR: out std_logic_vector(2 downto 0);DR: out std_logic_vector(2 downto 0);op_code: out std_logic_vector(2 downto 0); zj_instruct: out std_logic; cj_instruct: out std_logic; lj_instruct: out std_logic; DRWr: buffer std_logic; -为1时写DR寄存器 Mem_Write: out std_logic; DW_intruct: buffer std_logic; change_z: out std_logic;change_c: out std_logic;sel_memdata: out std_logic; -为1时存储器的读出数据作为写入DR的数据 r_sjmp_addr: out std_logic_vector(15 downto 0); -相对转移地址cl_stc: out std_logic_vector(1 downto 0) -Stc clc 标记 );end decoder_unit;architecture behav of decoder_unit isbeginSR = IR(7 downto 5);DR = IR(10 downto 8);sel_memdata = not IR(15) and IR(14) and (IR(12) xor IR(11);change_z = (not IR(15) and (not IR(14) and IR(1);change_c = (not IR(15) and (not IR(14) and IR(2);DRWr_proc: process(IR) -修改DRWrbeginif IR(15)=0 and IR(14) = 0 then -算术逻辑指令 if IR(15) =1 thenDRWr = 1; elseDRWr = 0;end if;elsif IR(10) = 1 and IR(9) = 0 then -MVRD DR,DATA;LDR DR,SRDRWr = 1;elseDRWr = 0;end if;end process; sj_addr_proc:process(IR) -条件转移指令的相对转移地址从8位扩展到16位beginif IR(10) =1 thenr_sjmp_addr = 11111111 & IR(10 downto 3);elser_sjmp_addr -jmp addr;mvrd dr,dataMem_Write = 0;DW_intruct - str sr,drMem_Write = 1;DW_intruct Mem_Write = 0;DW_intruct = 0;end case;end process;ALUOP_CODE_PROC:PROCESS(IR) -计算指令begin if IR(15 downto 14) = 00 thenop_code = IR(13 downto 11);elseop_code -jmp adrzj_instruct = 0;cj_instruct = 0;lj_instruct -jnc addrzj_instruct = 0;cj_instruct = 1;lj_instruct -jnz addrzj_instruct = 1;cj_instruct = 0;lj_instruct zj_instruct = 0;cj_instruct = 0;lj_instruct = 0;end case;end process;Clc_Stc:process(IR)beginif IR(15)=1 thenif IR(11)=0 then cl_stc = 00;elsecl_stc = 01;end if;elsecl_stc =10;end if;end process;end behav;3.2.2 RTL连接图3.2.3 仿真过程 仿真正确 4. CPU设计(彭阳坤)4.1取指设计 取指部分 instru_fetch.vhdlibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;use work.exp_cpu_components.all;entity instru_fetch isport(reset,clk: in std_logic;data_read: in std_logic_vector(15 downto 0); -存储器读出的数lj_instruct: in std_logic; -长转移指令DW_intruct: in std_logic;c_z_j_flag: in std_logic; -为1时进行条件转移sjmp_addr: in std_logic_vector(15 downto 0); -条件转移指令的转移地址t1,t3: buffer std_logic;pc: buffer std_logic_vector(15 downto 0);pc_inc: buffer std_logic_vector(15 downto 0);IR: out std_logic_vector(15 downto 0);end instru_fetch;architecture behav of instru_fetch issignal start,t2:std_logic;beginIR_poc: process(reset,t2)beginif reset = 0 thenIR = x7000; -nop指令elsif t2event and t2 = 1 thenIR = data_read;end if;end process;process(reset,clk)begin if reset = 0 then start = 1;elseif clkevent and clk =0 thenstart = 0;end if;end if;end process;process(reset,clk)beginif reset = 0 then t1 = 0; t2 = 0;t3 = 0;elsif clkevent and clk = 1 thent1 = start or t3;t2 = t1;t3 = t2;end if;end process;pc_inc = pc + 1;-为取双字指令的第2个字或者计算相对转移地址做准备PC_proc:process(reset,t3)begin if reset = 0 thenpc = x0000;elsif t3event and t3 = 0 thenif lj_instruct = 1 thenpc = data_read;elsif c_z_j_flag =1 thenpc = sjmp_addr;elsif DW_intruct = 1 thenpc = pc + 10;elsepc = pc_inc;end if;end if;end process;end behav;4.2 时序节拍设计4.3指令译码的设计 指令译码部分 decoder_unit.vhdlibrary ieee;use ieee.st

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论