目录
概述
本设计实现了复数正弦信号功率检测系统,该系统在EGO1平台上采用Xilinx Artix-7系列XC7A35T-1CSG324C FPGA。设计的主要目标是在信号频率固定的情况下,允许外部对信号幅度进行可变控制(范围从0.01到1)。最终,系统将检测到的信号功率以dBm为单位进行输出显示,其中满刻度为10dBm。
原理
1.信号生成
- 使用DDS核生成两路信号,一路cos信号,一路sin信号。初始信号数据宽度7,有符号数,因此最大值为64,满幅度值宽度为16,即32768。
- 通过matlab生成100个倍率保存到coe文件中,FPGA可以根据按键选择倍率,使信号幅度为32768*(0.01-1)。
2.功率计算
- 对两路信号采样10000个点,分别平方求和,再除以32768*32768归一化得到总功率。后面要转换成dbm,换算后刚好总功率就是平均功率,因此不用除10000。
- 将功率转换到dbm进行显示,公式为:
- 这里为了在数码管上显示,因此将计算的dbm值扩大100倍。
- 因为FPGA算log比较复杂,因此也通过matlab生成对应值,再进行查表。为了保存的lg值没有负数,因此计算1000lg(P*10)的值保存到coe文件中。
- 满足满刻度为10dbm和用于数码管的显示的dbm值的计算如下:
代码
1.生成ratedata和logdata的matlab代码
clc
close all
fid = fopen('ratedata.coe','w');
fprintf( fid,'memory_initialization_radix=16;\n');%生成索引
fprintf( fid, 'memory_initialization_vector =\n' );
N = 100;
r = [0:1:99];
s = 2^15/62*0.01*(1+r); %幅值比例
% r = [0:1:9999];
% s = 1000*log10(1+r); %1000lg转换表
z = round(s);
for k = 1:1:N
fprintf(fid,'%x;\n',z(k));
end
fclose(fid);
2.top模块
`timescale 1ns / 1ps
module top(
input sys_clk,rst,
input [7:0] sw,
output [7:0] an,sseg,sseg0
);
wire [3:0 ] dp;
wire [32:0] sum_power;
wire [15:0] i_signal,q_signal;
wire [12:0] dbmdata,t1000logdt;
wire [15:0] ratedt;
ila_0 ila1(
.clk (sys_clk ),
.probe0 (sum_power ),//33
.probe1 (i_signal ),
.probe2 (q_signal ),
.probe3 (dbmdata ),
.probe4 (sw )
);
ila_1 ila2(
.clk (sys_clk ),
.probe0 (ratedt ),//13
.probe1 (t1000logdt )//16
);
// key_select ukeyd_seg (
// sys_clk,
// rst,
// sw,
// );
display udisplay(
.clk (sys_clk ),
.reset (rst ),
.data (sum_power ),
.p_select (an ),
.sseg (sseg ),
.sseg0 (sseg0 ),
.dbm_data (dbmdata ),
.logdt (t1000logdt )
);
signal_source usgs(
.s_clk (sys_clk ),
.s_a (sw ),
.i_sig (i_signal ),
.q_sig (q_signal ),
.ratedt (ratedt )
);
Pow_cal_ctrl power_ins(
.s_clk (sys_clk ),
.i_signal (i_signal ),
.q_signal (q_signal ),
.sw (sw ),
.s_pow_sum (sum_power )
);
endmodule
两个ila核的设置