一、說明:
功能:AM調制
平臺:Vivado 2016.4 和 Matlab R2017a
二、原理:
1. AM調制原理
AM已調信號的時域表達式:
已調信號的頻域表達式:
本質上AM調制就是頻譜的搬移。
AM調制的系統框圖
將調制信號加上一個直流分量,保證信號的最小值大于零,然后再和載波相乘,得到已調信號。
三、AM調制的FPGA實現
1.產生調制信號和載波信號
調用ROM IP核在FPGA內部產生兩路余弦信號,其中一路信號用于模擬外部輸入的調制信號,另一路用作載波信號。
在配置ROM IP核之前,需要用Matlab生.coe文件,存放在ROM核里。
Matlab生成.coe文件:
%---------------------------------%
width=8; %設置rom的位寬
depth=1024; %設置rom的深度
%---------------------------------%
x=linspace(0,2*pi,depth); %在一個周期內產生depth個采樣點
y_cos=cos(x); %生成余弦函數
%y_cos=sin(x); %生成正弦函數
%y_cos=round(y_cos*(2^(width-1)-1))+2^(width-1)-1; %將數據轉化成整數,生成無符號數
y_cos=round(y_cos*(2^(width-1)-1)); %將數據轉化成整數,生成有符號數
plot(x,y_cos); %繪圖
fid = fopen(‘E:WorkspaceDDSDesignIP_Corecos.coe’,‘wt’);
fprintf(fid,‘memory_initialization_radix = 10; memory_initialization_vector = ’);
for i = 1 : depth
if mod(i-1,8) == 0
fprintf(fid,‘ ’);
end
fprintf(fid,‘%6d,’,y_cos(i));
end
fclose(fid); %關閉文件
生成.coe文件后就可以進行IP核的配置了。
ROM核具體配置:
配置完IP核后,編寫控制模塊,產生兩路信號。其中,調制信號上疊加的直流分量的大小為調制信號的峰值,這樣將得到調制度為100%的已調信號。如果要得到不同的調制度,則需要疊加不同大小的直流分量,同時需要注意定義的數據位寬,防止數據溢出。
產生載波和帶有直流分量的調制信號:
module cos_make(
input clk,
input rst_n,
output reg [7:0] cos_s,
output reg signed [7:0] cos_c
);
//------------------------------------//
parameter freq_s = 32‘d429497; //調制信號頻率10k
parameter freq_c = 32’d42949673; //載波頻率1M
parameter cnt_width = 8‘d32;
//------------------------------------//
//------------------------------------//
reg [cnt_width-1:0] cnt_s = 0;
reg [cnt_width-1:0] cnt_c = 0;
wire [9:0] addr_s;
wire [9:0] addr_c;
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
cnt_s 《= 0;
cnt_c 《= 0;
end
else begin
cnt_s 《= cnt_s + freq_s;
cnt_c 《= cnt_c + freq_c;
end
end
assign addr_s = cnt_s[cnt_width-1:cnt_width-10];
assign addr_c = cnt_c[cnt_width-1:cnt_width-10];
//------------------------------------//
//------------調用ROM核----------------//
wire signed [7:0] cos_s_r;
wire signed [7:0] cos_c_r;
ROM ROM_inst(
.clka (clk),
.addra (addr_s),
.douta (cos_s_r),
.clkb (clk),
.addrb (addr_c),
.doutb (cos_c_r)
);
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
cos_s 《= 0;
cos_c 《= 0;
end
else begin
cos_s 《= cos_s_r + 8 ’d128; //加上大小為峰值的直流分量
cos_c 《= cos_c_r;
end
end
endmodule
2.生成AM調制信號
得到兩路信號后就可以用乘法器將兩路信號相乘,得到已調信號。
乘法器具體配置:
AM調制的頂層模塊:
module modulate(
input clk,
input rst_n,
output signed [15:0] AM_mod
);
wire [7:0] cos_s;
wire signed [7:0] cos_c;
//------------調用出波模塊------------//
cos_make cos_make_inst0(
.clk (clk),
.rst_n (rst_n),
.cos_s (cos_s),
.cos_c (cos_c)
);
//-----------------------------------//
//------------調用乘法器--------------//
MULT MULT_inst1(
.CLK (clk),
.A (cos_s),
.B (cos_c),
.P (AM_mod)
);
endmodule
3.仿真調制結果
以上AM調制過程基本完成,但是正確與否還需要通過仿真來確定,接下來編寫仿真用的測試模塊。
TestBeach的編寫:
timescale 1ns/1ps
module tb_AM();
//---------接口設置----------//
reg sclk;
reg rst_n;
wire signed [15:0] AM_mod;
//--------------------------//
initial sclk = 1;
always #5 sclk = ~sclk; //100M時鐘
initial begin
rst_n = 0;
#500
rst_n = 1;
end
//--------------------------//
modulate modulate_inst0(
.clk (sclk),
.rst_n (rst_n),
.AM_mod (AM_mod)
);
endmodule
在Vivado中將各個文件添加進工程后,運行仿真。
仿真結果如下:
已調信號能明顯看到包絡,并且包絡的頻率同調制信號一致,表明AM調制正確。
評論
查看更多