北工大学实验学院(论文)
为提高系统开发效率,Quartus II集成开发环境拥有使用既有知识产权模块(Intellectual Property,IP)的功能。知识产权模块是一些预先设计好的电路模块,他们以软核形式呈现,即未被加工制造,仅完成了输入模型的建立。这些模块常常被复用,因此在设计中使用它们可以简化设计提高设计效率。
Quartus II集成开发环境另外一个特点是允许嵌入第三方工具。例如Modelsim,Hspiec。利用这些工具能够更好的完成时序验证,逻辑综合等任务[19]。 完整的FPGA系统开发设计流程包括以下几大步骤。
1、设计输入/RTL编码:这一阶段主要为硬件电路建模。即设计者通过Verilog HDL、VHDL、AHDL或者原理图的形式将算法模型转变成为硬件电路模型。
2、功能验证(RTL): 当电路模型建立完毕后,需要对电路实现的功能进行检测,这一阶段主要就是对电路功能进行验证。对硬件电路加入测试信号后,利用Modelsim等工具可以产生电路输出的波形图,根据波形图则可以分析出电路功能是否正确。这个阶段的波形图不包含时序信息,即未考虑电路延时,仅反映逻辑功能。
3、逻辑综合:这一阶段是将前面建立的电路模型转变为实际器件的连接模型。但这一步的器件仅仅是逻辑功能上的器件,即没有将各器件与FPGA内部资源对应起来,因此这一阶段的产生文件也不包含器件的延时信息。
4、布局布线:这一阶段的主要是把经过综合得到的电路器件与FPGA内部资源对应起来,并分配每个器件的位置与线路连接。从而使得开发者的设计能够在FPGA中实现。这一阶段完成后,报表中包含了电路的器件延时信息。
5、时序验证:上一阶段已经完成了从设计者电路模型到FPGA内部资源的映射。此时电路的逻辑功能由于包含有器件延时,不一定完全符合设计者原先的设计。因此需要进行时序严重,即查看电路中各个路径上的延时信息,查看运行时间是否满足电路设计。如果时序存在问题,需要调整主频甚至组合逻辑的设计。直到电路满足时序要求。
6、器件编程:当时序验证通过后,就可以将编译通过的程序加载带FPGA器件中去执行,从而从硬件上验证效果完成设计。
下图3-2 是利用QUARTUS II 13.0设计开发FPGA系统的流程图
6
北工大学实验学院(论文)
设置输入 综合 功耗分析 布局布线 调试 时序验证 工程更改管理 仿真 时序逼近 编程和配置 图2-1 QUARTUS开发流程图
2.3 FPGA器件
FPGA是现场可编程门阵列(Field-Programmable Gate Array)的简称。它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。
集成电路在发展的过程中经历和很多阶段,从一开始的小规模集成电路到大规模集成电路再到超大规模集成电路,集成电路的开发难度与开发成本越来越高,开发周期也越来越长。这些集成电路都是为某特定领域开发的专用集成电路(Application-Specific Integrated Circuits)。制造完成后其功能就被固化,就算设计存在缺陷,也无法修改。因此系统设计师迫切需要一种半定制电路,能够允许设计师们可以通过编程对其功能进行
二次开发,并能够在试验室里就对其进行测试。这样就算设计存在缺陷,也能够快速弥补,可以大大降低开发成本。正式由于这种需要,可编程逻辑器件出现了。经过一系列的发展演变,逐渐形成了今天广为使用的FPGA。
FPGA实现可编程逻辑是基于查找表(LUT)技术。查找表实质就是一块SRAM。程序编因此LE的数量可以衡量出一个FPGA的水平,LE越多则能够实现更复杂的逻辑运算。
7
北工大学实验学院(论文)
目前主流的FPGA器件厂商主要是Altera、Xilinx和Lattice。不同品牌的FPGA需要配合使用不同的开发环境。本设计中选择使用Altera公司的FPGA芯片,因此配合使用该公司的QUARTUS II 13.0开发环境作为设计工具。
8
北工大学实验学院(论文)
3.8位RISC设计
3.1 方案论证
一、指令集
常用的指令集包括复杂指令集和精简指令集两种。复杂指令集(CISC)包含大量的内存操作指令,因此可以很灵活的访问内存,对于编写程序有很大的便利。但是因此,复杂指令集通常结构多样,指令长度可变,在CPU控制部件译码上存在很多困难。为了解决这些困难,复杂指令集的CPU需要花更多的逻辑电路去解决这些问题,因此存在功耗大的问题。
相比之下,精简指令集(RISC)采用定长的指令结构。并且不包含内存运算指令,只拥有访问和读取内存的指令。这样简化了指令集的数量,将使用较多的指令保留下来。为CPU译码提高了很多便利,同时功耗较小。伴随着编译器的发展,越来越多的CPU采用精简指令集,如ARM、MIPS等。
综上,本课题采用精简指令集实现一个简单的8位的CPU。该CPU包含ADD,SUB,AND,OR四条运算指令,LOAD和STOR两条访问内存的指令,BEQ和JUMP两条跳转指令。 二、执行周期
CPU的执行方式通常分为单周期,多周期和流水线三种结构。
单周期方式是每一条指令采用一个时钟周期,在这一个周期中完成取指,译码,执行,访存和回写五个操作。这样的执行方式比较简单,但是问题在于在一个周期中完成如此多操作,需要花很长世间,因此时钟周期较长,相应的,主频较低。运算速度较慢。
在实际指令中,并不是每一条指令都需要经历上诉五个阶段,例如ADD等运算指令并不需要进行访存阶段,因此如果可以跳过这一步直接进行回写阶段,会节省很多时间。多周期的执行方式正是考虑到这种情况,选择将一条指令的执行分到多个周期中去,利用有限状态机去控制指令的转移方式,让指令跳过不需要的步骤。
在指令进行多周期划分后,人们发现其实当前一条指令进行译码操作时,不需要让取指电路空闲,而可以进行下一个条指令的取指操作,这样可以使得指令并行起来,大大提升了执行效率。然后在实际设计中,由于指令的相关性,流水线中前后的指令存在数据相关或控制相关。解决这些相关性需要复杂的逻辑电路,造成电路复杂,功耗增高。
对比以上三种结构,考虑到FPGA的电路不能太为复杂,因此选用单周期的执行结构。
9
北工大学实验学院(论文)
综上,本文实际一种单周期的精简指令集CPU。
3.2 整体结构设计
CPU主要完成取指,译码,执行,访问内存和回写五个步骤。
取指:将指令从指令存储器中取出。由指令存储器和PC寄存器构成。PC又叫程序计数器,用于存储下一条指令的地址。每取出一条指令,PC中数值加1,指向下一条指令的地址。在每一个时钟周期到来时,CPU按照PC中所存地址,将指令取出。
译码:取出指令后,需要确定指令类型和相应的操作数。这个过程叫做译码,由CPU的主要控制结构CU(控制单元)完成。CU按照指令集定义,确定指令的操作数和操作码。然后访问寄存器堆,找到源操作数的实际数值。准备送入ALU 执行:按照指令的进行数学运算。这个过程由ALU完成。一般每一条指令包含两个源操作数,因此ALU有两个操作数输入端,一个操作码输入端。本系统设计的ALU能够完成加法,减法,逻辑与和逻辑或四种运算。完成运算后,将结果送出。
访问内存:如果一条指令需要读取数据存储器或者写数据存储器,就必须经过访存阶段。这个过程主要是CPU对内存的信息交互过程。在CU的控制信号下完成。
回写:回写是指将运算结果回写至寄存器堆。每一个运算完成后,都需要将结果保存。CPU中利用寄存器堆来暂存运算结果。在所有过程执行完后,ALU或者内存将数据送入到寄存器堆入口端,在CU的写使能控制下,将数据暂存进去。
完成以上五个步骤,才算完成一条指令。
图3-1 流水线CPU的结构
10