AM調制的FPGA實現


一、說明:

  1. 功能:AM調制
  2. 平台: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:\Workspace\DDS\Design\IP_Core\cos.coe','wt');

fprintf(fid,'memory_initialization_radix = 10;\nmemory_initialization_vector = ');
for i = 1 : depth
    if mod(i-1,8) == 0 
        fprintf(fid,'\n');
    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調制正確。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM