16位模型机的设计
- 格式:doc
- 大小:989.50 KB
- 文档页数:14
计算机硬件课程设计报告——拓展接口的复杂模型机设计学院:计算机科学与工程学院专业:计算机科学与技术班级:组员1:组员2:起止时间:目录一、实验目的 (3)二、实验内容 (3)三、实验思路 (3)四、实验原理 (3)五、实验步骤 (10)六、实验设计 (11)七、实验心得 (14)一、实验目的经过一系列硬件课程的学习及相关实验后,做一个综合的系统性的设计,这在硬件方面是一个提高,进一步培养实践能力。
二、实验内容搭建一台有拓展接口的8位模型机,指令系统要求有10条以上,其中包括运算类指令、传送类指令、控制转移类指令、输入输出指令、停机指令等。
三、实验思路1、确定设计目标:确定所设计计算机的功能和用途。
2、确定指令系统:确定数据的表示格式、位数、指令的编码、类型、需要设计哪些指令及使用的寻址方式。
3、确定总体结构与数据通路:总体结构设计包含确定各部件设置以及它们之间的数据通路结构,列出各种信息传送路径以及实现这些传送所需要的微命令。
4、设计指令执行流程:数据通路确定后,就可以设计指令系统中每条指令的执行流程。
根据指令的复杂程度。
每条指令所需要的机器周期数。
对于微程序控制的计算机,根据总线结构,需要考虑哪些微操作可以安排在同一个微指令中。
5、确定微程序地址:根据后续微地址的形成方法,确定每条微程序地址及分支转移地址。
6、根据微指令格式,将微程序流程中的所有微操作进行二进制代码化,写入到控制存储器中的相应单元中。
7、组装、调试:在总装调试前,先按功能模块进行组装和分调,因为只有功能模块工作正常后,才能保证整机的运行正确。
四、实验原理1、指令系统及指令格式(1)数据格式8位。
(2)指令格式:指令系统应包括:算术逻辑运算指令、访存指令、控制转移指令、I/O指令、停机指令。
一般指令格式如下:O P-C O D E(4位)R S(2位)R D(2位)D A T A /A D D R (8位)其中R S 、R D 可以是R 0、R 1、R 2中任一个,它们的代码分别为00、01、10。
计算机组成原理实验指导书王潇编写仲恺农业工程学院计算机科学与工程学院二00八年十月目录第一章TEC-XP16实验计算机系统原理 (1)§1.1TEC-XP16计算机组成原理实验系统概述 (1)§1.2TEC-XP16机指令系统 (8)§1.3TEC-XP16机运算器部件 (12)§1.4TEC-XP16机内存储器部件 (15)§1.5TEC-XP16机的控制器部件 (18)§1.6TEC-XP16机的输入输出及中断 (22)第二章TEC-XP16实验计算机系统实验内容 (24)实验一基础汇编语言程序设计 (24)实验二脱机运算器实验 (29)实验三存储器部件教学实验 (32)实验四组合逻辑控制器部件教学实验 (37)实验五微程序控制器部件教学实验 (51)实验六输入/输出接口扩展实验 (59)实验七中断实验 (63)实验八8位模型机的设计与实现(综合实验) (71)附录 (74)附录1 联机通讯指南 (74)附录2TEC-XP16计算机组成原理实验系统简明操作卡 (77)附录3微程序入口地址映射表 (78)附录4指令流程框图 (80)附录5指令流程表 (82)附录6书写实验报告的一般格式 (86)参考文献 (87)第一章TEC-XP16实验计算机系统原理§1.1 TEC-XP16计算机组成原理实验系统概述一、教学计算机系统的实现方案和硬软件资源概述TEC-XP是由清华大学计算机系和清华大学科教仪器厂联合研制的适用于计算机组成原理课程的实验系统,主要用于计算机组成原理和数字电路等的硬件教学实验,同时还支持监控程序、汇编语言程序设计、BASIC高级语言程序设计等软件方面的教学实验。
它的功能设计和实现技术,都紧紧地围绕着对课程教学内容的覆盖程度和所能完成的教学实验项目的质量与水平来进行安排。
其突出特点是硬、软件基本配置比较完整,能覆盖相关课程主要教学内容,支持的教学实验项目多且水平高。
本次课程设计的任务是完成一个基本模型机的设计与实现。
设计经过综合运用了以前所学计算机原理的知识,依照设计要求和指导,实现了一个基本的模型计算机。
本模型机实现的功能有:IN(输入),OUT(输出),ADD(加法),SUB(减法),STA(存数),JMP(跳转)。
设计进行开始,在了解微程序的基本格式, 及各个字段值的作用后, 按微指令格式参照指令流程图,设计出程序以及微程序,将每条微指令代码化,译成二进制代码表,并将二进制代码转换为联机操作时的十六进制格式文件。
根据机器指令系统要求,设计微程序流程图及确定微地址。
设计的加法和减法中, 被加数和被减数都由调试人员输入, 而加数和减数都从存储器中读取. 最后上机调试,各个功能运行结果正确。
关键词:基本模型机;机器指令;微指令目录1、课程设计题目-----------------------------------------------12、实验设备---------------------------------------------------13、课程设计步骤-----------------------------------------------13.1、所设计计算机的功能和用途------------------------------13.2、指令系统----------------------------------------------23.3、总体结构与数据通路------------------------------------23.4、设计指令执行流程--------------------------------------33.5、微指令代码化------------------------------------------43.6、组装和调试----------------------------------------------54、课程设计总结-----------------------------------------------75、附录-----------------------------------------------------------------------------------8附录1:数据通路图----------------------------------------------------------8 附录2:微程序流程图--------------------------------------------------------9 附录3:实验接线图------------------------------------------------------------10 附录4:实验程序及微程序---------------------------------------------------11 附录5:参考文献(资料)-----------------------------------121、课程设计题目基本模型机的设计与实现2、实验设备TDN—CM++计算机组成原理教学实验系统一台,微机,虚拟软件,排线若干。
评语: 课中检查完成的题号及题数:课后完成的题号与题数:成绩: 自评成绩: 85实验报告实验名称:CPU 与简单模型机设计实验日期:2015.11.17 班级: 2 学号:13 姓名:周小多一、实验目的:1. 掌握一个简单CPU 的组成原理。
2. 在掌握部件单元电路的基础上,进一步将其构造一台基本模型计算机。
3. 为其定义五条机器指令,编写相应的微程序,并上机调试掌握整机概念。
二、实验内容:1.要实现一个简单的CPU,并且在此CPU 的基础上,继续构建一个简单的模型计算机。
CPU 由运算器(ALU)、微程序控制器(MC)、通用寄存器(R0),指令寄存器(IR)、程序计数器(PC)和地址寄存器(AR)组成,如图2-1-1 所示。
这个CPU 在写入相应的微指令后,就具备了执行机器指令的功能,但是机器指令一般存放在主存当中,CPU 必须和主存挂接后,才有实际的意义,所以还需要在该CPU 的基础上增加一个主存和基本的输入输出部件,以构成一个简单的模型计算机。
2.本模型机和前面微程序控制器实验相比,新增加一条跳转指令JMP,共有五条指令:IN(输入)、ADD(二进制加法)、OUT(输出)、JMP(无条件转移),HLT(停机),其指令格式如下(高4位为操作码):助记符机器指令码说明IN 0010 0000 IN→R0ADD 0000 0000 R0 + R0→R0OUT 0011 0000 R0→OUTJMP addr 1100 0000 addr→ PCHLT 0101 0000 停机3. 设计一段机器程序,要求从IN 单元读入一个数据,存于R0,将R0 和自身相加,结果存于R0,再将R0 的值送OUT 单元显示。
根据要求可以得到如下程序,地址和内容均为二进制数。
地址内容助记符说明00000000 00100000 ; START: IN R0 从IN 单元读入数据送R000000001 00000000 ; ADD R0,R0R0 和自身相加,结果送R000000010 00110000 ; OUT R0R0 的值送OUT 单元显示00000011 11100000 ; JMP START跳转至00H 地址00000100 0000000000000101 01010000 ; HLT停机三、项目要求及分析:1. 试修改现有的指令系统,将加法指令的功能修改为R0的内容和某个存储单元的内容相加;增加存数、取数和减法三条机器指令,指令助记符分别为STA、LAD 和SUB,指令操作码分别为十六进制的60、70和80。
基本模型机的设计与实现1.设计目的1、在掌握部件单元电路实验的基础上,进一步将其组成系统构造一台基本模型计算机。
2、为其定义五条机器指令,并编写相应的微程序,具体上机调试,掌握整机软硬件组成概念。
2.设计内容2.1设计原理部件实验过程中,各部件单元的控制信号是人为模拟产生的,而本次实验将能在微程序控制下自动产生各部件单元控制信号,实现特定指令的功能。
这里,计算机数据通路的控制将由微程序控制器来完成,CPU从内存中取出一条机器指令到指令执行结束的一个指令周期全部由微指令组成的序列来完成,即一条机器指令对应一个微程序。
2.1.1有关微控制器部分的介绍微程序控制电路:微程序控制器的组成见图10,其中控制存储器采用3片2816的E2PROM,具有掉电保护功能,微命令寄存器18位,用两片8D触发器(74273)和一片4D(74175)触发器组成。
微地址寄存器6位,用三片正沿触发的双D触发器(7474)组成,它们带有清“0”端和预置端。
在不判别测试的情况下,T2时刻打入微地址寄存器的内容即为下一条微指令地址。
当T4时刻进行测试判别时,转移逻辑满足条件后输出的负脉冲通过强置端将某一触发器置为“1”状态,完成地址修改。
在该实验电路中设有一个编程开关(位于实验板右上方),它具有三种状态:PROM (编程)、READ(校验)、RUN(运行)。
当处于“编程状态”时,实验者可根据微地址和微指令格式将微指令二进制代码写入到控制存储器2816中。
当处于“校验状态”时,可以对写入控制存储器中的二进制代码进行验证,从而可以判断写入的二进制代码是否正确。
当处于“运行状态”时,只要给出微程序的入口微地址,则可根据微程序流程图自动执行微程序。
图中微地址寄存器输出端增加了一组三态门,目的是隔离触发器的输出,增加抗干扰能力,并用来驱动微地址显示灯。
微指令格式:上图为地址转移逻辑电其中UA5--UA0为6位的后续微地址,A,B,C为三个译码字段,分别由三个控制位译码出多个微命令。
Autodesk Inventor设计的优势Autodesk Inventor设计的优势(一)----重焕青春Autodesk的Inventor处理大型组装模型具有极佳的交互性能。
图示模型是加工汽车引擎部件的传输线的一部分,共包含3,100个组件。
Inventor在Pentium III 500工作站上加载该模型只需39秒。
Autodesk重焕青春我们经常抱怨CAD软件的缔造者不能及时创新产品取代业已过时的软件。
Autodesk打破了这个成规,于近日首次展出了Autodesk Inventor _ 第一个基于其旗舰产品AutoCAD的机械CAD软件产品。
AutoCAD的问世可以回溯到1981年。
代号为Rubicon的Autodesk Inventor是一种尺寸驱动的实体造型系统,它意在与Pro/Engineer、CATIA、Unigraphics、I-DEAS Master 系列、SolidWorks和Solid Edge等相似的产品进行竞争。
类似于这些程序,Inventor也使用结构化的技术,包括草绘二维界面轮廓以及拉伸、旋转和扫掠草图形成实体模型。
软件将单个零件组合起来形成产品部件,并且允许通过将实体模型投影到平面上创建零件或部件的工程图。
最初编写AutoCAD时,16位的个人计算机拥有很低的处理能力和很少的内存,程序员的精力集中在如何使CAD程序在16位的个人计算机上顺利运行等技术难题上。
在80年代早期,使计算机画直线或圆弧的算法优化都是一种挑战。
开发Inventor的Autodesk小组已经将注意力集中于如何使Inventor比竞争产品更简单和方便地使用。
用户界面使用Microsoft的窗口基本类创建工具按钮、菜单和带标签的次级窗口。
这意味着临时用户也可以不用研究手册就可以执行基本的操作。
Autodesk也致力于在实体和工程图中简化设计过程。
例如,在草图管理器中水平和垂直的约束被自动地应用。
1、(P68 3.14)求补码和1)X=0.11001,Y=-0.10111 2)X=0.10010,Y=0.110002、(P68 3.15)求补码差1)X=-0.01111,Y=0.00101 2)X=0.11011,Y=-0.100103、(第三章测试)设机器字长为8位(含1位符号位),X=115,Y=-24,用补码运算规则计算[X-Y]补并判断是否溢出。
4、(P68 3.18)已知x = 0.1010 y = -0.0110 求用补码一位乘求x • y5、(第三章测试)用补码一位乘(布斯公式法)计算[x×y]补。
设x=0.11011,y=-0.111016、(P68 3.19)x =– 0.10110,y = 0.11111,用加减交替原码一位除求[X/Y]原7、(第三章测试)设浮点数格式为:阶码5位(含1位阶符),尾数11位(含1位数符)。
写出-86.5所对应的尾数规格化的机器数。
要求如下:1)阶码和尾数均为原码。
2)阶码为移码,尾数为补码。
8、(第三章测试)设浮点数格式为:阶码4位(含1位阶符),尾数7位(含1位数符)。
按机器补码浮点运算步骤计算 [x-y]补x=2-011×0.101100,y=2-010×(-0.011100)9、见教材P68 3.21(1)1、(补充作业)用16K×16位的SRAM芯片构成32K×32位的存储器,试画出该存储器的组成逻辑图。
2、(补充作业)下图为由8片2114芯片构成的4K×8位的存储器,与8位的一个微处理器相连,2114芯片为1K×4位的SRAM芯片,问:1)每一组芯片组的地址范围和地址线数目2)4KB的RAM寻址范围是多少?3)存储器有没有地址重叠?3、见教材P86 4.6第五章1、(例题)某16位模型机,主存容量为64K字,采用单字长单地址指令,共有40种指令,试采用直接、立即、变址、相对四种寻址方式设计指令格式。
实验六:复杂模型机的设计与实现精编版MQS system office room 【MQS16H-TTMS2A-MQSS8Q8-MQSH16898】实验五复杂模型机的设计与实现一、实验目的综合运用所学计算机原理知识,设计并实现较为完整的计算机。
二、实验设备Dais-CMX16+计算机组成原理教学实验系统一台,实验用导线若干。
三、数据格式及指令系统1.数据格式其中第7。
2.指令格式模型机设计四大类指令共16条,其中包括算术逻辑指令、I/O指令、访问及转移指令和停机指令。
⑴算术逻辑指令设计9条算术逻辑指令并用单字节表示,寻址方式采用寄存器直接寻址,其格式如下:其中,OP-CODE其中9条算术逻辑指令的名称、功能和具体格式见表5-1。
⑵访问指令及转移指令模型机设计2条访问指令,即存数(STA)、取数(LDA),2条转移指令,即无条件转移(JMP)、结果为零或有进位转移指令(BZC指令使用)。
D为十⑶I/O指令输入(IN)和输出(⑷停机指令 指令格式如下:HALT 3. 指令系统本模型机共有16条基本指令,其中算术逻辑指令9条,访问内存指令和程序控制指令4条,输入输出指令2条,其它指令1条。
下表列出了各条指令的格式、汇编符号、指令功能。
表5-1图5-1复杂模型机微程序流程图按照系统建议的微指令格式,参照微指令流程图,将每条微指令代码化,译成二进制代四、实验方法㈠键盘操作⑴首先卸去实验连接,然后按如下操作,把系统工作方式设为“微控/在线”。
在待命状态0下按【减址】键,LCD 显示器显示工作模式选项:按【增址】键,将光标移到“MUD ”微程序模式,按【减址】键确定后,系统先询问用户是否使用搭接方式,按【增址】键选择“y ”(搭接)或“n ”(在线),按【减址】键确定:接着系统询问用户是否使用扩展I/O 方式,按【增址】键选择“y ”(扩展I/O )或“n ”(微控制器关联),按【减址】键确定:确定设置后,系统返回待命状态0。
模型机设计实验报告一、实验目的本次实验的目的是通过设计和制作模型机,掌握机械设计的基本原理和方法,提高学生的机械制图和机械加工能力,培养学生的创新思维和动手能力。
二、实验原理模型机是一种小型机械装置,通常由多个零部件组成,可以模拟真实机器的运行原理。
在设计模型机时,需要考虑机器的结构、功能和材料等因素,以确保机器的稳定性和可靠性。
在本次实验中,我们采用了三维建模软件进行机器的设计,然后使用数控机床进行机器的加工。
在加工过程中,需要注意机器的精度和加工质量,以确保机器的性能和使用寿命。
三、实验步骤1. 设计模型机的结构和功能,确定机器的材料和尺寸。
2. 使用三维建模软件进行机器的设计,包括零部件的设计和组装。
3. 将设计好的模型导入数控机床,进行机器的加工。
4. 对加工好的零部件进行组装和调试,确保机器的性能和稳定性。
5. 对机器进行测试和评估,记录机器的性能和使用情况。
四、实验结果经过设计和制作,我们成功地制作出了一台模型机。
该机器采用了铝合金材料,具有较高的强度和耐腐蚀性。
机器的结构紧凑,功能齐全,可以模拟真实机器的运行原理。
在加工过程中,我们采用了数控机床进行加工,确保了机器的精度和加工质量。
在组装和调试过程中,我们注意了机器的细节和性能,确保了机器的稳定性和可靠性。
经过测试和评估,我们发现该机器的性能和使用情况良好,可以满足实际应用的需求。
五、实验总结通过本次实验,我们掌握了机械设计的基本原理和方法,提高了机械制图和机械加工能力,培养了创新思维和动手能力。
同时,我们也了解了数控机床的加工原理和操作方法,提高了数控加工的技能和水平。
在今后的学习和工作中,我们将继续加强机械设计和制造方面的学习和实践,不断提高自己的技能和能力,为实现自己的梦想和目标做出更大的贡献。
16位CPU的设计要求:此模型机的功能是将存储区的数据块复制到另一个存储区。
汇编代码如下:START:LOADI R1,0010H ;源操作数地址送R1LOADI R2,0030H ;目的操作数地址送R2LOADI R6,002FH ;结束地址送R6NEXT:LOAD R3,[R1] ;取数STORE [R2],R3 ;存数BRANCHGTI START ;如果R1>R6,则转向STARTINC R1 ;修改源地址INC R2 ;修改目的地址BRANCHI NEXT ;转向NEXT1.16位CPU的组成结构2.指令系统的设计一、指令格式1)单字指令格式2)双字指令格式操作码指令功能00001 LOAD 装载数据到寄存器00010 STORE 将寄存器的数据存入到存储器00100 LOADI 将立即数装入到寄存器00101 BRANCHI 无条件转移到由立即数指定的地址00110 BRANCHGTI 如果源寄存器容大于目的寄存器的容,则转移到由立即数指定的地址00111 INC 寄存器容加1指令依据以上设计的指令系统,则完成数据块复制的程序如下:地址机器码指令功能说明0000H 0001H 2001H0010HLOADI R1,0010H 源操作数地址送R10002H 0003H 2002H0030HLOADI R2,0030H 目的操作数地址送R20004H 0005H 2006H002FHLOADI R6,002FH 结束地址送R60006H 080BH LOAD R3,[R1] 取数0007H 101AH STORE [R2],R3 存数0008H 0009H 300EH0000HBRANCHGTI 0000 如果R1大于R6,则转向地址0000000AH 3801H INC R1 修改源地址000BH 3802H INC R2 修改目的地址000CH 000DH 2800H0006HBRANCHI 0006H 转向00006H,实现循环3.VHDL设计一、程序包:说明运算器的功能、移动寄存器的操作、比较器的比较类型和用于CPU控制的状态类型。
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;package cpu_lib issubtype t_shift is unsigned (3 downto 0);constant shftpass :unsigned(3 downto 0):="0000";constant sftl :unsigned(3 downto 0):="0001";constant sftr:unsigned(3 downto 0):="0010";constant rotl :unsigned(3 downto 0):="0011";constant rotr :unsigned(3 downto 0):="0100";subtype t_alu is unsigned(3 downto 0);constant alupass :unsigned(3 downto 0):="0000";constant andOp :unsigned(3 downto 0):="0001";constant orOp:unsigned(3 downto 0):="0010";constant notOp :unsigned(3 downto 0):="0011";constant xorOp :unsigned(3 downto 0):="0100";constant plus :unsigned(3 downto 0):="0101";constant alusub :unsigned(3 downto 0):="0110";constant inc :unsigned(3 downto 0):="0111";constant dec :unsigned(3 downto 0):="1000";constant zero:unsigned(3 downto 0):="1001";subtype t_comp is unsigned 2 downto 0);constant eq :unsigned(2 downto 0):="000";constant neq :unsigned(2 downto 0):="001";constant gt:unsigned(2 downto 0):="";constant gte :unsigned(2 downto 0):="011";constant lt :unsigned(2 downto 0):="100";constant lte :unsigned(2 downto 0):="101";subtype t_reg is std_logic_vector(2 downto 0);type state is (reset1,reset2,reset3,reset4,reset5,reset6,execute,nop,load,store,move,load2,load3,load4,store2,store3,store4,move2,move3,move4,incPc,incPc2,incPc3,incPc4,incPc5,incPc6,loadPc,loadPc2,loadPc3,loadPc4,bgtI2,bgtI3,bgtI4,bgtI5,bgtI6,bgtI7,bgtI8,bgtI9,bgtI10,braI2,braI3,braI4,braI5,braI6, loadI2,loadI3,loadI4,loadI5,loadI6,inc2,inc3,inc4);subtype bit16 is std_logic_vector(15 downto 0);end cpu_lib;二、基本部件的设计1)运算器的设计功能library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use work.cpu_lib.all;entity alu isport(a,b:in bit16;sel:in t_alu;c:out bit16);end alu;architecture rt1 of alu isbeginprocess(a,b,sel)begincase sel iswhen alupass=> c<=a after 1ns;when andop=> c<=a and b after 1ns;when orop=> c<=a or b after 1ns;when xorop=> c<=a xor b after 1ns;when notop=> c<= not a after 1ns;when plus=> c<=a + b after 1ns;when alusub=> c<=a - b after 1ns;when inc => c<=a +"0000000000000001" after 1ns; when dec => c<=a -"0000000000000001" after 1ns; when zero => c<="0000000000000000" after 1ns; when others => c<="0000000000000000" after 1ns; end case;end process;end rt1;2)比较器library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;use work.cpu_lib.all;entity comp isport (a,b:in bit16;sel:in t_comp;compout:out bit);architecture rt1 of comp isbeginprocess(a,b,sel)begincase sel iswhen eq => if a=b then compout <='1' after 1ns;else compout<='0' after 1ns;end if;when neq => if a/=b then compout <='1' after 1ns;else compout<='0' after 1ns;end if;when gt => if a>b then compout <='1' after 1ns;else compout<='0' after 1ns;end if;when gte => if a>=b then compout <='1' after 1ns;else compout<='0' after 1ns;end if;when lt => if a<b then compout <='1' after 1ns;else compout<='0' after 1ns;end if;when lte => if a<=b then compout <='1' after 1ns;else compout<='0' after 1ns;end if;when others=> compout<='0' after 1ns;end case;end process;end rt1;3)移位寄存器use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use work.cpu_lib.all;entity shift isport(a:in bit16;sel:in t_shift;y:out bit16);end shift;architecture rt1 of shift isbeginprocess(a,sel)begincase sel iswhen shftpass => y<=a after 1 ns;when sftl=> y<=a(14 downto 0) &'0' after 1 ns;when sftr=> y<='0'& a(15 downto 1) after 1 ns;when rotl=> y<=a(14 downto 0) & a(15) after 1 ns;when rotr=> y<= a(0) & a(15 downto 1) after 1 ns;when others=> y<="0000000000000000" after 1 ns; end case;end process;end rt1;4)寄存器library ieee;use ieee.std_logic_1164.all;use work.cpu_lib.all;entity reg isport(a:in bit16;clk:in std_logic;q:out bit16);end reg;architecture rt1 of reg isbeginprocessbeginwait until clk'event and clk='1';q<=a after 1ns;end process;end rt1;5)寄存器组library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use work.cpu_lib.all;entity regarray isport(data:in bit16;sel:in t_reg;en,clk:in std_logic;q:out bit16); end regarray;architecture rt1 of regarray istype t_ram is array (0 to 7) of bit16;signal temp_data:bit16;beginprocess(clk,sel)variable ramdata:t_ram;beginif clk'event and clk='1' then ramdata(conv_integer(sel)):=data;end if;temp_data<=ramdata(conv_integer(sel)) after 1 ns;end process;process(en,temp_data)beginif en='1' then q<=temp_data after 1 ns;else q<="ZZZZZZZZZZZZZZZZ" after 1 ns;end if;end process;end rt1;6)三态寄存器library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use work.cpu_lib.all;entity trireg isport(a:in bit16;en,clk:in std_logic;q:out bit16);end trireg;architecture rt1 of trireg issignal val:bit16;beginprocessbeginwait until clk'event and clk='1';val<=a;end process;process(en,val)beginif en='1' then q<=val after 1 ns;elsif en='0' then q<="ZZZZZZZZZZZZZZZZ" after 1 ns;else q<="XXXXXXXXXXXXXXXX" after 1 ns;end if;end process;end rt1;7)控制器采用状态机实现library IEEE;use IEEE.std_logic_1164.all;use work.cpu_lib.all;entity control isport( clock,reset,compout:in std_logic; instrReg:in bit16;progCntrWr,progCntrRd,addrRegWr,outRegWr,outRegRd:out std_logic;shiftSel:out t_shift; aluSel:out t_alu; compSel:out t_comp;opRegRd,opRegWr,instrWr,regRd,regWr,rw,vma:out std_logic;regSel:out t_reg );end control;architecture rtl of control issignal current_state, next_state : state;beginprocess( current_state, instrReg, compout)beginprogCntrWr <= '0'; progCntrRd <= '0'; addrRegWr <= '0';outRegWr <= '0';outRegRd <= '0'; shiftSel <= shftpass; aluSel <= alupass;compSel <= eq;opRegRd <= '0'; opRegWr <= '0'; instrWr <= '0'; regSel <= "000";regRd <= '0'; regWr <= '0'; rw <= '0'; vma <= '0';case current_state iswhen reset1=> aluSel<=zero after 1 ns; shiftSel<=shftpass; next_state<=reset2;when reset2 => aluSel<=zero; shiftSel<=shftpass; outRegWr<='1'; next_state<=reset3;when reset3 => outRegRd<='1'; next_state<=reset4;when reset4 => outRegRd<='1'; progCntrWr<='1';addrRegWr<='1'; next_state<=reset5;when reset5 => vma<='1'; rw <= '0'; next_state <= reset6;when reset6 => vma<='1'; rw<='0';instrWr<='1'; next_state<=execute;when execute => case instrReg(15 downto 11) iswhen "00000" => next_state <= incPc ;-- nopwhen "00001" => regSel<=instrReg(5 downto 3); regRd<='1';next_state<=load2;when "00010" => regSel<=instrReg(2 downto 0); regRd<='1';next_state<=store2;-- storewhen "00011" => regSel<=instrReg(5 downto 3); regRd<='1';aluSel<=alupass;shiftSel<=shftpass; next_state<=move2;when "00100" => progcntrRd<='1'; alusel<=inc; shiftsel<=shftpass;next_state<=loadI2;when "00101" => progcntrRd<='1'; alusel<=inc; shiftsel<=shftpass;next_state<=braI2;when "00110" => regSel<=instrReg(5 downto 3);regRd<='1';next_state<=bgtI2;--BranchGTImm when "00111" => regSel<=instrReg(2 downto 0); regRd<='1'; alusel<=inc;shiftsel<=shftpass; next_state<=inc2;when others =>next_state <= incPc;end case;when load2 => regSel <= instrReg(5 downto 3); regRd <= '1';addrregWr <= '1';next_state <= load3;when load3 => vma <= '1'; rw <= '0'; next_state <= load4;when load4 => vma <= '1'; rw <= '0'; regSel <= instrReg(2 downto 0);regWr <= '1';next_state <= incPc;when store2 => regSel <= instrReg(2 downto 0); regRd <= '1';addrregWr <= '1';next_state <= store3;when store3 => regSel <= instrReg(5 downto 3); regRd <= '1';next_state <= store4;when store4 => regSel <= instrReg(5 downto 3); regRd <= '1'; rw <= '1'; next_state <= incPc;when move2 => regSel <= instrReg(5 downto 3); regRd <= '1';aluSel <=alupass;shiftsel <= shftpass; outRegWr <= '1'; next_state <= move3;when move3 => outRegRd <= '1'; next_state <= move4;when move4 =>outRegRd <= '1';regSel <= instrReg(2 downto 0); regWr <= '1';next_state <= incPc;when loadI2 => progcntrRd <= '1'; alusel <= inc; shiftsel <= shftpass;outregWr <= '1';next_state <= loadI3;when loadI3 => outregRd <= '1'; next_state <= loadI4;when loadI4 => outregRd <= '1'; progcntrWr<='1'; addrregWr<='1';next_state<=loadI5;when loadI5 => vma <= '1'; rw <= '0'; next_state <= loadI6;when loadI6 => vma <= '1'; rw <= '0';regSel <= instrReg(2 downto 0);regWr <= '1';next_state <= incPc;when braI2 => progcntrRd <= '1'; alusel <= inc; shiftsel <= shftpass;outregWr <= '1';next_state <= braI3;when braI3 => outregRd <= '1'; next_state <= braI4;when braI4 => outregRd<='1'; progcntrWr<='1'; addrregWr<='1';next_state<=braI5;when braI5 => vma<='1'; rw<='0'; next_state <= braI6;when braI6 => vma <= '1'; rw <= '0';progcntrWr <= '1'; next_state <= loadPc;when bgtI2 => regSel <= instrReg(5 downto 3); regRd <= '1';opRegWr <= '1';next_state <= bgtI3;when bgtI3 => opRegRd <= '1'; regSel <= instrReg(2 downto 0);regRd <= '1'; compsel <= gt;next_state <= bgtI4;when bgtI4 => opRegRd <= '1' after 1 ns;regSel <= instrReg(2 downto 0); regRd <= '1';compsel <= gt;if compout = '1' then next_state <= bgtI5;else next_state <= incPc;end if;when bgtI5 => progcntrRd<='1'; alusel<=inc; shiftSel<=shftpass;next_state<=bgtI6;when bgtI6 => progcntrRd <= '1'; alusel <= inc; shiftsel <= shftpass;outregWr <= '1'; next_state <= bgtI7;when bgtI7 => outregRd <= '1'; next_state <= bgtI8;when bgtI8 =>outregRd <= '1';progcntrWr <= '1'; addrregWr <= '1'; next_state <= bgtI9;when bgtI9 => vma <= '1'; rw <= '0'; next_state <= bgtI10;when bgtI10 => vma <= '1'; rw <= '0'; progcntrWr <= '1'; next_state <= loadPc;when inc2 => regSel <= instrReg(2 downto 0); regRd <= '1'; alusel <= inc;shiftsel <= shftpass;outregWr <= '1'; next_state <= inc3;when inc3 => outregRd <= '1'; next_state <= inc4;when inc4 => outregRd <= '1'; regsel <= instrReg(2 downto 0);regWr <= '1'; next_state <= incPc; when loadPc => progcntrRd <= '1'; next_state <= loadPc2;when loadPc2 => progcntrRd <= '1'; addrRegWr <= '1'; next_state <= loadPc3;when loadPc3 => vma <= '1'; rw <= '0'; next_state <= loadPc4;when loadPc4 => vma <= '1'; rw <= '0'; instrWr <= '1'; next_state <= execute;when incPc => progcntrRd<='1'; alusel<=inc; shiftsel<=shftpass;next_state<=incPc2;when incPc2 => progcntrRd <= '1'; alusel <= inc; shiftsel <= shftpass;outregWr <= '1';next_state <= incPc3;when incPc3 => outregRd <= '1'; next_state <= incPc4;when incPc4 => outregRd<='1'; progcntrWr<='1';addrregWr<='1'; next_state<=incPc5;when incPc5 => vma <= '1'; rw <= '0'; next_state <= incPc6;when incPc6 => vma <= '1'; rw <= '0'; instrWr <= '1'; next_state <= execute;when others => next_state <= incPc;end case;end process;process(clock, reset)beginif reset = '1' then current_state <= reset1 after 1 ns;elsif clock'event and clock = '1'then current_state <= next_state after 1 ns;end if;end process;end rtl;8)存储器的设计LPM_RAM定制首先,定制初始化数据文件,建立Memory Initialization File(.mif)文件,选择File→New命令,并在New窗口选择Other file选项,再选择Memory Initialization File选项。