一、Chirp生成模块介绍
采用Verilog 生成Chirp,实现输入使能电平,模块输出Chirp信号,Chirp信号频率范围,时间宽度,连续Chirp信号数量可配置。
二、模块例化方法示例
parameter FL ='d20_000 ;
parameter FH ='d30_000 ;
parameter Tc ='d10 ; //ms
parameter Chirp_Num='d128;
chirp
#(. SYS_CLK (SYS_CLK),. FL (FL),. FH (FH),. Tc (Tc), //ms. Chirp_Num(Chirp_Num)
)
chirp_inst
(. sys_clk (clk_9_6m),. rst_n (rst_n),. chirp_en (chirp_en),. chirp_out (chirp_out),. chirp_valid (chirp_valid),. chirp_index (chirp_index));
三、模块仿真时序图
四、模块代码
`timescale 1ns / 1ps
//
// Company:
// Engineer: YOU
//
// Create Date: 2023/10/25 10:11:24
// Design Name:
// Module Name: Chirp
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//module chirp_cp
#(parameter SYS_CLK='d6_400_000,parameter FL ='d22_400 ,parameter FH ='d28_800 ,parameter Tc ='d20 ,//msparameter Chirp_Num='d128
)
(input wire sys_clk,input wire rst_n,input wire chirp_en,output wire [7:0] chirp_out,output wire chirp_valid,output reg [19:0] chirp_index);parameter B =FH-FL;parameter K =B*1000/Tc;parameter T_MAX=SYS_CLK*Tc/1000; // t/SYS_CLK 单位为sreg [7:0] chirp_cnt;reg [39:0] t;
reg [39:0] t_dl;always@(posedge sys_clk or negedge rst_n)
if(!rst_n)
chirp_cnt<='d0;
else if(chirp_en==1'b1)
chirp_cnt<='d0;
else if(t==T_MAX+1'b1)
chirp_cnt<=chirp_cnt+1'b1;
else
chirp_cnt<=chirp_cnt;always@(posedge sys_clk or negedge rst_n)
if(!rst_n)
t<='d0;
else if(t==T_MAX+1'b1&&chirp_cnt>=Chirp_Num-1)
t<='d0;
else if(t==T_MAX+1'b1&&chirp_cnt<Chirp_Num-1)
t<='d2;
else if(chirp_en==1'b1)
t<=t+1'b1;
else if(t>=1'b1)
t<=t+1'b1;
else
t<='d0;//t_dl
always@(posedge sys_clk or negedge rst_n)
if(!rst_n)
t_dl<='d0;
else
t_dl<=t;wire [79:0] t_2;
chirp_mul chirp_mul_inst (.CLK(sys_clk), // input wire CLK.A(t), // input wire [39 : 0] A.B(t), // input wire [39 : 0] B.P(t_2) // output wire [79 : 0] P
);reg [15:0] phase_reg;
//phase_reg
always@(posedge sys_clk or negedge rst_n)
if(!rst_n)
phase_reg<='d0;
else
phase_reg<=2*FL*32768*t_dl/SYS_CLK+K*32768*t_2/SYS_CLK/SYS_CLK; //由于cordic输入为fix16_13 ,所以乘上2^13,就能获得fix16_13数据reg [15:0] phase;
//phase
always@(posedge sys_clk or negedge rst_n)
if(!rst_n)
phase<='d0;
else if(phase_reg[15:15]=='b0)phase<=(phase_reg+1'b1)>>2; //将-32767~32767 对应 -pi~pi 转为000.00000 形式取值范围为-1~1 单位为pi else phase<=(phase_reg>>2)+16'b1100_0000_0000_0000; //这个右移两位,高位补一能实现,负数到fix16_13形式的转换reg chirp_cordic_en;
always@(posedge sys_clk or negedge rst_n)
if(!rst_n)
chirp_cordic_en<=1'b0;
else if(t>=2&&t<=T_MAX+1'b1)
chirp_cordic_en<=1'b1;
else
chirp_cordic_en<=1'b0;wire [15:0] chirp_data;chirp_cordic chirp_cordic_inst (.aclk(sys_clk), // input wire aclk.s_axis_phase_tvalid(chirp_cordic_en), // input wire s_axis_phase_tvalid.s_axis_phase_tdata(phase), // input wire [15: 0] s_axis_phase_tdata.m_axis_dout_tvalid(chirp_valid), // output wire m_axis_dout_tvalid.m_axis_dout_tdata(chirp_data) // output wire [15 : 0] m_axis_dout_tdata
);assign chirp_out=chirp_data[7:0];//chirp_index
always@(posedge sys_clk or negedge rst_n)
if(!rst_n)
chirp_index<='d0;
else if(chirp_valid==1'b1)
chirp_index<=chirp_index+1'b1;
else
chirp_index<='d0;endmodule
五、模块相关IP核配置(vivado)
六、总结
以上内容介绍,基于FPGA实现的可配置参数的chirp信号生成模块使用以及代码,如果确实有帮助到大家谢谢点赞支持。