简单微处理器的设计.docx
《简单微处理器的设计.docx》由会员分享,可在线阅读,更多相关《简单微处理器的设计.docx(22页珍藏版)》请在冰豆网上搜索。
简单微处理器的设计
文件排版存档编号:
[UYTR-OUPT28-KBNTL98-UYNN208]
简单微处理器的设计
简单微处理器的设计
摘要:
本课程设计采用EDA技术设计简单微处理器。
系统设计采用自顶向下的设计方法。
它由数的输入,数的比较,数的交换和结果输出四部分组成。
系统实现采用硬件描述语言VHDL把系统电路按模块化方式进行设计,然后进行编程、时序仿真并分析。
系统结构简单,使用方便,功能齐全,精度高,具有一定的应用价值。
关键词:
处理器;输入;比较;交换
1引言
随着社会的发展,科学技术也在不断的进步。
特别是计算机产业,可以说是日新月异,而处理器,作为计算机中的一个重要部分,其性能从很大程度上决定了计算机的性能。
本设计介绍的简单微处理器,要求具有以下验证程序所要求的功能:
输入包含10个整数(无符号数)的数组M,按从小到大的顺序输出这10个数。
课题设计的背景、目的
微处理器技术的发展是与微电子技术即大规模集成电路技术的发展分不开的。
微电子技术以每18个月集成度提高一倍的速度迅速发展。
20世纪80年代初,主要是16位微处理器8086/8088。
1985年推出了80386微处理器,完成了16位体系结构向32位体系结构的转变。
1989年80486出现了。
80486的设计目标是提高指令执行速度和支持多处理器系统。
80486在芯片内部增加一个8KB的高速缓冲存储器(cache),还增加了相当于80387的浮点部件(FPU),在基本指令的实现上,采用硬布线逻辑而不是微程序技术。
1993年3月,Intel公司推出了第一代“奔腾”微处理器(Pentium),微处理器技术发展进入了一个新的阶段。
到目前为止,“奔腾”已有四代产品。
“奔腾”的设计思想是把如何提高微处理器内部指令执行的并行性作为主导。
指令执行的并行性越好,微处理器的性能就越高。
本次设计的目的就是了解并掌握VHDL硬件描述语言的设计方法和思想,通过学习的VHDL语言结合电子电路的设计知识理论联系实际,掌握所学的课程知识,学习VHDL基本单元电路的综合设计应用。
通过对实用电子称的设计,巩固和综合运用所学课程,理论联系实际,提高IC设计能力,提高分析、解决计算机技术实际问题的独立工作能力。
通过课程设计深入理解VHDL语言的精髓,达到课程设计的目标。
课程设计的内容
本设计主要介绍的设计一台简单微处理器,要求具有以下验证程序所要求的功能:
输入包含10个整数(无符号数)的数组M,按从小到大的顺序输出这10个数。
(1)程序开始及输入10个数据。
(2)数的比较。
(3)交换两个数。
(4)结果输出(从小到大)。
2EDA、VHDL简介
EDA简介
EDA是ElectronicDesignAutomation(电子设计自动化)的缩写,EDA技术是20世纪90年代初以来迅速发展起来的现代电子工程领域的一门新技术。
它可以编程逻辑器件(PLD)为载体,以计算机为工作平台,以EDA工具软件为开发环境,以硬件描述语言(HDL)作为电子系统功能描述方式,以电子系统设计为应用方向的电子产品自动化设计过程。
简介
VHDL的英文全名是Very-High-SpeedIntegratedCircuitHardwareDescriptionLanguage,诞生于1982年。
1987年底,VHDL被IEEE和美国国防部确认为标准硬件描述语言。
自IEEE公布了VHDL的标准版本,IEEE-1076(简称87版)之后,各EDA公司相继推出了自己的VHDL设计环境,或宣布自己的设计工具可以和VHDL接口。
此后VHDL在电子设计领域得到了广泛的接受,并逐步取代了原有的非标准的硬件描述语言。
1993年,IEEE对VHDL进行了修订,从更高的抽象层次和系统描述能力上扩展VHDL的内容,公布了新版本的VHDL,即IEEE标准的1076-1993版本,(简称93版)。
现在,VHDL和Verilog作为IEEE的工业标准硬件描述语言,又得到众多EDA公司的支持,在电子工程领域,已成为事实上的通用硬件描述语言。
有专家认为,在新的世纪中,VHDL于Verilog语言将承担起大部分的数字系统设计任务。
语言的特点
VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可是部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。
在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。
这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。
应用VHDL进行工程设计的优点是多方面的。
(1)与其他的硬件描述语言相比,VHDL具有更强的行为描述能力,从而决定了他成为系统设计领域最佳的硬件描述语言。
强大的行为描述能力是避开具体的器件结构,从逻辑行为上描述和设计大规模电子系统的重要保证。
(2)VHDL丰富的仿真语句和库函数,使得在任何大系统的设计早期就能查验设计系统的功能可行性,随时可对设计进行仿真模拟。
(3)VHDL语句的行为描述能力和程序结构决定了他具有支持大规模设计的分解和已有设计的再利用功能。
符合市场需求的大规模系统高效,高速的完成必须有多人甚至多个代发组共同并行工作才能实现。
(4)对于用VHDL完成的一个确定的设计,可以利用EDA工具进行逻辑综合和优化,并自动的把VHDL描述设计转变成门级网表。
(5)VHDL对设计的描述具有相对独立性,设计者可以不懂硬件的结构,也不必管理最终设计实现的目标器件是什么,而进行独立的设计。
的设计流程
它主要包括以下几个步骤:
1.设计规范的定义
这个有点象系统的设计的总体规划,就是要明确这个系统有哪些设计要求,和你要想到达的目标。
2.采用VHDL进行设计描述
这部分包括设计规划和程序的编写。
设计规划主要包括设计方式的选择及是否进行模块划分。
设计方式一般包括直接设计,自顶向下和自底向下设计,这个和其他软件语言差不多。
最重要还是模块划分,这个和设计者的设计水平有很大关系。
完成规划设计后,就可以编写个模块的VHDL程序了,最后将各模块的VHDL程序综合起来就完成了整个设计的VHDL描述.
程序仿真
这个过程和其他软件语言没什么区别。
4.综合、优化和布局布线
综合指的是将设计描述转化成底层电路的表示形式,其结果是一个网表或者是一组逻辑方程;优化,这个主要是为了提高程序的执行效率及减少资源的利用;布局布线,指的是将逻辑关系转化成电路连接的方式。
5.后仿真。
这个与VHDL程序仿真不同,这个不仅是对逻辑方面的验证,还要进行时序功能验证。
6.器件编程
3简单微处理器的设计过程
设计规划
计算器通过简单的数字键盘输入操作数,其中所键入的数据将被暂存在移位寄存器中,然后根据运算符执行产生不同的操作结果,所获得的运算结果再通过译码电路转移到七段显示器输出。
整个微处理器的工作原理图如图所示。
图微处理器的工作原理图
各模块设计及相应程序
本系统设计了10条指令:
IN1(输入到目的寄存器),MOV(将一个数送入目的寄存器),MOV1(将源寄存器中的数据存储到目的寄存器所指向的地址单元),MOV2(将源寄存器所指向的地址单元中的数送入目的寄存器),OUT1(输出),CMP(将目的寄存器和源寄存器所指向的地址单元中的数据进行比较),DEC(将目的寄存器中的数据自减一),INC(将目的寄存器中的数据自加一),JMP(无条件跳转),JB(小于跳转),下表列出了每条指令的格式、汇编符号和指令功能。
表指令系统格式表
助记符号
指令格式
功能
IN1Rd
1000
××
Rd
(SW)->Rd
MOVimRd
1001
××
Rd
im
(im)->Rd
MOV1Rs[Rd]
1010
Rs
Rd
(Rs)->[Rd]
MOV2[Rs]Rd
1011
Rs
Rd
([Rs])->Rd
OUT1Rd
1100
Rs
××
(Rs)->LED
CMPRsRd
1101
Rs
Rd
(Rs)-(Rd),锁存CY和ZI
DECRd
1110
××
Rd
(Rd)-1->Rd
INCRd
1111
××
Rd
(Rd)+1->Rd
JMPaddr
0110
××××
addr
addr->PC
JBaddr
0111
××××
addr
若小于,则addr->PC
关键程序
数的选择模块
LIBRARYIEEE;
USEMUX5IS
PORT(
R0_B,R1_B,R2_B,R3_B,ALU_B:
INSTD_LOGIC;
R0_IN,R1_IN,R2_IN,R3_IN,ALU_IN:
INSTD_LOGIC_VECTOR(7DOWNTO0);
MUX5OUT:
OUTSTD_LOGIC_VECTOR(7DOWNTO0)
);
ENDMUX5;
ARCHITECTUREAOFMUX5IS
BEGIN
PROCESS(ALU_B,R3_B,R2_B,R1_B,R0_B)
BEGIN
IF(ALU_B='1'ANDR3_B='1'ANDR2_B='1'ANDR1_B='1'ANDR0_B='0')THEN
MUX5OUT<=R0_IN;
ELSIF(ALU_B='1'ANDR3_B='1'ANDR2_B='1'ANDR1_B='0'ANDR0_B='1')THEN
MUX5OUT<=R1_IN;
ELSIF(ALU_B='1'ANDR3_B='1'ANDR2_B='0'ANDR1_B='1'ANDR0_B='1')THEN
MUX5OUT<=R2_IN;
ELSIF(ALU_B='1'ANDR3_B='0'ANDR2_B='1'ANDR1_B='1'ANDR0_B='1')THEN
MUX5OUT<=R3_IN;
ELSIF(ALU_B='0'ANDR3_B='1'ANDR2_B='1'ANDR1_B='1'ANDR0_B='1')THEN
MUX5OUT<=ALU_IN;
ELSEMUX5OUT<=ALU_IN;
ENDIF;
ENDPROCESS;
ENDA;
LIBRARYIEEE;
USEFEN2IS
PORT(
MUX5_IN:
INSTD_LOGIC_VECTOR(7DOWNTO0);
LED_B,WR:
INSTD_LOGIC;
OUT_MUX3,OUT_PUT:
OUTSTD_LOGIC_VECTOR(7DOWNTO0)
);
ENDFEN2;
ARCHITECTUREAOFFEN2IS
BEGIN
PROCESS(LED_B)
BEGIN
IF(LED_B='0'ANDWR='0')THEN
OUT_PUT<=MUX5_IN;
OUT_MUX3<="00000000";
ELSE
OUT_MUX3<=MUX5_IN;
ENDIF;
ENDPROCESS;
ENDA;
LIBRARYIEEE;
USEMUX3IS
PORT(
SW_B,CS:
INSTD_LOGIC;
FEN2_IN,MUX2_2IN,SW_IN:
INSTD_LOGIC_VECTOR(7DOWNTO0);
MUX3OUT:
OUTSTD_LOGIC_VECTOR(7DOWNTO0)
);
ENDMUX3;
ARCHITECTUREAOFMUX3IS
BEGIN
PROCESS(SW_B,CS)
BEGIN
IF(SW_B='0'ANDCS='1')THEN
MUX3OUT<=SW_IN;
ELSIF(SW_B='1'ANDCS='0')THEN
MUX3OUT<=MUX2_2IN;
ELSIF(SW_B='0'ANDCS='0')THEN
MUX3OUT<=FEN2_IN;
ELSE
ENDIF;
ENDPROCESS;
ENDA;
4系统仿真
数的输入
以下仿真波形图的测试输入为(34,15,25,92,17,06,83,68,72,87)。
程序开始及输入10个数据.图中的R0控制循环,R1与用自增,R2用于保存输入的数并送到与R1对应地址的RAM中.
图程序开始及输入
数的比较
如图所示,R0存放外循环的比较次数,R1存放内循环的指针。
R2存放每次比较的大数,3存放与R2比较的下一个数。
如果R3>R2则跳转到交换,否则顺序执行。
图数的比较
交换两个数。
如图,由于R3种的数25大于R2中的数15,则进行交换。
使R2每次存入最大的值后,R3继续读入R1地址的值继续进行比较。
图交换两个数
结果输出
图中的R0控制循环,R1与用自增,R2用于输出寄存器.结果从QD输出。
图中刚好从最小的数06开始输出。
图结果输出
结束语
我在老师的细心指导和同学们的耐心帮助之下成功完成了本次实验,并能得到预期的实验结果。
在这段时间内,我努力学习了计算机系统结构,VHDL等相关的各项知识,也查阅不少资料,并能够将课堂上所学的知识运用于实际的设计中,能够很好的进行理论联系实际进行开发。
通过解决这次设计和设计中遇到的问题,也积累了一定的经验。
对以后从事集成电路设计工作会有一定的帮助。
在应用VHDL的过程中让我真正领会到了其并行运行与其他软件(C语言)顺序执行的差别及其在电路设计上的优越性。
致谢
本课程设计在选题和设计过程中得到了肖晓丽老师的悉心指导,肖老师多次询问课程设计进程,并多次指导我对课程设计进行修改,帮助我完善了该课程设计。
在此对肖老师表示衷心的感谢。
还要感谢寝室的同学们,谢谢你们对我技术和精神上的帮助,谢谢你们。
参考文献
[1]黄仁欣.EDA技术实用教程.北京:
清华大学出版社,2006
[2]黄志鹏,付丽琴.可编程逻辑器件开发技术MAX+piusⅡ.北京:
国防工业出版社,2005
[3]潘松.VHDL实用教程[M].成都:
电子科技大学出版社,2000
[4]谭会生.EDA技术基础.长沙:
湖南大学出版社,2004
[5]杨刚,龙海燕.现代电子技术—VHDL与数字系统设计.北京.电子工业出版社,2004
附录
程序清单:
1ALU子模块
LIBRARYIEEE;
USEALUIS
PORT(
AC,DR:
INSTD_LOGIC_VECTOR(7DOWNTO0);
S1,S0:
INSTD_LOGIC;
BCDOUT:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);
CY,ZI:
OUTSTD_LOGIC
);
ENDALU;
ARCHITECTUREAOFALUIS
SIGNALAA,BB,TEMP:
STD_LOGIC_VECTOR(8DOWNTO0);
BEGIN
PROCESS(S1,S0)
BEGIN
IF(S1='0'ANDS0='0')THEN
BCDOUT<=AC+DR;
AA<='0'&AC;
BB<='0'&DR;
TEMP<=AA+BB;
CY<=TEMP(8);
ZI<='1';
ELSE
ZI<='0';
ENDIF;
ELSIF(S1='0'ANDS0='1')THEN
BCDOUT<=AC-DR;
AA<='0'&AC;
BB<='0'&DR;
TEMP<=AA-BB;
CY<=TEMP(8);
IF(TEMP="000000000")THEN
ZI<='1';
ELSE
ZI<='0';
ENDIF;
ELSIF(S1='1'ANDS0='0')THEN
AA<='0'&AC;
TEMP<=AA+1;
BCDOUT<=TEMP(7DOWNTO0);
CY<=TEMP(8);
ZI<='1';
ELSE
ZI<='0';
ENDIF;
ELSIF(S1='1'ANDS0='1')THEN
AA<='0'&AC;
TEMP<=AA-1;
BCDOUT<=TEMP(7DOWNTO0);
CY<=TEMP(8);
IF(TEMP="000000000")THEN
ZI<='1';
ELSE
ZI<='0';
ENDIF;
ELSE
BCDOUT<="00000000";
CY<='0';
ZI<='0';
ENDIF;
ENDPROCESS;
ENDA;
2状态条件寄存器子模块
LIBRARYIEEE;
USELS74IS
PORT(
LDFR:
INSTD_LOGIC;
CY,ZI:
INSTD_LOGIC;
FC,FZ:
OUTSTD_LOGIC
);
ENDLS74;
ARCHITECTUREAOFLS74IS
BEGIN
PROCESS(LDFR)
BEGIN
IF(LDFR'EVENTANDLDFR='1')THEN
FC<=CY;
FZ<=ZI;
ENDIF;
ENDPROCESS;
ENDA;
3时序产生器子模块
LIBRARYIEEE;
USECOUNTERIS
PORT(
Q,CLR:
INSTD_LOGIC;
T2,T3,T4:
OUTSTD_LOGIC
);
ENDCOUNTER;
ARCHITECTUREAOFCOUNTERIS
SIGNALX:
STD_LOGIC_VECTOR(1DOWNTO0);
BEGIN
PROCESS(Q,CLR)
BEGIN
IF(CLR='0')THEN
T2<='0';
T3<='0';
T4<='0';
X<="00";
ELSIF(Q'EVENTANDQ='1')THEN
X<=X+1;
T2<=(NOTX
(1))ANDX(0);
T3<=X
(1)AND(NOTX(0));
T4<=X
(1)ANDX(0);
ENDIF;
ENDPROCESS;
ENDA;
4.程序计数器子模块
LIBRARYIEEE;
USEPCIS
PORT(
LOAD,LDPC,CLR:
INSTD_LOGIC;
BUS_IN:
INSTD_LOGIC_VECTOR(7DOWNTO0);
PCOUT:
OUTSTD_LOGIC_VECTOR(7DOWNTO0)
);
ENDPC;
ARCHITECTUREAOFPCIS
SIGNALQOUT:
STD_LOGIC_VECTOR(7DOWNTO0);
BEGIN
PROCESS(LDPC,CLR,LOAD)
BEGIN
IF(CLR='0')THEN
QOUT<="00000000";
ELSIF(LDPC'EVENTANDLDPC='1')THEN
IF(LOAD='0')THEN
QOUT<=BUS_IN;--BUS->PC
ELSE
QOUT<=QOUT+1;--PC+1
ENDIF;
ENDIF;
ENDPROCESS;
PCOUT<=QOUT;
ENDA;
5ROM子模块
LIBRARYIEEE;
USEROM16IS
PORT(
ROMOUT:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);
ADDR:
INSTD_LOGIC_VECTOR(7DOWNTO0);
RE,CS_I:
INSTD_LOGIC
);
ENDROM16;
ARCHITECTUREAOFROM16IS
BEGIN
PROCESS(RE,CS_I)
BEGIN
IF(RE='0'ANDCS_I='0')THEN
CASEADDRIS
WHEN"00000001"=>ROMOUT<="00001010";
WHEN"00000011"=>ROMOUT<="00000000";
WHEN"00001000"=>ROMOUT<="01110000";--JBL1
WHEN"00001001"=>ROMOUT<="00000100";
WHEN"00001011"=>ROMOUT<="00001001";
WHEN"00001101"=>ROMOUT<="00000000";
WHEN"00010001"=>ROMOUT<="01110000";--JBL4
WHEN"00010010"=>ROMOUT<="00011111";
WHEN"00010101"=>ROMOUT<="01110000";--JBL3
WHEN"00010110"=>ROMOUT<="00011001";
WHEN"00010111"=>ROMOUT<="01100000";--JMPL2WHEN"00011000"=>ROMOUT<="00001110";
WHEN"00011101"=>ROMOUT<="01100000";--JMPL2
WHEN"00011110"=>ROMOUT<="00001110";
:
DECR0
WHEN"00100001"=>ROMOUT<="00000000";
WHEN"00100011"=>ROMOUT<="01110000";--JBL2
WHEN"00100100"=>ROMOUT<="00001110";
WHEN"00100110"=>ROMOUT<="00001010";
WHEN"00101000"=>ROMOUT<="00000000";
:
MOV2[R1]R2
WHEN"00101101"=>ROMOUT<="01110000";--JBL5
WHEN"00101110"=>ROMOUT<="00101001";
:
OUT1R2
WHEN"00110000"=>ROMOUT<="01100000";--JMPL6
WHEN"00110001"=>ROMOUT<="00101111";
WHENOTHERS=>NULL;
ENDCASE;
ENDIF;
ENDPROCESS;
ENDA;
子模块