计算机组成原理实验报告(硬设)-2016.docx

上传人:doc321 文档编号:13027117 上传时间:2021-12-11 格式:DOCX 页数:58 大小:570.97KB
返回 下载 相关 举报
计算机组成原理实验报告(硬设)-2016.docx_第1页
第1页 / 共58页
计算机组成原理实验报告(硬设)-2016.docx_第2页
第2页 / 共58页
计算机组成原理实验报告(硬设)-2016.docx_第3页
第3页 / 共58页
计算机组成原理实验报告(硬设)-2016.docx_第4页
第4页 / 共58页
计算机组成原理实验报告(硬设)-2016.docx_第5页
第5页 / 共58页
点击查看更多>>
资源描述

《计算机组成原理实验报告(硬设)-2016.docx》由会员分享,可在线阅读,更多相关《计算机组成原理实验报告(硬设)-2016.docx(58页珍藏版)》请在三一文库上搜索。

1、优质文本?计算机组成原理?课程设计报告年级专业班级: 完成日期: 小组成员、组内分工及各成员成绩学号姓名分工工作量比例成绩优质文本1. 引言 1.1 实验目的1. 在掌握传统的、顺序执行的CPU工作原理根底上,理解掌握流水CPU的工作原理;2. 掌握流水线的设计思路和方法,尤其是对结构相关、数据相关和控制相关的解决思路;3. 理解硬件设计流程,熟悉掌握指令系统的设计方法,并设计简单的指令系统;4. 理解和掌握基于VHDL语言和TEC-CA硬件平台设计模型机的方法,并藉此掌握工程设计的思路和方法。 1.2 实验要求1. 根本设计要求参考?16位5级流水无cache实验CPU课程设计实验要求?文档

2、及其VHDL代码,在理解其思想和方法的根底上,将其改造成8位的5级流水无cache的实验CPU,包括对指令系统、数据通路、各流水段模块、内存模块等方面的改造。利用VHDL语言编程实现,并在TEC-CA平台上进行仿真测试。为方便起见,后续16位5级流水无cache实验CPU简记为ExpCPU-16,而8位的那么记为ExpCPU-8。对于内存模块的改造,参考?计算机组成原理?课程综合实验的方法,独立设计一块8位的RAM。要求测试减法的溢出标志位,如测试127-(-96)或者-127-96的溢出标志位。2. 额外设计要求时间允许的情况下,进行一些额外的、探索性的改造,可用于加分。例如,(1) 利用T

3、EC-CA平台上的16位RAM来存放8位的指令和数据;(2) 实现一条JRS指令,以便在符号标志位S=1时跳转。需要改写ID段的控制信息,并改写IF段;(3) 实现一条CMPJ DR,SR,offset指令,当比拟的两个数相等时,跳转到目标地址PC+1+offset;(4) 可以探索从外部输入指令,而不是初始化时将指令“写死在RAM中;(5) 此5段流水模块之间,并没有明显地加上流水存放器,可以考虑在不同模块间加上流水存放器;(6) 探索5段流水带cache的CPU的设计。各组亦可根据实际情况来做一些创新性的探索,酌情加分。 1.3 实验设备本课程综合设计中,需要用到的实验设备如下:1. PC

4、两台;2. TEC-CA硬件实验箱一个;3. Quartus II软件平台一个;4. DebugController软件一个;5. JTAG连接线。 1.4 主要成果实现5级流水无cache的8位实验CPU,16条简单的命令执行,输出确认无误。2. 8位无Cache的5段流水CPU总体设计 2.1 指令系统的设计注:要给出指令功能、指令格式、指令列表 constant ADD: std_logic_vector(3 downto 0):="0000" /加法 constant SUBB : std_logic_vector(3 downto 0):="0001&q

5、uot; /减法 constant ANDins : std_logic_vector(3 downto 0):="0011" /与 constant MOV : std_logic_vector(3 downto 0):="0010" /赋值 constant LOAD : std_logic_vector(3 downto 0):="1000" /load指令 constant STORE : std_logic_vector(3 downto 0):="1010" /store指令constant LOADH

6、 : std_logic_vector(3 downto 0):="1011"/高位load指令constant LOADL : std_logic_vector(3 downto 0):="1001" /低位load指令 constant JR : std_logic_vector(3 downto 0):="0100" /跳转 constant JRZ : std_logic_vector(3 downto 0):="0111" /Z=1跳转 constant NOP : std_logic_vector(3

7、downto 0):="1100"/空操作 constant MOVI : std_logic_vector(3 downto 0):="1101" /constant NOPIns: std_logic_vector(7 downto 0):="11000000" 2.2 数据通路的设计注:可参考16位CPU,然后指出变为8位时,作了哪些修改 一、数据通路图图1 无cache五级流水线数据通路示意图整个CPU由下边几个模块组成: 控制器:在每个时钟周期给出cpu其它部件的控制信号。 运算器:本运算器包括存放器堆。 Bus MUX:通

8、过控制信号BusSel数据的来源,通过Wr来控制送往外部数据总线上的数据内容。AR地址存放器:驱动地址总线。IR指令存放器:存放根据当前PC值取得的指令。 2.3 控制信号的设计注:要分析控制信号有哪些,最后总结一个控制信号列表,可参考上个学期综合实验参考文档中控制信号的列表方法wrMem信号含义w_memToReg1: 内存数据到存放器0: ALU输出到存放器wRegEn1: 允许写存放器0: 禁止写存放器wRegEn & MemToReg信号含义w_memToReg0: 内存数据到存放器1: ALU输出到存放器wRegEn1: 允许写存放器0: 禁止写存放器ALUSrcALUSrc

9、RS000A0001AB010A10110B100AFFFF101A立即数ALUOprALUOpr功能0000R + S0001S R0010R AND S0011R OR S0100R XOR S0101SHL S0110SHR S0111 SAR S1000LOADH R1001LOADL R1010MOVI RsetFlag3位:#信号含义000Flag_hold001Flag_update010Flag_innerDB011Flag_C0100Flag_C1101Flag_clear其它未定义 2.4 结构相关的处理由于我们的设计中不包含缓存,因此会有取指和访存的冲突,即结构相关见下列

10、图。当冲突发生时,必须先“访存,将“取指延后一个时钟周期,这样才能保证指令的正确执行。处理结构相关需要做两项工作:1冲突检测 2取指延后。1) 冲突检测只有执行访存指令(LOAD/STORE)时,才会出现冲突。因此,我们在译码时产生一个标志是否访存的信号wrMem。含义如下:wMem意义00写内存STORE01读内存LOAD1×不占用内存 通过检查“访存阶段的m_wrMem就可确定是否冲突。2取指延后在每次取指时,假设有冲突,那么往IR中写入空指令(NOP),并保持PC不变,使取指延后一个节拍。 2.5 数据相关的处理数据相关是指在执行本条指令的过程中,如果用到的操作数是前面指令的执

11、行结果,那么必须等待前面的指令执行完成,并把结果写回存放器或主存之后,本条指令才能继续执行3。我们采用设置专用数据通路即傍路技术来解决数据相关问题。但旁路技术并非一劳永逸。假设前一指令为LOAD,而后一指令和它数据相关,如下列图所示,当下一指令的执行阶段需要数据时,上一指令尚未给出,这种情况是无法用旁路技术来解决的。图 五级流水LOAD数据相关示意图针对上述情况的一般处理方法是通过插入bubble使LOAD之后的两条指令拖后一个节拍执行4。但我们感觉这种处理过于繁琐。我们发现,如果在LOAD译码时,后面自动加一条空指令,即增加冗余,就可以防止上述情况的出现。在这种简化处理后,我们将数据相关划分

12、为以下三种情况。1 相邻指令数据相关举例: INC R0INC R0 在此情形下,将上一指令的ALU输出经缓存后直接送回,作为ALU多路选择器的入口之一,如下列图所示。 图 五级流水相邻指令数据相关示意图具体代码片段为(forwardingentity.vhd):if m_wRegEn='1' and m_SA=e_SA then forwardA <= "10"其中m_SA为当前处于访问内存(MEM)中存放器输出结果的索引,e_SA为处于当前执行阶段中ALU的输入存放器A的索引,倘假设两个索引值相等,那么产生相邻指令数据相关2 中间隔1条指令的两指令

13、数据相关举例: INC R0 INC R1 INC R0在此情形下,将第1条指令的回写数据送回作为ALU多路选择器的入口之一供第3条指令使用,如下列图所示。图 五级流水相隔1条指令的两指令数据相关示意图具体代码片段如下(forwardingentity.vhd):elsif w_wRegEn='1' and w_SA=e_SA then forwardA <= "01"其中w_SA为当前处于回写阶段(WB)中存放器输出结果的索引,e_SA为处于当前执行阶段中ALU的输入存放器A的索引,倘假设两个索引值相等,那么产生中间隔1条指令的两指令数据相关3 中间

14、隔2条指令的两指令数据相关举例: INC R0INC R1INC R2INC R0第1和第4条指令数据相关,有两种处理方法。方法1:在第4条指令的译码阶段作旁路处理,将第1条指令的回写数据作为运算器的输入送入下一级,如下列图所示。方法2:考虑到读写存放器的时间较短,因此将写存放器的时机改在时钟下降沿。这样1、4指令就没有数据相关了。图 五级流水相隔2条指令的两指令数据相关示意图由于方法2处理较简洁,因此我们在实现时使用了后者。具体局部代码如下(ifentity.vhd):process(reset,clk,PCStall)beginif reset = '0' thenPC &

15、lt;= x"00" elsif FALLING_EDGE(clk) and (PCStall='0') then PC <= PCnext;end if;end process;可以看到更新PC的时机为FALLING_EDGE。 2.6 控制相关的处理控制相关是指因为程序的执行方向可能改变而引起的相关。当执行跳转指令时,就会发生这种情况。除JR外,JRZ等条件跳转需要根据当前状态位来决定是否跳转,而当前状态位是由前面最近的会影响状态位的指令如算术指令决定。常规的也是比拟简单的做法是在碰到JRX之类的跳转指令时,延迟后边流水线的进入。但我们通过分析,认

16、为可以一点都不必延迟,通过旁路处理把控制相关转为数据相关来处理。这样处理,不必延迟,可以提高流水线的性能。按我们的方式解决控制相关需要做两项工作:1) 通过旁路,提供状态存放器的值和临时状态位的值,为判断是否跳转作准备;2) 选择PC更新的时机3. 结构级设计 指关键模块的功能、输入输出信号的框图示意,并说明主要信号的功能及取值。可以分为如下几个关键模块:IF段、ID段、EX段、Mem段、WB段、冲突检测模块、定向处理模块等。可以参考之前给出的?实践报告?文档的写法,但要注意修改其中信号的位数。1. 总体逻辑结构计图 五级流水整体结构图整个CPU由以下几个模块组成:(1)取指模块IF:给出内存

17、地址,读取指令并送入指令存放器,为下一级准备数据。由于PC控制模块处于取指模块中,因此控制相关的检测也置于取指模块。(2)译码模块ID:读取存放器值和指令译码。我们采取一次译码,逐级传递的方式,译出后几级流水所需的控制信号和数据如立即数等,在每次时钟上升沿到来时送入下一级。实际上,结构相关、控制相关、数据相关的检测都可归入译码局部。考虑到“相关检测涉及到的信号分属不同阶段以及整体结构的清晰性,我们将“相关检测独立出来。(3)执行模块Ex:完成算术逻辑运算、计算有效地址和提供数据通道。(4)访存模块Ma:选择地址线的数据来源和数据线的流向。访存和取指在功能上是独立的,但CPU对外只有一条地址线和

18、数据线的事实决定了访存和取指是相互联系的。当执行LOAD/STORE指令时,地址线由ALU送入“访存段的值提供;取指时,那么由PC提供。当写内存时,CPU内部数据送数据线;当需要读内存时,CPU往数据线送高阻。(5)回写模块Wb:选择回写数据源和根据写使能信号wRegEn将数据回写到存放器堆;(6)HazardDetectEntity模块:检测结构相关;(7)ForwardingEntity模块:检测数据相关。2. 关键分模块结构设计(1)执行模块(Ex)执行模块的主要工作是完成算术逻辑运算、计算有效地址和提供数据通道。执行模块的主体局部是运算器,其总体结构和两级流水是相似的。主要不同之处在于

19、增加了旁路模块,这是由于五级流水存在数据相关需要旁路处理。图 五级执行模块结构图(2)HazardDetectEntity模块 该模块通过检查“访存阶段的m_wrMem来确定是否发生结构相关。具体请参阅上文中处理结构相关的局部。 结构图: 图 五级HazardDetectEntity模块结构图信号说明端口信号含义信号含义输入m_wrMemwrMem处于访存阶段的值w_wrMemwrMem处于回写阶段的值d_IR指令存放器输出PCStall1 : 保持PC不变0: PC更新IFFlush1: NOP写入IR0: 内存输出写入IR表 HazardDetectEntity信号说明(3)回写模块WB回

20、写是一条指令执行过程中的最后一步。它的工作是选择回写数据源和根据写使能信号wRegEn将数据回写到存放器堆。需要选择的数据源共有两项:运算器输出和内存输出。在执行算术逻辑、移位等指令时选择运算器输出;执行LOAD指令时选择内存输出。 结构图: 图 五级回写模块结构图 信号说明:信号含义w_memToReg1: 内存数据到存放器0: ALU输出到存放器wRegEn1: 允许写存放器0: 禁止写存放器表 五级回写模块信号说明 2.2.4 ForwaringEntity模块 在“时序设计局部,我们已对“如何检测数据相关作了详细表达。具体实现由ForwardingEntity模块完成。 结构图 图 五

21、级ForwardinEntity模块结构图 信号说明端口信号含义信号含义输入e_SA存放器A口选择信号处于执行阶段的值e_SB存放器B口选择信号处于执行阶段的值m_SA存放器A口选择信号处于访存阶段的值w_SA存放器A口选择信号处于回写阶段的值m_wRegEn存放器写使能处于访存阶段的值w_wRegEn存放器写使能处于回写阶段的值输出forwradA选择ALU的A口数据forwradB选择ALU的B口数据表 五级FowardingEntity模块信号说明4. VHDL 源代码用黑色外的其它明显的颜色标注对16位参考代码所作的修改,这个作为评分时的一个主要参考因素。此外,需有适当的注释,说明关键

22、代码的功能与作用,注释亦用黑色外的其它颜色进行标注。-UnitPack.vhd- 常量定义文件-2004-09-04library ieee;use ieee.std_logic_1164.all;PACKAGE unitPack IS constant ZERO8 : STD_LOGIC_VECTOR(7 DOWNTO 0) := "00000000"constant ZERO9 : STD_LOGIC_VECTOR(8 DOWNTO 0) := "000000000"constant Z8 : STD_LOGIC_VECTOR(7 DOWNTO 0)

23、 := "ZZZZZZZZ"- ALU: select data sourceconstant selA0: std_logic_vector(2 downto 0) := "000"constant selAB: std_logic_vector(2 downto 0) := "001"constant selA1: std_logic_vector(2 downto 0) := "010"constant sel0B: std_logic_vector(2 downto 0) := "011"

24、;constant selAF: std_logic_vector(2 downto 0) := "100"constant selAD: std_logic_vector(2 downto 0) := "101"- ALU: Select operationconstant aluAdd: std_logic_vector(3 downto 0) := "0000"constant aluSub: std_logic_vector(3 downto 0) := "0001" constant aluAnd: st

25、d_logic_vector(3 downto 0) := "0010"constant aluOr : std_logic_vector(3 downto 0) := "0011" constant aluXor: std_logic_vector(3 downto 0) := "0100"constant aluShl: std_logic_vector(3 downto 0) := "0101"constant aluShr: std_logic_vector(3 downto 0) := "011

26、0"constant aluSar: std_logic_vector(3 downto 0) := "0111" constant aluLOADH : std_logic_vector(3 downto 0) := "1000" constant aluLOADL : std_logic_vector(3 downto 0) := "1001" constant aluMOVI : std_logic_vector(3 downto 0) := "1010"- 状态位的控制信号constant fla

27、g_hold : std_logic_vector(2 downto 0) := "000" constant flag_update : std_logic_vector(2 downto 0) := "001"constant flag_InnerDB : std_logic_vector(2 downto 0) := "010" constant flag_C0 : std_logic_vector(2 downto 0) := "011"constant flag_C1 : std_logic_vector

28、(2 downto 0) := "100"constant flag_clear : std_logic_vector(2 downto 0) := "101"- 指令操作码 constant ADD: std_logic_vector(3 downto 0):="0000" constant SUBB : std_logic_vector(3 downto 0):="0001" constant ANDins : std_logic_vector(3 downto 0):="0011" con

29、stant MOV : std_logic_vector(3 downto 0):="0010" constant LOAD : std_logic_vector(3 downto 0):="1000" constant STORE : std_logic_vector(3 downto 0):="1010"constant LOADH : std_logic_vector(3 downto 0):="1011" constant LOADL : std_logic_vector(3 downto 0):=&quo

30、t;1001" constant JR : std_logic_vector(3 downto 0):="0100" constant JRZ : std_logic_vector(3 downto 0):="0111" constant NOP : std_logic_vector(3 downto 0):="1100" constant MOVI : std_logic_vector(3 downto 0):="1101"constant NOPIns: std_logic_vector(7 down

31、to 0):="11000000" constant DoNothing :std_logic_vector(17 downto 0):="0000"&"10"&"0"&"1"&"011"&"0000"&"000" subtype INDEXTYPE is INTEGER range 0 to 3; subtype WORD is std_logic_vector(15 downto 0)

32、; subtype BYTE is std_logic_vector(7 downto 0); type REGISTERARRAY is array ( 0 to 3 ) of BYTE;END unitPack;-MemAccessEntity.vhd- 访存模块library IEEE;use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all;use work.unitpack.all;entity MemAccessEntity isport(reset,clk: in std_logic;m_wrMem: in std_

33、logic_vector(1 downto 0);w_wrMem : out std_logic_vector(1 downto 0);m_ALUOut: in byte; m_RBdata: in byte; wr: out std_logic; OuterDB: inout byte;w_ALUOut: out byte;w_MemOut: out byte;m_flag: in std_logic_vector(3 downto 0); w_flag: out std_logic_vector(3 downto 0); PC : in byte; addr : out byte; m_S

34、A: in std_logic_vector(1 downto 0);w_SA: out std_logic_vector(1 downto 0);m_wRegEn : in std_logic; m_destReg : in std_logic_vector(1 downto 0); m_memToReg : in std_logic;w_wRegEn : out std_logic; w_destReg: out std_logic_vector(1 downto 0); w_memToReg : out std_logic);end entity ;architecture MemAcc

35、essArch of MemAccessEntity isbegin process(clk,m_wrMem,m_ALUOut,m_RBdata,PC)begin case m_wrMem iswhen "00" => addr <= m_ALUout; wr <= '0' - write MemoryOuterDB <= m_RBdata;when "01" => wr <= '1' addr <= m_ALUout;OuterDB <= Z8;when others =&

36、gt;wr <= '1' addr <= PC; OuterDB <= Z8; end case;end process;process(reset,clk)begin if reset='0' thenw_wRegEn <= '0'w_wrMem <= "10"elsif RISING_EDGE(clk) then w_flag <= m_flag;w_ALUOut <= m_ALUOut;w_SA <= m_SA;w_wRegEn <= m_wRegEn;w_destR

37、eg<= m_destReg;w_memToReg<= m_memToReg; w_memOut <= OuterDB;w_wrMem <= m_wrMem;end if;end process;end architecture ;-IFEntity.vhd- 取指模块library IEEE;use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all;use work.unitpack.all;entity IFEntity isport (reset: in STD_LOGIC;clk: in STD_L

38、OGIC; Z,C: in std_logic; tempZ,tempC : in std_logic; e_setFlag: in std_logic_vector(2 downto 0);PCPlusOffset: in byte;PCStall : in std_logic; IFFlush: in std_logic; OuterDB: in byte; PC_addr: out byte; d_PCInc1 : out byte;d_IR : out byte -指令存放器输出 );end IFEntity; architecture IFArch of IFEntity issig

39、nal PC,IR: std_logic_vector(7 downto 0);signal PCIncSel: std_logic; signal s_PCInc1,PCnext : std_logic_vector(7 downto 0);signal op: std_logic_vector(3 downto 0);signal s_flag : std_logic_vector(3 downto 0);signal s_selZ,s_selC : std_logic;signal ZZ,CC : std_logic;begin op <= IR(7 downto 4);with

40、e_setFlag select ZZ <= Zwhen flag_hold, tempZ when others;with e_setFlag select CC <= Cwhen flag_hold, tempC when others;s_selZ <= '1' WHEN( op=JRZ AND ZZ='1') OR op=JR else '0' s_selC <= '1' WHEN( op=JRC AND CC='1') else '0' PCIncSel <=

41、 '1' WHEN s_selZ='1' or s_selC='1' ELSE '0' s_PCInc1 <= PC + x"01" WITH PCIncSel SELECT PCnext <= s_PCInc1 WHEN '0', PCPlusOffset WHEN '1', s_PCInc1 when others; process(reset,clk,PCStall)beginif reset = '0' thenPC <= x"

42、00" elsif FALLING_EDGE(clk) and (PCStall='0') then PC <= PCnext;end if;end process; PC_addr <= PC;-PC作为内存地址d_IR <= IR;process(reset,clk,OuterDB,IFFlush)beginif reset='0' thenIR <= NopIns;- NULL operation elsif RISING_EDGE(clk) thencase IFFlush iswhen '0' =>

43、; IR <= OuterDB;when others => IR <= NOPIns;end case;d_PCInc1 <= s_PCInc1;end if;end process;end IFArch;-IDEntity.vhd- 译码模块library IEEE;use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all;use work.unitpack.all;entity IDEntity isport(reset: in std_logic;clk: in std_logic; d_IR: i

44、n byte; d_PCInc1 : in byte; w_WBData : in byte; w_destReg : in std_logic_vector(1 downto 0); w_wRegEn : in std_logic; e_SA,e_SB: out std_logic_vector(1 downto 0);i_PCPlusOffset: out byte;e_RAOut,e_RBOut: out byte; e_IMM: out byte; e_ALUSrc: out std_logic_vector(2 downto 0);e_ALUOpr: out std_logic_vector(3 downto 0); e_SetFlag: out std_logic_vector(2 downto 0); e_wrMem: out std_logic_vector(1 downto 0); e_wRegEn : out std_logic;e_destReg : out std_logic_vector(1 downto 0)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1