基于FPGA的CFAR设计.docx
《基于FPGA的CFAR设计.docx》由会员分享,可在线阅读,更多相关《基于FPGA的CFAR设计.docx(20页珍藏版)》请在冰豆网上搜索。
基于FPGA的CFAR设计
基于FPGA的CFAR设计
基于FPGA的CFAR设计
摘要
恒虚警率(ConstantFalse-AlarmRate,CFAR)处理技术是雷达信号处理的重要组成部分。
在雷达信号检测中,当外界干扰强度变化时,雷达能自动调整其灵敏度,使雷达的虚警概率保持不变。
具有这种特性的接收机称为恒虚警接收机。
雷达信号的检测总是在干扰背景上进行的,干扰包括接收机内部的热噪声,以及地物、雨雪、海浪等杂波干扰。
其中,地杂波、海杂波、气象杂波和箔条杂波都是由天线波束照射区内的大量散射单元的散射信号叠加组成。
因此,在强干扰中提取信号,不仅要求有一定的信噪比,而且必须对信号作恒虚警处理。
在自动检测雷达中,必须具备恒虚警处理设备,使之在强杂波干扰下仍能继续工作。
本文首先介绍了恒虚警率(CFAR)的基本原理,然后利用FPGA方案对恒虚警率(CFAR)进行了实例设计,并对各子模块进行了详细说明,最后对整个模块进行仿真和验证。
关键词:
VerilogHDL、FPGA、恒虚警(CFAR)
二、CFAR算法基本原理
一般通用的CFAR方案中,视频信号样本通过平方率包络检测器被送到滑窗寄存器中。
该寄存器长一般设定为N+1=2n+1,统计量Z是与噪声能量成比例的,而噪声能量是通过检测单元D周N个参考单元的某种处理而得到的。
U是一个恒量元素,在均匀背景下,与N、Pfa有关,给定参考单元数N及虚警概率Pfa对应的U是一个定值。
如果检测单元D的值大于门限U0,则该信号将被判决为目标信号。
根据μ的计算方式的不同,CFAR检测器分为均值(ML)类和有序统计量(OS)类两种典型的检测器,其原理图分别如图1和图2所示。
ML类CFAR包括单元平均(CA)CFAR、最大选择(GO)CFAR和最小选择(SO)CFAR等;OS类CFAR包括有序统计(OS)CFAR、削减平均(TM)CFAR等。
均值类CFAR适用于空间上统计平稳的背景,它在检测单元前、后沿各有一个覆盖若干距离单元的滑动窗,利用滑动窗中参考采样的均值,形成前、后沿局部估计,再对局部估计平均、选大、选小或加权平均,以确定检测单元的背景杂波平均功率估计。
鉴于信号可能会跨越到前后邻近单元中,检测单元及其临近前后距离单元一般不包括在平均窗内,若检测单元中信号幅度大于滑动窗内均值的K倍,则认为是信号。
图1ML类CFAR结构示意图
图2OS类CFAR结构示意图
本文利用如图1所示的CA-CFAR方法的FPGA来进行设计,在顶层模块调用了一个CFAR算法模块和两个块存储器IP核,实现了数据长度为16bit,前、后窗长度为L=16位数据的CA-CFAR算法。
三、FPGA设计与实现
CFAR电路由目标回波消除电路和恒虚警电路构成,下面分别介绍其VerilogHDL设计。
包括顶层模块设计、回波消除电路设计、恒虚警电路设计和块存储器IP核。
总框图如图3所示。
图3CFAR电路总结构示意图
3.1、顶层模块设计
对于CFAR电路首先要关注的是顶层模块的FPGA逻辑设计,其功能主要是对要实现的各子模块进行连接和统筹规划,使得各子模块能够正常运行从而实现所有功能。
顶层模块具体实现了数据连接、信号噪声的对比以及全局时钟缓存等功能。
设计程序如下所示:
`timescale1ns/1ps
moduletop(
inputclk,
inputrst,
input[15:
0]I_signal,
outputO_result
);
wire[15:
0]signal;
wire[15:
0]noise;
delu1(.clk(clk),
.rst(rst),
.I_signal(I_signal),
.O_signal(signal),
.O_noise(noise));
cfaru2(.clk(clk),
.rst(rst),
.I_signal(signal),
.I_noise(noise),
.O_result(O_result));
endmodule
3.2、回波消除电路设计
回波消除电路主要用来消除回波信号,以便后续电路计算噪声平均功率。
信号通过该模块后分为两路输出:
信号和回波消除后的噪声信号。
模块框图如图4所示。
图4回波消除电路框图
设计程序如下所示:
`timescale1ns/1ps
moduledel(
inputclk,
inputrst,
input[15:
0]I_signal,
output[15:
0]O_signal,
output[15:
0]O_noise
);
parameterpc=16'h0100;
reg[15:
0]O1_signal;
reg[15:
0]O1_noise;
reg[15:
0]R_signal;
reg[15:
0]R1_signal;
reg[17:
0]mult;
reg[15:
0]R_result;
reg[15:
0]compare;
//---------------signaloutput----------------
always@(posedgeclkornegedgerst)
begin
if(~rst)
begin
R_signal<=16'h0000;
R1_signal<=16'h0000;
O1_signal<=16'h0000;
end
else
begin
R_signal<=I_signal;
R1_signal<=R_signal;
O1_signal<=R1_signal;
end
end
assignO_signal=O1_signal;
//---------------noiseoutput-----------------
always@(posedgeclkornegedgerst)
begin
if(~rst)
begin
mult<=16'h0000;
end
else
begin
mult<=I_signal*3;
end
end
always@(posedgeclkornegedgerst)
begin
if(~rst)
begin
R_result<=16'h0000;
end
else
begin
if(R_signalbegin
R_result<=mult[17:
2]+{{2{R_result[15]}},R_result[15:
2]};
end
end
end
always@(*)
begin
compare<=R_result+pc;
end
always@(posedgeclkornegedgerst)
begin
if(~rst)
begin
O1_noise<=16'h0000;
end
else
begin
O1_noise<=R_result;
end
end
assignO_noise=O1_noise;
endmodule
3.3、恒虚警(CFAR)电路设计
恒虚警(CFAR)模块利用了移位寄存器实现恒虚警电路功能。
此模块是CFAR处理技术的核心,采样回波产生数据,并对这些数据进行定点化。
模块框图如图5所示。
图5恒虚警(CFAR)电路框图
设计程序如下所示:
`timescale1ns/1ps
modulecfar(
inputclk,
inputrst,
input[15:
0]I_signal,
input[15:
0]I_noise,
outputO_result
);
reg[15:
0]O1_result;
reg[15:
0]R_noise;
reg[15:
0]R1_noise;
reg[15:
0]R2_noise;
reg[15:
0]R3_noise;
reg[15:
0]R4_noise;
reg[15:
0]R5_noise;
reg[15:
0]R6_noise;
reg[15:
0]R7_noise;
reg[15:
0]R8_noise;
reg[15:
0]R9_noise;
reg[15:
0]R10_noise;
reg[15:
0]R11_noise;
reg[15:
0]R12_noise;
reg[15:
0]R13_noise;
reg[15:
0]R14_noise;
reg[19:
0]R_add;
reg[15:
0]R1_add;
reg[15:
0]R2_add;
reg[15:
0]R3_add;
reg[15:
0]R4_add;
reg[15:
0]R5_add;
reg[15:
0]R6_add;
reg[15:
0]R7_add;
reg[15:
0]R8_add;
reg[15:
0]R9_add;
reg[15:
0]R10_add;
reg[15:
0]R11_add;
reg[15:
0]R12_add;
reg[15:
0]R13_add;
reg[15:
0]R14_add;
reg[15:
0]R15_add;
reg[15:
0]R16_add;
reg[15:
0]R_average;
reg[15:
0]R_signal;
reg[15:
0]R1_signal;
reg[15:
0]R2_signal;
reg[15:
0]R3_signal;
reg[15:
0]R4_signal;
reg[15:
0]R5_signal;
reg[15:
0]R6_signal;
reg[15:
0]R7_signal;
reg[15:
0]R8_signal;
reg[15:
0]R9_signal;
reg[15:
0]R10_signal;
reg[15:
0]R11_signal;
reg[15:
0]R12_signal;
reg[15:
0]R13_signal;
reg[15:
0]R14_signal;
reg[15:
0]R15_signal;
reg[15:
0]R16_signal;
//---------------noiseshift----------------
always@(posedgeclkornegedgerst)
begin
if(~rst)
begin
R_noise<=16'h0000;
R1_noise<=16'h0000;
R2_noise<=16'h0000;
R3_noise<=16'h0000;
R4_noise<=16'h0000;
R5_noise<=16'h0000;
R6_noise<=16'h0000;
R7_noise<=16'h0000;
R8_noise<=16'h0000;
R9_noise<=16'h0000;
R10_noise<=16'h0000;
R11_noise<=16'h0000;
R12_noise<=16'h0000;
R13_noise<=16'h0000;
R14_noise<=16'h000