【正点原子FPGA连载】第三十六章双路高速DA实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1
时间:2023-07-02 16:37:00
1)实验平台:正点原子新起点V2开发板
2)平台采购地址:https://detail.tmall.com/item.htm?id=609758951113
2)全套实验源码 手册 视频下载地址:http://www.openedv.com/thread-300792-1-1.html
3)正点原子FPGA感兴趣的同学可以加群讨论:99424016
4)关注正点原子微信官方账号,获取最新信息更新
第三十六章双路高速公路DA实验
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系列数模转换器具有高性能、低功耗的特点。PD5651E数模转换位数为10位,最大转换速度为125位MSPS(每秒采样百万次,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是3PD5651E10位输入数据和输入时钟,IOUTA和IOUTB为3PD5651E输出电流信号。由图 36.1.可以看出,数据是锁定在时钟的上升边缘的,所以我们可以在时钟的下降边缘发送数据,从而使数据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两个型号的模块为3PD5651E 的DA三PD5651E原理图如下图所示。
图 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程序设计
根据本章的实验任务,FPGA3需要连续输出正弦波形数据PD5651E如果通过编写代码,使用三角函数公式输出正弦波数据,程序设计将变得非常复杂。正弦波形数据一般存储在工程应用中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 <= 10'd0;
32 else if(freq_cnt == FREQ_ADJ)
33 freq_cnt <= 10'd0;
34 else
35 freq_cnt <= freq_cnt + 10'd1;
36 end
37
38 //读ROM地址
39 always @(posedge clk or negedge rst_n) begin
40 if(rst_n == 1'b0)
41 rd_addr <= 10'd0;
42 else begin
43 if(freq_cnt == FREQ_ADJ) begin
44 rd_addr <= rd_addr + 10'd1;
45 end
46 end
47 end
48
49 endmodule
在代码的第14行定义了一个参数FREQ_ADJ(频率调节),可以通过控制频率调节参数的大小来控制最终输出正弦波的频率大小,频率调节参数的值越小,正弦波频率越大。频率调节参数调节正弦波频率的方法是通过控制读ROM的速度实现的,频率调节参数越小,freq_cnt计数到频率调节参数值的时间越短,读ROM数据的速度越快,那么正弦波输出频率也就越高;反过来,频率调节参数越大,freq_cnt计数到频率调节参数值的时间越长,读ROM数据的速度越慢,那么正弦波输出频率也就越低。由于freq_cnt计数器的位宽为10位,计数范围是01023,所以频率调节参数FREQ_ADJ支持的调节范围是01023,可通过修改freq_cnt计数器的位宽来修改FREQ_ADJ支持的调节范围。
WaveToMem软件设置ROM深度为1024,倍频系数为1,而输入时钟为125Mhz,那么一个完整的正弦波周期长度为10248ns = 8192ns,当FREQ_ADJ的值为0时,即正弦波的最快输出频率为1s/8192ns(1s = 1000000000ns) ≈ 122.0Khz。当我们把FREQ_ADJ的值设置为5时,一个完整的正弦波周期长度为5120ns(5+1) =49152ns,频率约为20.35KHz。也可以在WaveToMem软件设置中增加倍频系数或者增加AD的驱动时钟来提高正弦波输出频率。
36.5下载验证
将双路高速DA模块插入新起点开发板的P6扩展口,连接时注意扩展口电源引脚方向和开发板电源引脚方向一致。
新起点开发板硬件连接实物图如下图所示:
图 36.5.1 新起点开发板硬件连接实物图
接下来我们将下载器一端连接电脑,另一端与开发板上对应端口连接,连接电源线并打开电源开关,将工程生成的sof文件下载到新起点开发板中后,然后使用示波器测量DA输出通道的波形。首先将示波器带夹子的一端连接到开发板的GND位置(可使用杜邦线连接至开发板上的任一的GND管脚),然后将另一端探针插入双路高速DA模块的DA通道中间的金属圆圈内(注意将红色的保护套拿掉),如图 36.5.2所示。
图 36.5.2 DA模拟电压测量孔位
此时观察示波器可以看到正弦波的波形,如果观察不到波形,可查看示波器设置是否正确,可以尝试按下示波器的“AUTO”,再次观察示波器波形。示波器的显示界面如下图所示:
图 36.5.3 示波器显示界面