1设计原理
在卫星信号发射端,PRN编号为i的卫星首先将数据码与C/A码Gi异或相加,从而完成数据码对C/A码的调制。当数据码与C/A码异或相加,数据码与C/A码异或相加时候,数据码的每一个比特变成20周期的C/A 码或他们的反向值。原先码率为50bps的数据码的频宽一下子扩大,因此这个过程也可以叫扩频调制。
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2023/10/23 15:28:41
// Design Name:
// Module Name: data_message_xor_ca_code
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module data_message_xor_ca_code(
clk ,
reset_n ,
navigation_message ,
ca_code ,
xor_begin_flag ,
ca_data_flag ,
uart_begin_flag ,
send_data_flag ,
navigation_message_casr ,
DSSS_message_data //扩频调制后的数据码
);
input clk ; //系统时钟
input reset_n ; //复位信号
input [1499 :0 ] navigation_message ; //1500位bit的导航信息
input [1022 : 0 ] ca_code ; //输入C/A码编码数据
input xor_begin_flag ; //输入开始异或标志位
input ca_data_flag ;
output reg uart_begin_flag ;
output reg send_data_flag ;
output reg navigation_message_casr ; //扩频后的数据码
output reg DSSS_message_data ; //扩频调制信息码
reg [11 :0 ] nav_i ; //定义一个数据码计数器
reg [11 : 0] ca_code_j ; //定义一个C/A码计数器
reg [ 1 : 0] uart_state ; //定义此时uart处于哪一个状态
reg [ 8 : 0 ] uart_tx_bit_counter ; // 拆分成单比特状态计数器
//扩频调制module
always@(posedge clk or negedge reset_n) begin
if(!reset_n) begin
DSSS_message_data <= 1'b0 ;
nav_i <= 12'd0 ;
ca_code_j <= 12'd0 ;
uart_tx_bit_counter <= 8'd0 ;
uart_state <= 2'd0 ;
end
else if( (nav_i < 12'd1500 ) && (xor_begin_flag == 1 ) && (ca_code_j <= 12'd1022) )begin
DSSS_message_data <= navigation_message[nav_i] ^ ca_code[ca_code_j] ;
navigation_message_casr <= navigation_message[nav_i] ;
ca_code_j <= ca_code_j + 1'd1 ;
if (ca_code_j == 12'd1023) begin
uart_tx_bit_counter <= uart_tx_bit_counter + 1'b1 ; //说明一个比特计数完成
ca_code_j <= 12'd0 ; //发完后清零
end
if (uart_tx_bit_counter == 8'd20 ) begin //计数到20位个比特的时候说明一个byte可以发送
uart_tx_bit_counter <= 8'd0 ; //计数清零
nav_i <= nav_i + 1 ;
end
if (nav_i == 12'd1499 )
begin
send_data_flag <= 1'b1 ;
end
if (nav_i == 12'd1500 )
begin
send_data_flag <= 1'b0 ;
nav_i <= 12'd0 ;
end
end
else if( (ca_data_flag == 1'b1 ) && (ca_code_j <= 12'd1022 ) && (uart_state <= 2'd3 ) )
begin
ca_code_j <= ca_code_j + 1'b1 ;
if (ca_code_j == 12'd1023 )
begin
uart_tx_bit_counter = uart_tx_bit_counter + 1 ;
ca_code_j <= 12'd0 ;
end
if (uart_tx_bit_counter == 8'd20 ) //发送完成一个字节
begin
uart_tx_bit_counter <= 8'd0 ;
uart_state <= uart_state + 1'd1 ;
end
if (uart_state == 2'd1 )
uart_begin_flag <= 1'b1 ; //准备发送字节
if (uart_state == 2'd2 ) begin
uart_begin_flag <= 1'b0 ; //结束发送字节
uart_state <= 2'd3 ; //并且跳转到下一个状态
end
end
end
endmodule