基于FPGA的8085A CPU结构分析与实现-设计应用_第1页
基于FPGA的8085A CPU结构分析与实现-设计应用_第2页
基于FPGA的8085A CPU结构分析与实现-设计应用_第3页
基于FPGA的8085A CPU结构分析与实现-设计应用_第4页
基于FPGA的8085A CPU结构分析与实现-设计应用_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

精品文档-下载后可编辑基于FPGA的8085ACPU结构分析与实现-设计应用1引言

微型计算机原理几乎是所有理工科类大学生的必修课目之一,其重要性不言而喻。然而大多数教学侧重于应用方面,对计算机的结构及工作原理涉之不深,因为无法做一个CPU来演示。这样学生不能真正了解其性能特点,掌握内部结构,在学习汇编语言的时候增加了难度,影响学习兴趣。随着可编程逻辑器件的广泛应用,给数字系统的设计带来了极大的灵活性,用户可以利用现场可编程门阵列FPGA来开发出一个适合自己的专用CPU,对微型计算机的原理及结构进行充分理解与研究,便于将来从事相关ASIC设计,开发出创新型的产品,为我国计算机发展做贡献。

现场可编程门阵列FPGA门数众多,人们可以将合适的IP软核或其他形式的核作为嵌入式模块装在自己的设计中。但通常IP软核需要门数较多的FPGA器件支持,作为学习来说的FPGA芯片往往资源有限,需要节约FPGA的成本与面积;并且没必要实现所有功能,只要做出关键部分及重要结构,明白其运行机理,又能与真实的CPU紧密相联即可。实验箱上采用的FPGA芯片为Altera公司的EPF10K20TC144-4。这里以Intel的8085A为例来说明8位计算机的工作原理。

28085ACPU设计及实现

2.1FPGA芯片及外围电路简介

Altera的FLEX10K器件是工业界首例嵌入式PLD,基于可重配置CMOSSRAM元件。EPF10K20带有144个LAB(逻辑阵列块)和1152个逻辑单元,I/O数目为189。另外,芯片中嵌入式陈列块(EAB)有6个,其RAM总位数为12288。

实验涉及到FPGA芯片的外围部分包括控制开关、2*8键盘输入、6个数码管输出、8个输入端口、8个输出端口及2个中断开关等。主要用来增添程序设计的灵活性及形象性,使其可现场调试,验证结果,避免单纯用软件仿真的不足。外围电路控制模块及结构可参见文献[1]。

现场调试时可以通过控制开关,手动从键盘输入相应的地址及数据(通过数码管显示),输错可以修改;用写使能开关给RAM写入相应程序。当输入完所有程序后,按下运行开关即可执行程序,在数码管上显示地址、数据及终结果。控制开关用于配合键盘通过手动方式输入程序,可以形象化的现场编程。在软件后不使用计算机,通过按钮、键盘就能将程序输入到RAM中,然后运行,显示出结果。

2.2CPU模块

2.2.1内部结构

CPU模块的内部结构如图1所示。微型计算机由下面几个部分组成:8位通用寄存器H、L,16位程序计数器(PC),16位堆栈指示器(SP),一个加1/减1地址锁存器(ADD/ADR),8位NL寄存器(NL),8位中断时间寄存器(TIMER);算术逻辑单元(ALU),累加器(A),标志寄存器(FR),数据选择器(SEL);指令寄存器(IR),控制器(CON),4选1多路选择器(MUX),存储地址寄存器(MAR),8位数据寄存器(MDR);输入数据寄存器(INDT),输出数据寄存器(OUTDT)等部分组成。其中标志寄存器有4位,分别是:进位位(Cy)、零位(Z)、符号位(S)、奇偶位(P),微机通过检测这些标志位的1位或多位来判断程序是否需要转移。

图1微型计算机CPU结构图

图中字母L为数据载入控制信号,E为三态输出选通信号,clk为时钟信号,clr为清零信号,W为数据载入PC信号,Cpc为控制PC加1信号,S3-S0为控制ALU进行加减、逻辑运算或移位运算的选择信号,Iadr、Dadr为加1/减1地址锁存器加1减1控制信号,Isp、Dsp为堆栈指示器的加1减1控制信号,Eram、Wram为读写RAM控制信号。另外,累加器(A),标志寄存器(FR)增加了专用的清零信号。

所有的控制、时钟及清零信号由控制器(CON)模块给出,而CON模块由外部时钟clkin、清零信号rst及使能信号enable控制。存储地址寄存器(MAR)用来给RAM输送地址,从RAM读指令和数据,也可以给RAM写数据。

Altera公司的EPF10K20TC144-4芯片中有6个嵌入式陈列块,其RAM总位数为12288。这里RAM可配置为1024*8(1024个地址,8位数据),直接调用参数可设置模块库中LPM_RAM_IO的LPM_FILE文件,用文本编辑器编辑mif文件来初始化数据。如果不用FPGA的内部RAM,可外接64K的8位RAM,即寻址空间为64K。

2.2.2指令系统

内部工作原理和指令系统紧密相联。本微机共有54条指令,可分为8类,即数据传送指令、算术与逻辑运算指令、移位指令、增量与减量指令、堆栈操作及中断指令、转移指令、子程序调用及返回指令、其它指令等。指令系统与8080/8085的指令系统表基本一致,标志位的变化(无辅助进位位)与其相同,可参见文献。

由于资源所限,没有使用8085A所有的寄存器及某些功能,如B、C、D、E寄存器等,但是这并不妨碍本微机能够实现其绝大多数功能。从时钟周期数(状态数)来说,比8085A更少,也就是说速度更快。

数据传送指令有14条(一个n表示一个8位二进制数据):3个状态数的movah(将H的内容存入A)、movha、movla(将A的内容存入L)、mova;l4状态的mvian(将数据n存入A)、mvihn、mviln、mvitn(将数据n存入time寄存器,此指令为新增);5状态的movma(将A的内容装入HL所指的地址)、movam;4状态数的sphl(将HL寄存器的内容装入SP);6状态的inn(n所指地址的内容给A)、outn;4状态的cd_out(A内容给PC+1,停机,此指令为新增)等。

算术与逻辑运算指令有13条:3状态的cmc(Cy符号取反)、stc(Cy置1)、cma(寄存器A内容取反);4状态的addh(将A与H相加后给A)、adin(将A与n相加后给A)、subh、suin、cmph(将A与H相比较(只影响符号))、adch(将A与H及符号Cy相加后给A)、sbbh、anah(将A与H寄存器的内容相与后给A)、orah、xrah(将A与H异或后给A)等。

移位指令有4条,同8085A。增量与减量指令有4条,只针对H、L寄存器。堆栈操作及中断指令有8条:7状态的pushh(HL压入堆栈)、pushp(AF压入堆栈);6状态的poph、popp;8状态的rsta(重新启动);3状态的etime(T寄存器使能,此指令为新增)、eint(中断使能)、dint等。转移指令有5条:7状态的jmpn(无条件转移至程序nn,低位在前);不跳转时5状态,跳转时7状态的jnn(Z=1时转移至程序nn)、jcn、jmn、jpen等。子程序调用及返回指令有2条:11状态的calln(保留当前PC,转移至程序nn,低位在前)、7状态的ret(返回)。其它指令有4条:3状态的nop、clrF(标志寄存器清零,此指令为新增)、clrA(A清零,此指令为新增)、hlt等。

状态数的计算,若本次指令的前面一指令为3状态数时,本指令将会减少1状态。如:movha,adin;若第1指令movha前没有其它3状态指令时,它是3个状态,而adin会减少1状态,由原来的4状态变为3状态。再如:movla,movha;则后一状态由3状态变成2状态。其余类似(但不包括rsta)。

2.2.3工作原理

由图1可知,不同的子模块一共有20个,每个模块用VHDL程序来实现,用元件例化语句构成总模块。下面以设计算术逻辑部件模块c_alu及控制模块c_con为例简要介绍一下思路。

(1)算术逻辑部件c_alu。

算术逻辑部件c_alu非常占用FPGA的逻辑单元logiccells,需要尽量优化。S3-S0为控制ALU进行加减、逻辑或移位运算的选择信号,一共可得到16种运算,这里用了13种:6种算术、3种逻辑运算和4种移位指令。如加法、减法、加1、减1、带符号位加法、带符号位减法;A或B、A与B、A异或B;A左移、A右移、A带Cy左移、A带Cy右移等。另外,ALU的运算直接影响到符号位的变化,运算结果存入标志寄存器(FR)。有关alu的运算多为4个状态。

(2)控制模块c_con。

占用FPGA的逻辑单元logiccells多的是控制模块c_con。在参考文献[3]中的思路不再适合于稍大型的CPU设计,但它是理解如何控制CPU信号的一个起点。对于一条指令应该细化到每一个步骤及每一位,而不再是以一个控制字的方式去实现。以指令movah为例,首先把PC值送入MAR寄存器,此为状态s0,这时起作用的是Lmar;然后在状态s1时,PC值加1,将存储器单元中的内容读入到IR,这时Cpc、Eram、Lir起作用,Lmar不再起作用,需要置0;接着在状态s2时,对IR寄存器中的指令进行译码,所有的操作指令都是在此状态译码(不包括rsta)。对于3状态指令,不保存指令,直接执行,然后跳转到状态s1。因此对于下一条指令来说,其状态数减1。

指令中状态数多的是子程序调用calln指令。

Calln指令要保存PC值到SP-1及SP-2中,然后跳转到子程序。考虑到返回指令ret执行后,PC要重新在原位置执行,那么存入SP中的PC值应该是在得到其指令后加3。对PC进行单独加3是一种思路,但需要另外耗费资源,并且增加状态。这里采用了先把calln后的nn存入16位的加1/减1地址锁存器,然后保存PC到SP,再将nn赋值给PC,跳转到子程序的方法。返回指令ret不仅可以用作子程序调用后的返回,还可用于中断的返回。

2.3..FPGA实现及编程思路

由于使用内部RAM,其地址空间为0000-03FFH。通常在00H中放入28(即jmpn,跳转指令),将程序跳转到从40H开始。把03-0EH作为放常用变量的空间,用inn及outn指令来调用,以解决寄存器不足的缺陷。这也是一种编程思路,可参见文献[4]。0FH、1FH、2FH分别为外部中断0(int0),外部中断1(int1),定时器中断(time)的起始位置。Int0优先级,int1次之,time。中断信号高电平有效。中断功能的实现是为了学习其工作原理,只做了一个定时器中断。计时为减1方式,当计时为0时,发出中断信号。Time中断的使用方法:首先关中断(dint),给T赋值(mvitn),再开中断(eint),T寄存器使能(etime)。此后,T寄存器正常工作。若要再次使用,首先给T赋值,然后T寄存器使能。

初始时的PC为0000H,SP为03FFH。SP的更改可通过指令sphl来执行。针对实验箱,将8000-0FFFFH作为输出口地址,4000-7FFFH作为输入口地址。而实际实验箱上只定义了1个8位输入,1个8位输出。IO口的操作可通过movam及movma指令去实现。

由于键盘输入时,要进行去抖动处理,使用了两种不同的时钟频率。键盘处理采用1KHz的频率,而CPU的工作时钟可选择实验箱上的不同频率,从1Hz到10MHz皆可,甚至可以外接其它更高频率。

如果采用1Hz的clkin频率,可以清楚地看到CPU工作的每一过程。

将本微机到实验箱上,已成功实现了乘法(用减1或右移的方法),调用子程序,IO口的使用,中断的使用等多项实验,验证了CPU设计的正确性。

3结束语

QuartusII对微机进行编译,其逻辑单元LE用到1151,占100%。用FPGA来实现CPU的功能,研究其工作原理,然后用Synplifypro软件对其进行门级研究,对CPU的面纱将不再感

温馨提示

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

评论

0/150

提交评论