【FPGA-DSP】第一期:DSP基础

目录

1. DSP基础 

1.1 DSP基本概念

1.2 FPGA实现DSP的特点

2. DSP硬核的结构与使用

3. FPGA设计DSP技术

3.1. 浮点数与定点数的表示与转换

3.1.1. 双精度浮点数表示

3.1.2. 双精度浮点数与定点数的转换


本章作为FPGA数字信号处理的入门介绍课程,将介绍DSP的基本原理                                           

通常的数字信号处理器只包含一个或几个乘法器,需要进行多次迭代完成运算。不同的是从平台级 FPGA 开始,器件中集成了大量数字信号处理(DSP)的硬件模块,成为对信号进行并行处理的引擎,利用 FPGA 实现数字信号处理算法可以满足信号处理系统所提出的高性能要求,因此得到越来越广泛的应用。本章讨论采用 FPGA 硬件实现 DSP 系统的设计方法。

1. DSP基础 

1.1 DSP基本概念

DSP 与其他通用计算技术相互区别的两个重要特性是实时流量要求数据驱动特性。DSP 的硬件实现应该以满足实时处理的流量约束来设计,新的输入采样从信号源周期地按收时就需要立即处理,这与先在缓冲器存储,然后按批作业处理不同。如果系统的流量比要求的采样率低,必须停止或缓冲新的输人采样,并需要无限长的缓冲器。但是,一旦硬件达到要求的采样率和实时流量处理的能力,就没必要提高计算的执行速度。

因为FPGA有着强大的实时计算能力,一旦输入数据有效,FPGA就会进行数据处理,这种系统是由数据流同步的,而不是系统时钟同步。DSP程序可以实现对一个无限长时间信号进行重复的数据处理。DSP系统的时钟速率一般和采样率是不同的。

在进行DSP处理前,首先要对模拟信号进行采样的处理,将模拟信号转换成数字信号。若不在最佳采样点采样,可能会引入混迭和其他不期望的频率分量。同时采样尽量使信号的有效动态范围达到满量程,实现最大信噪比,减小量化误差。

最小的采样率称为 Nyquist 频率。在 Nyquist-Shannon定理中定义了这个最小频率来确地表示一个连续的频带受限模拟信号,采样频率至少是信号最大频率的两倍以上,这里不做过多赘述。

在A/D转换时会引入量化误差和噪声,量化误差由量化间隔决定,量化噪声与DAC位数有关,DAC位数越高,在满量程时采样出来的信号越逼近原始模拟信号,此时量化噪声最小,可以发现量化噪声和量化误差都是在采样时引入的。下面介绍一些常用相关术语

  • 最大信噪比:采样达到有效信号的满量程动态范围即可输出最大信噪比
  • 迭代:执行一次全部DSP算法的过程称为一次迭代
  • 关键通道:计算的组合逻辑电路中,输入到输出最长的一条数据通道称为关键通道,因此关键通道的计算时间决定了一个DSP系统的最小可处理时钟周期或最大时钟频率
  • 等待时间:系统接收到输入到计算输出的时间差

DSP输入输出关系公式:

从上述公式可以看出,实现一个基本的DSP 算法需要三种运算单元,包括加法运算、延时单元以及乘法运算。加法和乘法运算在电路中有专门的器件,单位延时可采用D触发器来实现。如果需要产生多个单位延时,可采用多个D触发器的级联或者对存储器先写入然后延时读出数据的方式。其实,D 触发器属于存储器的一种,所以,实现一个基本的数字信号处理系统,需要加法器、乘法器和存储器。FPGA 内部包括上述所有器件,因而成为实现DSP的理想选择。

要采用 FPGA实现 DSP算法,必须经过量化。在公式中,系数a_{k}b_{k}通常都是通过理论计算或者 MATLAB工具计算得到的。前者采用无限精度,后者采用双精度浮点数。无论是无限精度还是双精度浮点数,FPGA 芯片都是无法直接处理的,所以必须将系数a_{k}b_{k}进行量化,以有限长的二进制码的形式表示。量化采用的二进制位数越多,精度越高,但耗费的 FPGA资源就越多,设计中根据系统的指标对精度与资源进行折中。此外,由于量化会引入量化误差,在设计中要引起重视。例如,设计一个有极点的滤波器,若其极点太靠近单位圆,量化误差有可能会使该极点跑到单位圆外,造成系统不稳定。具体的量化分析读老可以参阅与数字信号处理相关的书籍,这里不再详述。 

量化之后还需要选取运算结构。不同的算法结构所需的存储器和乘法器资源是不同的,前者影响复杂度,后者影响运算速度。

经过量化和确定好运算结构之后,便可以使用FPGA来设计一个DSP系统。但是DSP系统设计不再是用硬件描述语言直接描述,而是从算法角度着手的系统级综合,再通过高级综合实现RTL级的描述。进行DSP算法综合需要用到除了vivado以外的电子系统及设计软件。

利用 FPGA实现DSP嵌人式系统时,可以利用 Altera 和 Xilinx 公司在MATLAB-Simulink 中预先提供的模块集(Blockset),按照基于模型的设计方法建立DSP系统的算法模型在仿真、优化的基础上由 DSP Builder 和 System Generator 自动转换成硬件实现的网表文件,再进行布局和布线的实现。     

System Generator是 Xilinx公司推出的一个面向 DSP 开发的基于模型的设计工具它是作为 MTALAB中的一个Smulink 工具箱出现的工具,广泛应用于科学计算和工程计算,可以进行复杂的 DSP 系统的建模与仿真。Simulink 是MATLAB的一个组成部分,用于图形化建模仿真。System Generator 作为Simulink 的一个工具箱,使得利用 FPGA 设计嵌入式 DSP 系统时,设计者完全可以通过Simulink 的图形化界面来进行系统建模,只要简单地进行 System Generator 工具箱中的模块调用即可。值得注意的是,System Generator 中的 DSP 基本模块是以算法级的描述出现的,便于设计者从系统级或者算法级进行理解,甚至不需要了解 FPGA本身和硬件描述语言。    

1.2 FPGA实现DSP的特点

FPGA是具有极高并行速度的信号处理引擎,通过并行方式提供高性能的信号处理能力。传统的DSP设备是顺序执行所需要处理的任务,分时共享乘法累加单元,从而限制了数据流量,是的系统时钟频率就算很高也无法提供高速的处理速度。但是FPGA内部有大量的乘法器,大量处理可以并行实现,能够保持高速可靠的数据率。传统的通用DSP器件和FPGA器件的顺序与并行处理比较。 

FPGA的系统时钟频率一般低于通用DSP器件,也能够保证比DSP器件更快的计算速度。就通用DSP器件而言,运算速度随着抽头数(算法复杂度)增加成指数下降。一般情况下FPGA可以与DSP处理器配合使用,一起构成了数字信号处理系统。

(1)利用 FPGA 的并行处理的特性实现预处理器,对系统前端的高速数据流进行预先处理,得到低速的数据流,在将低速数据流由 DSP 处理器完成后续的处理。例如将多路并行数据进行预处理得到单路数据,再交给通用 DSP 做相应的处理。

(2)利用 FPGA 硬件高速处理的能力实现协处理器,将软件无法完成的高速处理交由FPGA处理。所以作为协处理器,FPGA 受到起系统主机作用的 DSP 处理器控制,在不同的工作模式下协助主机完成高速处理的任务。

其实,通用 DSP处理器的功能也可以采用 FPGA 完成,构成可编程片上系统(SOPC)。七系列Zynq芯片就提供了大量的DSP硬核在PL中,在ARM处理器控制下实现信号的高速处理。总之,FPGA能够实现高性能的数字信号处理,主要基于一下三个因素

  • 高度的并行性
  • 重构的灵活性
  • 最佳性价比

 

2. DSP硬核的结构与使用

fpga对于数字信号处理(DSP)应用是有效的,因为它们可以实现定制的、完全并行的算法。DSP应用程序使用很多二进制最好在专用DSP片中实现的乘数器和累加器。所有7系列fpga有许多专用的、全定制的、低功耗的DSP片,组合起来高速度快,体积小,同时保持系统设计的灵活性。DSP片增强了许多应用的速度和效率超出了数字信号处理的范围动态总线移位器,内存地址生成器,宽总线多路复用器,和内存映射的I/O寄存器。七系列FPGA中的DSP硬核DSP48E1参考官方文档

DSP功能的一些亮点包括:

  • 25 × 18位二补乘法器:
    • 动态旁路
  • 48位累加器:
    • 可作为同步上/下计数器使用
  • 省电预加法器:
    • 优化对称滤波器应用,降低DSP片的要求
  • 单指令多数据(SIMD)算术单元:
    • 双24位或四12位加/减/累加
  • 可选逻辑单元:
    • 可以生成两个操作数的十个不同逻辑函数中的任何一个
  • 模式检测器:
    • 收敛或对称四舍五入
    • 与逻辑单元一起使用时,96位宽的逻辑功能
  • 高级功能:
    • 可选的流水线和专用总线级联

DSP48E1片提供了提高的灵活性和利用率,提高了效率应用程序,降低了整体功耗,并提高了最大频率。高性能允许设计人员在一个程序中实现多个较慢的操作,单DSP48E1片采用时间多路复用方法。DSP48E1片支持许多独立的功能。这些函数包括multiply, multiply累加(MACC), multiply add, three-input add, barrel shift, wide(广义)总线复用,幅度比较器,位逻辑函数,模式检测,以及wide计数器。该架构还支持级联多个DSP48E1片以形成宽数学函数,DSP滤波器和复杂的算术,而不使用通用的FPGA逻辑。 

3. FPGA设计DSP技术

在第二期我们会使用matlab中的Simulink与vivado中的System Generator套件联合开发,下面简要介绍一些FPGA中需要具备的数字信号处理必备知识。

3.1. 浮点数与定点数的表示与转换

3.1.1. 双精度浮点数表示

在设计仿真中,Simulink 是利用双精度数(double)表示数值,它是 64 位 2的补码浮点数,而双精度数对 FPGA 是无效或不实际的。

当利用有限位数来表示二进制数时,进制点的位置确定了所表示数的范围和精度。二者的关系是,二进制点前面的位数多表示的数值的有效范围大,精度就低;相反,二进制点后面的位数多,数值精度提高,数值有效范围减小。

  • 首先介绍一下单双精度浮点数的区别

单精度是这样的格式,一共32位,其中1位符号,8位指数,23位小数。

双精度一共64位,其中1位符号,11位指数,52位小数。 

要先理解3大要点:

  1. 小数的二进制表示法,即浮点数
  2. 浮点数如何在计算机中储存,即符号位(0正、1负),指数位,小数位(通常翻译做尾数)
  3. 取值范围取决于指数位,计算精度取决于小数位(尾数)。小数位越多(比如双精度是52位),则能表示的数越大,那么计算精度则越高。

单精度的小数位在计算机中只有23位(二进制),换算到十进制只能百分百保证6位十进制数字的精确度。不能百分百保证7位的精度运算。超过该精度(二进制23位,十进制6位)的小数运算将会被截取,造成精度损失和计算结果的不准确。同理,双精度,小数位是52位(二进制),换算为十进制则只能百分百能保证15位,16位及其之后的数据同样会被截取。

注意:浮点数中小数点的位置是不固定的,用阶码和尾数来表示。通常尾数为纯小数,阶码为整数,尾数和阶码均带符号数。同时通过移动小数点的位置,可以实现纯整数或者纯小数的表示方法:

# 纯整数表示法

最高位是符号位,小数点默认隐含在数值位末尾的后一位,数值位是整数部分的二进制

# 纯小数表示法

最高位是符号位,小数点默认隐含在符号位和数值位之间,数值位是小数部分的二进制

3.1.2. 双精度浮点数与定点数的转换

由于硬件无法按照双精度的要求进行实现,所以要转换成N位的定点数。在Simulink中Xilinx的模块集有3种数据类型:
(1)不带符号的N位定点数,表示为 UFix_N_m,其中N为二进制位数,m 为二进制点距离最低位的位置,最大精度为2^{m}

(2)带符号的 N位定点数,表示为 Fix_N_m,其中N为二进制位数,m 为二进制点距离最低位的位置,最大精度为2^{m}

(3) 布尔类型数,总是定义为0或1,作为控制口的使能(CE)或复位(reset),所以不可以设为无效

例:将数值-2.261 108表示为Fix_16_13的格式

在基于模型的系统设计流程中,当Xilinx 模块集中的带符号的定点数模块需要与Simulink 的双精度数模块通信时,必须要进行数据类型的变换,这是基于模型的系统设计流程中的重要概念之一。
为了完成这个数据类型变换,要选择 Xilinx模块集中的Gateway In实现双精度数到定点数的转换,或者选择Xilinx 模块集中的 Gateway Out 实现定点数到双精度数的转换 。

Gateway In/Out 两个模块可以通过选择参数来控制如何实现双精度数与定点数之间的相互转换。一般来说,主要由 Gateway In 模块的参数选择来进行控制,除了选择带符号或不带符号定点数的位数和二进制点位置之外,还需要选择以下两个参数:
(1)量化方式:截断(Trancate)或舍人(Round)
(2)溢出方式:饱和(Saturate)或交迭(Wrap)。
当小数部分的位数不足以表示一个数值的小数部分时,将出现量化的情况,截断是放弃最低有效位右边的所有位,当有两个等距离最接近表示的数值,舍入将取最接近表示的数值,或去偏离0最远的数值。

双精度浮点和定点的转换见下图:

 

当一个数值超出了表示范围,将出现溢出,在仿真过程中出现溢出将有溢出标志位作为Simulink的错误产生。同时溢出时有两种数据表示方式:

(1)饱和

        去最大的正值或最大的负值

(2)交迭

         直接放弃超出最大有效位的任何有效位

在满足设计要求的情况下,尽量选择截断的量化方式(不增加硬件资源)。溢出方式选着饱和可以防止输出的震荡,输出数据不再改变,但是会增加硬件资源。

 

  • 17
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先需要理解EMIF总线,EMIF总线是外部存储器接口总线,可以连接FPGADSP芯片与外部存储器进行数据通信。接下来是FPGADSP的Verilog代码: FPGA部分: ```verilog module fpga_emif( input wire clk, //时钟信号 input wire reset_n, //复位信号 output reg [15:0] data_out, //数据输出 input wire [15:0] data_in, //数据输入 output reg oe_n, //输出使能信号 output reg we_n, //写使能信号 inout [22:0] addr //地址信号 ); reg [15:0] data_out_reg; //输出数据寄存器 //复位 always @(negedge reset_n) begin oe_n <= 1'b1; //输出使能信号复位为高电平 we_n <= 1'b1; //写使能信号复位为高电平 data_out_reg <= 16'h0000; //输出数据寄存器复位为0 end //数据输出 assign data_out = data_out_reg; //数据输入 always @(posedge clk) begin if (oe_n == 1'b0) begin //如果输出使能信号为低电平 data_out_reg <= data_in; //输出数据寄存器赋值 end end //地址信号 assign addr[22] = 1'b0; //EMIF总线地址信号第23位为0 assign addr[21:0] = 22'h0000; //EMIF总线地址信号低22位为0 //输出使能信号 always @(posedge clk) begin if (oe_n == 1'b0) begin //如果输出使能信号为低电平 oe_n <= 1'b1; //输出使能信号赋值为高电平 end end //写使能信号 always @(posedge clk) begin if (we_n == 1'b0) begin //如果写使能信号为低电平 we_n <= 1'b1; //写使能信号赋值为高电平 end end endmodule ``` DSP部分: ```verilog module dsp_emif( input wire clk, //时钟信号 input wire reset_n, //复位信号 output reg [15:0] data_out, //数据输出 input wire [15:0] data_in, //数据输入 output reg oe_n, //输出使能信号 output reg we_n, //写使能信号 inout [22:0] addr //地址信号 ); reg [15:0] data_out_reg; //输出数据寄存器 //复位 always @(negedge reset_n) begin oe_n <= 1'b1; //输出使能信号复位为高电平 we_n <= 1'b1; //写使能信号复位为高电平 data_out_reg <= 16'h0000; //输出数据寄存器复位为0 end //数据输出 assign data_out = data_out_reg; //数据输入 always @(posedge clk) begin if (oe_n == 1'b0) begin //如果输出使能信号为低电平 data_out_reg <= data_in; //输出数据寄存器赋值 end end //地址信号 assign addr[22] = 1'b0; //EMIF总线地址信号第23位为0 assign addr[21:0] = 22'h0000; //EMIF总线地址信号低22位为0 //输出使能信号 always @(posedge clk) begin if (oe_n == 1'b0) begin //如果输出使能信号为低电平 oe_n <= 1'b1; //输出使能信号赋值为高电平 end end //写使能信号 always @(posedge clk) begin if (we_n == 1'b0) begin //如果写使能信号为低电平 we_n <= 1'b1; //写使能信号赋值为高电平 end end endmodule ``` 以上是FPGADSP采用EMIF总线的Verilog代码,其中包括复位、时钟、数据输入输出、地址信号、输出使能信号和写使能信号等模块。需要根据实际情况进行适当的修改和调试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值