GPS模拟器中的载波NCO理解

        GPS信号包含三部分,50bit/s的导航电文数据,1.023MHz的C/A码,频率为1575.42MHz的载波信号。

                                       

导航电文先与C/A码进行异或处理,得到的是1.023MHz的(0-1)数据流,然后将数据调制到1575.42MHz的载波信号上面,因为载波信号的频率高出(0-1)数据流1540倍,所以,一个0或者一个1需要很多个完整的载波正/余弦信号来表示。

        但是在实际应用中正弦信号不可能很好产生,需要对其数字化处理,即通过NCO(数控振荡器)产生。

        载波NCO产生的载波信号是正/余弦信号。下面介绍如何生成NCO信号。

        实际应用中的正弦信号是不能生成的,只能通过数字化处理后,比较生成,采样频率越高,生成的精度也就就越好。

        一个最简单的单频信号:

                                        u(t)=\sin 2\displaystyle \displaystyle \pi f_{0}t=sin\theta (t)                                                              (1)

f_{0}即为我们所需要的频率,对这个信号进行抽样处理,抽样频率为f_{c},则其离散相位序列为:

                                        \theta (n)=2\pi f_{0}nT_{c}=\triangle \theta * n (n=0.1.2.....)

        ​​​​其中:

                                                  \triangle \theta =2\pi f_{0}T_{c}=2\pi \frac{f_{0}}{f_{c}}

其中\triangle \theta叫相位增量,我们可以通过相位增量就可以控制合成信号的频率。将整个周期的相位2π分为M份,每份为\sigma =\frac{2\pi }{M},若每次的相位增量选择为\sigma的K倍,即可得到信号的频率:

                                        f_{0}=\frac{K\sigma }{2\pi T_{c}}=\frac{K}{M}f_{c}

对应的模拟信号为:

                        ​​​​​​​        ​​​​​​​        u(t)=sin(2\pi \frac{K}{M}f_{c}t)

其中K和M都是正整数,根据采样定律,K_{max}<\frac{1}{2}M综上所述,在采样频率一定的情况下,可以通过控制两次采样之间的相位增量(不得大于π)来控制所得离散序列的频率。

        实际应用中,我们已经定义了抽样频率f_{c}和我们需要的频率^{f_{0}}。通过\frac{K}{M},M为我们将周期分割的份。K又称频率累加字,在某一时钟频率下K进行累加,等加到M时,就表示一个周期信号产生。

在FPGA实现正弦信号的过程中,将每次K自身累加的值对应的正弦信号中的幅度值写成ROM表,每次K累加一次,输出的是其正弦信号中对应的幅值。

这样一个载波正弦信号就生成了。

简单的说,就是K在累加过程中,每一次的累加都是在输出一个正弦信号的采样值,当输出到M也就是一个周期的结束时,一个完整的正弦信号就生成了。K越大,输出的信号就月精密。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,下面是一个简单的Verilog代码实现NCO模块,并在ModelSim进行仿真的步骤: 1. 首先,新建一个Verilog文件,命名为nco.v,然后将以下代码复制粘贴到文件: ```verilog module nco( input clk, //时钟信号 input reset, //复位信号 input [31:0] phase_increment, //相位增量 output reg sine //正弦波输出 ); reg [31:0] phase; //相位寄存器 phase_accumulator PA(clk, reset, phase_increment, phase); //调用相位累加器模块 always @(posedge clk) begin sine <= $sin(phase[31:28]); //计算正弦波输出 end endmodule ``` 在上面的代码,我们定义了一个NCO模块,包含了时钟信号、复位信号、相位增量和正弦波输出。我们还定义了一个相位寄存器,并通过相位累加器模块进行相位累加。最后,我们通过计算正弦波输出。 2. 然后,新建一个testbench文件,命名为nco_tb.v,然后将以下代码复制粘贴到文件: ```verilog `timescale 1ns/1ns module nco_tb; reg clk; reg reset; reg [31:0] phase_increment; wire sine; nco UUT(clk, reset, phase_increment, sine); initial begin clk = 0; reset = 1; phase_increment = 0; #10 reset = 0; #100 $finish; end always #5 clk = ~clk; endmodule ``` 在上面的代码,我们定义了一个测试台,包括时钟信号、复位信号、相位增量和正弦波输出。我们通过nco模块实例化UUT,并在initial块初始化信号,并进行仿真。 3. 接下来,打开ModelSim软件,然后新建一个工程,将nco.v和nco_tb.v文件添加到工程。 4. 然后,编译工程,生成仿真文件。 5. 最后,在仿真窗口运行仿真,并观察正弦波输出是否符合我们的期望。 这样,我们就用Verilog语言在ModelSim实现了NCO模块的仿真代码。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值