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

概述

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

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

值得注意的是,由于FPGA计算的数据精度有限,计算相位差时应该选择合适的时间,否则会得到错误的值(具体情况请看下面的仿真部分介绍)。本设计选择在DDS2的相位为0的时刻进行判决输出。相关部分代码如下:

//减法器计算相位差
wire signed [15:0] sub_result;
reg signed [15:0] diff_reg;
c_addsub_0 sub_inst
(
    .CLK  (clk),
    .A    (theta2),
    .B    (theta1),
    .S    (sub_result)
); 

//选取合适的判决门限,减少误差
wire flag = (theta2 > 0) ? 1'b1 : 1'b0;

always @ (posedge flag or negedge rst_n) 
    if (!rst_n) diff_reg <= 'd0;
    else diff_reg <= sub_result;

assign theta_diff = diff_reg;

仿真测试

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

在仿真图中明显看到由于计算精度的影响,得到的相位与理想情况有不小的差距(直观地说,就是下降沿不够陡峭)。如果在相位的下降沿时刻取相位差(theta2-theta1),得到的就是错误的结果。因此选取合适的判决时刻很有必要。


上位机程序设计与实测

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

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

猜你喜欢

转载自blog.csdn.net/fpgadesigner/article/details/80785174