基于FPGA的堆栈处理器设计Word格式文档下载.docx

上传人:b****4 文档编号:7930060 上传时间:2023-05-09 格式:DOCX 页数:17 大小:155.02KB
下载 相关 举报
基于FPGA的堆栈处理器设计Word格式文档下载.docx_第1页
第1页 / 共17页
基于FPGA的堆栈处理器设计Word格式文档下载.docx_第2页
第2页 / 共17页
基于FPGA的堆栈处理器设计Word格式文档下载.docx_第3页
第3页 / 共17页
基于FPGA的堆栈处理器设计Word格式文档下载.docx_第4页
第4页 / 共17页
基于FPGA的堆栈处理器设计Word格式文档下载.docx_第5页
第5页 / 共17页
基于FPGA的堆栈处理器设计Word格式文档下载.docx_第6页
第6页 / 共17页
基于FPGA的堆栈处理器设计Word格式文档下载.docx_第7页
第7页 / 共17页
基于FPGA的堆栈处理器设计Word格式文档下载.docx_第8页
第8页 / 共17页
基于FPGA的堆栈处理器设计Word格式文档下载.docx_第9页
第9页 / 共17页
基于FPGA的堆栈处理器设计Word格式文档下载.docx_第10页
第10页 / 共17页
基于FPGA的堆栈处理器设计Word格式文档下载.docx_第11页
第11页 / 共17页
基于FPGA的堆栈处理器设计Word格式文档下载.docx_第12页
第12页 / 共17页
基于FPGA的堆栈处理器设计Word格式文档下载.docx_第13页
第13页 / 共17页
基于FPGA的堆栈处理器设计Word格式文档下载.docx_第14页
第14页 / 共17页
基于FPGA的堆栈处理器设计Word格式文档下载.docx_第15页
第15页 / 共17页
基于FPGA的堆栈处理器设计Word格式文档下载.docx_第16页
第16页 / 共17页
基于FPGA的堆栈处理器设计Word格式文档下载.docx_第17页
第17页 / 共17页
亲,该文档总共17页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

基于FPGA的堆栈处理器设计Word格式文档下载.docx

《基于FPGA的堆栈处理器设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《基于FPGA的堆栈处理器设计Word格式文档下载.docx(17页珍藏版)》请在冰点文库上搜索。

基于FPGA的堆栈处理器设计Word格式文档下载.docx

c.数据位数不少于8位;

d.通过数码管显示操作数据及运算结果。

(2)发挥部分

a.具有错误提示功能;

b.数据位数不少于16位;

c.其它。

三、时间进度安排

布置课题和讲解:

1天查阅资料、设计:

4天

实验:

3天撰写报告:

2天

四、主要参考文献

何小艇《电子系统设计》浙江大学出版社2008.1

潘松黄继业《EDA技术实用教程》科学出版社2006.10

齐晶晶《现代电子系统设计》实验指导书电工电子实验教学中心2009.8

指导教师签字:

2010年12月30日

摘要

堆栈处理器是具有两个功能,首先它与数据总线的数据交换符合堆栈的要求(即先进后出);

能对存储的数据进行算术运算。

本次设计就是基于FPGA用VHDL语言实现的一个堆栈处理器,拥有一个RAM进行堆栈的数据存储操作,同时有两个寄存器存放运算器的输入和运算结果。

堆栈处理器的主要组成部分如下:

1、堆栈存储器:

进行数据的存储是堆栈处理器的基本功能,这里的堆栈存储器就是一个可以用来存储和读取数据的RAM,它的存储和读取符合堆栈先进后出的要求,具体的实现方法将在后面的方案论证中详细论述。

2、运算器:

运算器的功能就是对处于栈顶的两个数据进行算术运算(加、减、乘、除),并将运算结果送至控制部分,进行下一步的操作。

3、控制模块:

控制堆栈处理器的各项操作(入栈、出栈、算术运算)、状态转移、设置各种状态标志和RAM地址的产生。

4、显示模块:

用来显示A、B寄存器中的数据、数据总线数据和输入数据的实时显示。

关键词:

堆栈、算术运算、控制、显示、FPGA、VHDL

一、任务解析……………………………………………………………………3

二、系统方案论证………………………………………………………………4

2.1总体方案比较论证……………………………………………………4

2.2系统结构与原理………………………………………………………4

三、数据子系统的设计…………………………………………………………4

3.1堆栈存储器的设计……………………………………………………4

3.2运算器的设计…………………………………………………………5

3.3数据路径………………………………………………………………6

四、控制子系统…………………………………………………………………6

4.1方案论证………………………………………………………………6

4.2控制部分的实现………………………………………………………7

五、总结…………………………………………………………………………8

5.1仿真结果………………………………………………………………8

5.2系统缺陷分析…………………………………………………………11

六、心得体会……………………………………………………………………11

一、任务解析

(1)根据任务要求,堆栈处理器与总线的数据交换要符合先进后出的原则,它是一个具有数据存储和读取功能的RAM,为了便于测试,这里我们设定了一个8*8的RAM,它的字数为8,每个字为8位,满足了数据位数为8的要求。

在堆栈中定义一个堆栈指针SP,用来表征存储字在RAM中的位置,当进行入栈操作PUSH时,数据存入地址为SP的单元后,SP←SP-1;

而进行出栈操作POP时,将SP单元的数据读出后,SP←SP+1。

当指针处于栈顶,对应满栈,应有满栈信号FULL=1,此时不能进行入栈PUSH。

当SP=8时,指针处于栈底,对应栈空,应有栈空信号EMPTY=1,此时不可以进行出栈POP。

(2)堆栈处理器的第二个功能是算术运算操作,首先应有四个算术运算的指示信号,即输入信号ADD、SUB、MUL、DIV。

算术运算的过程就是把地址分别为SP和SP+1的两个数据分别送入运算器进行运算,运算后将结果送入地址为SP+1的字中。

当栈中只有一个字时不能进行算术运算,因此应有一个ONE指示信号,当指针为7时,栈内只有一个字,指示信号ONE=1。

(3)控制器主要用来设置各个标志位的状态,数据的具体流向、存储路径,控制显示模块的显示。

(4)对于显示的部分,只需将数据总线的数据送至数码管显示电路即可。

(5)系统框图的确定

由以上分析可以得到堆栈处理器的功能框图和系统原理框图如下所示:

图一、系统原理框图

图二、功能框图

二、系统方案论证

2.1总体方案比较论证

方案一:

采用数字逻辑电路,根据堆栈处理器的各种状态转移和逻辑关系画出卡诺图,分析其逻辑关系,使用触发器、门电路等一系列芯片来连接电路实现堆栈处理器的功能。

但是由于堆栈处理器的状态转移较多,逻辑关系分析起来比较复杂,而且会需要大量的芯片,电路连接复杂,不易实现,不是理想方案。

方案二:

采用FPGA实现,用语言描述或者微程序法实现各种状态转移和逻辑关系。

这种方案较之于第一种方案比较容易实现,省去了复杂的电路连接,而且堆栈处理器的RAM,以及加法器,减法器,乘法器,除法器都可以定制,相对来说,省去了构建运算器的工作量。

因此我们选择了方案二作为我们的设计方案。

2.2系统结构与原理

本方案的系统原理图见图一,它主要包括数据子系统和控制子系统两大模块,下面我们来讨论具体功能的实现。

三、数据子系统的设计

数据子系统包括对数据的存储、运算、传输以及控制子系统之间的条件和控制信号交换部分,下面就从这几个方面来分析数据子系统的设计和实现放法。

3.1堆栈存储器的设计

定制RAM,然后根据各种操作对RAM的访问不同,编写一个RAM的读写控制器,它产生读写控制信号和相应的RAM地址。

用语言编写,这里我们采用了语言编写了一个RAM,将各种的控制操作和RAM整合在了一起,作为一个堆栈存储器的模块。

为了便于测试,我们这里定义一个8*8的RAM作为堆栈存储器,地址产生器产生的地址即为指针SP,由于RAM的速度问题,因此我们用两个高速的寄存器A、B来数据总线进行数据交换,而RAM作为后备不直接和数据总线通信,这样就解决了RAM的读写速度较慢的问题。

图示即为堆栈存储器的结构框图。

堆栈存储器的工作有三个方面:

入栈、出栈和算术运算。

由于添加了两个寄存器,因此数据的流向不再是简单的将数据存储到RAM中,下面来分别讨论在这三方面的数据流向问题:

图三、堆栈存储器的结构

(1)入栈(PUSH)操作:

A,B均空时:

B←DIN。

A空B满时:

A←DIN。

A、B均满时:

RAM←B,B←A,A←DIN。

(2)出栈(POP)操作

A,B均满:

DOUT←A。

A空B满:

DOUT←B。

A,B均空:

B←RAM,DOUT←B。

(3)算术运算(OP)操作:

A,B均满:

B←[A(OP)B]。

A←B,B←RAM,B←[A(OP)B]。

B←RAM,A←B,B←RAM,B←[A(OP)B]。

由以上分析可以看出堆栈处理器的工作特点:

a.只有A,B寄存器和外部总线进行数据交换,RAM只和B寄存器进行数据交换。

b.必须设置两个标志位FA,FB来指示A,B寄存器是否已满。

c.应设置一个READY信号,指示操作是否完成,只有当处理器输出READY信号时才可以进行下一步的操作。

d.关于堆栈指针SP,为了实现堆栈的要求(先进后出),因此在系统的起始状态,SP应指向栈底(RAM的最后一个单元,SP=8),而且应注意到,入栈时,数据不直接进入RAM之中,必须是A、B均满的时候才进行写RAM的操作,这时RAM(SP)←B,SP←SP-1;

同样的对于出栈,应该在A、B均空以后才可以读RAM,SP←SP+1,B←RAM(SP),DOUT←B。

e.栈满信号FULL应该是在SP=0,并且FA=1,FB=1时才指示栈满,输出栈空信号EMPTY的条件是FA=0,FB=0,且SP=8。

3.2运算器的设计

由上面的分析我们知道运算器的输入是A,B两个寄存器的数据,运算器进行相关的运算以后将运算结果送至B寄存器存储起来。

加法器和减法器的设计比较简单,直接进行加减运算就可以了,可以用语言描述的方法将他们直接的整合到堆栈存储器的模块之中去,不必再去定制相应的模块,节省了部分资源;

乘法器和除法器我们采用定制的方法,将A,B的数据送至乘法器、除法器的输入端,然后将结果送回堆栈处理器进行处理,下图即为定制的乘法器和除法器。

图四、乘法器和除法器

当栈内只有一个数时不能进行算术运算,因此必须设置一个ONE信号指示栈内数据为一的状态,提醒此时不可以经行算术运算。

与堆栈存储器一样,运算器同样需要一个READY信号,来指示操作是否完成。

3.3数据路径

根据以上的分析,明确了数据系统应有的模块及其操作规则。

按照分析的结果我们可以总结出其数据路径如下:

●寄存器A的数据来源有两个,分别是数据总线和B寄存器,只有在入栈和算术运算时才有数据进入。

●寄存器B的数据来自四个方面:

寄存器A、数据总线、RAM和运算器的运算结果。

●RAM的数据仅来自寄存器B,不和其它设备进行数据的交换。

●输出的数据来自寄存器A和寄存器B,任何输出都要经过这两个寄存器才能输出。

●运算器的数据来自寄存器A和寄存器B,运算结果输出到寄存器B。

至此,我们已经分析了堆栈存储器的设计思路,设计方案,以及实现的方法,根据上面得出的逻辑关系和数据流向就可以写出数据子系统的VHDL语言代码。

四、控制子系统设计

4.1方案论证

采用微程序法实现

控制子系统的微程序设计适用于系统很复杂,系统的MDS图的状态数目很多,输入输出变量很多的情况,而且它具有设计规范、易于模块化、便于二次集成、便于修改的有点。

其基本结构如下图所示。

图五、微程序设计基本结构

本系统的状态转移变量较多,系统较复杂,因而使用微程序设计的方法比较适合于这个系统。

语言描述

比之于微程序设计的方法来说,语言描述的方法相对来说比较繁琐,因为转移变量较多,写程序的时候比较复杂,需要仔细的分析系统,否则会导致数据混乱等一系列的后果,但是如前所述,在设计数据子系统的时候,已经涉及到了各项操作的数据流向及状态标志的问题,这里再进行一次相关描述会有些重复,因此在这里我们继续的使用语言描述的方案,将控制子系统和数据子系统相结合,利用数据子系统的资源来进行控制子系统的设计。

虽然这种方案没有前者那样看起来模块清晰,但是由于和数据子系统结合在一起,在阅读程序时比较容易了解整个系统的工作流程,需要修改时也不必对各个模块逐一的修改。

4.2控制部分的实现

在数据子系统中我们讨论了在各种操作中的数据流向的问题,但并没有明确的指出数据的存储路径以及各种标志信号的变化,根据在上面分析的数据流向的基础上,我们加上各种标志位进行详细的论述:

(1)入栈PUSH

若FA=0,FB=0:

B←DIN,FB←1;

若FA=0,FB=1:

A←DIN,FA←1;

若FA=1,FB=1:

RAM(SP)←B,SP←SP-1,B←A,A←DIN,FA←1,FB←1;

(2)出栈POP

DOUT←A,FA←0;

DOUT←B,FB←0,;

SP←SP+1,B←RAM(SP),DOUT←B,FA←0,FB←0;

(3)算术运算OP

B←[A(OP)B],FA=0,FB=1;

A←B,SP←SP+1,B←RAM(SP),B←[A(OP)B],FA=0,FB=1;

SP←SP+1,B←RAM(SP),A←B,SP←SP+1,B←RAM(SP),B←[A(OP)B],FA=0,FB=1;

(4)READY信号

READY信号用来指示是否可以进行操作,因此当有操作输入(PUSH,POP,

OP)时,READY←0,此时封锁操作信号的输入,而当当前操作结束后,应立即给READY恢复为1,允许其他操作的进行。

可以用下面的方法来实现READY的赋值:

IF(PUSH·

POP·

OP)∥READY←0∕READY←1;

(5)ONE信号

ONE信号指示栈内只有一个数据的情况,指示ONE有两种情况:

FA=0,FB=1,SP=8

FA=0,FB=0,SP=7;

根据堆栈的特点,入栈总是先入B寄存器,出栈总是先出A寄存器,因而

不会出现A满B空的情况,因此FA=1,FB=0,SP=8的情况不予考虑。

(6)乘法、除法的数据处理

由于是定制的乘、除法器,因此在进行乘除的运算时,控制器要将A、B

寄存器的值输出给乘、除法器,然后接收两个运算器的结果,对其进行处理后存储起来,并且显示运算结果。

我们对乘法和除法作如下的规定:

两个8位的数据相乘之后得到的是16位的结果,我们这里只取其底8位,当结果的高8位有结果时,就输出错误警告,表示运算溢出;

对于除法,我们只保留其商,对余数不做处理。

(7)显示部分的控制

由于要求显示A、B寄存器,数据总线,和输入数据的值,因此控制模块还要把A、B寄存器,数据总线的数据送至数码管显示,同时还要实时的显示输入数据的值。

FULL信号和EMPTY信号在3.1中已进行过论述,这里不再讨论。

到此为止,我们已经把控制部分的设计讨论结束,结合数据子系统的设计,我们就得到了最终的堆栈处理器,它可以实现堆栈和基本的算术运算操作。

五、总结

5.1仿真结果

由于堆栈处理器的输入输出变量较多,把所有的输入输出放在一起进行仿真

不易观察结果,观察不到内部个状态的转移,数据的存储等,因此这里分块对系统进行仿真,分别对入栈PUSH,出栈POP,算术运算OP进行仿真,下面是仿真的结果。

入栈PUSH的仿真

图六、入栈PUSH的波形仿真

由于试验箱的按键有限,因此这里我们定义了两个计数器作为数据的输入,din1,din2为计数器的输入,dispA,dispB为A、B寄存器得到内容,FA,FB为A、B寄存器的标志位,data_bus为数据总线的内容,data_set为输入的数据,sp为堆栈指针(RAM的地址),sram为我们定义的8*8的RAM。

如图所示,在入栈前,堆栈处理器为空,empty为1,第一次PUSH时,A、B均空,因此B寄存器存入数据1,且FB为1,此时SP指针不变,这时只有一个数据,one为1;

第二次PUSH时,A空B满,A寄存器存放输入数据2,FA变为1,SP仍旧没有变化;

第三次PUSH时,A、B均满,B寄存器中的1放入了RAM的最底部单元RAM[7]中,A寄存器中的2放入了B中,A中存放新进入的数据3,且SP-1;

从图中我们可以看到ready信号的变化,没有操作时,ready始终为1,当有操作进行时ready立即跳变为0,封锁其他的操作。

综上所述,堆栈(push)操作完全符合前面所分析的指标的要求,是正确的。

出栈POP的仿真

图七、出栈POP的仿真

在上面入栈的基础上,我们进行出栈POP的仿真。

如图所示,在第一次入栈操作前,A、B寄存器均满,因此先向数据总线输出A寄存器的数据3,且A寄存器的标志位变为0,表示A已空;

第二次POP时,A空B满,因而向数据总线输出B寄存器中的2,并且FB=0,这时栈内只有sram[7]的一个数据,因此one指示1;

第三次POP时,A、B已空,所以sram[7]的数据1先传送给B,sp+1,最后经B将数据送至数据总线,这时栈内没有任何数据,empty=1;

由此图我们也可以看出堆栈的特点(先入后出):

入栈的顺序为1、2、3,而出栈的顺序是3、2、1,且各项标志都完全正确,因而栈操作部分的设计是完全正确的。

算术运算OP的仿真

图八、加法(ADD)的仿真

因实验箱的按键有限,因此在算数运算部分我用了两个按键op2和op1对算术操作进行编码,op2=0,op1=0表示加法运算;

op2=0,op=1表示减法运算;

op2=1,op1=0表示乘法运算;

op2=1,op1=1表示除法运算,op_en为运算操作的使能键。

仿真说明:

首先我们向栈内存入了三个数:

1、2、3,加法时op1、op2均为0,进行第一次加法时,FA=1,FB=1,因此是A、B中的数据相加,然后将结果存入B寄存器中,A寄存器FA=0,如图,第一次加法后,结果5放入了B寄存器中;

第二次加法时FA=0,FB=1,因而B先将其内的数据5传输给A,然后再从RAM中读取数据1,然后进行加法运算,结果6仍旧放入B寄存器。

从波形分析可以看出,加法运算的仿真完全正确,证明设计没有错误。

减法操作与加法操作相似这里不再仿真,下面给出乘法和除法的仿真结果:

图九、乘法(MUL)的仿真

如图所示,事先我们已经往A、B寄存器中放入了两个数3和2,进行一次乘法运算(op2=1,op1=0)后,结果为6,被存放至B寄存器,且A、B寄存器的标志位的变化也完全正确,乘法器的设计符合要求。

图十、除法(DIV)的仿真

如图,A寄存器的值为3,B寄存器的值为2,进行一次除法(op2=1,op1=1)后,得到的商为1,由前面的分析我们知道余数被舍弃了,因此我们只保留运算的商,并将它存放在B寄存器中。

5.2系统的缺陷分析

这次堆栈处理器的设计大部分功能均已实现,且符合设计要求,然而还并不十分完美,下面我们就本系统设计的不足之处进行一下讨论。

第一,没有添加错误报警模块,例如栈满和栈空时虽然有FULL和EMPTY信号,但是还是应该增加一个报警指示,当再进行入栈和出栈操作时,指示操作错误,并且控制器不执行相应的操作;

算术运算时,栈内只有一个数据时进行算术操作也应报警且拒绝算术操作;

此外,算术运算的溢出也需要报警,通知操作者运算溢出。

这些是本设计需要改进的地方。

第二,RAM的容量过小,本设计为了验证起来比较方便,因此只设计了一个8*8的RAM,在实际应用中这是不能满足要求的,所以在实际的使用中要根据应用的不同对RAM的字数和数据位数进行扩展,以满足相关的要求。

第三,RAM的速度问题是堆栈处理器的一大缺陷,虽然增加了两个高速的寄存器A和B,但是在涉及到快速的数据交换应用时,B寄存器将会频繁和RAM经行数据交换,此时RAM的读写速度就限制了整个堆栈处理器的速度。

第四,功能单一,只有出栈入栈和简单的加减乘除运算,在实际的应用中,这些功能远远不够,因此本设计还有很大的扩展空间,例如加入逻辑运算模块等等。

六、心得体会

本次设计的堆栈处理器是纯粹的编写代码,而且逻辑关系复杂,状态转移较多,稍不注意就会弄错,导致仿真结果错误。

在编写代码的时候会因为一个问题而纠结好几个小时,但是当问题解决的时候那份喜悦却是如此的美妙。

以前在学习的时候总觉的仿真没那么必要,这次的设计我深深的体验到了仿真的重要,因为直接将程序下载到硬件上,即使错了也找不到错误所在;

而且仿真必须全面,将所有的可能情况都考虑进去。

在遇到问题的时候,我们不能惧怕它,而是要通过查资料,与别人交流来解决问题,失败并不可怕,失败的次数越多我们距离成功就越近了。

最后,从事设计工作必须要细心而且要有耐心,不细心就会出现许多的错误,影响工作的心情和进度;

耐心是最重要的一个品质,没有耐心的人是不能搞电子设计尤其是程序编写的工作的,因为调试的过程会大大的考验一个人的耐性,没有这份耐心什么也做不好。

评语

成绩:

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

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2