小言_互联网的博客

m基于FPGA的GPS收发系统开发,包括码同步,载波同步,早迟门跟踪环,其中L1采用QPSK,L2采用BPSK

262人阅读  评论(0)

目录

1.算法描述

2.仿真效果预览

3.MATLAB核心程序

4.完整MATLAB


1.算法描述

       最早的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。这里,为了测试的需要,我们需要降低频率来进行测试。整个发送端,按如下的结构设计:

       通过捕获模块获得初始的频偏值,然后进行载波同步。与此同时,通过码同步,完成相位的捕获。最后进入跟踪阶段。

       先介绍一下捕获的基本原理:

       本地码生成器以C/A码标称频率产生C/A码与接收到的采样信号相关累加,一个积分周期(通常1个码周期)后,相关峰与检测门限比较,如果相关峰大于门限,则认为捕获成功,得到对应的码相位估计;如果相关峰小于门限,码发生器自动将本地码码相位向前或向后跳动1/2或1/4个码片,然后继续相关累加检测,最多在 或 个伪码周期后找到与本地伪码同步的输入伪码的相位状态( 即为一个码周期内码片的数目),以实现伪码的捕获。下面对步进相关法进行简单介绍,其原理图见图1。

跟踪部分:

其内部详细结构如下所示:

2.仿真效果预览

算法仿真:MATLAB 2010b

FPGA设计:ISE12.2

FPGA仿真:Modelsim6.5SE

   

   

导航电文和CA码及P码异或之后的信号。

导航电文和CA码及P码异或之后的信号,通过成型滤波器之后的效果。

这个最后发送出去的QPSK,BPSK以及相加之后的射频信号。

最后捕获跟踪之后的信号,放大看如下所示:

一开始的逐渐变大的过程就是锁定过程

3.MATLAB核心程序


  
  1. ` timescale 1 ns / 1 ps
  2. module GPS_Rec(
  3. i_clk,
  4. i_rst,
  5. i_QPSK,
  6. i_BPSK,
  7. //Capture
  8. o_Ca_index,
  9. o_CA,
  10. o_abs_addCA,
  11. o_P_index,
  12. o_P,
  13. o_abs_addP,
  14. o_fre_est_Ca,
  15. o_fre_est_P,
  16. //Tracking
  17. o_I_L1,
  18. o_Q_L1,
  19. o_I_L2,
  20. o_Q_L2,
  21. o_Dwen_rec_L1,
  22. o_Dwen_rec_L2
  23. );
  24. input i_clk;
  25. input i_rst;
  26. input signed [15:0] i_QPSK;
  27. input signed [15:0] i_BPSK;
  28. //Capture
  29. output [9:0] o_Ca_index;
  30. output signed [1:0] o_CA;
  31. output signed [21:0] o_abs_addCA;
  32. output [10:0] o_P_index;
  33. output signed [1:0] o_P;
  34. output signed [23:0] o_abs_addP;
  35. output signed [23:0] o_fre_est_Ca;
  36. output signed [23:0] o_fre_est_P;
  37. //Tracking
  38. output signed [15:0] o_I_L1;
  39. output signed [15:0] o_Q_L1;
  40. output signed [15:0] o_I_L2;
  41. output signed [15:0] o_Q_L2;
  42. output signed [1:0] o_Dwen_rec_L1;
  43. output signed [1:0] o_Dwen_rec_L2;
  44. wire clk_ca;
  45. wire clk_ca_2code;
  46. wire clk_p;
  47. wire clk_p_2code;
  48. //2 time ca clock
  49. CLOCK_DCM2 CLOCK_DCM2_u(
  50. .i_clk (i_clk),
  51. .i_rst (i_rst),
  52. .o_clk_dwen (),
  53. .o_clk_ca (clk_ca),
  54. .o_clk_ca_2code (clk_ca_2code),
  55. .o_clk_p (clk_p),
  56. .o_clk_p_2code (clk_p_2code)
  57. );
  58. //CAPTURE
  59. //CAPTURE
  60. //frequency capture
  61. wire signed [9:0] o_Ca_index;
  62. wire signed [1:0] o_CA;
  63. wire signed [21:0] o_abs_addCA;
  64. frequency_capture_channel1 frequency_capture_channel1_u(
  65. .i_clk (i_clk),
  66. .i_clk_ca (clk_ca),
  67. .i_clk_ca2times (clk_ca_2code),
  68. .i_rst (i_rst),
  69. .i_QPSK (i_QPSK),
  70. .o_fre_est (o_fre_est_Ca),
  71. .o_I_filter (),
  72. .o_Q_filter (),
  73. .o_Ca_index (o_Ca_index),
  74. .o_CA (o_CA),
  75. .o_abs_addIQ (o_abs_addCA)
  76. );
  77. wire signed [10:0] o_p_index;
  78. wire signed [1:0] o_p;
  79. wire signed [23:0] o_abs_addP;
  80. frequency_capture_channel2 frequency_capture_channel2_u (
  81. .i_clk (i_clk),
  82. .i_clk_p (clk_p),
  83. .i_clk_p2times (clk_p_2code),
  84. .i_rst (i_rst),
  85. .i_BPSK (i_BPSK),
  86. .o_fre_est (o_fre_est_P),
  87. .o_I_filter (),
  88. .o_Q_filter (),
  89. .o_p_index (o_P_index),
  90. .o_p (o_P),
  91. .o_abs_addIQ (o_abs_addP)
  92. );
  93. //TRACKING
  94. //TRACKING
  95. wire signed [15:0] o_I_filter1;
  96. wire signed [15:0] o_Q_filter1;
  97. wire signed [15:0] o_I_filter2;
  98. wire signed [15:0] o_Q_filter2;
  99. Frequency_track_tops Frequency_track_tops_u(
  100. .i_clk (i_clk),
  101. .i_rst (i_rst),
  102. .i_QPSK (i_QPSK),
  103. .i_BPSK (i_BPSK),
  104. . i_FRE_index1(o_fre_est_Ca),
  105. . i_FRE_index2(o_fre_est_P),
  106. .o_I_filter1 (o_I_L1),
  107. .o_Q_filter1 (o_Q_L1),
  108. .o_I_filter2 (o_I_L2),
  109. .o_Q_filter2 (o_Q_L2)
  110. );
  111. //CA capture
  112. wire signed [1:0] Dwen_rec_L1;
  113. CA_early_late_track_tops CA_early_late_track_tops_u(
  114. .i_clk (clk_ca_2code),
  115. .i_clk_ca (clk_ca),
  116. .i_rst (i_rst),
  117. .i_CA_index (o_Ca_index+ 1),
  118. .i_Idin (o_I_L1),
  119. .i_Qdin (o_Q_L1),
  120. .o_dout (o_Dwen_rec_L1)
  121. );
  122. //P capture
  123. wire signed [1:0] Dwen_rec_L2;
  124. P_early_late_track_tops P_early_late_track_tops_u (
  125. .i_clk (clk_p_2code),
  126. .i_clk_p (clk_p),
  127. .i_rst (i_rst),
  128. .i_P_index (o_P_index+ 1),
  129. .i_Idin (o_I_L2),
  130. .i_Qdin (o_Q_L2),
  131. .o_dout (o_Dwen_rec_L2)
  132. );
  133. endmodule
  134. 01 _118m

4.完整MATLAB

V


转载:https://blog.csdn.net/hlayumi1234567/article/details/128258392
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场