手把手教你玩转AD9361数字调制解调系列(四) ----纯PL逻辑实现QPSK信号的数字调制解调

因最近客户需求,用纯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 信号来实现,具体步骤如下:

  1. 比特分组:将输入的比特流分成两位一组。例如,输入比特流为 11001010,则分组为 11、00、10、10。
  2. 映射相位:将每组比特映射到一个相位。例如:
    • 00 -> 0度
    • 01 -> 90度
    • 10 -> 180度
    • 11 -> 270度
  3. 生成 I 和 Q 信号:通过以下公式生成 I 和 Q 信号:
    • I(t)=Acos⁡(θ)
    • Q(t)=Asin⁡(θ) 其中 AAA 是信号的振幅,θ\thetaθ 是相位角。
  4. 合成信号:将 I 和 Q 信号相加,得到调制信号:
    • S(t)=I(t)cos⁡(2πfct)−Q(t)sin⁡(2πfct) 其中 fcf_cfc​ 是载波频率。

3. 解调过程

QPSK 解调的目的是从接收到的调制信号中提取原始的比特流,具体步骤如下:

  1. 分离 I 和 Q 信号:将接收到的信号通过两个正交的本地振荡器,得到 I 和 Q 信号:
    • Ir(t)=S(t)cos⁡(2πfct)
    • Qr(t)=−S(t)sin⁡(2πfct)
  2. 低通滤波:对 I 和 Q 信号进行低通滤波,去除高频分量,得到基带信号:
    • Ibb(t)=LPF(Ir(t))
    • Qbb(t)=LPF(Qr(t))
  3. 恢复相位:计算 I 和 Q 信号的相位:
    • θr=arctan⁡(Qbb(t)/Ibb(t))
  4. 相位映射:将相位映射回比特:
    • 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) begin
    if (rst) begin
        I_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) begin
    if (rst) begin
        data_out <= 2'b00;
    end else begin
        if (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

如果感觉文章对您有用,麻烦三连支持一下,方便下次用到的时候,就可以快速找到我,非常感谢您的支持!!! 

  • 22
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值