2.3 基于FPGA的数字信号处理的相关问题

2.3.1 基于FPGA的数字信号处理系统设计流程

如前所述,主流的数字信号处理系统仍采用FPGA+DSP处理器的架构模式。基于此架构模式的数字信号处理系统设计流程如图2.12所示。首先,对系统进行需求分析,明确系统需要实现的功能和达到的性能,如系统功耗如何、系统采样频率如何和系统带宽如何等,同时指出系统的集成度需求和对外接口定义,这样便于PCB制作及芯片选型。其次,进行系统算法级的仿真,确定算法的正确性和功能的完备性,此时需要借助Matlab/Simulink等高级软件。算法级仿真可以完全以浮点数的方式完成,或者仅对核心算法以定点数的方式完成。在硬件实现时,如果某些芯片不支持浮点数则可根据系统性能要求和浮点数的仿真结果确定数据的位宽。第三,进行系统算法的分解。算法分解的依据主要有两点:算法结构的特点和算法实现时的性能需求。对于算法结构较为规则、实现时需要高速处理的,FP-GA较为合适;对于算法结构较为复杂、对处理速度要求不高的,DSP处理器较为合适。至此,整个系统的算法级设计结束。第四,算法实现。对于需要FPGA实现的算法,根据FP-GA设计开发流程,完成HDL电路描述、功能验证和硬件调试;对于需要DSP处理器实现的算法,根据DSP处理器设计开发流程,使用C语言或汇编语言完成算法描述、功能验证和软件调试。最后,将系统集成,进行系统验证和调试。这里并不建议将算法全部设计完毕之后再进行验证,建议采用设计与验证并行的方式,这样可提高验证效率,降低验证的烦琐度,尽快发现问题,从而缩短验证时间,同时这对于系统从开环验证到闭环验证的过渡非常有利。

图2.12 FPGA+DSP处理器的数字信号处理系统设计流程

图2.13 单片FPGA取代FPGA+DSP处理器

在FPGA内部可嵌入处理器软核,这使得在某些场合FPGA+DSP处理器的模式可被单片FPGA或多片FPGA的模式所取代,如图2.13所示。在这种情况下,整个系统完全以FPGA为核心,相应的设计流程也有所改变。基于FPGA的数字信号处理系统设计流程如图2.14所示。这种设计流程体现了ESL的设计理念。在这个流程中,算法分解是非常重要的一环,需要对算法结构有深入的理解,根据算法结构的特点以C/C++、Mat-lab/Simulink、VHDL/Verilog对算法描述。采用C/C ++描述的部分,可以通过高层次综合工具转换为RTL代码实现硬件加速。采用Matlab/Simulink描述的部分,若是直接采用Xilinx SysGen描述的,则可利用SysGen生成RTL代码;若是采用Simulink自身模块描述的,则可利用HDL Coder生成RTL代码(不是所有的Simulink模块都可转化为RTL代码,具体哪些模块支持可通过hdllib查看)。采用HDL代码描述的部分,除了手工编写代码外,还可以充分利用Xilinx提供的IP核。

图2.14 基于FPGA的数字信号处理系统设计流程

2.3.2 定点数与浮点数

FPGA所能处理的数据以定点数为主,尽管也具备处理浮点数的能力,Xilinx也提供了浮点(Floating-point)IP核,可支持多种浮点运算,但与定点数相比,浮点数在资源和功耗上都没有优势。事实上,如果选取合适的字长,则定点数的处理结果总能逼近浮点数的处理结果。表2.1给出了定点数与浮点数的比较。相比之下,定点数在占用存储空间、执行速度和硬件功耗上占有优势,而浮点数在代码的可复用性、实现的复杂度和错误定位上占有优势。因此,在一般情况下,在算法级的设计开发与验证上采用浮点模型(借助Mat-lab/Simulink环境),而到RTL则采用定点模型。于是,从浮点模型到定点模型的转换就成为设计的一个关键环节。这种转换归根结底是确定数据的字长。数据的字长由整数部分字长和小数部分字长共同决定。字长的确定需要综合考虑系统采样频率、系统带宽、系统动态范围、系统功耗、系统资源等各方面的需求。在信号处理中,字长选取的总体原则是“大信号不溢出,小信号不损失”。

表2.1 定点数与浮点数的比较

图2.15 将浮点数以二进制补码表示的操作流程

字长的确定从A/D转换器的选取就已开始。选取具有恰当分辨率的A/D转换器,可获得期望的动态范围和信噪比,同时对后续算法所需字长也有直接影响。在系统仿真时,可以借助Matlab/Simulink完成,这是以浮点数为基础的。如何确定硬件电路中每个环节(模块)的字长是系统仿真的一项重要任务。这和硬件电路所要完成的功能(如加法、乘法和滤波等)有关。例如,在Matlab中利用fdatool产生一套滤波器系数fircoe,显然均为浮点数,现在要将其以二进制补码表示,可按照图2.15所示操作。在图2.15中,量化比特率就是指以多少位的二进制数来表示数值,这和系统指标要求及FPGA内部资源等有关;在放大处理中,采用2N-1 -1去相乘,这是N位二进制补码所能表示的最大值,其目的是为了防止溢出;Matlab中的取整函数有ceil、floor、round、fix、nearest和covergent等,此处用floor函数表示向下取整,目的还是为了防止溢出。

定点数实际上是以整数尺度为基础的,因为我们总可以采用某一比例系数来对数值进行缩放,在随后的数学计算时将比例系数考虑进去即可。在利用FPGA进行数字信号处理时,要尽可能地使所有数据为定点数据。同时,借助Matlab确定系统各模块的位宽,要综合考虑各方面的因素。