因最近客户需求,用纯PL实现AD9361的数字信号调制解调,于是就把各种数字调制都在AD9361上都实现了一遍。
优点就是:既可以在zynq系列上配置9361,也可以在纯FPGA系列配置9361。并且理解起来比较简单!!!
制作不易,记得三连哦,给我动力,持续更新中!!!
完整工程文件下载:纯逻辑设计AD9361发射QSPK工程下载 (点击蓝色文字即可下载)
提取码:19w5
对于之前学习过我文章的小伙伴来说,大家应该都了解如何利用 AD936x Evaluation Software 生成 AD9361 的配置,并在 Vivado 中调用该配置,最后写入 AD9361 芯片。
对于新来的小伙伴而言,我建议你可以先回顾一下我之前的文章内容。在那些文章中,我详细介绍了如何通过软件生成 AD9361 的配置,并在 Vivado 开发环境中使用该配置。这些基础知识对于接下来的内容学习很重要。
在接下来的设计中,我们将在纯逻辑配置 AD9361 的基础上,实现各种数字信号的调制解调功能。这将涉及更多的数字信号处理知识和技术。如果你对这些内容感兴趣,不妨继续关注我的后续文章。我会在这些文章中, 全面地讲解如何基于 AD9361 实现各种数字调制解调功能的具体实现方法。
纯逻辑配置AD9361教程/通过UART串口发送配置文件配置AD9361/通过rom配置AD9361/纯PL配置AD9361_ad9361发送数据代码-CSDN博客
本篇文章将介绍如何通过AD9361发射QPSK信号以及纯verilog代码实现和讲解。
一、QPSK调制解调原理
QPSK (Quadrature Phase Shift Keying) 是一种广泛使用的数字调制方式,它通过改变载波的相位来传输数据。QPSK 实现 IQ 调制解调的基本原理包括以下几个方面:
1. 基本概念
- I 和 Q 分量:QPSK 使用两个正交的载波,即相差90度的两个信号,称为 I(同相)分量和 Q(正交)分量。
- 相位变化:QPSK 通过改变载波信号的相位来表示数据,每个符号可以表示两个比特(00、01、10、11)。
2. 调制过程
QPSK 调制通过将输入比特流转换为 I 和 Q 信号来实现,具体步骤如下:
- 比特分组:将输入的比特流分成两位一组。例如,输入比特流为 11001010,则分组为 11、00、10、10。
- 映射相位:将每组比特映射到一个相位。例如:
- 00 -> 0度
- 01 -> 90度
- 10 -> 180度
- 11 -> 270度
- 生成 I 和 Q 信号:通过以下公式生成 I 和 Q 信号:
- I(t)=Acos(θ)
- Q(t)=Asin(θ) 其中 AAA 是信号的振幅,θ\thetaθ 是相位角。
- 合成信号:将 I 和 Q 信号相加,得到调制信号:
- S(t)=I(t)cos(2πfct)−Q(t)sin(2πfct) 其中 fcf_cfc 是载波频率。
3. 解调过程
QPSK 解调的目的是从接收到的调制信号中提取原始的比特流,具体步骤如下:
- 分离 I 和 Q 信号:将接收到的信号通过两个正交的本地振荡器,得到 I 和 Q 信号:
- Ir(t)=S(t)cos(2πfct)
- Qr(t)=−S(t)sin(2πfct)
- 低通滤波:对 I 和 Q 信号进行低通滤波,去除高频分量,得到基带信号:
- Ibb(t)=LPF(Ir(t))
- Qbb(t)=LPF(Qr(t))
- 恢复相位:计算 I 和 Q 信号的相位:
- θr=arctan(Qbb(t)/Ibb(t))
- 相位映射:将相位映射回比特:
- 0度 -> 00
- 90度 -> 01
- 180度 -> 10
- 270度 -> 11
二、FPGA工程代码
主要代码为:QPSK调制模块、9361数据接收和发射接口、9361配置模块、串口模块,和之前的ASK调制的差异主要是把ASK调制部分替换为了QPSK调制和解调,其他代码不变(一劳永逸)
(1)顶层top
主要连接各个模块,已结对差分信号的差分转换
部分代码:
wire signed [15:0] I, Q;QPSK_Modulator modulator(.clk(clk),.rst(~RstN),.data_in(data_in),.I_out(I),.Q_out(Q)
);QPSK_Demodulator demodulator(.clk(clk),.rst(~RstN),.I_in(I),.Q_in(Q),.data_out(data_out)
);
(2)配置9361模块
主要通过读取rom中的配置信息,然后通过SPI去写入9361寄存器,实现对9361的配置
(3)QPSK调制模块
QPSK_Modulator 模块:主要功能将输入的两位数据(00, 01, 10, 11)转换为 I 和 Q 信号。
部分代码:
module QPSK_Modulator(input wire clk,input wire rst,input wire [1:0] data_in, // 输入两位数据output reg signed [15:0] I_out, // I 分量输出output reg signed [15:0] Q_out // Q 分量输出
);always @(posedge clk or posedge rst) beginif (rst) beginI_out <= 16'sd0;Q_out <= 16'sd0;
(4)QPSK解调模块
QPSK_Demodulator 模块:将 接受到的I 和 Q 信号重新转换为两位数据。
部分代码:
module QPSK_Demodulator(input wire clk,input wire rst,input wire signed [15:0] I_in, // I 分量输入input wire signed [15:0] Q_in, // Q 分量输入output reg [1:0] data_out // 解调后的数据输出
);always @(posedge clk or posedge rst) beginif (rst) begindata_out <= 2'b00;end else beginif (I_in > 16'sd0 && Q_in > -16'sd16384 && Q_in < 16'sd16384) begin
三、下板测试
把上述FPGA工程,综合编译,然后生成bit文件
本设计使用的硬件为官方开发板zedboard和ad9361发射,然后通过一个sdr设备进行信号接收,硬件链接如下所示
然后把bit文件下载到zedboard开发板,通过ila查看升余弦函数的输出
然后通过频谱仪和示波器可以看出符合QPSK信号特征,最后利用逻辑信号分析仪对QPSK信号查看星座图。本设计的码元速率设置的为1MHZ
通过上述分析仪可以观察到,星座图符合QPSK信号的特征,且相位稳定,表明信号调制正确。整个工程的9361接口和配置函数运行正常。
至此QPSK调制解调的部分就已经结束了,后期更新QPSK调制解调部分
完整工程文件下载:纯逻辑设计AD9361发射QPSK 提取码:w515
如果感觉文章对您有用,麻烦三连支持一下,方便下次用到的时候,就可以快速找到我,非常感谢您的支持!!!