源码获取方式
使用版本
算法仿真:MATLAB2010b
FPGA设计:ISE12
获取方式
点击下载链接:
m基于FPGA的GPS收发系统开发,包括码同步,载波同步,早迟门跟踪环,其中L1采用QPSK,L2采用BPSK
获取方式
如果下载链接失效,加博主微信联系,或私信联系。
算法描述
最早的GPS包含L1和L2两个频段,其中L1上调制CA码,P码以及导航电文,L2上调制P码和导航电文。在实际接收到的GPS信号中,我们除了能够接受到CA码和P码外,还能检测到L1和L2两种载波信号。
GPS双频发送器的基本构架如下所示:
使用CA码和P码两种码来区分双频道中的两种不同的频道。但是P码周期非常长,美国用P码周期是140多天,而简化后的民用版本也要7天多,我们无法在仿真或者实际测试的时候花那么多时间去验证P码的捕获,所以这里,我们将P码部分做了下简化,使用伪随机序列周期为2048bit,来代替P码部分。
一般情况下,导航电文的频率为50hz,CA码的频率为1M,P码的频率为10M。这里,为了测试的需要,我们需要降低频率来进行测试。
整个发送端,按如下的结构设计:
通过捕获模块获得初始的频偏值,然后进行载波同步。与此通过码同步,完成相位的捕获。最后进入跟踪阶段。
跟踪部分:
其内部详细结构如下所示:
部分程序
`timescale 1ns / 1ps
//
module GPS_Trans(
i_clk,
i_rst,
o_Dwen,
o_CAcode,
o_Pcode,
o_Dwen_CA_xor,
o_Dwen_P_xor1,
o_Dwen_P_xor2,
o_Dwen_CA_filter,
o_Dwen_P_filter1,
o_Dwen_P_filter2,
o_QPSK,
o_BPSK,
o_R,
//CLOCK
o_clk_dwen,
o_clk_ca,
o_clk_p,
o_clk_system
);
input i_clk;
input i_rst;
output signed[1:0] o_Dwen;
output signed[1:0] o_CAcode;
output signed[1:0] o_Pcode;
output signed[1:0] o_Dwen_CA_xor;
output signed[1:0] o_Dwen_P_xor1;
output signed[1:0] o_Dwen_P_xor2;
output signed[15:0]o_Dwen_CA_filter;
output signed[15:0]o_Dwen_P_filter1;
output signed[15:0]o_Dwen_P_filter2;
output signed[15:0]o_QPSK;
output signed[15:0]o_BPSK;
output signed[15:0]o_R;
//test
output o_clk_dwen;
output o_clk_ca;
output o_clk_p;
output o_clk_system;
CLOCK_DCM CLOCK_DCM_u(
.i_clk (i_clk),
.i_rst (i_rst),
.o_clk_dwen (o_clk_dwen),
.o_clk_ca (o_clk_ca),
.o_clk_p (o_clk_p)
);
assign o_clk_system = i_clk;
//enable delay
//Dwen
Dwen Dwen_u(
.i_clk (o_clk_dwen),
.i_rst (i_rst),
.o_Dwen (o_Dwen)
);
//CA address
CA_gen CA_gen_u(
.i_clk (o_clk_ca),
.i_rst (i_rst),
.i_enable (1"b1),
.o_CAcode (o_CAcode)
);
//P address
P_gen P_gen_u(
.i_clk (o_clk_p),
.i_rst (i_rst),
.i_enable (1"b1),
.o_Pcode (o_Pcode)
);
//3 XOR
GXor GXor_u1(
.i_clk (o_clk_ca),
.i_rst (i_rst),
.i_din (o_Dwen),
.i_code (o_CAcode),
.o_dout_xor (o_Dwen_CA_xor)
);
GXor GXor_u2(
.i_clk (o_clk_p),
.i_rst (i_rst),
.i_din (o_Dwen),
.i_code (o_Pcode),
.o_dout_xor (o_Dwen_P_xor1)
);
GXor GXor_u3(
.i_clk (o_clk_p),
.i_rst (i_rst),
.i_din (o_Dwen),
.i_code (o_Pcode),
.o_dout_xor (o_Dwen_P_xor2)
);
//QPSK
fir_filter fir_filter_u1(
.i_clk (o_clk_system),
.i_rst (i_rst),
.i_din (o_Dwen_CA_xor),
.o_dout_filter (o_Dwen_CA_filter)
);
fir_filter fir_filter_u2(
.i_clk (o_clk_system),
.i_rst (i_rst),
.i_din (o_Dwen_P_xor1),
.o_dout_filter (o_Dwen_P_filter1)
);
QPSK_mod QPSK_mod_u(
.i_clk (o_clk_system),
.i_rst (i_rst),
.i_I_pcode (o_Dwen_P_filter1),
.i_Q_cacode (o_Dwen_CA_filter),
.o_cos (),
.o_sin (),
.o_R (o_QPSK)
);
//BPSK
fir_filter fir_filter_u3(
.i_clk (o_clk_system),
.i_rst (i_rst),
.i_din (o_Dwen_P_xor2),
.o_dout_filter (o_Dwen_P_filter2)
);
BPSK_mod BPSK_mod_u(
.i_clk (o_clk_system),
.i_rst (i_rst),
.i_I_pcode (o_Dwen_P_filter2),
.o_cos (),
.o_R (o_BPSK)
);
assign o_R = o_BPSK + o_QPSK;
endmodule
`timescale 1ns / 1ps
//
//
module GPS_Rec(
i_clk,
i_rst,
i_QPSK,
i_BPSK,
//Capture
o_Ca_index,
o_CA,
o_abs_addCA,
o_P_index,
o_P,
o_abs_addP,
o_fre_est_Ca,
o_fre_est_P,
//Tracking
o_I_L1,
o_Q_L1,
o_I_L2,
o_Q_L2,
o_Dwen_rec_L1,
o_Dwen_rec_L2
);
input i_clk;
input i_rst;
input signed[15:0] i_QPSK;
input signed[15:0] i_BPSK;
//Capture
output [9:0] o_Ca_index;
output signed[1:0] o_CA;
output signed[21:0]o_abs_addCA;
output [10:0]o_P_index;
output signed[1:0] o_P;
output signed[23:0]o_abs_addP;
output signed[23:0]o_fre_est_Ca;
output signed[23:0]o_fre_est_P;
//Tracking
output signed[15:0]o_I_L1;
output signed[15:0]o_Q_L1;
output signed[15:0]o_I_L2;
output signed[15:0]o_Q_L2;
output signed[1:0] o_Dwen_rec_L1;
output signed[1:0] o_Dwen_rec_L2;
wire clk_ca;
wire clk_ca_2code;
wire clk_p;
wire clk_p_2code;
//2 time ca clock
CLOCK_DCM2 CLOCK_DCM2_u(
.i_clk (i_clk),
.i_rst (i_rst),
.o_clk_dwen (),
.o_clk_ca (clk_ca),
.o_clk_ca_2code (clk_ca_2code),
.o_clk_p (clk_p),
.o_clk_p_2code (clk_p_2code)
);
//CAPTURE
//CAPTURE
//frequency capture
wire signed[9:0] o_Ca_index;
wire signed[1:0] o_CA;
wire signed[21:0]o_abs_addCA;
frequency_capture_channel1 frequency_capture_channel1_u(
.i_clk (i_clk),
.i_clk_ca (clk_ca),
.i_clk_ca2times (clk_ca_2code),
.i_rst (i_rst),
.i_QPSK (i_QPSK),
.o_fre_est (o_fre_est_Ca),
.o_I_filter (),
.o_Q_filter (),
.o_Ca_index (o_Ca_index),
.o_CA (o_CA),
.o_abs_addIQ (o_abs_addCA)
);
wire signed[10:0] o_p_index;
wire signed[1:0] o_p;
wire signed[23:0] o_abs_addP;
frequency_capture_channel2 frequency_capture_channel2_u (
.i_clk (i_clk),
.i_clk_p (clk_p),
.i_clk_p2times (clk_p_2code),
.i_rst (i_rst),
.i_BPSK (i_BPSK),
.o_fre_est (o_fre_est_P),
.o_I_filter (),
.o_Q_filter (),
.o_p_index (o_P_index),
.o_p (o_P),
.o_abs_addIQ (o_abs_addP)
);
//TRACKING
//TRACKING
wire signed[15:0]o_I_filter1;
wire signed[15:0]o_Q_filter1;
wire signed[15:0]o_I_filter2;
wire signed[15:0]o_Q_filter2;
Frequency_track_tops Frequency_track_tops_u(
.i_clk (i_clk),
.i_rst (i_rst),
.i_QPSK (i_QPSK),
.i_BPSK (i_BPSK),
.i_FRE_index1(o_fre_est_Ca),
.i_FRE_index2(o_fre_est_P),
.o_I_filter1 (o_I_L1),
.o_Q_filter1 (o_Q_L1),
.o_I_filter2 (o_I_L2),
.o_Q_filter2 (o_Q_L2)
);
//CA capture
wire signed[1:0]Dwen_rec_L1;
CA_early_late_track_tops CA_early_late_track_tops_u(
.i_clk (clk_ca_2code),
.i_clk_ca (clk_ca),
.i_rst (i_rst),
.i_CA_index (o_Ca_index+1),
.i_Idin (o_I_L1),
.i_Qdin (o_Q_L1),
.o_dout (o_Dwen_rec_L1)
);
//P capture
wire signed[1:0]Dwen_rec_L2;
P_early_late_track_tops P_early_late_track_tops_u (
.i_clk (clk_p_2code),
.i_clk_p (clk_p),
.i_rst (i_rst),
.i_P_index (o_P_index+1),
.i_Idin (o_I_L2),
.i_Qdin (o_Q_L2),
.o_dout (o_Dwen_rec_L2)
);
endmodule
部分仿真预览
导航电文和CA码及P码异或之后的信号。
导航电文和CA码及P码异或之后的信号,通过成型滤波器之后的效果。
这个最后发送出去的QPSK,BPSK以及相加之后的射频信号。
最后捕获跟踪之后的信号,放大看如下所示:
一开始的逐渐变大的过程就是锁定过程
文章为作者独立观点,不代表 股票程序化软件自动交易接口观点