0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于FPGA与VHDL语言实现音频处理芯片设计与仿真分析

电子设计 来源:郭婷 作者:电子设计 2019-01-07 08:47 次阅读

1 引言

随着数字技术日益广泛的应用,以现场可编程门阵列FPGA(Field Programmable Gate Array)[1]为代表的ASIC[2]器件得到了迅速的普及和发展,器件的集成度和速度都在高速增长。FPGA既具有门阵列的高逻辑密度和高可靠性,又具有可编程逻辑器件的用户可编程性,可以减少系统的设计和维护的风险,降低产品成本,缩短设计周期。

目前,信号处理技术、通信技术和多媒体技术的迅猛发展都得益于DSP[3]技术的广泛应用。但是对于便携式和家用的语音系统而言,基于一般的DSP芯片的设计方案并不理想。首先DSP的芯片成本以及开发成本在现阶段仍然是比较高的,尤其是芯片成本,远远不及大批量ASIC芯片成本之低。其次便携式的设备对体积要求十分苛刻,限制了一部分DSP芯片的使用,而体积正是ASIC芯片的优点之一。

本文提出了一种基于FPGA的音频处理芯片的硬件电路实现方案。由于对FIR滤波器算法进行了改良,所以很大程度上减小了芯片的体积和降低了芯片的功耗。

2 算法研究与改良

2.1 普通FIR滤波算法

N阶FIR滤波器可以用下面的线性卷积表示:[4]

基于FPGA与VHDL语言实现音频处理芯片设计与仿真分析

x(n)是输入的音频序列,而y(n)是经过滤波后输出的音频序列,h(k)是N阶滤波器的系数。

简单的实现这个算法,需要N+1次的乘法和N次的加法。所以至少需要一个硬件乘法器和一个定点或者浮点加法器来实现这个功能。由于音频处理芯片只需要做线性卷积,所以我们不需要采用乘法器的结构。一般来说,由于乘法器庞大的结构,占用了芯片上的大部分面积,消耗用了大部分功率。而不使用乘法器的结构将会节约可观的芯片面积和功耗。为了实现这种结构,我们需要改良FIR滤波算法。

2.2 改良滤波算法

首先,将滤波的系数h(k)用二进制表示法(POT,Power of Two)表示:

例如:h(k)=0.1172=2-3-2-7-2-16

我们给出7阶滤波器的一组系数,使用POT表示(精度小于10-4):

h(0) = 0.3761 = 2-1-2-3+2-10+2-13-2-15

h(1) = 0.3083 = 2-2+2-4-2-8-2-12

h(2) = -0.9424*10-1 = -2-3+2-5-2-11

h(3) = 0.6439*10-1 = 2-4+2-9-2-14

h(4) = -0.3308*10-1 = -2-5-2-9+2-13

h(5) = 0.1663*10-1 = 2-6+2-10+2-15

h(6) = -0.4135*10-2 = -2-8-2-12+2-16

h(7) = 0.1877*10-2 = 2-9-2-14-2-16

n=7时滤波器的输出值y如下:

y = (2-1-2-3+2-10+2-13-2-15) * x(7)

+(2-2+2-4-2-8-2-12) * x(6)

+(-2-3+2-5-2-11) * x(5)

+(2-4+2-9-2-14) * x(4)

+(-2-5-2-9+2-13) * x(3)

+(2-6+2-10+2-15) * x(2)

+(-2-8-2-12+2-16) * x(1)

+(2-9-2-14-2-16) * x(0)

很明显,x(n)的系数全部都是2的负k次幂,所以我们可以把具有相同系数的x(n)合并起来。

y(n)=2-1(...2-1(2-1(2-1u1+u2)+u3)+...)+u16)

uj=xj(1)+ xj(2)+……+ xj(rj)

其中1≤j≤16, xj(i)∈{x(n-k)}, 1≤i≤rj

由前面的系数,可以得到:

U1 = x(n-6)-x(n-7); U2 = -x(n)+x(n-5);

U3 = -x(n-3)-x(n-7); U4 = x(n)+x(n-4);

U5 = -x(n-1)-x(n-6); U6 = -x(n-2);

U7 = x(n)+x(n-5); U8 = x(n-3)-x(n-4)+x(n-7);

U5 = -x(n-1)-x(n-6); U10 = 0;

U11 = x(n-5); U12 = x(n-2)-x(n-4);

U13 = x(n-1)+x(n-3); U14 = -x(n)-x(n-2);

U15 = x(n-1); U16 = x(n);

按照这个算法,先求U1的值,然后将结果右移一位,再将结果与U2的值相加,依此类推,即可得到y(n)。我们使用若干次加法和16次移位操作即可完成FIR滤波,算法的复杂度和功耗都大大地降低。

3 音频处理芯片的设计

3.1 结构概述

在整个音频处理芯片的结构中,我们没有采用任何乘法器,取而代之的是一个加法器和移位器。加法器的结果输出到移位器,移位器的输出再反馈到加法器的输入端,循环运算实现滤波器的功能。

考虑7阶的FIR滤波器,需要对x进行8次采样,所以输入的数据都应该保存在一个8*16的DataRAM之中(16bit的采样精度)。系数RAM(ProgramRAM)的大小取决于操作的个数,在上面提到的算法中,一共有28个操作,所以ProgramRAM的大小不能小于28,在这里我们使用了一个32*6的ProgramRAM,以满足算法需要。

考虑到音频处理芯片的可扩展性,我们在音频处理芯片外设置一个EEPROM用来存放系数,当芯片启动的时候,从EEPROM中将数据转存到ProgramRAM中,以适应不同FIR滤波器的系数,极大地增强了音频处理芯片的可编程性。

音频处理芯片的模块主要包括EEPROM, ProgramRAM, DataRAM,串并转换模块,并串转换模块,地址生成模块,主控制器模块。

3.2 寻址方式描述

在系统启动时,附加的EEPROM储存的系统参数值,包括输入信号在DataRAM中的地址值和相应的标志位(32*6bit) ,依次读入ProgramRAM中去。

其中,Zero,Sign,Shift分别为操作控制

Zero表示不加任何操作数

Sign表示加上负的操作数

Shift表示移位操作

而Virtual Address表示操作数的虚拟地址。

基于FPGA与VHDL语言实现音频处理芯片设计与仿真分析

基于FPGA与VHDL语言实现音频处理芯片设计与仿真分析

Base Address总是指向DataRAM中最早写入的值所在的地址,也就是x(n-7)的地址,而Virtual Address其他值相对于x(n-7)的地址,所以可以得出操作数在DataRAM中实际的地址:

Physical Address=BaseAddress+VirtualAddress

以y(n)=2-1(...2-1(2-1(2-1u1+u2)+u3)+...)+u16)中的u1为例

U1 = x(n-6) - x(n-7);

参数设置:C1= x(n-6)=000001

C2=-x(n-7)=011000

※最低的三位表示存储地址

※第4位表示移位标志,C2(4)为1表示计算出U1以后要右移得到2-1* U1

※第5位表示符号位,控制加减运算。C1(5)为0表示加, C2(5)为1表示减

※最高位,也就是第6位在Un=0时为1,这里只有C19(6)为1

3.3 端口描述

基于FPGA与VHDL语言实现音频处理芯片设计与仿真分析

3.4 模块设计

3.4.1 EEPROM [5]

·EEPROM用来存储系统参数

·EEPROM是32*6bit的存储阵列

·EEPROM的输入是Enable,Address(4 downto 0)

·EEPROM的输出是CoeffData(5 downto 0)

·EEPROM的首单元存放了操作的个数;例如,首单元存放"011100"表示一共有28个操作。

3.4.2 ProgramRAM [6]

·ProgramRAM接收EEPROM中的系统参数

·ProgramRAM是32*6bit的存储阵列

·ProgramRAM的输入是Write,Read,DataIn(5 downto 0),Address(4 downto 0)

·ProgramRAM的输出是Zero,Sign,Shift,DataAddr(2 downto 0)

3.4.3串并转换模块[7] (Serial2Parallel)

·Serial2Parallel接收来自ADC的串行数据、数据时钟和帧同步信号

·Serial2Parallel将串行输入信号转化为16bit的并行信号

·Serial2Parallel的输入是DataClk,DataIn,FrameSync

·Serial2Parallel的输出是DataOut(15 downto 0),DataOutSync

3.4.4并串转换输出模块[7] (Parallel2Serial)

•Parallel2Serial将并行信号转化为串行信号

•Parallel2Serial的输入是DataIn(15 downto 0),DataClk,FrameSync

•Parallel2Serial的输出是DataOut

3.4.5主控制器模块(Main Controller)

·主控制器模块是整个设计的核心,它协调控制着其他各个模块的工作

·主控制器模块是根据操作流程图设计的一个状态机

3.4.6 地址生成模块(AddressGen)

·PhysicalAddress实际上是一个加法器,将VirtualAddress与BaseAddress相加产生读地址

·BaseAddress实际上是一个计数器,IncreaseBase信号控制加1,产生写地址

·MUX选择读地址或者是写地址到DataRAM

4 音频处理芯片的仿真

4.1 仿真波形

4.2 仿真结果

通过程序,对一组输入序列进行了仿真结果比较,所获得的结果如表1所示。

表1:仿真结果比较

基于FPGA与VHDL语言实现音频处理芯片设计与仿真分析

通过表1可以看出音频处理芯片达到了预期的设计目标,效果良好。

可以看到,期望值和仿真结果在最后一位会有±1的误差,这是由于我们采用的移位算法将最后一位移出时不进行四舍五入造成的。经过计算,这种误差不会影响FIR的精度。

5 结束语

本文设计的音频处理芯片主要实现FIR滤波器功能,可以满足较为简单的语音信号处理的需要。用POT系数表示方法来表示系统参数,用一个加法器和一个移位寄存器实现乘法器的功能,这样在面积功耗上就有相当大的优势。设计过程是采用自顶向下的设计方法。最终的仿真结果符合预期的要求

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1603

    文章

    21337

    浏览量

    593753
  • 芯片
    +关注

    关注

    447

    文章

    47888

    浏览量

    409941
  • 滤波器
    +关注

    关注

    158

    文章

    7343

    浏览量

    174969
收藏 人收藏

    评论

    相关推荐

    基于FPGA的图像边缘检测系统设计,用VHDL语言实现该怎么做?

    不知道有没有大神做过:基于FPGA的图像边缘检测系统设计,用VHDL语言实现
    发表于 05-10 00:22

    如何用VHDL语言实现帧同步的设计?

    帧同步是什么工作原理?如何用VHDL语言实现帧同步的设计?
    发表于 04-08 06:33

    FPGA技术如何用VHDL语言实现8位RISC微处理器?

    设计RISC微处理器需要遵循哪些原则?基于FPGA技术用VHDL语言实现的8位RISC微处理
    发表于 04-13 06:11

    如何利用VHDL语言实现FPGA与单片机的串口异步通信电路?

    本文介绍利用VHDL语言实现 FPGA与单片机的串口异步通信电路。
    发表于 04-29 06:34

    如何利用FPGAVHDL语言实现PCM码的解调?

    利用现场可编程门阵列(FPGA)和VHDL 语言实现了PCM码的解调,这样在不改变硬件电路的情况下,能够适应PCM码传输速率和帧结构变化,从而正确解调数据。
    发表于 05-07 06:58

    VHDL语言实现3分频电路

    VHDL语言实现3分频电路 标签/分类: 众所周知,分频器是FPGA设计中使用频率非常高的基本设计之一,尽管在目前大部分设计中,广泛使用芯片厂家集成的锁相
    发表于 08-21 15:28 5558次阅读

    VHDL语言实现3分频电路(占空比为2比1)

    VHDL语言实现3分频电路(占空比为2比1) 分频器是FPGA设计中使用频率非常高的基本设计之一,尽管在目前大部分设计中,广泛使用芯片厂家集成的锁
    发表于 06-22 07:46 7914次阅读

    FM收音机的解码及控制器VHDL语言实现

    Xilinx FPGA工程例子源码:FM收音机的解码及控制器VHDL语言实现
    发表于 06-07 14:13 11次下载

    关于通过FPGAVHDL语言实现ALU的功能设计详解

    目前许多FPGA的逻辑资源(LE)都已超过1万门,使得片上可编程系统SOPC已经成为可能。算术逻辑单元ALU应用广泛,是片上可编程系统不可或缺的一部分。利用VHDL语言FPGA
    发表于 07-22 11:22 7044次阅读
    关于通过<b class='flag-5'>FPGA</b>中<b class='flag-5'>VHDL</b><b class='flag-5'>语言实现</b>ALU的功能设计详解

    使用Quartus和VHDL语言实现的LPC时序的工程文件

    本文档的主要内容详细介绍的是使用Quartus和VHDL语言实现的LPC时序的工程文件免费下载。
    发表于 09-18 16:49 20次下载
    使用Quartus和<b class='flag-5'>VHDL</b><b class='flag-5'>语言实现</b>的LPC时序的工程文件

    基于VHDL硬件描述语言实现CPSK调制的程序及仿真

    本文档的主要内容详细介绍的是基于VHDL硬件描述语言实现CPSK调制的程序及仿真
    发表于 01-19 14:34 11次下载
    基于<b class='flag-5'>VHDL</b>硬件描述<b class='flag-5'>语言实现</b>CPSK调制的程序及<b class='flag-5'>仿真</b>

    使用VHDL硬件描述语言实现基带信号的MASK调制的程序与仿真

    本文档的主要内容详细介绍的是使用VHDL硬件描述语言实现基带信号的MASK调制的程序与仿真
    发表于 01-19 14:34 13次下载
    使用<b class='flag-5'>VHDL</b>硬件描述<b class='flag-5'>语言实现</b>基带信号的MASK调制的程序与<b class='flag-5'>仿真</b>

    使用VHDL硬件描述语言实现基带信号的MFSK调制的程序与仿真

    本文档的主要内容详细介绍的是使用VHDL硬件描述语言实现基带信号的MFSK调制的程序与仿真
    发表于 01-19 14:34 4次下载
    使用<b class='flag-5'>VHDL</b>硬件描述<b class='flag-5'>语言实现</b>基带信号的MFSK调制的程序与<b class='flag-5'>仿真</b>

    使用VHDL硬件描述语言实现基带码发生器的程序设计与仿真

    本文档的主要内容详细介绍的是使用VHDL硬件描述语言实现基带码发生器的程序设计与仿真免费下载。
    发表于 01-20 13:44 16次下载
    使用<b class='flag-5'>VHDL</b>硬件描述<b class='flag-5'>语言实现</b>基带码发生器的程序设计与<b class='flag-5'>仿真</b>

    基于VHDL语言实现远程防盗报警设计

    电子发烧友网站提供《基于VHDL语言实现远程防盗报警设计.pdf》资料免费下载
    发表于 11-08 14:33 0次下载
    基于<b class='flag-5'>VHDL</b><b class='flag-5'>语言实现</b>远程防盗报警设计