1:CA码的结构和特征多项式
c/a码的设计和结构示意图参考GPS原理和接收机设计本书,从结构图上看,G1序列和G2序列都是m序列,C/A码是G1序列和G2等价序列(选取特定相位值)G2i序列的模二和所构成的。同时初步考虑设计十级移位寄存器的值全都为1 ,只考虑C/A码的生成模块,不对时钟的分频模块进行设计。设计出合理的C/A码产生模快。
module c_a_produce(
clk ,
reset_n ,
c_a_send_en ,
ca_data_flag ,
ca_data ,
ca_data_out
);
input clk ; //系统时钟
input reset_n ; //复位信号
input c_a_send_en ; //CA码发送使能
output reg ca_data_flag ; //ca码完成标志
output reg [1022 : 0 ] ca_data ; //C/A码输出
output reg ca_data_out ; //输出ca_data_out信号
parameter INPULSE_INITIAL = 10'b111_111_111_1 ; //初始化十位脉冲信号置位成1
reg g1_work_en ; //g1序列使能,
reg g2_work_en ; //g2序列使能
reg load_g1 ; //装载g1信号标志
reg load_g2 ; //装载g2信号标志
reg [9 : 0 ] shift_reg_g1 ; //用于存储g1信号的十级移位寄存器
reg [9 : 0 ] shift_reg_g2 ; //用于存储g2信号的十级移位寄存器
reg g1_data_out ; //输出g1的数据
reg g2_equ_data_out ; //输出g2的平移等价序列序列的数据
reg [10 : 0 ] i ;
//使能模块
always@(posedge clk or negedge reset_n ) begin
if(!reset_n) begin
g1_work_en <= 1'b0 ;
g2_work_en <= 1'b0 ;
end
else if (c_a_send_en) begin
g1_work_en <= 1'b1 ;
g2_work_en <= 1'b1 ;
end
else begin
g1_work_en <= 1'b0 ;
g2_work_en <= 1'b0 ;
end
end
//c_a_produce
//g1_seq
always @ (posedge clk or negedge reset_n ) begin
if ( !reset_n) begin
load_g1 <= 1'b0 ; //g1信号
shift_reg_g1 <= INPULSE_INITIAL ; // 初始移位寄存器全部置位成1
g1_data_out <= 1'b0 ;
end
else if ( g1_work_en ) begin
shift_reg_g1 <= { shift_reg_g1[ 8:0 ] ,shift_reg_g1[9] } ; //循环向左移动,上一级的寄存器的值是下一级寄存器的值
shift_reg_g1[9] <= shift_reg_g1[9] ^shift_reg_g1[2] ;
load_g1 <= 1'b1 ; // 装载g1信号
g1_data_out <= shift_reg_g1[9] ;
end
else begin
load_g1 <= 1'b0 ;
g1_data_out <= 1'b0 ;
end
end
//g2_seq
always @ (posedge clk or negedge reset_n ) begin
if ( !reset_n) begin
load_g2 <= 1'b0 ; //g1信号
shift_reg_g2 <= INPULSE_INITIAL ; // 初始移位寄存器全部置位成1
g2_equ_data_out <= 1'b0 ;
end
else if ( g2_work_en ) begin
shift_reg_g2 <= { shift_reg_g2[ 8:0 ] ,shift_reg_g2[9] } ; //循环向左移动,上一级的寄存器的值是下一级寄存器的值
shift_reg_g2[9] <= shift_reg_g2[9] ^shift_reg_g2[8] ^ shift_reg_g2[7] ^shift_reg_g2[5] ^shift_reg_g2[2] ^shift_reg_g2[1] ;
load_g2<= 1'b1 ; // 装载g1信号
g2_equ_data_out <= shift_reg_g2[1] ^ shift_reg_g2[5]; //不同的g2i对应于不同PRN卫星号 PRN1 号卫星
end
else begin
load_g2 <= 1'b0 ;
g2_equ_data_out <= 1'b0 ;
end
end
//ca码生成模块
always@ (posedge clk or negedge reset_n) begin
if (!reset_n) begin
ca_data_out <= 1'b0 ;
ca_data <= 1023'b0 ;
i <= 11'd0 ;
ca_data_flag <= 1'b0 ;
end
else if ((load_g1 == 1 ) && (load_g2 == 1 ) && (i < 1023 ) )
begin
ca_data_out <= g1_data_out ^ g2_equ_data_out ;
ca_data[i] <= ca_data_out ;
i <= i + 1 ;
end
else if (i == 11'd1023 ) begin
i = 11'd1023 ;
ca_data_flag <= 1'b1 ; //CA码产生完成标志
end
end
endmodule
通过改变不同的相位选择值可以产生出不同的对应于PRN序列的卫星标号对应关系间下表