可编程逻辑
AM是幅度调制,因此只需要将基带信号与载波信号相乘;FM是频率调制,以频率的变化来表示基带信号。
好在FPGA有NCO IP核,其内部的原理,是将一个完整的正弦波信号分为2的32次方点数,将点数存放在ROM内,然后使用频率控制字作为读数据地址,频率控制字越大,点数的跨度越大,输出的波形周期越小,频率越大。
所以只需要将基带信号的变化加入到载波频率控制字上,便可以达到频率调制的效果。NCO的内容可以看之前的那篇讲述DDS上变频的文章,Xilinx称之为DDS,Altera称之为NCO。
为了方便板上验证,这里使用NCO产生基带信号,模拟整体过程。
使用50M时钟,NCO的相位精度为32,基带信号使用200kHz频率,算出的频率控制字为17179869;输出的基带信号位宽为16位;载波设为20MHz信号。输出的基带信号转为载波频率控制字的变化量,需要乘上一个倍数,倍数关系大致为:
将数值带入,算出倍乘因子是131。这里的倍数控制调制深度,不宜设的过大。将算出的数值与载波的频率控制字相加,代码如下:
module phi_control2(
input clk,
input rst,
input [26:0]sig_phi,
output reg [31:0]phi
);
parameter phi_t =171798691 ; //
//assign phi = phi_t + {{5{sig_phi[26]}},sig_phi};
always @ (posedge clk or posedge rst)
begin
if (rst)
phi <= 'd0;
else
phi <= phi_t + {{5{sig_phi[26]}},sig_phi};
end
endmodule
由于变化量的数值与频率控制字不是相同位宽,而且变化量的值是有符号数,所以需要进行符号位扩展,将两个参数的位宽补至相同。将最终的频率控制字送入NCO,输出的就是FM调制信号。
SignaltapII 抓取的FM调制图
将数据保存为txt,在matlab读取并做频谱分析,结果如图,截位肯定会损失精度。
调制的结构图如下图所示:
全部0条评论
快来发表一下你的评论吧 !