16位cpu设计课程设计.docx

上传人:暗伤 文档编号:64512358 上传时间:2022-11-29 格式:DOCX 页数:21 大小:366.45KB
返回 下载 相关 举报
16位cpu设计课程设计.docx_第1页
第1页 / 共21页
16位cpu设计课程设计.docx_第2页
第2页 / 共21页
点击查看更多>>
资源描述

《16位cpu设计课程设计.docx》由会员分享,可在线阅读,更多相关《16位cpu设计课程设计.docx(21页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、目录1. 课程设计目的32. 开发工具选择33. 方案选择34. 指令系统设计45. 模型机框图设计46. 指令流程图57. 微指令格式(微程序控制器)设计68. 微程序(微程序控制器)设计79. VHDL 程序代码910. 调试仿真1611. 课程设计回顾总结18参 考 文 献18201. 课程设计目的(1) 、计算机组成原理课程设计的主要任务是让学生通过动脑和动手解决计算机设计中的实 际问题。综合运用所学计算机组成原理知识,在掌握部件单元电路实验的基础上,进一步将其组成系统构造一台基本的模型计算机,掌握整机概念,并设计机器指令系统,编写程序, 在所设计的模型计算机上调试运行。(2) 、通过

2、一台模型机的设计过程,明确计算机的控制原理与控制过程,巩固和灵活应用所学的理论知识,掌握计算机组成的一般设计方法,提高学生设计能力和实践操作技能,为从事计算机研制与设计打下基础。2. 开发工具选择使用QUARTUS 5.0 软件编写并调试VHDL 程序,然后做功能仿真。3. 方案选择本次实习的内容为 16 位模型计算机的设计,单总线,采用微程序控制方式,有四种寻址方式:直接寻址、寄存器寻址、寄存器间接寻址和变址寻址。微程序控制方式由微指令译码产生。微程序中一条机器指令往往分成几步执行,将每一步操作所需的若干为命令以代码编写在一条微指令中,若干条微指令组成一段微程序,对应一条机器指令。然后根据系

3、统的需要,事先编制各段微程序,将它存入一个专用寄存器(即控制存储器)中。微程序执行过程:如图 1 所示,为微程序控制基本框:(1) 从控存中逐条取出“取指令操作”,执行取指令公共操作。(2) 根据指令的操作码,经过微地址形成部件,得到这条指令的入口地址,并送入微地址寄存器中。(3) 从控存中逐条的取出对应的微指令并执行。(4) 执行完一条机器指令对应的微程序后又回到取指微程序的入口地址,继续第(1) 步,以完成取下一条机器指令的公共操作。微命令序列指令代码IR微地址译码器PSW运行状态形成电路微命令字段微指令寄存器IR微地址字段PC微地址寄存器AR控制存储器 CM图 1 微程序控制基本框4.

4、指令系统设计操作码 目的操作数寻址方式目的操作数 源操作数寻址方式 源操作数1512 1110 96 54 30模拟机采用了定长的指令格式,每条指令字长为16 位。采用的寻址方式为直接寻址(00)、寄存器寻址(01)、寄存器间接寻址(10)和变址寻址(11),操作码类型及编码方式如下操作码staaddsuband1or1shl编码方式0000000100100011010001015. 模型机框图设计IRMDRACCPCR0MCR1ALUMARD模拟机数据通路如图 2 所示,模型机采用单总线结构,主要包括运部件ALU,以及程序计数器 PC、累加器 ACC、指令寄存器 IR、数据寄存器 MDR、

5、地址寄存器 MAR 和通用寄存器R,M 为内存图 2:模型机数据通路(1) 寄存器的位数:所有的寄存器都均为 16 位A 通用寄存器R0,R1该模拟机有 2 个通用寄存器,用于提供操作数。B 指令寄存器IR为了提高取指令的速度,将指令从内存中读出,经数据总线直接置入IR。C 数据寄存器MDR、地址寄存器MAR地址寄存器MAR 提供访问主存的地址;数据寄存器MDR,把从内存取出的数据暂存于 MDR 中,在用到该数据进行运算时, 再从 MDR 中取出数据进行运算。D 程序计数器PC用于存放下一条指令的内存地址。(2) 总线宽度:该模拟机只有一条总线,且总线宽度为16 位。(3)ALU 位数及运算功

6、能ALU 可以实现 16 位操作数的运算,即ALU 的位数为 16 位。ALU 运算功能为:可以实现简单的加(0001:add)、减(0010:sub)、逻辑与(0011: and1)、或(0100:or1)操作。(4)微命令的设置(各标识的含义)经过认真分析各信息传送路径,对指令过程基本掌握,并为相应的微命令做了一下设置:171615141312111098765-0PC_busload_IRload_MARMDR_busload-MDRALU_ACCINC_PCAddr_busCSR_NWALU_addALU_sub下地址30292827262524232221201918微地址ACC_A

7、CC_D_loadC_loadR1_loadR0_loadloadACCloadaddDaddCbus_Dbus_Cbus_R1bus_R0_PC_bus_ACC333231ALUALUALU_and_or_srl6. 指令流程图指令的流程图如图 3 所示,共有 6 条指令,每条指令都要经过取指令、分析指令和执行指令 3 个步骤。在取指令阶段,8 条指令是一样的,首先程序计数器PC 的内容通过总线送入地址寄存器 MAR,存储信息,PC+1 传送给 PC,把读出的内容传送给指令寄存器IR 。再接下来的操作中,根据不同的指令,执行顺序也不同。PCMARRiCRiMARRiCRiCPC+1PCPCM

8、ARMMDRCRjMDRRjDMMDRCPC+1PCRjDMMDRDC or DRjC+RiMARMMDRDCDRjCandDMDRMMDRCCRjD+RjMARMMDRDMDRMC+DMDRMDRM开始PCMARMIR,PC+1PCstaaddsubandorshlAMARMMDRCC 左移一位ACC结束图 3 指令流程图7. 微指令格式(微程序控制器)设计控 制 信 号描述load_PC将总线上的数据装载至 PCACC_bus用 ACC 的内容驱动总线load_ACC将总线上的数据载入 ACC微指令格式设计如表:PC_bus用PC 的内容驱动总线load_IR将总线上的数据装载至 IRlo

9、ad_MAR将总线上的数据装载至 MARMDR_bus用 MDR 的内容驱动总线load_MDR将总线上的数据装载至 MDR ALU_ACC用 ALU 的结果装载 ACCINC_PCPC+1 并将结果存至PC 中Addr_bus用 IR 指令中的地址部分驱动总线CS片选。用 MAR 的内容设置存储器地址R_NW读取,不可写。当 R_NW 无效且CS 有效时,MBR 的内容存储于存储器中ALU_addC在 ALU 中执行 ACC 和 C 的逻辑加操作ALU_addD在 ALU 中执行 ACC 和 D 的逻辑加操作ALU_add在 ALU 中执行逻辑加操作ALU_sub在 ALU 中执行减操作AL

10、U_and在 ALU 中执行与操作ALU_or在 ALU 中执行与操作ALU_shl在 ALU 中执行左移操作R0_bus用寄存器 R0 的内容驱动总线load_R0将总线上的数据装载至 R0R1_bus用寄存器 R1 的内容驱动总线load_R1将总线上的数据装载至 R1C_bus用暂存器 C 的内容驱动总线load_C将总线上的数据装载至 CD_bus用暂存器 D 的内容驱动总线load_D将总线上的数据装载至 D表 1 微指令格式8. 微程序(微程序控制器)设计根据微处理器的数据通路和指令系统,可得出微程序的流程图如图 4 所示。微程序的编码采用直接编码方法,每一个控制信号对应一位,共有

11、28 个控制信号,根据微指令格式把相关的控制信号整合到一起进行编码。PC_busload_MAR0INC_PCCS1R_NWMDR_bus2load_IRop3staPC_bus48load_MAR INC_PC4 CSR_NW5 MDR_bus load_Cload_MDR6 load_ACC R1_bus7 ALU_AC C8 ACC_bus load_MARadd49 R1_busload_MDR11 load_CPC_bus12 load_MAR INC_PC13 CS R_NW14 MDR_bus load_Dload_MDR15 load_ACC R0_busALU_ACC22 C

12、S21 ACC_bussub50 R0_busload_MARCSR_NW30load_C37load_CR1_busR1_busMDR_bus31load_MAR38load_MARload_C32CS39load_DR1_busR_NWload_MDR40ALU_ACC33MDR_busALU_orload_Dload_D41ACC_busALU_ACC34ALU_ACCload_MDRALU_subALU_and42load_R1232425262728 ACC_busload_MDRand51 R0_busload_MDR35 ACC_busload_MDRor52 R0_busloa

13、d_MDRshl53 addr_busload_MAR43 CS R_NW44 MDR_busload_ACCALU_ACC45 ALU_shl46 ACC_busload_MDR47 load_R19CSR_NWMDR_bus16ALU_addC17 ACC_busload_MARload_MDR20 ALU_ACC29 load_R036 CS10load_C load_R018 CS R_NW19 MDR_bus load_D根据图 4 微程序流程图的下地址图,4 可微程知序共流有程5图4 条微指令,该模拟机微程序的编码如下0= 00000000000000001010001000000

14、000011= 00000000000000000000000011000000102= 00000000000000000101000000000000113= 00000000000000000000000000001111114= 00000000000000000000000011000001015= 00000000100000000001000000000001106= 00000000010000010000100000000001117= 00001000000000000000010000000010008= 000000000000001000100000000000100

15、19= 000000000000000000000000110000101010= 000000001000100000010000000000000011= 000000001000000000000000000000110012= 000000000000000010100010000000110113= 000000000000000000000000110000111014= 000000100000000000010000000000111115= 000000000001000100001000000001000016= 000100000000000000000100000001

16、000117= 000000000000001000100000000001001018= 000000000000000000000000110001001119= 000000100000000000010000000001010020= 000000000000000000000100001001010121= 000000000000001000001000000001011022= 000000000000000000000000100000000023= 000000000000000000000000110001100024= 00000000100000000001000000

17、0001100125= 000000000100000000001000000001101026= 000000100000000000000000000001101127= 000000000000000000000100000101110028= 000000000000001000001000000001110129= 000000000010000000000000000000000030= 000000001000000000000000000001111131= 000000000100000000100000000010000032= 0000000000000000000000

18、00110010000133= 000001000000000000010000000010001034= 100000000000000000000100000010001135= 000000000000001000001000000010010036= 000000000000000000000000100000000037= 000000001000000000000000000010011038= 000000000100000000001000000010011139= 000000100000000000000000000010100040= 010000000000000000

19、000100000010100141= 000000000000001000001000000010101042= 000000000010000000000000000000000043= 000000000000000000000000110010110044= 000000001000000000010000000010110145= 001000000000000000000100000010111046= 000000000000001000000000010010111147= 000000000000100000000000000000000048= 00000000000000

20、0010100010000000010049= 000000000100000000001000000000101150= 000000000001000000100000000001011151= 000000000001000000001000000001111052= 000000000001000000001000000010010153= 00000000000000000010000100001010119. VHDL 程序代码-头文件LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;PACKAGE cpu_defs ISTYPEopcode IS

21、(sta, add, sub,and1,or1, shl,jmp,nop); TYPEregcode IS (r0, r1);TYPExzhcode IS (zh,j,jj,bi); CONSTANT word_w: NATURAL :=16; CONSTANT op_w: NATURAL :=4; CONSTANT reg_w: NATURAL :=4; CONSTANT xzh_w: NATURAL :=2;CONSTANT rfillop: STD_LOGIC_VECTOR(op_w-1 downto 0):=(others =0); CONSTANT rfillreg: STD_LOG

22、IC_VECTOR(reg_w-1 downto 0):=(others =0); CONSTANT rfillxzh: STD_LOGIC_VECTOR(xzh_w-1 downto 0):=(others =0);-FUNCTIOn slv2op(slv:IN STD_LOGIC_VECTOR) RETURN opcode; FUNCTION op2slv(op:in opcode) RETURN STD_LOGIC_VECTOR; FUNCTION regslv(reg:in regcode) RETURN STD_LOGIC_VECTOR; FUNCTION xzhslv(xzh:in

23、 xzhcode) RETURN STD_LOGIC_VECTOR; END PACKAGE cpu_defs;PACKAGE BODY cpu_defs ISTYPEoptable IS ARRAY(opcode) OF STD_LOGIC_VECTOR(op_w-1 DOWNTO 0);TYPEregtable IS ARRAY(regcode) OF STD_LOGIC_VECTOR(reg_w-1 DOWNTO 0); TYPExzhtable IS ARRAY(xzhcode) OF STD_LOGIC_VECTOR(xzh_w-1 DOWNTO 0); CONSTANT trans

24、_tableop:optable :=(0000, 0001, 0010, 0011, 0100, 0101,0110,0111);CONSTANT trans_tabler:regtable :=(0000,0001);CONSTANT trans_tablex:xzhtable :=(00,01,10,11);FUNCTION op2slv(op:IN opcode) RETURN STD_LOGIC_VECTOR IS BEGINRETURN trans_tableop(op); END FUNCTION op2slv;FUNCTION regslv(reg:in regcode) RE

25、TURN STD_LOGIC_VECTOR IS BEGINRETURN trans_tabler(reg); END FUNCTION regslv;FUNCTION xzhslv(xzh:in xzhcode) RETURN STD_LOGIC_VECTOR IS BEGINRETURN trans_tablex(xzh); END FUNCTION xzhslv;END PACKAGE BODY cpu_defs;LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL,IEEE.NUMERIC_STD.ALL; USE WORK.CPU_DEFS.ALL;ENT

26、ITY CPU ISPORT( clock: INSTD_LOGIC;reset: INSTD_LOGIC;mode: INSTD_LOGIC_VECTOR(3 DOWNTO 0);mem_addr: INUNSIGNED(word_w-op_w-1 DOWNTO 0); output: OUTSTD_LOGIC_VECTOR(word_w-1 DOWNTO 0); data_r_out : OUT STD_LOGIC_VECTOR(33 DOWNTO 0);op_out: OUTSTD_LOGIC_VECTOR(op_w-1 DOWNTO 0); add_r_out: OUTUNSIGNED

27、(5 DOWNTO 0);END ENTITY;ARCHITECTURE rtl OF CPU ISTYPE mem_array IS ARRAY (0 TO 2*5) OF STD_LOGIC_VECTOR(word_w-1 DOWNTO 0);SIGNALmem: mem_array; CONSTANT prog: mem_array:=(0= op2slv(sta) & xzhslv(j) & regslv(r0)& xzhslv(bi)& regslv(r1) , 1= STD_LOGIC_VECTOR(TO_UNSIGNED(3,word_w),2= op2slv(add) & xz

28、hslv(bi)& regslv(r0)& xzhslv(j) & regslv(r1), 3= STD_LOGIC_VECTOR(TO_UNSIGNED(0,word_w),4= op2slv(sub) & xzhslv(j) & regslv(r1) & xzhslv(jj)& regslv(r0),5= op2slv(and1)& xzhslv(jj)& regslv(r1)& xzhslv(j) & regslv(r0), 6= op2slv(or1) & xzhslv(j) & regslv(r1) & xzhslv(j) & regslv(r0), 7= op2slv(shl) &

29、 xzhslv(j) & regslv(r0) & xzhslv(zh)& STD_LOGIC_VECTOR(TO_UNSIGNED(10,reg_w),8= STD_LOGIC_VECTOR(TO_UNSIGNED(9,word_w),9= STD_LOGIC_VECTOR(TO_UNSIGNED(8,word_w),10= STD_LOGIC_VECTOR(TO_UNSIGNED(15,word_w), OTHERS = (OTHERS =0);TYPE microcode_array IS ARRAY (0 TO 53) OF STD_LOGIC_VECTOR(33 DOWNTO 0);

30、CONSTANT code: microcode_array:=(0= 0000000000000000101000100000000001,1= 0000000000000000000000001100000010,2= 0000000000000000010100000000000011,3= 0000000000000000000000000000111111,4= 0000000000000000000000001100000101,5= 0000000010000000000100000000000110,6= 0000000001000001000010000000000111,7

31、= 0000100000000000000001000000001000,8= 0000000000000010001000000000001001,9= 0000000000000000000000001100001010,10= 0000000010001000000100000000000000,11= 0000000010000000000000000000001100,12= 0000000000000000101000100000001101,13= 0000000000000000000000001100001110,14= 000000100000000000010000000

32、0001111,15= 0000000000010001000010000000010000,16= 0001000000000000000001000000010001,17= 0000000000000010001000000000010010,18= 0000000000000000000000001100010011,19= 0000001000000000000100000000010100,20= 0000000000000000000001000010010101,21= 0000000000000010000010000000010110,22= 000000000000000

33、0000000001000000000,23= 0000000000000000000000001100011000,24= 0000000010000000000100000000011001,25= 0000000001000000000010000000011010,26= 0000001000000000000000000000011011,27= 0000000000000000000001000001011100,28= 0000000000000010000010000000011101,29= 0000000000100000000000000000000000,30= 000

34、0000010000000000000000000011111,31= 0000000001000000001000000000100000,32= 0000000000000000000000001100100001,33= 0000010000000000000100000000100010,34= 1000000000000000000001000000100011,35= 0000000000000010000010000000100100,36= 0000000000000000000000001000000000,37= 000000001000000000000000000010

35、0110,38= 0000000001000000000010000000100111,39= 0000001000000000000000000000101000,40= 0100000000000000000001000000101001,41= 0000000000000010000010000000101010,42= 0000000000100000000000000000000000,43= 0000000000000000000000001100101100,44= 0000000010000000000100000000101101,45= 001000000000000000

36、0001000000101110,46= 0000000000000010000000000100101111,47= 0000000000001000000000000000000000,48= 0000000000000000101000100000000100,49= 0000000001000000000010000000001011,50= 0000000000010000001000000000010111,51= 0000000000010000000010000000011110,52= 0000000000010000000010000000100101,53= 000000

37、0000000000001000010000101011);SIGNAL count: UNSIGNED(word_w-op_w-1 DOWNTO 0); SIGNAL op: STD_LOGIC_VECTOR(op_w-1 DOWNTO 0);SIGNAL z_flag: STD_LOGIC;SIGNAL mdr_out: STD_LOGIC_VECTOR(word_w-1 DOWNTO 0); SIGNAL mar_out: UNSIGNED(reg_w-1 DOWNTO 0);SIGNAL IR_out: STD_LOGIC_VECTOR(word_w-1 DOWNTO 0);SIGNA

38、L acc_out: UNSIGNED(word_w-1 DOWNTO 0);SIGNAL sysbus_out : STD_LOGIC_VECTOR(word_w-1 DOWNTO 0); SIGNAL cc : STD_LOGIC_VECTOR(word_w-1 DOWNTO 0); SIGNAL rr1 : STD_LOGIC_VECTOR(word_w-1 DOWNTO 0);BEGINPROCESS(reset,clock)VARIABLE instr_reg : STD_LOGIC_VECTOR(word_w-1 DOWNTO 0);-IR VARIABLE acc: UNSIGN

39、ED(word_w-1 DOWNTO 0);CONSTANT zero: UNSIGNED(word_w-1 DOWNTO 0):=(OTHERS =0); VARIABLE mdr: STD_LOGIC_VECTOR(word_w-1 DOWNTO 0); VARIABLE r0: STD_LOGIC_VECTOR(word_w-1 DOWNTO 0); VARIABLE r1: STD_LOGIC_VECTOR(word_w-1 DOWNTO 0); VARIABLE c: STD_LOGIC_VECTOR(word_w-1 DOWNTO 0); VARIABLE d: UNSIGNED(

40、word_w-1 DOWNTO 0);VARIABLE mar: UNSIGNED(reg_w-1 DOWNTO 0);VARIABLE sysbus: STD_LOGIC_VECTOR(word_w-1 DOWNTO 0);VARIABLE microcode : microcode_array;VARIABLE add_r: UNSIGNED(5 DOWNTO 0); VARIABLE data_r: STD_LOGIC_VECTOR(33 DOWNTO 0); VARIABLE temp: STD_LOGIC_VECTOR(5 DOWNTO 0);BEGINIF reset=0 THEN

41、 add_r:=(OTHERS =0); count 0);instr_reg := (OTHERS =0); acc := (OTHERS =0);mdr := (OTHERS =0);mar := (OTHERS =0);z_flag =0; mem 0); r0 :=x0005;r1 :=x0006;c := (OTHERS =0);d := (OTHERS =0);ELSIF RISING_EDGE(clock) THEN-microprogram controllerdata_r:= code(TO_INTEGER(add_r);IF data_r(5 DOWNTO 0)=111111 THEN -判断下地址temp:=11 & op(3 DOWNTO 0);add_r := UNSIGNED(temp); ELSEadd_r := UNSIGNED(data_r(5 DOWNTO 0); END IF;data_r_out =data_r; add_r_out = add_r;-PCIF data_r(17)=1 THEN-PC_bus=1sysbus := rfillop & STD_LOGIC_VECTOR(count); END IF;IF data_r(20)=1 THEN-load_PC=1count = UNSIGNED(mdr(word_w-op_w

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 技术方案

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁