歡迎您光臨本站 登入註冊首頁

AM調製的FPGA實現原理和步驟

jacky631102 @ 2020-06-04 , reply:0

概述

一、說明:功能:AM調製平臺:Vivado 2016.4 和 Matlab R2017a二、原理:1. AM調製原理AM已調信號的時域表達式:已調信號的頻域表達式:本質上AM調製就是頻譜的搬移。AM調……

一、說明:

功能: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調製正確。

[jacky631102 via 研發互助社區 ] AM調製的FPGA實現原理和步驟已經有432次圍觀

http://cocdig.com/docs/show-post-45652.html