首页 > 其他分享 >基于FPGA的A律压缩解压缩verilog实现,包含testbench

基于FPGA的A律压缩解压缩verilog实现,包含testbench

时间:2024-07-07 16:09:55浏览次数:20  
标签:wire FPGA tdata 压缩 解压缩 verilog data axis

1.算法仿真效果

VIVADO2019.2仿真结果如下(完整代码运行后无水印):

 

 

 

RTL图如下所示:

 

 

 

2.算法涉及理论知识概要

       A律压缩是一种广泛应用于语音编码的非均匀量化技术,尤其在G.711标准中被欧洲和中国等国家采纳。该技术的核心目的是在有限的带宽下高效传输语音信号,同时保持较高的语音质量。在基于现场可编程门阵列(Field-Programmable Gate Array, FPGA)的实现中,A律压缩解压缩算法的高效硬件实现成为可能,这对于实时通信系统尤为重要。

 

       A律压缩基于对数性质,对原始的模拟语音信号进行非线性变换,将较大的信号变化幅度分配更多的量化级,而较小的变化分配较少的量化级,以此达到降低数据速率的同时保持信号的主要特征不变。A律压缩的数学表达式如下:

 

 

 

       其中,x是归一化后的输入信号(通常在−1−1到11之间),y是量化后的数字信号,A是压缩器的阈值,一般取A=1/1.5​。实际应用中,为了简化硬件实现,A律压缩通常采用13折线近似,即将输入信号范围分割为多个小段,每段采用不同的线性关系进行近似。

 

       解压缩过程是压缩的逆过程,其目标是将经过A律压缩的数字信号恢复成接近原始的模拟信号。解压缩数学表达式为:

 

 

 

        其中,x′是解压缩后的近似原始信号,y是接收到的量化数字信号,A同压缩时使用的阈值。在FPGA实现中,解压缩同样可以通过查找表、算术逻辑单元(ALU)或专用的浮点运算单元完成。

 

FPGA实现要点

 

信号预处理:首先,模拟信号需经过采样和量化变为数字信号,这一过程通常在FPGA的模数转换器(ADC)部分完成。

 

非线性变换:接下来,通过查找表(LUT)或多项式近似实现上述非线性变换。FPGA的LUT资源丰富,适合存储折线近似所需的查找表值。例如,对于13折线近似,可以预先计算每个区间的输出值,存储在LUT中,输入信号根据其所在区间直接查表得到量化输出。

 

量化与编码:量化后的信号需要进一步编码为二进制数据进行传输。编码过程往往涉及将连续的量化值映射到固定的比特序列,这可以通过简单的逻辑门电路或者状态机在FPGA上实现。

 

同步与控制:FPGA实现中,还需要考虑时钟管理和状态控制逻辑,确保整个压缩流程按时序正确执行,同时处理好数据的流动和存储问题。

 

3.Verilog核心程序

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2024/06/21 17:39:11
// Design Name: 
// Module Name: TEST
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//
 
 
module TEST();
 
reg i_clk;
reg i_rst;
wire [7:0]  o_y_alaw;
wire [11:0] o_y_dealaw; 
 
 wire [31 : 0] m_axis_data_tdata;
dds_compiler_0 dds_compiler_0U (
  .aclk(i_clk),                                // input wire aclk
  .m_axis_data_tvalid(),    // output wire m_axis_data_tvalid
  .m_axis_data_tdata(m_axis_data_tdata),      // output wire [15 : 0] m_axis_data_tdata
  .m_axis_phase_tvalid(),  // output wire m_axis_phase_tvalid
  .m_axis_phase_tdata()    // output wire [31 : 0] m_axis_phase_tdata
);
 
wire signed[11:0]signal = {m_axis_data_tdata[31],m_axis_data_tdata[31:21]};
 
tops uut(
.i_clk       (i_clk),
.i_rst       (i_rst),
.i_x         (signal),
.o_y_alaw    (o_y_alaw),
.o_y_dealaw  (o_y_dealaw)
);
 
initial
begin
i_clk=1'b1;
i_rst=1'b1;
#100
i_rst=1'b0;
end
always #5 i_clk = ~i_clk;
endmodule

  

标签:wire,FPGA,tdata,压缩,解压缩,verilog,data,axis
From: https://www.cnblogs.com/51matlab/p/18288604

相关文章

  • I2S采集卡&播放器 Verilog实现
    1.杜老师的建议购买采集卡播放器使用采集卡可以验证生成的i2s时序是否正确使用播放器可以观察正确的i2s时序带使能的计数器自己能播自己能录2.几个音频的专业术语音调实际上就是频率音色音调的决定因素:谐波的结构:声音中的谐波极其相对强度和分布是音色的主要......
  • verilog行为建模(二):命名事件和行为描述
    目录1.命名事件(namedevent)2.行为描述举例3.RTL描述举例微信公众号获取更多FPGA相关源码:1.命名事件(namedevent)在行为代码中定义一个命名事件可以触发一个活动。命名事件不可综合。moduleadd_mult(out,a,b);input[2:0]a,b;output[3:0]o......
  • 基于MCU和FPGA的DDS信号发生器——MCU与FPGA通信部分
    前言由于项目制作时间有限,考虑到改变方案的风险,我们在遇到许多问题时并没有选择改变路线,而是在现有成果上缝缝补补,造就了现在看来十分笨重的通信模块,不过错误也是宝贵的学习经验,对于电子领域的工作者更是如此,因而笔者保留了我们制作时的失误和思考历程,供广大读者参考借鉴。总......
  • FPGA加扰与仿真
    对加扰仿真,输出结果符合预期 仿真代码如下 modulescrambler_64bit(inputwireclk,inputwirerst,inputwire[63:0]data_in,outputreg[63:0]data_out);reg[63:0]state;always@(posedgeclkorposedgerst)beginif(rst)begin......
  • 课程设计——基于FPGA的双向移位寄存器
    基于FPGA的双向移位寄存器摘 要本文使用verilogHDL语言设计双向移位寄存器,使电路受外部信号控制,实现数字信号的双向移位等功能,其电路设计模块主要分为三个部分,分别为接受判断控制信号的组合逻辑电路部分、实现存储、运算和输出数据的时序逻辑电路部分以及时钟信号输入部分......
  • FPGA必修课—FIFO
    FIFO基本概念FIFO,全称为“FirstInFirstOut”,译为“先进先出”。这是一种常见的数据存储和处理原则,其基本含义在于数据的存取顺序:最先进入的数据将最先被取出。FIFO可以被视为一种特殊类型的数据缓冲区,它按照元素到达的顺序进行数据的存取操作。学习FIFO的重要性在于它在......
  • Verilog图片仿真
            今天给大家分享自己使用的一段仿真代码,是我调整好的,拿去就可以直接使用!!!        我们做fpga有时候会接触一些图像相关的算法,我们不能每一次都是编译成功下载验证看效果吧,我也是找了好久,终于找到一个没啥毛病的,我对于这个模块还是做了一些调整,满足我们......
  • Linux—— 逻辑运算符,压缩和解压缩
     --a:and逻辑与  --o:or逻辑或  --not:not逻辑非  -优先级:与>或>非```shell[root@server~]#find / -size +10k -a -size -50k[root@server~]#find /etc  -name "e*" -o -name "f*"[root@server~]#find /etc  -nam......
  • 【Emacs Verilog mode保姆级的使用指南】
    ......
  • Flask 之 文件上传并解压缩
    #-*-coding:utf-8-*-fromflaskimportFlask,request,render_template_stringimportosimportzipfileimporttarfileapp=Flask(__name__)@app.route('/')defindex():returnrender_template_string('''<formact......