verilog Matlab GPS C/A码发生器.

    本文所涉文献资料均为开源免费, 参考文献、声明链接等均写在文末。

1.C/A码简要介绍 

       GPS卫星信号包括载波信号 、测距码和数据码.其 中的测码粗码即 C/A码 (CoarseAcquisitionCode)除 了作为粗测码外 ,还由于其具有码长短,易于捕获的特点而作为GPS卫星信号的捕获码 ,因此C/A码是 GPS信号捕获以及接收机实现的基础。[1]

      GPS系统中使用了两种伪随机码 ,一种是时钟速率 为 10.23MHz用于精密测距的精确军用码 ,简称P码 。另一种是时钟速率为 1.023MHz用于分址 、搜捕卫星信号的粗捕获民用码 ,简称为 c/A 码。c/A码(Coarse/Acquisition)是用于粗测和捕获的伪随机码。它是 m 序列的优选对组合码形成的Gold码 (简称 G 码 )。[2]


2.C/A码发生器原理

       C/A码是由两个移位寄存器产生的10阶M序列(自己查,不赘述)经抽头选择后,模2和的结果,(其中G2需要根据卫星编号PRN进行抽头选择模2和,而G1只进行抽头选择),码长为2^10 -1。这两个10阶M序列分别为

G1:X^10 +X^3 +1 

G2:X^10 +X^9 + X^8 + X^6 + X^3 + X^2 +1

     抽头选择,即为抽选M序列对应阶数的系数。模2和即为异或。


3. 算法思路

3.1先对两个10位寄存器进行初始化

reg [9:0] G1_REG=10'b11_1111_1111    //verilog

G1_REG = ones(1,10);(Matlab)

3.2生成G码G1和G2

verilog

G1_REG<={G1_REG[8:0], G1_REG[9]^ G1_REG[2]};

先将G1非0阶非0系数进行异或,然后移位,最后将异或结果作为G1_REG[0]

Matlab

temp = xor(G1_REG(3),G1_REG(10));

G1_REG(1,2:10)=G1_REG(1,1:9);

G1_REG(1)=temp

3.3抽头选择

G2需要根据卫星编号prn,进行对应抽头(m,n)

verilog

G1_R<= G1_REG[9];

G2_R<=G2_REG[m-1]^G2_REG[n-1];

matlab

G1_R=G1_REG(10);

G2_R=xor(G2_REG(m),G2_REG(n));

3.5 G1与G2异或生成C/A码

注意:c/a码实际上就是不断循环上述过程产生的数列,在第一步异或结果放在寄存器的哪一位都行,只是代码有略微区别。

verilog

CA_CODE <=G1_R^G2_R;

Matlab

CA_CODE = mod(G1_R+G2_R,2)


4.具体代码

verilog  CA_GENRATOR.v

module CA_GENRATOR(
input  [5:0]  PRN,
input         CLK_10P23M,
input         SYS_RST,
output        CA_CODE
);

reg    [9:0]  G1_REG  =  10'h3FF;
reg    [9:0]  G2_REG  =  10'h3FF;

reg    [3:0]  m;
reg    [3:0]  n;

always @(posedge CLK_10P23M) begin
    if (SYS_RST) begin
        m   <=  0;
        n   <=  0;
    end else begin
        case (PRN)
            1  : begin   m <= 2;  n <=6;  end
            2  : begin   m <= 3;  n <=7;  end
           //文件在内网,这些代码平板手打太费劲,具体看matlab里prn和n m的对应关系
            32 : begin   m <= 4;  n <=9;  end
            default : begin m<=0; n <=0;  end
        endcase
    end
end

reg      G1_R;
reg      G1_temp = 0;
reg      G2_R;
reg      G2_temp = 0;

always @( posedge CLK_10P23M ) begin
    if (SYS_RST) begin
        G1_REG  <=  10'h3FF;
        G1_R    <=  0;
    end
    else if (m>0) begin
        G1_R   <=  G1_REG[9];
        G1_REG <=  {G1_REG[8:0],G1_REG[2]^G1_REG[9]};
    end
end

always @( posedge CLK_10P23M ) begin
    if (SYS_RST) begin
        G2_REG  <=  10'h3FF;
        G2_R    <=  0;
    end
    else if (m>0) begin
        G2_R   <=  G2_REG[m-1]^G2_REG[n-1];
        G2_REG <=  {G2_REG[8:0],G2_REG[1]^ G2_REG[2]^ G2_REG[5]^ G2_REG[7]^ G2_REG[8]}^ G2_REG[9];
    end
end

always @( posedge CLK_10P23M ) begin
    if (SYS_RST) begin
        CA_CODE <= 0;
    end else
        CA_CODE <= G2_R^ G1_R;
end
endmodule

文末声明 

本文仅作免费分享用途,转载只需声明来源,且转载内容不得用于盈利。否则,啊米诺斯。

笔者以后会不定时更新自己学习的经验,均非盈利分享。如有谬误,欢迎各位批评指正。

学习交流:todaytyp@gmail.com;站内私信;v:同csdnid

matlab 代码参考

matlab 代码


2024.1.16     

         原matlab代码的链接404了,我搜了一下csdn上其他代码,都有点复杂。自己写一个吧。

整理一下思路

1.全一矩阵对应G码公式异或移位。用全一1X10矩阵对应G码非零阶项,然后把对应上的数全异或作为矩阵左移后的第0位;

2.抽头。对上一步生成的矩阵进行抽头,G1没要求直接抽最高位,G2抽取卫星要求的对应位异或;

3.抽头结果异或。

regG1 = ones(1,10);
regG2 = ones(1,10);

prn   = 10;

switch prn
    case 1
        m = 2; n = 6;
    case 2
        m = 3; n = 7;
    case 3
        m = 4; n = 8;
    case 4
        m = 5; n = 9;
    case 5
        m = 1; n = 9;
    case 6
        m = 2; n = 10;
    case 7
        m = 1; n = 8;
    case 8
        m = 2; n = 9;
    case 9
        m = 3; n = 10;
    case 10
        m = 2; n = 3;
    case 11
        m = 3; n = 4;
    case 12
        m = 5; n = 6;
    case 13
        m = 6; n = 7;
    case 14
        m = 7; n = 8;
    case 15
        m = 8; n = 9;
    case 16
        m = 9; n = 10;
    case 17
        m = 1; n = 4;
    case 18
        m = 2; n = 5;
    case 19
        m = 3; n = 6;
    case 20
        m = 4; n = 7;
    case 21
        m = 5; n = 8;
    case 22
        m = 6; n = 9;
    case 23
        m = 1; n = 3;
    case 24
        m = 4; n = 6;
    case 25
        m = 5; n = 7;
    case 26
        m = 6; n = 8;
    case 27
        m = 7; n = 9;
    case 28
        m = 8; n = 10;
    case 29
        m = 1; n = 6;
    case 30
        m = 2; n = 7;
    case 31
        m = 3; n = 8;
    case 32
        m = 4; n = 9;
end

for i             = 1:1023
    reg1(i)       = regG1(10);
    temp          = xor(regG1(3),regG1(10));
    regG1(1,2:10) = regG1(1,1:9);
    regG1(1)      = temp;
end

for i             = 1:1023
    reg2(i)       = xor(regG2(m),regG2(n));
    temp1         = xor(xor(regG2(2),regG2(3)),regG2(6));
    temp2         = xor(xor(regG2(8),regG2(9)),regG2(10));
    tempg         = xor(temp1,temp2);
    regG2(1,2:10) = regG2(1,1:9);
    regG2(1)      = tempg;
end

CACODE   = mod(reg1+reg2,2);
I        = find(CACODE == 0);
CACODE(I)= -1;

参考文献

[1] E11iottDKapla.GPS原理 与应用 [M].邱致 和 ,王万 义译.北京 :电子工业 出版社 ,2002.52-59..

[2] 张贤达 ,保铮.通讯信号处理[M3.北京 :国防工业 出版社 ,2000

  • 40
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值