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

发布时间 2023-11-16 16:09:50作者: 我爱C编程

1.算法仿真效果

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

 

 

 

rtl结构如下:

 

 

 

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