第1章 FPGA高阶设计方法
1.1 可编程逻辑设计原则
FPGA是可编程的硬件设备,可编程逻辑设计有以下4个原则。
(1)面积与速度互换原则。
(2)数字电路硬件原则。
(3)系统设计原则。
(4)同步设计原则。
1.1.1 面积与速度互换原则
这里的面积是指FPGA逻辑器件中的逻辑资源。在逻辑资源有限,且设计规模庞大的情况下,必须采取牺牲速度以节约面积的做法。例如,减少实例化模块的数量,特别是标准IP生成的模块,可分时复用这些模块,前提是这些模块不存在数据依存或者并行处理的要求。
例如,可用一个查找表ROM模块将一组十六进制数据转换为十进制数据来显示,如果设计时有多组十六进制数据需要转换为十进制数据来显示,则可以分时复用一个查找表ROM模块来节约资源,程序代码如下。
以上是用一个查找表ROM模块在7个周期内实现4组十六进制数转换为十进制数的程序,下面是在4个周期内实现4组十六进制数转换为十进制数的程序。
对比上面两个程序可以看出,分时复用一个查找表ROM模块,需要7个周期来完成4组数据转换,而同时实例化4个查找表ROM模块来并行转换,只需要4个周期来完成4组数据转换,相当于速度提高了约40%,但是逻辑资源多耗费了3倍。在资源充足的情况下,可采用并行实例化的设计;如果资源紧张,就只能采取降低速度来换取面积的做法。
1.1.2 数字电路硬件原则
可编程逻辑设计与软件的高级语言开发有着本质的区别。软件工程师进行高级语言开发时不必关心硬件的具体细节,只关心一段程序实现的结果,而且不在乎也不好把握每条语句执行的时间周期。数字电路硬件原则是指开发人员进行可编程逻辑设计时要保持硬件思维。首先,开发人员必须对数字电路有深刻的认识,特别是组合逻辑电路和时序逻辑电路。其次,开发人员必须了解数字电路的工作过程,如组合逻辑电路按电流速度工作,时序逻辑电路按时钟周期工作。下面以Verilog HDL编程与C语言编程为例说明两者的区别。
1.语句执行顺序的区别
在Verilog HDL编程中,对于时序逻辑要注意语句的执行顺序。例如:
如果c在上一周期的值是1,那么它在当前周期的值是2,而不是1,因为寄存器在同一周期内,Verilog HDL以always赋值语句的最后一条作为该周期的赋值语句,这条语句之前的语句都无效;而C语言程序是顺序执行的,先把0赋予c,再把c+1赋予c,最终结果就是1。
2.语句执行周期的区别
对于上述程序中的变量a和b,在经过当前这个周期之后,它们的值等于上一周期的c和a的值,而不是c和a实时的值,这就是可编程逻辑的时序特性。开发人员从事可编程逻辑设计时,必须谨记时序的概念。
3.变量类型的区别
可编程逻辑中主要有两种类型的变量:寄存器reg和信号线wire。其中,寄存器变量是按照时钟周期工作的,所以只能用非阻塞赋值方式赋值,即<=,而且寄存器变量只能在连续赋值语句中赋值,即always@();信号线变量只能用阻塞赋值方式赋值,即=,而且不能同时用多个阻塞赋值语句赋值。
1.1.3 系统设计原则
系统设计原则是指在充分了解器件资源之后,对模块功能进行正确划分。特别是在设计规模较大、器件资源复杂的情况下,如集成CPU的SoC FPGA芯片,要正确分配在FPGA和CPU中实现的算法。对于FPGA中资源的使用要注意以下几点。
1.存储器资源的使用
存储器资源的使用原则是根据设计中用到的RAM的宽度和深度,确定所选器件的嵌入式RAM的容量。嵌入式RAM的具体配置由Quartus软件自动分配,用户只需要确保片上RAM资源大于设计中的RAM需求。
2.软核的使用
软核是指用FPGA的逻辑资源生成的一个软IP核,它可以定制功能,同时要消耗大量的逻辑资源。使用软核的好处是不需要外部CPU就能在FPGA中实现大量复杂的计算功能,而且能与FPGA内部逻辑无缝连接,传输速率和运行效率高。缺点是在资源有限的器件中,软核会占用其他逻辑功能模块的资源。所以在设计之前,必须确定计算量大的功能模块是使用软核、硬核还是外部协处理器。
3.串行收发器的使用
由于目前高速通信的需要,高端FPGA器件都集成了高速串行收发器SERDES。其中,发送串口用于把数据和时钟调制到模拟差分信号线上,接收串口用于恢复数据和时钟。目前最快的SERDES可以达到几Gbit/s到几十Gbit/s的传输速率。SERDES可用来实现千兆网传输,也可用来实现PCIe和SPI4.2等高速接口。采用串行收发器可以节约板级布线资源。
4.其他结构的使用
其他结构主要是指可编程PLL或者DLL时钟资源,通常采用片上自带的PLL来做时钟驱动,分频或者倍频有利于增强系统的稳定性和改善最高工作频率。
系统设计流程如图1-1所示。
图1-1 系统设计流程
1.1.4 同步设计原则
时序电路通常分为同步时序电路和异步时序电路。
1.同步时序电路的特点
(1)电路核心为各种触发器。
(2)电路输入和输出信号都由时钟沿触发。
(3)可避免电路信号产生毛刺现象。
(4)有利于程序在器件间移植。
(5)有利于静态时序分析。
2.异步时序电路的特点
(1)电路核心为组合逻辑门电路。
(2)电路输入和输出信号与时钟沿不同步。
(3)电路信号容易产生毛刺现象。
(4)不利于程序在器件间移植,或者移植后参数不一样导致结果不一样。
(5)不利于静态时序分析。
在FPGA设计中,通常优先采用同步时序设计。
在同步时序设计中,需要注意以下事项。
(1)两个基本时序原则:setup time原则和hold time原则。setup time是指时钟沿到来前数据已经准备好的时间,hold time是指时钟沿离去后数据保持的时间。这两个时间都满足相应条件才能保证数据被正确采样保存。
(2)异步时钟域数据传输。
(3)组合逻辑常用设计方式。
(4)同步时序逻辑的时钟设计。
(5)同步时序电路信号的延迟,即需要把信号延迟一定时间再送往下一级寄存器,短时间延迟用寄存器级联,长时间延迟用计数器。
(6)关于reg变量是否被综合成实际寄存器的问题。Verilog中定义了两种类型的变量:reg和wire,reg指寄存器,wire指组合逻辑的信号线。一般情况下,将reg变量放到always@()中会被综合成寄存器。但是,如果always@()的括号里面的敏感信号不是时钟沿,而是其他信号的高低电平,而且always@()中不采用非阻塞赋值,则会把该reg变量综合成组合逻辑的一个信号线变量,没有数据寄存功能。所以要想把reg变量综合成实际的寄存器,必须使always@()的敏感信号为时钟沿,而且always@()中要采用非阻塞赋值。