1)实验平台:正点原子新起点V2开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113 2)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-300792-1-1.html 3)对正点原子FPGA感兴趣的同学可以加群讨论:994244016 4)关注正点原子公众号,获取最新资料更新
DAC(Digital to Analog Converter,即数模转换器)是大多数系统中必不可少的组成部件,用于将离散的数字信号转换成连续的模拟信号,它们是连接模电电路和数字电路必不可少的桥梁。在很多场合下, DAC的转换速度甚至直接决定了整个系统的运行速度。本章我们将使用高速DA芯片实现数模转换,产生正弦波模拟电压信号。 本章包括以下几个部分: 3535.1简介 35.2实验任务 35.3硬件设计 35.4程序设计 35.5下载验证 36.1简介 本章我们使用的双路DA模块是正点原子推出的一款双路高速数模转换模块(ATK_DUAL_HS_DA),高速DA转换芯片是由思瑞浦公司生产的3PD5651E芯片。 ATK_HS_AD_DA模块的硬件结构图如下图所示。
图 36.1.1 ATK_DUAL_HS_DA模块硬件结构图 由上可知,3PD5651E芯片输出的是一对差分电流信号,为了防止受到噪声干扰,电路中接入了低通滤波器,然后通过高性能和高带宽的运放电路,实现差分变单端以及幅度调节等功能,使整个电路性能得到了最大限度的提升,最终输出的模拟电压范围是-5V~+5V。 下面来介绍下这款芯片。 3PD5651E是3PEAK公司(思瑞浦微电子科技股份有限公司)生产的DAC系列数模转换器,具有高性能、低功耗的特点。3PD5651E的数模转换位数为10位,最大转换速度为125MSPS(每秒采样百万次,Million Samples per Second)。 3PD5651E的内部功能框图如下图所示:
图 36.1.2 内部功能框图 3PD5651E在时钟(CLOCK)的驱动下工作,内部集成了+1.1V参考电压(+1.10V REF)、运算放大器、电流源(CURRENT SOURCE ARRAY)和锁存器(LATCHES)。两个电流输出端IOUTA和IOUTB为一对差分电流,当输入数据为0(DB9DB0=10’h000)时,IOUTA的输出电流为0,而IOUTB的输出电流达到最大,最大值的大小跟参考电压有关;当输入数据全为高点平(DB9DB0=10’h3ff)时,IOUTA的输出电流达到最大,最大值的大小跟参考电压有关,而IOUTB的输出电流为0。 3PD5651E必须在时钟的驱动下才能把数据写入片内的锁存器中,其触发方式为上升沿触发,3PD5651E的时序图如下图所示:
图 36.1.3 芯片时序图
图 36.1.4 FPGA内部时序 如图 36.1.3中的DBO-DB9和CLOCK是3PD5651E的10位输入数据和为输入时钟,IOUTA和IOUTB为3PD5651E输出的电流信号。由图 36.1.3可知,数据在时钟的上升沿锁存,因此我们可以在时钟的下降沿发送数据,这样使DA芯片在数据的中央采样,保证数据采样的准确性,如图 36.1.4所示。需要注意的是,CLOCK的时钟频率越快,3PD5651E的数模转换速度越快,3PD5651E的时钟频率最快为125Mhz。 IOUTA和IOUTB为3PD5651E输出的一对差分电流信号,通过外部电路低通滤波器与运放电路输出模拟电压信号,电压范围是-5V至+5V之间。当输入数据等于0时,3PD5651E输出的电压值为5V;当输入数据等于10’h3ff时,3PD5651E输出的电压值为-5V。 3PD5651E是一款数字信号转模拟信号的器件,内部没有集成DDS(Direct Digital Synthesizer,直接数字式频率合成器)的功能,但是可以通过控制3PD5651E的输入数据,使其模拟DDS的功能。例如,我们使用3PD5651E输出一个正弦波模拟电压信号,那么我们只需要将3PD5651E的输入数据按照正弦波的波形变化即可,下图为3PD5651E的输入数据和输出电压值按照正弦波变化的波形图。
图 36.1.5 3PD5651E正弦波数据(左)、电压值(右) 由上图可知,数据在0至1023之间按照正弦波的波形变化,最终得到的电压也会按照正弦波波形变化,当输入数据重复按照正弦波的波形数据变化时,那么3PD5651E就可以持续不断的输出正弦波的模拟电压波形。需要注意的是,最终得到的3PD5651E的输出电压变化范围由其外部电路决定的,当输入数据为0时,3PD5651E输出+5V的电压;当输入数据为1023时,3PD5651E输出-5V的电压。 由此可以看出,只要输入的数据控制的得当,3PD5651E可以输出任意波形的模拟电压信号,包括正弦波、方波、锯齿波、三角波等波形。 36.2实验任务 本节实验任务是使用新起点开发板及双路高速DA扩展模块(ATK_DUAL_HS_DA模块)实现数模转换。首先利用FPGA产生正弦波变化的数字信号,经过DA芯片后转换成模拟信号,然后通过示波器观察模拟信号的波形是否按照正弦波波形变化。 36.3硬件设计 ATK_DUAL_HS_DA模块由2个型号为3PD5651E 的DA转换芯片组成。3PD5651E的原理图如下图所示。 图 36.3.1 芯片原理图 由上图可知,3PD5651E输出的一对差分电流信号先经过滤波器,再经过运放电路得到一个单端的模拟电压信号。图中右侧的RP1为滑动变阻器,可以调节输出的电压范围,推荐通过调节滑动变阻器,使输出的电压范围在-5V至+5V之间,从而达到DA转换芯片的最大转换范围。 ATK_DUAL_HS_DA模块的实物图如下图所示。
图 36.3.2 ATK_DUAL_HS_DA模块实物图 本实验中,各端口信号的管脚分配如下表所示。 表格 36.3.1 双路高速DA转换实验管脚分配
36.4程序设计 根据本章的实验任务,FPGA需要连续输出正弦波波形的数据,才能使3PD5651E连续输出正弦波波形的模拟电压,如果通过编写代码使用三角函数公式运算的方式输出正弦波数据,那么程序设计会变得非常复杂。在工程应用中,一般将正弦波波形数据存储在RAM或者ROM中,由于本次实验并不需要写数据到RAM中,因此我们将正弦波波形数据存储在只读的ROM中,直接读取ROM中的数据发送给DA转换芯片即可。 图 36.4.1是根据本章实验任务画出的系统框图。ROM里面事先存储好了正弦波波形的数据,DA数据发送模块从ROM中读取数据,将数据和时钟送到3PD5651E芯片的输入数据端口和输入时钟端口。 双路高速DA实验的系统框图如图 36.4.1所示:
图 36.4.1 双路高速DA系统框图 顶层模块的原理图如下图所示:
图 36.4.2 顶层模块原理图 FPGA顶层模块(hs_dual_da)例化了以下三个模块:DA数据发送模块(da_wave_send)、ROM波形存储模块(rom_1024x10b)和时钟模块(clk_wiz_0)。 DA数据发送模块(da_wave_send):DA数据发送模块输出读ROM地址,将输入的ROM数据发送至DA转换芯片的数据端口。 ROM波形存储模块(rom_1024x10b):ROM波形存储模块由Vivado软件自带的Block Memory Generator IP核实现,其存储的波形数据可以使用波形转存储文件的上位机来生成.coe文件。 顶层模块的代码如下:
1 module hs_dual_da(
2 input sys_clk , //系统时钟
3 input sys_rst_n , //系统复位,低电平有效
4 //DA芯片接口
5 output da_clk , //DA驱动时钟,最大支持125Mhz时钟
6 output [9:0] da_data , //输出给DA的数据
7
8 //DA芯片接口
9 output da_clk1 , //DA驱动时钟,最大支持125Mhz时钟
10 output [9:0] da_data1 //输出给DA的数据
11 );
12
13 //wire define
14 wire [9:0] rd_addr; //ROM读地址
15 wire [9:0] rd_data; //ROM读出的数据
16 //*****************************************************
17 //** main code
18 //*****************************************************
19
20 assign da_clk1 = da_clk;
21 assign da_data1 = da_data;
22
23 pll u_pll(
24 .inclk0 (sys_clk),
25 .c0 (clk));
26
27 //DA数据发送
28 da_wave_send u_da_wave_send(
29 .clk (clk),
30 .rst_n (sys_rst_n),
31 .rd_data (rd_data),
32 .rd_addr (rd_addr),
33 .da_clk (da_clk),
34 .da_data (da_data)
35 );
36
37 //ROM存储波形
38 rom_1024x10b u_rom_1024x10b(
39 .address (rd_addr),
40 .clock (clk),
41 .q (rd_data)
42 );
43
44 endmodule
在代码的第23至25行例化了时钟模块,倍频出125M时钟给DA芯片采样用。 DA数据发送模块输出的读ROM地址(rd_addr)连接至ROM模块的地址输入端,ROM模块输出的数据(rd_data)连接至DA数据发送模块的数据输入端,从而完成了从ROM中读取数据的功能。 在代码的第38至42行例化了ROM模块,由ROM IP核配置生成。在“高速ADDA试验”中已经讲解过rom的初始化,这里不再讲解。 DA数据发送模块的代码如下:
1 module da_wave_send(
2 input clk , //时钟
3 input rst_n , //复位信号,低电平有效
4
5 input [9:0] rd_data , //ROM读出的数据
6 output reg [9:0] rd_addr , //读ROM地址
7 //DA芯片接口
8 output da_clk , //DA驱动时钟,最大支持125Mhz时钟
9 output [9:0] da_data //输出给DA的数据
10 );
11
12 //parameter
13 //频率调节控制
14 parameter FREQ_ADJ = 10'd0; //频率调节,FREQ_ADJ的越大,最终输出的频率越低,范围0~255
15
16 //reg define
17 reg [9:0] freq_cnt ; //频率调节计数器
18
19 //*****************************************************
20 //** main code
21 //*****************************************************
22
23 //数据rd_data是在clk的上升沿更新的,所以DA芯片在clk的下降沿锁存数据是稳定的时刻
24 //而DA实际上在da_clk的上升沿锁存数据,所以时钟取反,这样clk的下降沿相当于da_clk的上升沿
25 assign da_clk = clk;
26 assign da_data = rd_data; //将读到的ROM数据赋值给DA数据端口
27
28 //频率调节计数器
29 always @(posedge clk or negedge rst_n) begin
30 if(rst_n == 1'b0)
31 freq_cnt
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?