基于FPGA线性调频信号LFM的产生

这篇具有很好参考价值的文章主要介绍了基于FPGA线性调频信号LFM的产生。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文用了DDS来产生LFM信号,DDS的原理可以查看赛灵思的官方文档,这里不做赘述,同时对于LFM信号也不做赘述,直接上工程实现及其方法。

首先,我们要确定脉宽和PRI,在这里脉宽选取10us,PRI选取200us(fpga内部时钟用来100MHz),所以使用计数器去实现这两个信号的计数,当计数器计数到一定值的时候,使用使能信号来反应该计数状态,根据使能信号和成脉冲门信号,在脉冲门信号里面对DDS进行频率的步进,达到最后的输出效果。

DDS配置如下:

fpga调频,fpga开发

 fpga调频,fpga开发

 其余保持默认配置

`timescale 1ns / 1ps
//
// Company: xidian
// Engineer: CC
// 
// Create Date: 2023/04/29 20:03:54
// Design Name: 
// Module Name: lfm_gen
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module  lfm_gen
#(
    parameter   CNT_TAO_MAX = 10'd999,
	parameter   CNT_PRI_MAX = 15'd19_999     //实际pri=(19999+1)*10ns*2=400us
)
(
    input    wire  sys_clk,
    input    wire  sys_rst_n,

//    output   wire  meng,
//    output   wire  [31:0]data,
//	output   wire  [15:0]sin_imag,
//	output   wire  [15:0]cos_real,
    output   wire  wr_en,
	output   wire  [13:0]data_out,
	output   wire  clk_125M
);

reg    pri_en;
reg    tao_en;

reg     cnt_ctrl1;  //脉宽前沿检测
reg     cnt_ctrl2;  //脉宽后沿检测
reg     cnt_ctrl3;  //PRI后沿检测

reg     [9:0]cnt_tao;
reg     [14:0]cnt_pri;

reg     [7:0]tao_reg;  //一个周期内对脉宽的计数

reg     freq_en;

reg     [31:0]dds_pinc_in;
reg     [31:0]dds_poff_in;

wire    [63:0]s_axis_phase_tdata;

parameter   FREQ_START = 32'd858_993_460;  //起始频率为20MHz
parameter   FREQ_STEP = 32'd214_749;       //步进频率为5KHz

wire   [31:0] data;
wire   meng;
wire  [15:0]sin_imag;
wire  [15:0]cos_real;
wire  [13:0]data_reg;

//pri计数器,产生对应时间的脉冲间隔
always@(posedge sys_clk or negedge sys_rst_n)
    if (sys_rst_n == 1'b0)
        cnt_pri <= 15'b0;
	else if (cnt_pri == CNT_PRI_MAX)
	    cnt_pri <= 15'b0;
	else
	    cnt_pri <= cnt_pri + 1'b1;

//脉冲前沿信号产生
always@(posedge sys_clk or negedge sys_rst_n)
    if (sys_rst_n == 1'b0)
        cnt_ctrl1 <= 1'b0;
	else if (cnt_pri == CNT_PRI_MAX && tao_reg == 8'b0 ) 
	    cnt_ctrl1 <= 1'b1;
	else 
	    cnt_ctrl1 <= 1'b0;

//脉冲后沿信号产生
always@(posedge sys_clk or negedge sys_rst_n)
    if (sys_rst_n == 1'b0)
        cnt_ctrl2 <= 1'b0;
	else if (tao_reg == 8'b0 && cnt_tao == CNT_TAO_MAX)
	    cnt_ctrl2 <= 1'b1;
	else
	    cnt_ctrl2 <= 1'b0;

//PRI后沿检测
always@(posedge sys_clk or negedge sys_rst_n)
    if (sys_rst_n == 1'b0)
        cnt_ctrl3 <= 1'b0;
	else if (cnt_pri == CNT_PRI_MAX && pri_en == 1'b0)
	    cnt_ctrl3 <= 1'b1;
	else 
	    cnt_ctrl3 <= 1'b0;

//tao计数器,产生对应时间的脉宽
always@(posedge sys_clk or negedge sys_rst_n)
    if (sys_rst_n == 1'b0)
        cnt_tao <= 10'b0;
	else if (pri_en == 1'b1) 
	    cnt_tao <= cnt_tao + 1'b1;
	else if (cnt_ctrl2 == 1'b1)  //cnt_tao == CNT_TAO_MAX && tao_reg == 8'b1
	    cnt_tao <= 10'b0;
	else if (pri_en == 1'b0)
	    cnt_tao <= 10'b0;

//pri使能信号
always@(posedge sys_clk or negedge sys_rst_n)
    if (sys_rst_n == 1'b0)
        pri_en <= 1'b0;
	else if (cnt_ctrl1 == 1'b1) 
	    pri_en <= 1'b1;
	else if (tao_reg == ((CNT_PRI_MAX + 1'b1)/(CNT_TAO_MAX + 1'b1)) - 1'b1) 
	    pri_en <= 1'b0;
	else 
	    pri_en <= pri_en;

//tao使能信号
always@(posedge sys_clk or negedge sys_rst_n)
    if (sys_rst_n == 1'b0)
        tao_en <= 1'b0;
	else if (cnt_ctrl1 == 1'b1)
	    tao_en <= 1'b1;
	else if (cnt_ctrl2 == 1'b1)
	    tao_en <= 1'b0;
	else 
	    tao_en <= tao_en;

//一个周期内对脉宽的计数
always@(posedge sys_clk or negedge sys_rst_n)
    if (sys_rst_n == 1'b0)
        tao_reg <= 8'b0;
	else if (pri_en == 1'b1 && cnt_tao == CNT_TAO_MAX)
	    tao_reg <= tao_reg + 1'b1;
	else if (tao_reg == ((CNT_PRI_MAX + 1'b1)/(CNT_TAO_MAX + 1'b1)) - 1'b1)
	    tao_reg <= 8'b0;

//脉冲门信号合成
assign meng = tao_en;

//频率控制字使能
always@(posedge sys_clk or negedge sys_rst_n)
    if (sys_rst_n == 1'b0)
        freq_en <= 1'b0;
	else if (cnt_ctrl1 == 1'b1)
	    freq_en <= 1'b1;
	else if (cnt_tao == CNT_TAO_MAX/2)
	    freq_en <= 1'b0;
	else 
	    freq_en <= freq_en;

//频率控制字产生
//always @(posedge sys_clk or posedge sys_rst_n) //正在TAO内累加,在TAO外面清除
//    if(sys_rst_n == 1'b0) 
//	    begin
//            dds_pinc_in <= FREQ_START;
//            dds_poff_in <= 32'b0;   
//        end 
//    else if(freq_en == 1'b1 && tao_en == 1'b1) 
//	    begin
//            dds_pinc_in <= dds_pinc_in - (FREQ_STEP/2);//hband_phase + (step_phase/2)  
//            dds_poff_in <= 32'b0000_0000;//init_phase   
//        end 
//    else if(freq_en == 1'b0 && tao_en == 1'b1) 
//	    begin
//            dds_pinc_in <= dds_pinc_in - (FREQ_STEP/2);//dds_pinc_in + step_phase(10,976,027) 159,243,070,680 4,294,967,296
//            dds_poff_in <= 32'b0000_0000;//init_phase    
//        end 
//	else 
//	    begin
//            dds_pinc_in <= FREQ_START;//32'b0;
//            dds_poff_in <= 32'b0;            
//        end

always @(posedge sys_clk or posedge sys_rst_n) 
    if(sys_rst_n == 1'b0) 
	    begin
            dds_pinc_in <= FREQ_START;
            dds_poff_in <= 32'b0; 
        end
    else if(tao_en == 1'b1) 
	    begin
            dds_pinc_in <= dds_pinc_in - (FREQ_STEP/2);//hband_phase + (step_phase/2)  
            dds_poff_in <= 32'b0000_0000;//init_phase   
        end 
	else 
	    begin
            dds_pinc_in <= FREQ_START;
            dds_poff_in <= 32'b0;            
        end



assign s_axis_phase_tdata={dds_poff_in[31:0],dds_pinc_in[31:0]}; 

//雷达信号产生
dds dds_inst (
  .aclk(sys_clk),                                // input wire aclk
  .aclken(tao_en),                            // input wire aclken
  .s_axis_phase_tvalid(tao_en),  // input wire s_axis_phase_tvalid
  .s_axis_phase_tdata(s_axis_phase_tdata),    // input wire [63 : 0] s_axis_phase_tdata
  .m_axis_data_tvalid(),    // output wire m_axis_data_tvalid
  .m_axis_data_tdata(data),      // output wire [15 : 0] m_axis_data_tdata
  .m_axis_phase_tvalid(),  // output wire m_axis_phase_tvalid
  .m_axis_phase_tdata()    // output wire [31 : 0] m_axis_phase_tdata
);

  clk clk_inst
   (
    // Clock out ports
    .clk_out1(clk_125M),     // output clk_out1
    // Status and control signals
    .reset(~sys_rst_n), // input reset
    .locked(),       // output locked
   // Clock in ports
    .clk_in1(sys_clk));      // input clk_in1

assign sin_imag = data[31:16];
assign cos_real = data[15:0];
assign data_reg = data[31:18];
assign data_out = data_reg + 8192;
assign wr_en = clk_125M;

ila_0 ila_inst (
	.clk(sys_clk), // input wire clk


	.probe0(data_out) // input wire [13:0] probe0
);

endmodule

其中代码中例化的ila和clk是为了上板,才例化的(可以根据自己的板子修改)

仿真代码如下:

`timescale 1ns / 1ps
//
// Company: xidian
// Engineer: CC
// 
// Create Date: 2023/04/29 20:37:23
// Design Name: 
// Module Name: tb_lfm_gen
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module tb_lfm_gen();

reg    sys_clk;
reg    sys_rst_n;

//wire   meng;
//wire   [31:0]data;
//wire   [15:0]sin_imag;
//wire   [15:0]cos_real;
wire   [13:0]data_out;
wire   clk_125M;
wire   wr_en;

initial
    begin
	    sys_clk = 1'b0;
	    sys_rst_n = 1'b0;
	    #20 
	    sys_rst_n = 1'b1;
	end

always #5 sys_clk = ~sys_clk;

lfm_gen
#(
    .CNT_TAO_MAX (10'd999),
	.CNT_PRI_MAX (15'd19_999)
)
lfm_gen_inst
(
    .sys_clk(sys_clk),
    .sys_rst_n(sys_rst_n),

//    .meng(meng),
//    .data(data),
//	.sin_imag(sin_imag),
//	.cos_real(cos_real),
    .wr_en(wr_en),
    .clk_125M(clk_125M),
	.data_out(data_out)
);

endmodule

仿真图

fpga调频,fpga开发

fpga调频,fpga开发

 (注意:输出的data_out是无符号数,在最后输出到板子上的时候要将有符号数转换成无符号数)

 信号说明:

clk_125M是板子上DAC的采样时钟

wr_en是DAC的写入使能

data_out是fpga给DAC的信号

pri_en在一个pri周期内会拉高,但是由于下一个pri周期会和上一个pri周期是连续的,会影响下一个脉冲前沿的赋值,所以这里了pri_en不是正真意义上的一个pri周期,在上一个pri周期快要结束的时候要提前拉低,这里就用到了tao_reg计数器,tao_reg = pri / tao。

tao_en在脉冲出现的地方拉高。

cnt_ctrl1脉冲前沿信号

cnt_ctrl2脉冲后沿信号

cnt_ctrl3 pri周期开始信号及其结束信号

cnt_tao脉宽计数器

cnt_pri pri计数器

tao_reg pri的时间和tao时间的比值

dds_pinc_in相位增加量的计算信号

dds_poff_in相位偏移量的计算

data dds输出的数据

fpga调频,fpga开发

 fpga调频,fpga开发

 从上图我们可以看出已近产生了对应的脉宽和pri

由于加入了tao_ref计数器,所以可以灵活的修改你想要的脉宽和pri参数

fpga调频,fpga开发

 上图就是改变pri为100us时候的结果。

下面介绍频率控制字的计算:

fpga调频,fpga开发

fpga调频,fpga开发

 fpga调频,fpga开发

上式是对于调谐率的计算,因为条斜率决定了频率变换的快慢。

fpga调频,fpga开发

 带宽是10M,从20M变换到10M,Fbase是开始频率,detaF是变化频率,所以 Fout输出频率就是开始频率加变化频率(计算公式在赛灵思的官方手册中有说明)

硬件实现(zynq7010 + an9767)

fpga调频,fpga开发

 fpga调频,fpga开发

 fpga调频,fpga开发文章来源地址https://www.toymoban.com/news/detail-599481.html

到了这里,关于基于FPGA线性调频信号LFM的产生的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【FPGA零基础学习之旅#5】产生非等占空比信号

    🎉欢迎来到FPGA专栏~产生非等占空比信号 ☆* o(≧▽≦)o *☆ 嗨 ~我是 小夏与酒 🍹 ✨ 博客主页: 小夏与酒的博客 🎈该系列 文章专栏: FPGA学习之旅 文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏 📜 欢迎大家关注! ❤️ 我们通过LED的亮灭来展现等占空

    2024年02月05日
    浏览(41)
  • SAR信号处理基础1——线性调频信号

    :线性调频信号,LFM信号,chirp信号,驻定相位原理(POSP),泰勒展开,Taylor展开,脉冲压缩,匹配滤波,sinc,分辨率,峰值旁瓣比,积分旁瓣比   线性调频(Linear Frequency Signal, LFM)信号在SAR(乃至所有雷达)系统中非常重要,其最主要的特征是瞬时频率是时间的线

    2024年02月15日
    浏览(25)
  • 基于vivado+Verilog FPGA开发 — 基于AD9767高速DAC的DDS信号发生器

    目录  一、功能定义 二、设计输入  1、主模块 2、DDS模块 3、 按键消抖模块 三、功能仿真  四、综合优化 五、布局布线 六、时序仿真 七、板级调试  代码规范:Verilog 代码规范_verilog代码编写规范-CSDN博客 开发流程:FPGA基础知识----第二章 FPGA 开发流程_fpga 一个项目的整个

    2024年03月18日
    浏览(59)
  • LabVIEW仿真单频脉冲信号+线性调频信号+高斯白噪声信号

    本文基于 LabVIEW 仿真了单频脉冲信号(先导脉冲)和线性调频信号,全程伴有高斯白噪声。 单频脉冲信号由 正弦信号 * 脉冲信号 组合而成。 正弦信号 采样数 = 仿真信号时间总长度(s) * 采样率(Hz) 幅值 = 仿真信号幅度峰峰值(Vpp) / 2 相位 = 0 周期数 = 单频脉冲-频率(Hz) * 仿真信

    2024年02月12日
    浏览(32)
  • 基于FPGA的均匀白噪声的产生

    均匀白噪声的产生我们使用m序列来生成并且把数据导出到matlab中观察其直方图。 我们使用6个本原多项式,从而扩展14阶m序列的重复周期,原来是2^14-1,现在在原来的基础上周期扩大6倍。 好,均匀噪声就生成了,不过我们最好还是导入到matlab中看看其结果 好!设计实现了!

    2024年02月11日
    浏览(28)
  • 基于 ARM+FPGA+AD平台的多类型同步信号采集仪开发及试验验证(一)

    对工程结构的服役状况进行实时的监测和诊断,及时地发现结构的损伤,评估其安 全性能,预判结构的性能变化趋势与服役期限并提出改进举措,对提高工程结构的使用 效率,保障人民生命财产安全具有极其重要的意义,已经成为工程结构越来越迫切的技 术需求 [2] 。结构

    2024年02月07日
    浏览(41)
  • 基于 ARM+FPGA+AD平台的多类型同步信号采集仪开发及试验验证(二)板卡总体设计

    2.2 板卡总体设计 本章开发了一款基于 AD7193+RJ45 的多类型传感信号同步调理板卡,如图 2.4 所 示,负责将传感器传来的模拟电信号转化为数字信号,以供数据采集系统采集,实现了 单通道自由切换传感信号类型与同步采集多类型传感信号的功能(包含桥式电路信号、 IEPE 传感

    2024年02月06日
    浏览(37)
  • 线性调频信号的解线调(dechirp,去斜)处理matlab仿真

    线性调频信号的回波模型 对于线性调频脉冲压缩雷达,其发射信号为: s ( t ) = r e c t ( t T ) e x p ( j π μ t 2 ) begin{equation} s(t)=rect(frac{t}{T})exp(jpi mu t^2) end{equation} s ( t ) = rec t ( T t ​ ) e x p ( jπ μ t 2 ) ​ ​ 其中 r e c t ( t T ) = { 1 , 0 ≤ t ≤ T 0 , o t h e r w i s e . begin{equation} re

    2024年01月20日
    浏览(33)
  • 【友晶】基于FPGA的贪吃蛇游戏设计(七)——食物(苹果)的产生

    食物产生模块完成的任务是:每次初始化就给定一个食物坐标比如(24,10),然后蛇运动的过程中用蛇头坐标跟食物坐标对比是否重合来判断是否吃掉了食物,如果相同食物就被吃掉,然后由随机数产生新的食物坐标。 蛇要吃掉的食物大小为16*16个像素(蛇头大小也是16*16,

    2024年02月02日
    浏览(34)
  • 基于FPGA的信号发生器(四)

         基于FPGA的信号发生器的硬件电路通常需要以下组件: FPGA芯片:FPGA芯片是这个电路的核心部件,用于实现信号生成算法和控制逻辑。选择合适规模的FPGA芯片以满足你的信号发生器的性能和功能需求。 时钟源:信号发生器需要一个稳定的时钟源,以确定信号的频率和采

    2024年04月14日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包