《基于FPGA的16位堆栈处理器的设计.doc》由会员分享,可在线阅读,更多相关《基于FPGA的16位堆栈处理器的设计.doc(4页珍藏版)》请在三一文库上搜索。
1、基于FPGA的16位堆栈处理器的设计摘要:设计了一款面向嵌入式控制领域的16位堆栈处理器,该处理器包含两个堆栈:执行数学表达式的数据堆栈和支持子程序调用的返回堆栈,其指令集含35条堆栈指令详细给出了该堆栈处理器的体系结构及设计方法;不仅采用简单有效的指令编码方式缩小了代码体积,同时给出了单周期操作多个堆栈元素的解决方法该处理器采用FPGA实现,在XC5VLX110T芯片上的运行时钟频率最高达到146.7MHz。最后给出了设计的软件仿真与硬件综合结果。引言Forth是由Charles H.Moore在1960年代发明的一种基于堆栈、可扩展、具有简单哲学思想的计算机编程语言,特别适合于软件代码在千
2、行数量级的中规模嵌入式系统中应用,并且已经被国外广泛应用于天文、军事、航空航天、工业自动化、图形、仪器仪表等领域。Forth语言既可以被看作汇编语言又可以被看作高级语言,它与传统语言最大的区别在于它是基于堆栈的和可扩展性。Forth语言本质上定义了一种双堆栈体系结构。这种体系结构的主要思想是基于两个不同的堆栈,一个是用来执行数学表达式的数据堆栈,另一个是用来支持子程序调用的,即保存子程序返回地址的返回堆栈,指令的所有操作都是针对这两个堆栈的一个或者几个栈顶元素。Forth语言定义的这种双堆栈体系结构清晰明了,复杂度低,并且其主要面向的是嵌入式控制领域。在这种背景下,结合FPGA的灵活性,本文设
3、计并实现了一种基于FPGA 的位堆栈处理器,相比基于RISC体系结构的嵌入式处理器,具有以下几点优势: 很大程度上避免了处理器进行上下文切换带来的开销,因为处理器的运行不依赖于大量的通用寄存器; 处理器的寻址方式非常简单,几乎所有指令都是操作数指令这样不仅系统复杂度显著降低,速度得到提升,代码体积也大大减小; 处理器在运行具有深度嵌套特征的程序时有更加明显的优势,因为具有专门的硬件堆栈来执行子程序调用与返回。设计与实现堆栈处理器体系结构概览处理器的结构如图所示,为了能够清晰地展示其结构,部分信号并未显示或直接连接处理器包含的主要模块见表。需要说明的是,表中的数据堆栈由栈顶寄存器、次栈顶寄存器、
4、第三栈顶寄存器2以及深度为32的堆栈存储器构成;返回堆栈由栈顶寄存器以及深度为32的堆栈存储器构成。指令集指令集设计处理器实现了四种类型共条指令,具体如下表所示。表中大部分指令遵从了Forth语言的原语命名规则与功能比如,其中的表示将数据堆栈栈顶寄存器的内容弹出到返回堆栈栈顶寄存器,则表示相反的功能另外,表示从存储器读数据到数据堆栈,而!表示将数据堆栈的内容存储到存储器中下面分别简述各种类型指令的功能。 堆栈操作:主要是对数据堆栈或者返回堆栈的一个或者多个栈顶元素的操作例如,swap指令交换与1的内容;one和zero指令分别将的所有bit位置和;drop指令弹出中内容并抛弃所有的堆栈操作类型
5、指令都在一个周期内完成。 数学运算:数学运算指令的操作数均为和中内容逻辑运算指令包括or、xor和and;移位指令包括asr、lsr和lsl;1plus和1min分别将数据堆栈栈顶元素加和减所有数学运算类型指令都在一个周期内完成。为了节省硬件资源,堆栈处理器没有实现硬件支持的乘法器3和除法器4,因此没有直接的乘法和除法指令,取而代之的是mpp和shld指令这两条指令分别完成了乘法器和除法器在一个时钟周期中完成的操作mpp指令执行时需要同时操作寄存器、1和21与2中分别存放初始的乘数与被乘数,的初始值为;最终乘积结果的高低位分别存放于与1mpp指令的执行分成两步第一步判断1最低位是否为:如果为,
6、将2与中内容相加;否则不做操作第二步将做高位、1做低位,对其内容进行逻辑右移这样连续执行完16条mpp指令后,与1中存放的分别为乘积的高低16位这16条mpp指令再配合其他几条指令便可以完成正常的乘法操作,完整的乘法操作耗费19个时钟周期除法的实现与乘法类似,完整的除法操作耗费21个时钟周期下面给出了乘法操作的程序示例,其详细解释将在3.1节的仿真分析中给出: 将压入堆栈 第条指令 第条指令 乘法结束后,清理掉 位于的被乘数 访存:堆栈处理器支持按字节和按字两种访存方式指令集中的litc、c和!指令为字节访存指令;而lit、和!为按字访存指令这里简要说明按字访存指令的功能,按字节访存与之类似l
7、it将一个字常量压入数据堆栈;将的内容弹出送入地址寄存器,按中地址访存取得数据后压入数据堆栈;!指令将中的内容弹出送入地址寄存器,再将当前栈顶的数据弹出存入 中地址除litc指令的其他指令需要两个周期执行,litc指令在设计时被优化为不需要访存,因此只需要一个周期执行。 程序转移:call为子程序调用指令,它将当前C寄存器值压入返回堆栈,同时将子程序地址送入C寄存器;ret为子程序返回指令,它将返回堆栈的栈顶值弹出,送入C寄存器;jmp为无条件跳转指令;jz和jc为有条件跳转指令,跳转条件分别是数据堆栈栈顶的内容是否为和ALU进位标志位是否为;drjne将返回堆栈栈顶的内容减,然后判断中内容是
8、否为,如果不为则跳转除call与ret以外的其他指令都需要先访存取得16位跳转地址,然后压入堆栈,因此需要两个周期执行;ret与call指令只需要一个周期执行。指令集编码优化存储器是嵌入式控制系统中的一种稀缺资源,因此在设计堆栈处理器时,采用了一种简单但是有效的编码方式进行指令编码,不仅大大减小了代码体积,还在一定程度上可以降低系统的复杂度,提高系统效率。在堆栈处理器上执行的程序一般都通过大量子程序调用进行模块化设计以减小代码尺寸,这样才能充分利用硬件支持的返回堆栈因此,在典型的堆栈处理器程序中的时间花费在子程序调用上,这就要求在实现堆栈处理器时必须高效地实现call指令一方面,如果call指
9、令占用的bit位较少,便能减小代码体积;另外一方面,如果call指令的执行能在一个周期完成,将大大加快程序的执行速度因此指令集采用了两种不同的编码方式实现。对于除call以外的其他指令,每条指令占位且最高位均为处理器每次访存取出的16位数据中,高低位各为一条指令采用这种设计方案后,一方面,每次访存可以取出两条指令这在处理器和存储器之间形成了一个处理器速度两倍于存储器速度的缓冲,可以在一定程度上避免Cache的引入,降低嵌入式系统的复杂度;另一方面,每条指令占用位而不是16位可以大大减小代码体积。all指令采用了另外一种实现方式,如果访存取出的16位数据中最高位为,那么这16位不再被解释为两条指令,最高位被解释为call指令,剩下的15位经逻辑左移位后作为子程序地址相对于采用与其他类型指令相同的位实现方式,这种实现方式使得call指令仅占位,可以进一步减小代码体积。另外,call指令执行时的子程序地址不需要通过访存取得,因此其执行将只耗费一个周期当然,这样的方案会让call指令只能调用位于偶地址的子程序,但是好的设计来源于适当的折中,这种损失相对于获得的效率和性能提升是值得的。
链接地址:https://www.31doc.com/p-3410263.html