FPGA综合系统设计(七)基于DDC的两路信号相位差检测

本文介绍了一种基于FPGA的数字信号处理系统设计,利用DDS生成中频信号,通过DDC提取基带信号,计算两路信号间的相位差,并通过串口将结果传至上位机显示。

概述

本文记录一个简单的数字信号处理综合系统。在这个设计实例中,由DDS生成模拟中频信号与本振信号,使用DDC(Digital Down Converter,数字下变频)提取出同相分量i和正交分量q,计算两路信号之间的相位差,将测量结果通过串口发送至PC,使用Qt上位机做界面显示。

这是一些完成本文设计的参考文章:
1. DDS IP核的使用参考FPGA数字信号处理(一)数字混频(NCO与DDS的使用):
https://blog.youkuaiyun.com/fpgadesigner/article/details/80512067
2. 计算相位时arctan函数实现参考FPGA数字信号处理(十四)Vivado Cordic IP核计算arctan:
https://blog.youkuaiyun.com/FPGADesigner/article/details/80780088
3. Vivado FIR滤波器设计参考FPGA数字信号处理(五)Vivado FIR IP核实现:
https://blog.youkuaiyun.com/fpgadesigner/article/details/80621411
4. Qt上位机程序设计参考Qt程序设计(一):气象自动监测站-图形化搭建程序界面:
https://blog.youkuaiyun.com/fpgadesigner/article/details/74278934
Qt程序设计(二):气象自动监测站-串口通信与数据处理:
https://blog.youkuaiyun.com/fpgadesigner/article/details/74295083


环境与设备

Vivado 2017.2
Xilinx FPGA开发板
Qt 5.8(MSVC2015)


系统设计

FPGA系统设计框图如下所示:
这里写图片描述
使用DDS Compile IP核生成两路余弦信号x1(t)和x2(t),这里设置采样率为100MHz,中频信号频率20MHz+500kHz。DDS1的相位固定为0°,DDS2的相位可以通过上位机调节。本系统的任务就是测量x1(t)与x2(t)之间的相位差。DDS3产生本振信号cos与-sin,频率为20MHz。

数字下变频模块(DDC)的原理框图如下所示:
这里写图片描述
与两路本振信号混频,经过LPF滤除高频分量,得到基带信号。滤波器的通带频率fp应大于基带信号的带宽(此处为500kHz),截止频率fc应小于载波信号频率(此处为20MHz)。经过LPF后得到相互正交的复基带信号的实部i和虚部q。

两路中频信号x1(t)和x2(t)分别通过数字下变频(DDC),可分别得到两路复基带信号的实部和虚部,设a1Q和a1I为第一路复基带信号虚部和实部,a2Q和a2I为第二路复基带信号虚部和实部,则两路复基带相位的相位估算θ1 (t)和θ2 (t)及两路信号之间的相位差θd (t)为:
这里写图片描述
需要注意的是,当信号经过LPF滤波后,提取出的基带信号带宽往往都远远低于系统的采样频率,可以抽取滤波来降低采样率。Vivado的FIR滤波器就提供抽取的功能,将“Filter Type”设置为Decimation。本设计LPF滤波后的信号只有500kHz(20.5MHz与20MHz信号混频后为差频500kHz与和频40.5MHz信号),抽取率Decimation Rate Value设置为10,输出数据速率为10MHz。

在FPGA中设计时,计算arctan函数的功能使用Vivado提供的CORDIC IP核实现,得到的数据范围为-π~π,不需要考虑象限模糊的问题(arctan函数的值域∈(-π/2,π/2),而相位的取值∈(-π,π),所以通常会有象限模糊的问题)。得到的两个信号相位相减则为相位差。


MATLAB仿真

按照设计要求,系统参数选择为(与FPGA保持一致):
●中频信号频率:用余弦信号模拟,频率为(20Mhz+500kHz);
●载波频率20MHz(本振);
●采样频率100Mhz;
●中频信号x1(t)固定相位0°,设置x2(t)相位。

设计包括:中频信号产生、本振信号产生、数字下变频(FDATOOL设计LPF并导出coe文件)、抽取滤波、象限模糊修复、相位差计算。

x2(t)相位设置为(0.5*pi=1.57),结果如下左图;x2(t)相位设置为(-0.75*pi=-2.35),结果如下右图。
这里写图片描述


FPGA设计

FPGA设计的RTL视图如下:
这里写图片描述
包括PLL模块(生成所需时钟信号)、信号生成模块signal_gen(产生中频信号与本振信号)、数字下变频模块DDC、相位估算模块phase_estimate和串口控制模块uart_ctrl。串口控制模块系统框图如下:
这里写图片描述
包括时钟分频模块clkdiv、串口发送模块uarttx、串口接收模块uart_rx、串口发送控制模块tx_ctrl和串口接收控制模块rx_ctrl。串口部分将需要发送的相位差数据按一定帧格式组织好发送;接收到的DDS2的初始相位也按预定的帧格式解析。串口数据刷新率设定为1秒。

值得注意的是,两路信号由于总存在一定的相位差,导致减法器输出的相位差结果不会限制在-pi~pi之间,必须做一定的修正以得到正确的结果(详情可参考下面的System Generator设计部分)。


仿真测试

编写Testbench,在Vivado中进行仿真:
这里写图片描述
从上到下依次为信号1的i和q支路信号、信号2的i和q支路信号、信号1和信号2的相位估计(theta1与theta2)。
这里写图片描述
theta_diff为相位差。仿真中模拟了9种相位差情况,可以明显看到仿真图中的9个相位差值,经过验证结果正确。


上位机程序设计与实测

上位机使用Qt5.8(C++)开发,设计了一个简陋的界面,主要是串口通信与数据的解析处理。上位机程序可以控制DDS2的相位,并显示测得相位的结果。

FPGA工程配置完毕后,下载到FPGA开发板,与上位机连接实测,结果如下图:
这里写图片描述
0~180°即对应0~pi;180°~360度对应-pi~0。测试后功能正确。


System generator设计方法

这里在System Generator重现两路信号相位差检测的设计。这款工具可以借助Simulink平台搭建便捷强大的仿真环境,并将设计导出到Vivado工程。System Generator的使用方法可以参考博主的《学会System Generator系列》。

System Generator中搭建模型如下:
这里写图片描述
运行仿真,结果如下:
这里写图片描述
红框部分便是出错的原因,导致相位未能限制在-pi~pi之间。对减法器输出结果进行限制即可。这部分用block搭建比较麻烦,System Generator支持将部分MATLAB语法转换为HDL模型。编写一个MATLAB函数,完成相位差修正(超过pi,则减去2pi;低于-pi,则加上2pi),添加一个MCode block,导入该函数。模型连接图如下:
这里写图片描述
运行仿真,相位超前与滞后的两种情况的仿真分别如下:
这里写图片描述
这里写图片描述
都没有出现错误,结果修正正确。

<think>好的,我现在需要帮助用户解决在FPGA上实现FM正交解调的问题。首先,我得理解用户的需求。用户可能是一个工程师或者学生,正在尝试在FPGA平台上实现FM解调,需要设计方案和代码示例。根据用户提供的引用内容,特别是引用[2]中的System Generator和QAM的例子,这可能是一个相关的参考,但用户现在需要的是FM正交解调,而不是QAM。 首先,我应该回顾FM正交解调的基本原理。FM解调通常涉及从调频信号中恢复基带信号。正交解调法是一种常用的方法,通过将信号分解成同相(I)和正交(Q)分量,然后计算相位变化来提取调制信号。在FPGA上实现这个需要数字信号处理的知识,包括下变频、滤波、相位计算等步骤。 接下来,我需要考虑FPGA的实现流程。通常,设计会包括以下几个步骤:信号采集与下变频、正交混频、低通滤波、相位差计算以及积分还原基带信号。每个步骤都需要在FPGA中用硬件描述语言(如Verilog或VHDL)实现,或者使用高级工具如System Generator进行模块化设计。 用户可能需要具体的代码示例,但直接编写RTL代码可能比较复杂。参考引用[2]中的Matlab和System Generator的例子,或许可以提供一个基于System Generator的设计方案,这样用户可以利用已有的模块快速搭建系统。比如,使用DDS生成正交本振信号,进行混频,然后低通滤波,再通过CORDIC算法计算相位差,最后积分得到基带信号。 另外,引用[3]中提到脉冲成形滤波器的MATLAB实现,这可能对设计低通滤波器部分有帮助。虽然引用是关于SC-FDE和MMSE均衡器的,但滤波器设计的思路是相通的。在FPGA中,FIR滤波器是常用的,可以使用MATLAB的滤波器设计工具生成系数,然后导入到FPGA中实现。 关于代码示例,引用[2]中的System Generator代码可以作为参考,但需要调整为FM解调的结构。比如,创建项目、添加调制解调模块,但这里的模块应该是正交混频器、滤波器和相位计算模块。可能需要使用CORDIC模块来处理相位计算部分。 此外,用户提到的引用[4]中的可视化部分也很重要,在FPGA开发过程中,仿真和验证是关键步骤。用户可能需要使用MATLAB或Simulink进行仿真,验证FPGA设计的正确性,比如观察星座图或时域波形,确保解调后的信号正确。 需要注意的是,FPGA实现时需要考虑资源优化和时序约束。例如,使用流水线结构处理数据,优化乘法器和存储器的使用,确保实时性。同时,时钟管理和数据同步也是关键点,避免亚稳态等问题。 用户可能还关心性能优化,比如如何处理高采样率的数据,如何选择适当的滤波器阶数和系数,以及如何调试和验证设计的正确性。这时可以参考引用中的资源库,寻找相关的文档和示例代码。 总结一下,回答需要包括设计方案概述、关键步骤、可能的System Generator模块搭建示例、MATLAB辅助设计滤波器的方法,以及验证和优化建议。同时,要确保引用相关的参考资料,如引用[2]中的System Generator代码生成和引用[3]中的滤波器设计方法。</think>### FPGA实现FM正交解调设计方案 #### 一、设计方案概述 FM正交解调的核心是通过正交混频提取相位信息,最终还原基带信号FPGA实现需完成以下关键步骤: 1. **正交下变频**:将射频信号搬移至基带,生成I/Q两路信号[^2] 2. **低通滤波**:使用FIR滤波器滤除高频分量[^3] 3. **相位差计算**:通过CORDIC算法计算瞬时相位 4. **微分运算**:对相位信号微分得到原始调制信号 #### 二、FPGA实现关键步骤 **1. 正交混频模块设计** 采用数字下变频(DDC)结构: ```systemverilog module quadrature_mixer( input clk, input [15:0] rf_in, output reg [15:0] I_out, output reg [15:0] Q_out ); // 本振NCO配置 wire [15:0] sin, cos; nco_core nco_inst(.clk(clk), .sin_out(sin), .cos_out(cos)); always @(posedge clk) begin I_out <= $signed(rf_in) * $signed(cos) >> 14; // 保留符号位 Q_out <= $signed(rf_in) * $signed(sin) >> 14; end endmodule ``` **2. 多相滤波器组实现** 采用多相结构降低运算量,MATLAB生成滤波器系数: ```matlab h = firpm(63, [0 0.2 0.25 1], [1 1 0 0]); % 设计63阶低通滤波器 fprintf('%d,\n', fix(h*32767)); % Q15格式量化 ``` **3. 相位解调模块** 使用CORDIC算法计算arctan(Q/I): ```systemverilog cordic_arctan #( .WIDTH(16), .ITER(12) ) cordic_inst ( .clk(clk), .x_in(I_filtered), .y_in(Q_filtered), .phase_out(phase) ); ``` #### 三、System Generator实现示例 参考QAM系统实现架构[^2],搭建正交解调模型: ```matlab % 创建FM解调系统 sysgenProject = sysgen.project.create('FM_Demodulator'); % 添加正交混频模块 mixer = sysgen.module.create('Quadrature_Mixer'); mixer.set('LO_Frequency', 10.7e6); % 中频频率 sysgenProject.addModule(mixer); % 添加CIC补偿滤波器 cic_comp = sysgen.module.create('CIC_Compensation_Filter'); cic_comp.set('DecimationFactor', 8); sysgenProject.addModule(cic_comp); % 生成HDL代码 sysgenProject.generateHDL(); ``` #### 四、验证与优化 1. **时频域联合验证** - 使用MATLAB生成调频测试信号 - 对比FPGA输出与理论值的星座图[^4] 2. **资源优化技巧** - 采用时分复用技术共享乘法器 - 使用对称滤波器系数减少乘法器数量 - 选择适当的定点数格式(建议Q2.14)
评论 12
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值