m基于FPGA的4ASK调制解调系统verilog实现,包含testbench测试文件

108 阅读4分钟

1.算法仿真效果

本系统Vivado2019.2平台开发,测试结果如下:

1280ed5591a52b467abcdfebfa7006e1_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.jpg  

rtl结构如下:

 

12df20ca420b92818f1db495cb6b5140_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.jpg

 

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

       随着通信技术的不断发展,多进制数字调制方式逐渐受到人们的关注。其中,4ASK(四进制振幅键控)作为一种有效的调制方式,在通信系统中具有广泛的应用前景。4ASK调制是一种多进制数字调制方式,它使用四种不同的振幅水平来表示四个不同的符号,每个符号对应两位二进制信息。在4ASK调制中,通过改变载波的振幅来传递信息,不同的振幅水平对应不同的二进制码字。解调过程中,接收机根据接收到的信号幅度来判决原始的二进制信息。与2ASK相比,4ASK调制具有更高的频带利用率,因为它在每个符号周期内可以传递更多的信息。然而,随着进制数的增加,调制解调的复杂性也相应提高,对信道的要求也更加严格。

 

4ASK调制的数学表达式可以表示为:

 

s(t) = A[m] * cos(2πfct + φ)

 

        其中,A[m] 表示四种不同的振幅水平,它与输入的两位二进制码字对应;fc 表示载波的频率;φ 表示载波的初始相位。在解调过程中,通常采用包络检波或相干解调的方法来还原原始的二进制信息。

 

在FPGA上实现4ASK调制解调系统主要分为以下几个步骤:

 

       系统设计:根据4ASK调制解调的原理,设计系统的整体架构。包括输入接口、调制器、解调器、输出接口等部分。确定各个模块之间的连接关系和数据流。

        Verilog编码:使用Verilog语言对各个模块进行编码。对于调制器模块,根据输入的两位二进制码字选择相应的振幅水平,并生成调制信号。解调器模块接收调制信号,通过包络检波或相干解调的方法还原出原始的二进制信息。同时,还需要设计合适的滤波器、时钟模块等辅助模块来实现完整的调制解调功能。

      仿真验证:在完成编码后,通过仿真工具对设计的系统进行验证。可以使用测试向量或模拟信号作为输入,观察调制和解调输出是否符合预期。通过不断调整和优化参数,确保系统的性能和稳定性满足要求。

 

3.Verilog核心程序 ``timescale 1ns / 1ps

//

 

module test_ASK4;

 

reg i_clk;

reg i_rst;

reg[1:0]i_bits;

wire signed[15:0]o_4ask;

wire signed[31:0]o_de_4askf;

wire [1:0]o_bits;

 

 

 

 

ASK4 uut(

.i_clk(i_clk),

.i_rst(i_rst),

.i_bits(i_bits),

.o_4ask(o_4ask),

.o_de_4ask(),

.o_de_4askf(o_de_4askf),

.o_bits(o_bits)

);

 

initial

begin

    i_clk = 1'b1;

    i_rst = 1'b1;

    #1000

    i_rst = 1'b0;

end

initial

begin

    i_bits= 2'b00;

    #1024

    i_bits= 2'b1;

    #256

    i_bits= 2'b0;

    #512

    i_bits= 2'b1;

    #512

    i_bits= 2'b1;

    #512

    i_bits= 2'b1;

    #1024

    i_bits= 2'b0;

    #512

    i_bits= 2'b0;

    #256

    i_bits= 2'b1;

    #128

    i_bits= 2'b1;

    #128

    i_bits= 2'b0;

    repeat(100)

    begin

    #256

    i_bits= 2'b0;

    #2048

    i_bits= 2'b11;

    #2048

    i_bits= 2'b00;

    #2048

    i_bits= 2'b01;

    #2048

    i_bits= 2'b10;

    #2048

    i_bits= 2'b00;

    #1024

    i_bits= 2'b11;

    #1024

    i_bits= 2'b10;

    #1024

    i_bits= 2'b10;

    #512

    i_bits= 2'b01;

    #512

    i_bits= 2'b10;

    #512

    i_bits= 2'b10;

    #256

    i_bits= 2'b10;

    #256

    i_bits= 2'b00;

    #512

    i_bits= 2'b01;

    #256

    i_bits= 2'b10;

    #128

    i_bits= 2'b00;

    

    #128

    i_bits= 2'b10;

    #128

    i_bits= 2'b11;

    #1024

    i_bits= 2'b01;

    #512

    i_bits= 2'b00;

    #128

    i_bits= 2'b11;

    #256

    i_bits= 2'b10;

    #128

    i_bits= 2'b10;

    #256

    i_bits= 2'b00;

    end

end

always #1 i_clk=~i_clk;

endmodule`