《EDA课程设计堆栈设计.doc》由会员分享,可在线阅读,更多相关《EDA课程设计堆栈设计.doc(20页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、-作者xxxx-日期xxxxEDA课程设计堆栈设计【精品文档】信息技术学院可编程逻辑器件原理及应用课程综合设计报告书姓 名: 简忠祥 班 级: B1106 学 号: 0915110603 时 间: 2013年12月31日指导教师: 李海成 设计题目 堆栈设计设计要求和任务设计一个以字节形式组织的的堆栈,长度为8,设有入栈按钮、出栈和读栈按钮,执行相应操作设计过程 堆栈是一种简单的数据结构,是一种只允许在其一端进行插入或删除的线性表。允许插入或删除操作的一端称为栈顶,另一端称为栈底,对堆栈的插入和删除操作被称为入栈和出栈。有一组CPU指令可以实现对进程的内存实现堆栈访问。其中,POP指令实现出栈
2、操作,PUSH指令实现入栈操作。CPU的ESP寄存器存放当前线程的栈顶指针,EBP寄存器中保存当前线程的栈底指针。CPU的EIP寄存器存放下一个CPU指令存放的内存地址,当CPU执行完当前的指令后,从EIP寄存器中读取下一条指令的内存地址,然后继续执行。在本文中,我们设计了堆栈处理器。主要分为如下几个部分:l 数据子系统模块:堆栈存储器:“先进后出”是堆栈处理器的基本功能,故在堆栈处理器设计之前我们首先需要了解入栈(PUSH)和出栈(POP)的3中情况(A、B均满/空和A空B满),及其如何实现该功能的,之后利用VHDL语言把这三种情况的实现编写出来。由于加减模块较为简单,所以可以直接利用VHD
3、L语言,把堆栈处理器的基本操作表达出来。(A、B均满/空,A空B满)。在EDA课程中我们很少用到乘法和除法运算,而且利用语言的形式也很难编写出来,故该模块我们利用现代电子系统设计实验指导书上的调用LPM模块的方式来编写。运算器:由于执行各种运算所需的时间不同,故需要开始和结束信号。数据路径:RAM及寄存器A、B的数据来源。条件与控制点:输出及输出信号显示l 控制子系统:根据数据子系统对堆栈处理器各部分的分析,利用VHDL语言编写程序,下载到FPGA实验板上,验证其功能是否满足设计要求。l 其他:本次课程设计除了满足上述要求外还可以额外的实现错误提示功能,及扩展数据到16位。下面会对此进行简单的
4、分析。关键词:入栈(POP)、出栈(PUSH)、算术运算()、VHDL、FPGA一、任务解析: 本次设计要实现如下功能:a与外部数据线的数据交换符合堆栈要求(先进后出); b对存储的数据能进行算术运算;c数据位数不少于8位;d通过数码管显示操作数据及运算结果。围绕着要实现功能,分析堆栈处理器应该具有哪些输入和输出信号,明确设计要求。1.1 从堆栈角度考虑堆栈的指示信号 堆栈其实是一个能随机存取数据的存储器,它符合先进后出的原则。作为一个存储器,除了工作速度外,它的首要指标是容量,设其字数为aa,每个字N位。表征存取字位置的指示信号时地址,在堆栈中称为指针SP。当指针处于栈顶时,SP=0,对应满
5、栈,应有满栈指示信号FULL=1。设计过程当堆栈空时,指针SP=aa,应有空栈指示信号EMPTY=1。同时规定指针SP始终指向操作之前栈内有内容的位置。图1 堆栈处理器指针堆栈的操作 作为堆栈它的操作只有两项,入栈PUSH和出栈POP。入栈操作PUSH后指针SP(SP-1),出栈操作POP后指针SP(SP+1)。若FULL=1,不能入栈PUSH,若EMPTY=1,不能出栈POP。1.2 从算术运算功能考虑首先应有进行算术运算的指示信号,即输出信号ADD,SUB,MUL和DIV。由于不同的运算所需的时间不同,因此必须有一个启动信号START和一个完成信号READY。堆栈中两个数据进行运算的过程如
6、图所示。地址分别为SP和SP+1的两个数据送入运算器进行运算,运算后将结果送入地址SP+1的字中。当堆栈只有一个字时,不能进行算术运算,因此必须有一个ONE指示。当指针处于栈底时,SP=aa-1,这时堆栈只有一个字,应有指示信号ONE=1。图2 堆栈处理器的运算1.3 功能方框图由以上分析可以得到堆栈处理器的功能框图如下所示。图中所标注的信号时该堆栈处理器和外界应有的交换信号。设计过程 图3 堆栈处理器功能方框图二、系统方案论证由于本系统操作时判断条件很多,用流程图描述时会有很多分支,显得很杂乱,因此在此采用VHDL语言将堆栈处理器对数据的操作方案进行描述。本语言对数字系统的描述不涉及具体实现
7、和具体元件,属于行为处理器的描述语言。但其整个描述过程可以得到下图的框架。在此结构中,将堆栈处理器分为数据子系统和控制子系统两大部分,下面分别设计数据子系统和控制子系统。图4 堆栈处理器结构方框图三、数据子系统模块 数据子系统包括对数据的存储、运算、传输以及和控制子系统之间的条件和控制信号交换几大部分。下面就从这几个方面来设计数据子系统,找出各部分的模块电路和它们之间的联系。 堆栈存储器用一块容量为aaN的随机存取存储器RAM作为堆栈存储器,相应的地址产生器的输出即指针SP,由于对RAM数据的存取必须先对地址操作,然后再对数据操作,这样速度较慢。在计算机中一般都用两个高速寄存器直接和总线进行数
8、据交换,RAM则作为后备,其结构如下图所设计过程示。寄存器A,B和RAM共同组成了堆栈存储器。 图5 堆栈存储器结构堆栈处理器的工作过程规定如下:进栈(PUSH)操作,分三种情况:(a) A,B均空:BDIN。(b) A空B满:ADIN。(c) A,B均满:RAMB,BA,ADIN。图6 堆栈处理器的进栈操作出栈(POP)操作,分三种情况:(a) A,B均满:DOUTA。(b) A空B满:DOUTB。(c) A,B均空:BRAM,DOUTB。图7 堆栈处理器的出栈操作算术运算(OP)操作,分三种情况:设计过程(a)A,B均满:BA(OP)B。(b)A空B满:AB,BRAM,BA(OP)B。(c
9、)A,B均空:BRAM,AB,BRAM,BA(OP)B。 图8 堆栈处理器的运算操作 从以上规定的操作可以看出堆栈处理器的结构特点:l 只有寄存器A,B直接和外部总线进行数据交换,RAM只和寄存器B进行数据交换。l 必须设有标志信号FA和FB,当寄存器A满时FA=1,当寄存器B满时FB=1。l 寄存器A是堆栈存储器的栈顶,寄存器B是次栈顶,B不能在A之前先空。将堆栈处理器的存储器和寄存器归纳如下: RAM。对存储器RAM可以从以下几个方面进行描述:l 容量 若选用aa=1024个字,每个字为16位的RAM,记为M(1024,16)。l 地址 地址产生器MA,其输出值VMA即为指针SP。即为SP
10、= VMA;当满栈时,FULL=1,SP= VMA=0;栈内只有一个字时,ONE=1,SP= VMA=1023=aa-1;当空栈时,EMPTY=1,SP=VMA=1024=aa。由于要置入SP=1024,所以地址线应有11位;对地址产生器的操作有加1,减1和置数=1024(初始化)。l 操作 读RAM的操作是:BM(vMA);将RAM中地址为vMA的字置入寄存器B。 写RAM的操作是: M(vMA) B;将寄存器B中的内容设计过程存入地址为vMA的RAM的字中。RAM的读写操作均需一定的时间,操作完毕后,RAM输出MREADY信号表示结束。 寄存器。共有六个寄存器,它们是三个16位的寄存器A(
11、16)、B(16)、输出寄存器D。(16),一个6位的操作码寄存器ROP(16)和两个标志寄存器FA,FB。操作码寄存器的每一位分别表示PUSH,POP,ADD,SUB,MUL,DIV,对它的操作有置数LD和清零CR。标志寄存器FA和FB是一位的D触发器,它们分别具有置数和清零控制端。3.2 运算器假设已有一块能完成、-、的运算器OP。对应每种运算所需要的时间假设为T(ADD)=T(SUB)=2,T(MUL)=8,T(DIV)=12。由于执行各种运算所需的时间不同,因此必须有一个开始信号OBEGIN和结束信号OREADY。四堆栈处理器源程序及其分析library ieee;use ieee.s
12、td_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity st isgeneric(k:integer:=8;w:integer:=3);port(rst:in std_logic; clk:in std_logic; din1,din2:in std_logic; push,pop:in std_logic; op1,op2,op_en:in std_logic; full,empty,one,ready,FA,FB,error_led:out std_logic; mul_in
13、:in std_logic_vector(15 downto 0); div_quo,div_rem:in std_logic_vector(k-1 downto 0); dispA,dispB,data_bus,data_set:out std_logic_vector(k-1 downto 0); qA,qB:out std_logic_vector(k-1 downto 0); end entity;根据数据子系统的分析我们可以了解到堆栈处理器的各种输出和输入变量,在这部分进行实体及其端口的定义architecture behav of st issubtype word is std_
14、logic_vector(k-1 downto 0);type memory is array(0 to 2*w-1)of word;signal tmp_full,tmp_empty,tmp_one:std_logic;signal count1,count2:std_logic_vector(w downto 0);signal din:std_logic_vector(k-1 downto 0);signal tmp_FA,tmp_FB:std_logic:=0;signal dout:std_logic_vector(k-1 downto 0);设计过程begindata_in:pro
15、cess(rst,din1,din2) begin if(din1event and din1=1)then count1=count1+1; end if;if (din2event and din2=1)then count2=count2+1;end if;din(k-1 downto 4)=count2; din(3 downto 0)=count1; data_set=din; if(rst=1)thencount1=0000;count2=0000;end if;end process;由于一个数码管最多能显示4位16进制数据,且本次课程设计要求其数据位不得少于8位,故需定义两个数
16、据输入端口,高4位和低4位。process(clk,pop,push,op_en)isvariable sram:memory;variable ready1:std_logic;variable sp:integer range 0 to 8;variable A,B:std_logic_vector(k-1 downto 0);beginif(clkevent and clk=1)thenif(rst=1)thensp:=8;tmp_FA=0;tmp_FB=0;tmp_empty=1;tmp_one=0;A:=”00000000”;B:=”00000000”;end if;if(sp=0
17、and tmp_FA=1 and tmp_FB=1)then tmp_full=1; elsif(sp=8 and tmp_FA=0 and tmp_FB=0)then tmp_empty=1;tmp_one=0; elsif(tmp_FA=0 and tmp_FB=0 and sp=7)then tmp_one=1; elsif(tmp_FA=1 and tmp_FB=0 and sp=8)then tmp_one=1;elsif(tmp_FA=0 and tmp_FB=1 and sp=8)then tmp_one=1;else tmp_one=0;设计过程 tmp_full=0;end
18、if;在进行入栈、出栈及算术运算的时候我们利用指示灯可以观察出来堆栈处理器的存储情况,FULL、ONE、EMPTY、FA、FB。if(push=1 and ready1=1 and tmp_full=0)then - push if(tmp_FA=0 and tmp_FB=0)then B:=din;tmp_FB=1; elsif(tmp_FA=0 and tmp_FB=1)then A:=din;tmp_FA=1; elsif(tmp_FA=1 and tmp_FB=1)then sram(sp-1):=B; B:=A; A:=din;tmp_FA=1;tmp_FB=1; sp:=sp-1;
19、 end if; ready1:=0; tmp_empty=0;end if;if(pop=1 and ready1=1 and tmp_empty=0)then -pop if(tmp_FA=1 and tmp_FB=1)then dout=A;tmp_FA=0;tmp_FB=1; elsif(tmp_FA=0 and tmp_FB=1)then dout=B;tmp_FA=0;tmp_FB=0; elsif(tmp_FA=0 and tmp_FB=0)then sp:=sp+1; B:=sram(sp-1); dout=B; tmp_FA=0;tmp_FB=0; end if; ready
20、1:=0; end if;通过前面对入栈和出栈三种情况(A.B均空/满、A空B满)的分析,编写程序。if(op_en=1 and ready1=1 and tmp_one=0 and tmp_empty=0)then if(tmp_FA=1 and tmp_FB=1 and op1=0 and op2=0)then 加法 B:=B+A;tmp_FA=0; elsif(tmp_FA=0 and tmp_FB=1 and op1=0 and op2=0)then A:=B;sp:=sp+1;B:=sram(sp-1);B:=A+B; elsif(tmp_FA=0 and tmp_FB=0 and
21、op1=0 and op2=0)then sp:=sp+1;B:=sram(sp-1);A:=B;sp:=sp+1;B:=sram(sp-1);B:=A+B; elsif(tmp_FA=1 and tmp_FB=1 and op1=1 and op2=0)then 减法设计过程 B:=A-B;tmp_FA=0; elsif(tmp_FA=0 and tmp_FB=1 and op1=1 and op2=0)then A:=B;sp:=sp+1;B:=sram(sp-1);B:=A-B; elsif(tmp_FA=0 and tmp_FB=0 and op1=1 and op2=0)then s
22、p:=sp+1;B:=sram(sp-1);A:=B;sp:=sp+1;B:=sram(sp-1);B:=A-B; elsif(tmp_FA=1 and tmp_FB=1 and op2=1)then 乘法和除法 qA=A;qB=B; elsif(tmp_FA=0 and tmp_FB=1 and op2=1)then A:=B;qA=A;sp:=sp+1;B:=sram(sp-1);qB=B; elsif(tmp_FA=0 and tmp_FB=0 and op2=1)then sp:=sp+1;B:=sram(sp-1);A:=B;qA=A; sp:=sp+1;B:=sram(sp-1);
23、qB=B;end if; ready1:=0;end if; if(op_en=1 and op2=1 and op1=0)then if(mul_in(15 downto 8)/=0)then error_led=1; else B:=mul_in(7 downto 0);tmp_FA=0;tmp_FB=1;error_led=0; end if; elsif(op_en=1 and op1=1 and op2=1)then B:=div_quo;tmp_FA=0;tmp_FB=1; end if; if(push=0 and pop=0 and op_en=0)then ready1:=1
24、;end if;该部分是对算术运算的编写,其中+、-运算可以直接根据寄存器之间的转移情况来编写,而乘除运算操作无法直接编写出来,故直接输出,之后可以把其输出端口连接到用LPM模块编写的乘法除法器中进行实现。在进行算术运算乘法的时候有可能导致数据溢出,在此可以利用二极管给出一个溢出显示。ready=ready1;dispA=A;dispB=B;FA=tmp_FA;FB=tmp_FB;full=tmp_full;empty=tmp_empty;one=tmp_one;if(push=1 and pop=0)then data_bus=din;elsif(push=0 and pop=1)then设
25、计过程 data_bus=dout;elsif op_en=1 then data_bus=B;else data_bus=00000000;end if;end if;end process;end;本程序主要实现了堆栈处理器的基本功能:8位数据显示、先进后出,及算术运算的+、-操作。利用Quartus生成元件本程序的元件,再调用LPM模块生成乘法和除法器。最后进行电路元件的连接就完成了堆栈处理器的控制部分。 数据路径通过前面的讨论,明确了数据子系统应有的模块及其操作规则。现在就可以按照规定的操作规则添上数据路径。寄存器A的数据来源是外部数据线DIN和寄存器B,因此在进入A的数据线上必须有一
26、个2选1的数据选择器MUXa。寄存器B的数据来源有外部数据线DIN,寄存器A,RAM和运算器的运算结果,因此在进入B的数据线上应有一个4选1的数据选择器MUXb。输出寄存器D。的数据来源是寄存器A和寄存器B,用数据选择器MUXd进行选择。RAM的数据来源自B。运算器的数据来源是寄存器A和寄存器B,运算结果输出到寄存器B。3.4 条件与控制点 数据子系统与外部的数据交换是DIN和DOUT。外部输入的控制信号时操作码:PUSH,POP,ADD,SUB,MUL,DIV。数据子系统输出到外部的条件信号是:READY;FULL: SP=0,FA=1,FB=1;EMPTY:SP=aa,FA=0,FB=0;
27、ONE: SP=aa-1,FA=0,FB=0或者SP=aa,FA=0,FB=1数据子系统输出到控制子系统的局部条件信号:操作码 PUSH,POP,OP(ADD+SUB+MUL+DIV)。其中+表示“或”存储器信息 FA,FB,MREADY。运算器信息 OREADY四、控制子系统模块本设计采用VHDL语言编写,下载进FPGA实验板上进行操作。故本次设计用高级语言作为其控制子系统的模块。首先是本次课程设计的总设计流程图: 设计流程图设计过程图9 设计流程图设计总电路框图其中MUL和DIV是调用LPM模块生成的乘法和除法器。由于该乘法器的输出为16位,故在程序中设计了溢出显示。设计过程图10设计总电
28、路框图五、错误报警及数据位扩展模块在本次设计的扩展部分由如下要求:a具有错误提示功能;b数据位数不少于16位;c其他。5.1 错误报警堆栈处理器的输出端口主要通过数码管显示和指示灯显示来实现。我们进行入栈操作时有可能操作错误,因此我们可以设置一个报警模块来进行提示,以免进行错误的操作而不知道,最后去找程序的问题。首先最简单的是满栈和溢出报警。由于在上述的方案中只有乘法器是16位的可能会溢出,故只需把溢出指示灯的信号连接到蜂鸣器上即可实现简单的报警。在本次设计的处理器,ram可以存储8个数据,A、设计过程B寄存器各一个,当我们输入的数据达到10个时满栈指示FULL将通过指示灯进行显示,同样,我们
29、只需把它连接到蜂鸣器上即可实现错误提示。然后是操作错误报警:在上述程序中我们定义了入栈、出栈和算术运算操作是ready=1,因此当ready=0时我们进行操作给蜂鸣器一个信号即可。如if (ready=0and PUSH=1 and (POP=1 or OP=1) then speaker=1或者if (ready=0and POP=1 and (PUSH=1 or OP=1) then speaker=1或者if (ready=0and OP=1 and (PUSH=1 or POP=1) then speaker=1。即当OP、POP、PUSH三种操作有两个同时处于高电平时给蜂鸣器一个信号
30、就行了。 数据位扩展由于实验板上只有8个数码管,而数码管显示一般都是显示0F的数据,故16位的数据需要4个数码管和4个按键来控制,这在实验板上是不可能实现的,因此这种方法可以排除。此外就是一个数码管显示一个8位的数据,两个按键分别控制高8位和低8位,其它和上述程序完全一致,但如何使数码管实现超过F的显示,暂时没有头绪,不会做。六、总结仿真结果及错误分析程序仿真波形图设计过程图11程序仿真波形图上述波信号主要体现了减法、入栈和出栈操作。仿真时主要输入了四个数据:1、2、3、4;当输入完这四个数据后我们可以在数码管上看到A上显示的为4,B上显示的为3。进行减法操作时,A-B = B,故B上的数据为
31、1。之后进行出栈操作,首先是B上的1,如后却出RAM中的数据,基于“先进后出”的原则,先显示的是2,最后显示1。对连接好的电路图进行编译调试,完成后进行管脚锁定。由于做的是8位数据显示,故每个数据都需要两个数码管。A、B寄存器内容显示,数据总线BUS及输出数据显示。按键分别有:复位、算术操作(OP_EN,OP2,OP1)、入栈、出栈、数据输入。当管脚锁定完成后下载进FPGA实验板就可进行验证了。我验证的过程中特别要注意的是操作错误,也就是说,当要进行算术操作、入栈或者出栈的时候要观察READY指示灯,确保没有其他操作正在进行。我验证的时候就遇到了这样的情况,当进行除法运算的时候,我先输入两个数
32、据,然后op2、op1分别置1,然后按op-en,使其工作,但得到设计过程结得却是A里面的数据将,这让我很迷惑不解,最后才发现是操作错误导致的。 心得及体会: 经过了这次课程设计,使我对VHDL语言有的更深刻的理解。通过堆栈设计课程设计,使我加深了对VHDL语言设计程序的了解。学会了层次设计概念,将程序分为若干模块,分别完成各个模块,最后再将各个模块连接起来。通过这次课程设计,对VHDL的语言有了更深刻的认识,对课题设计的基本流程有了一定的认识,同时也是一次把原来所学的书本知识和实践相联系的过程。并通过实践,建立起了学习EDA的浓厚兴趣,基本掌握了这个软件的基本使用方法,并顺利的对程序进行编辑
33、及仿真。为实现预期功能,能够对系统进行快速的调试,并能够对出现的功能故障进行分析,及时修改相关软硬件。对软件编程、排错调试。了解了关于EDA技术及VHDL语言的基本编程形式及原理图的绘制,为今后的学习打好基础。在此之后,我会继续学习关于VHDL语言的运用。我还意识到了我对这门课掌握还有一定的不足,还有许多的知识我不了解;有的是一知半解;有的即使原理懂了,但在应用方面却是丝毫不知。所以在今后的学习中,我会更加努力,不仅要学好理论知识,还要把它应用到实践中去,使两者很好的结合起来,互补互助。 同时也特别感谢李老师的细心指导,才让我们能顺利的完成我的作业。成绩评定(包括:指导教师评语和课程设计等级)【精品文档】