基于NCO的AM调制信号发生器(Quartus)

该文详细介绍了如何使用FPGA(Field-ProgrammableGateArray)进行AM调制的数字实现,具体涉及Quartus17.1工具和ModelsimSE-6410.4软件环境。设计包括NCO模块生成调制和载波信号,以及通过LPM_MULT宏功能模块实现调幅计算。实验步骤涵盖调制信号和载波信号的生成,调制度的改变对波形的影响,以及TestBench的编写和仿真验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、说明

实现平台:Quartus17.1和Modelsim SE-64 10.4

二、内容

1. 利用NCO产生调制信号和载波信号;

2. 根据AM调幅原理,产生调制度为0.5的AM调制器设计;

3. 验证AM调制信号的正确性,并改变调制度,观察波形变化情况;

4. 能够根据NCO的配置参数,实现不同载波频率和调制信号的产生,继而实现各种样式的AM信号。

三、实验原理

       幅度调制是模拟调制中的重要类型,在无线通信领域有着非常经典的理论研究价值和应用背景。从实现方式上幅度调制可以分为:常规AM,抑制载波的DSB调制、单边带SSB和残留边带四种调制方式。本次实验,我们用FPGA来进行常规AM调制的数字化实现。

       AM的表达式为:

 

        其中,A_{c}\geq \left | m(t) \right |_{max}是直流偏置分量;m(t)是带调制信号,使我们要传输的信息。

 当m(t)=A_{m}cos(2\pi f_{m}t+\theta _{m})时,上述表达式可写为:

       其中,\beta _{AM}是调制度,一般情况下小于等于1。f_{m}是调制信号(这里是单频正弦波)的频率,f_{c}是载波频率。

       根据表达式 ,建立AM的FPGA实现数学模型,如图2所示:

四、步骤

(1)设计要求

要求设计一个可变频率的正弦波产生器,主要参数为:

  • 50MHz主时钟clock,低电平有效复位reset;
  • 输出调制信号(正弦波)wSource,频率为1kHz,幅度3.3V,10位输出;
  • 输出载波信号(正弦波)wCarr,频率为1MHz,幅度3.3V,10位输出;
  • 输出AM调制信号Amsig,3.3V,12位输出

(2)设计思路

 1.产生调制信号wSource。调用宏功能模块NCO,按照输入时钟50MHz,产生频率为1KHz的正弦信号输出,并命名为b1_source.v。

2.产生载波信号wCarr。调用宏功能模块NCO,按照输入时钟50MHz,产生频率为1MHz的正弦信号输出,并命名为b2_source.v。

3.计算调幅度和调制信号的乘积(对应\beta _{AM}cos(2\pi f_{m}t+\theta _{m}))。调用宏功能模块LPM_MULT,调制度\beta _{AM}=0.5,统一定标为10'b00_1111_1111,计算\beta _{AM}和wSource的乘积。

4.计算调幅度与调制信号乘积值与1相加(对应1+\beta _{AM}cos(2\pi f_{m}t+\theta _{m}))。

5.产生调制信号Amsig。调用宏功能模块LPM_ MULT,将载波信号wCarr与步骤4所产生的值进行相乘,得到Amsig。

 (3)具体实现

1.打开quartus新建工程,首先设计顶层模块,代码如下:

module am_gen(clk,rst_n,am_sig,w_Source,w_Carrier);
	input clk;
	input rst_n;
	output [19:0] am_sig;
	output [9:0] w_Source;
	output [9:0] w_Carrier;
	
wire [17:0] source_1k;
wire [17:0] carrier_1m;
wire outvalid_1;
wire outvalid_2;
wire [19:0] wsource_out1;
wire [10:0] wsource;
wire [19:0] am_sig_out;

 
b1_source u1 (
		.clk       (clk),       // clk.clk
		.reset_n   (rst_n),   // rst.reset_n
		.clken     (1'b1),     //  in.clken
		.phi_inc_i (32'd85899), //    .phi_inc_i
		.fsin_o    (source_1k),    // out.fsin_o
		.out_valid (outvalid_1)  //    .out_valid
	);

b2_source u2 (
		.clk       (clk),       // clk.clk
		.reset_n   (rst_n),   // rst.reset_n
		.clken     (1'b1),     //  in.clken
		.phi_inc_i (32'd85899346), //    .phi_inc_i
		.fsin_o    (carrier_1m),    // out.fsin_o
		.out_valid (outvalid_2)  //    .out_valid
	);
	
mult1 m1(
		.dataa(10'b00_1111_1111),
		.datab(source_1k[17:8]),
		.result(wsource_out1)
	);
	
assign wsource = wsource_out1[19:9] + 11'b001_1111_1111;

mult2 m2(
	.dataa(wsource[10:1]),
	.datab(carrier_1m[17:8]),
	.result(am_sig_out)
	);
	
assign am_sig = am_sig_out;
assign w_Source = source_1k[17:8];
assign w_Carrier = carrier_1m[17:8];

endmodule

 2.调制信号wSource产生模块,NCO具体参数设计:

 

 

 3.载波信号wCarr产生模块,NCO具体参数设计:

 

 

 4.mult1和mult2宏功能模块LPM_ MULT参数设置:

 

 

 

 

 

5.程序设计完成后点击综合,只要综合完成即可进行下一步。

设计完成后可以看到RTL原理图如下所示,基本符合预期。

 6.TestBench程序编写如下:

`timescale 1 ns/ 1 ns
module am_gen_vlg_tst();

reg clk;
reg rst_n;
                                            
wire [19:0]  am_sig;
wire [9:0]  w_Carrier;
wire [9:0]  w_Source;

                       
am_gen i1 (
	.am_sig(am_sig),
	.clk(clk),
	.rst_n(rst_n),
	.w_Carrier(w_Carrier),
	.w_Source(w_Source)
);

initial                                                
begin                                                  
    clk = 0;
	rst_n = 1;
	#100;
	rst_n = 0;
	#100;
	rst_n = 1;
end 
                                                   
always #10 clk = ~clk;
                                                    
endmodule

 (4)仿真结果

显示波形设置波形的format和radix,分别设置为analog和decimal

若想改变AM的频率,仅需在NCO中改变频率即可。

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值