1.算法仿真效果
本文是之前写的文章
基于FPGA的2ASK调制解调系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
的硬件测试版本。
在系统在仿真版本基础上增加了ila在线数据采集模块,vio在线SNR设置模块,数据源模块。
硬件ila测试结果如下:(完整代码运行后无水印):
vio设置SNR=2db
vio设置SNR=5db
vio设置SNR=10db
硬件测试操作步骤可参考程序配套的操作视频。
2.算法涉及理论知识概要
2ASK调制解调是一种数字调制解调技术,它是基于ASK调制的一种数字调制方式。ASK调制是一种模拟调制方式,它是通过改变载波的振幅来传输数字信号。而2ASK调制解调则是将数字信号转换为二进制码,再通过改变载波的振幅来传输数字信号。 2ASK调制的原理是将数字信号转换为二进制码,然后将二进制码与载波信号相乘,得到调制信号。在解调时,将接收到的信号与载波信号相乘,再通过低通滤波器滤波,得到原始的数字信号。
2ASK是一种数字调制方式,其中“2”代表二进制,即调制信号只有两个幅度水平。在2ASK调制中,数字基带信号控制载波的幅度。当发送二进制“1”时,发送全幅度载波;当发送二进制“0”时,不发送信号,即无载波输出。因此,2ASK信号可以看作是基带脉冲序列与一个全幅度正弦波的乘积。2ASK的调制解调系统结构如下图所示:
假设我们的输入二进制序列为an,那么2ASK的调制过程可以用以下数学公式表示:
e2ASK(t) = Σan g(t - nTs) cos(ωct)
其中,g(t)是基带脉冲形状,Ts是基带脉冲间隔,ωc是载波的角频率。解调过程则是对接收到的信号进行包络检波,恢复出原始的二进制序列。
在FPGA上实现2ASK调制解调系统主要分为以下几个步骤: 系统设计:首先,我们需要根据2ASK调制解调的原理设计出系统的整体架构,包括调制器、信道模拟器和解调器等主要部分。
Verilog编码:然后,我们使用Verilog硬件描述语言对系统各个部分进行编码。例如,我们可以创建一个调制器模块,它接收二进制输入,根据2ASK调制原理生成相应的调制信号。同样,我们也需要创建一个解调器模块,它接收调制信号,通过包络检波恢复出原始的二进制序列。
仿真测试:编码完成后,我们需要通过仿真测试验证我们的设计是否正确。我们可以使用一些测试工具,如ModelSim,对我们的设计进行仿真。通过观察仿真结果,我们可以检查我们的设计是否满足预期。
FPGA实现:最后,我们将通过仿真测试的设计下载到FPGA上进行实现。这通常需要使用特定的FPGA开发工具,如Xilinx Vivado。在这个步骤中,我们需要考虑FPGA的资源限制和性能优化等问题。
在FPGA实现过程中,需要注意的是,由于FPGA是硬件实现,所以设计需要考虑实时性和并行性。此外,对于调制和解调过程中的一些非线性操作,可能需要利用FPGA的查找表(LUT)等资源进行优化。
3.verilog核心程序
module tops_hdw( input i_clk, input i_rst, output reg [3:0] led );wire o_msg;//产生模拟测试数据 signal signal_u( .i_clk (i_clk), .i_rst (~i_rst), .o_bits(o_msg) );//设置SNR wire signed[7:0]o_SNR; vio_0 your_instance_name (.clk(i_clk), // input wire clk.probe_out0(o_SNR) // output wire [7 : 0] probe_out0 );wire signed[15:0]o_2ask; wire signed[15:0]o_2ask_Rn; wire signed[31:0]o_de_2ask; wire signed[31:0]o_de_2askf; wire signed[1:0]o_bits; wire signed[31:0]o_error_num; wire signed[31:0]o_total_num; wire signed[1:0]o_rec2;//ASK调制解调系统 ASK2 uut( .i_clk(i_clk), .i_rst(~i_rst), .i_bits({~o_msg,1'b1}), .i_SNR(o_SNR), .o_2ask(o_2ask), .o_2ask_Rn(o_2ask_Rn), .o_de_2ask(), .o_de_2askf(o_de_2askf), .o_bits(o_bits), .o_error_num(o_error_num), .o_total_num(o_total_num), .o_rec2(o_rec2) ); wire signed[15:0]w_de_2askf=o_de_2askf[25:10]; wire errflag = o_bits[1]^o_rec2[1]; //ila篇内测试分析模块 ila_0 ila_u (.clk(i_clk), // input wire clk.probe0({ o_msg,o_SNR,//9o_2ask, o_2ask_Rn,w_de_2askf,o_bits,//50o_error_num,o_total_num,errflag,//64o_rec2})); endmodule
4.开发板使用说明和如何移植不同的开发板
注意:硬件片内测试是指发射接收均在一个板子内完成,因此不需要定时同步模块。
在本课题中,使用的开发板是:
如果你的开发板和我的不一样,可以参考代码包中的程序移植方法进行移植: