FPGA实现复信号功率计算

本文介绍了设计并实现了一个复数正弦信号功率检测系统,使用DDS核生成信号,通过FPGA进行功率计算,结果以dBm显示,支持信号幅度可变。设计包括Matlab代码生成、ILA核配置、以及上板验证的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

概述

原理

1.信号生成

2.功率计算

代码

仿真

上板验证


概述

        本设计实现了复数正弦信号功率检测系统,该系统在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进行显示,公式为:

10\lg \tfrac{P(w)}{1000}

  • 这里为了在数码管上显示,因此将计算的dbm值扩大100倍。
  • 因为FPGA算log比较复杂,因此也通过matlab生成对应值,再进行查表。为了保存的lg值没有负数,因此计算1000lg(P*10)的值保存到coe文件中。
  • 满足满刻度为10dbm和用于数码管的显示的dbm值的计算如下:

-3000dbm \leqslant P=1000\lg power-3000\leqslant 1000dbm

代码

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核的设置

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值