数据码和C/A码异或扩频模块

本文介绍了卫星信号发射端如何通过将数据码与C/A码进行异或操作,实现50bps数据码的扩频调制过程,以及相关计数器和状态机在其中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值