信号发生器:Intel FPGA DDS(NCO)+双路DAC(AD9767)输出正余弦信号

本文介绍了如何在Quartus18.1环境中配置ACM9767模块,使用AD9767芯片生成双通道差分电流输出,通过NCOIP实现DDS信号,以及在FPGA中集成PLLIP和NCOIP进行信号处理。文章还讨论了仿真注意事项和代码实现中的细节,如最高位取反以匹配AD9767的电流输出要求。
摘要由CSDN通过智能技术生成

一、软硬件环境

Quartus18.1
小梅哥AC620开发板+ACM9767模块
示波器

二、ACM9767模块介绍

ACM9767模块使用的是ADI公司的AD9767芯片,14位CMOS 双通道DAC,125Msps转换率。
在这里插入图片描述
输出形式为差分电流输出,输出电流满量程范围为可设置为 2~20mA。
AD9767的两路DA输出都为补码形式的电流输出IoutA和IoutB。当AD9767数字输入为满量程时(DAC的输入的14位数据都为高),IoutA输出满量程的电流输出20mA。IoutB输出的电流为0mA。具体的电流和DAC的数据的关系如下公式所示(红色方框圈出来的):
在这里插入图片描述
DAC CODE的值就对应14位数据的输入值(重点:14位无符号数据
Ioutfs的大小由参考电压和外部电阻决定。
在这里插入图片描述在这里插入图片描述
上图所示IREF=1.2V/1.92K=0.625mA,所以Ioutfs=32*0.625=20mA

输入14bit数据之后,产生互补的电流信号,还要经过运算放大器的转换
在这里插入图片描述
在这里插入图片描述

三、NCO IP设置(DDS)

在Quartus18.1 的IP Catalog搜索NCO
在这里插入图片描述
在这里插入图片描述
如果此处选择IP默认的选项,如下图所示
在这里插入图片描述
在全编译的时候,就会提示FPGA的存储资源不够用,如下图所示,存储器的资源使用率达到了433%
在这里插入图片描述
在这里插入图片描述
因为AD9767是双通道的,这里就可以设置成两个输出,其中一个是正弦信号一个是余弦信号。
在这里插入图片描述
NCO IP的第二页的设置如下所示。
在这里插入图片描述
其中工作时钟可以查看AD9767的数据手册得到
在这里插入图片描述
在这里插入图片描述
由上面两张图分析,AD9767最大支持的频率是142.857MHz(7ns)

四、工程代码

代码部分只由一个PLL IP和NCO IP组成

module top(
    input               clk         ,
    input               rst_n       ,
    //ad9767 ch1
    output              clk1        ,
    output              wrt1        ,
    output      [13:0]  dac_data1   ,
    //ad9767 ch2
    output              clk2        ,
    output              wrt2        ,
    output      [13:0]  dac_data2   
);

wire        clk_125m;
wire        pll_lock;
wire    [13:0]  dds_sin;
wire    [13:0]  dds_cos;
wire            dds_vld;

pll	pll_inst (
	.areset ( ~rst_n ),
	.inclk0 ( clk ),
	.c0 ( clk_125m ),
	.locked (pll_lock)
	);

assign clk1 = clk_125m;
assign wrt1 = clk_125m;
assign clk2 = clk_125m;
assign wrt2 = clk_125m;


	dds u0 (
		.clk       (clk_125m    ),  // clk.clk
		.reset_n   (pll_lock    ),  // rst.reset_n
		.clken     (pll_lock    ),  //  in.clken
		.phi_inc_i (524         ),  //    .phi_inc_i  32'd68719477
		.fsin_o    (dds_sin     ),  // out.fsin_o
		.fcos_o    (dds_cos     ),  //    .fcos_o
		.out_valid (dds_vld     )   //    .out_valid
	);


assign dac_data1 = {~dds_sin[13],dds_sin[12:0]};
assign dac_data2 = {~dds_cos[13],dds_cos[12:0]};


endmodule

dds IP核的phi_inc_i的输入为524,这个值是在配置NCO IP的时候,IP自动计算的相位增量。此处的计算公式可以自行查找NCO IP核的手册,以及DDS的工作原理。

还有一个问题是,在代码的最后为什么要对最高位取反呢?

assign dac_data1 = {~dds_sin[13],dds_sin[12:0]};
assign dac_data2 = {~dds_cos[13],dds_cos[12:0]};

这里是因为NCO IP输出的数据是按照原码输出的,最高位为1表示负数,为0表示正数。
我们在前面分析AD9767输出电流的时候分析过,14bit的值全为1的时候输出电流20mA,14bit全为0的时候输出-20mA的电流,分别对应最终的5V电压和-5V电压。
因此NCO 输出的原码与AD9767输出电流的关系就出错了,如果不对此做处理就会导致最终输出的波形出错。
在这里插入图片描述
最高位数据取反之后,波形就是正确的。
在这里插入图片描述

五、NCO仿真注意事项

使用联合仿真的时候,如果modelsim提示如下错误时。

Error: (vsim-3033) e:/project/ac620_prj/11_dds_dac_ad9767/prj/db/ip/dds/submodules/dds_nco_ii_0.v(328): Instantiation of ‘asj_xnqg’ failed. The design unit was not found.

在这里插入图片描述
需要在对NCO IP编译时选择生成仿真文件,并且将对应的.sip和.qip文件添加到工程文件中
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
添加完NCO的两个文件之后,仿真就能正常进行了

默认转换成波形显示是有符号的数据
在这里插入图片描述
可以将最终输出的dac_data1和dac_data2设置成无符号数(AD9767需要的是无符号数据)
在这里插入图片描述

  • 21
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值