FPGA学习-并行ADC与DAC

DDS与并行ADC、DAC 总任务: 用DDS合成信号,经过DAC输出,用ADC采集信号。 使用Signal TAP在时域观察信号 使用 Matlab 在频域观察信号   操作过程:   一.生成分频和倍频锁相环   创建一个Megafunction。此在tools/MegaWizard Plug- In Manager,默认选第一项,点Next。   (2)创建PLL。注意以下四点: 1.左侧... 阅读详情
AI摘要

本文介绍了如何使用FPGA连接并行ADC和DAC,包括接口协议、AD9280和AD9708的时序分析,以及在不同编码方式下进行数据转换的处理。通过实例代码展示了如何利用Quartus或Vivado的时钟管理IP实现接口驱动。

点击蓝字关注我们

关注、星标公众号,精彩内容每日送达
来源:网络素材

概述

ADC和DAC是FPGA与外部信号的接口,从数据接口类型的角度划分,有低速的串行接口和高速的并行接口。FPGA经常用来采集中高频信号,因此使用并行ADC和DAC居多。本文将介绍如何使用FPGA驱动并行ADC和并行DAC芯片。

并行接口包括两种数字编码方式:带符号数signed与无符号数unsigned。本文还将介绍使用不同编码方式的ADC与DAC时需要注意的问题。

接口协议

以ADI公司的32M、8位ADC芯片AD9280和125M、8位DAC芯片AD9708为例(这是淘宝上最容易买到的AD/DA模块)。

AD9280的时序图如下:

3d2658e05d9ed46d29e99945400fb4aa.jpeg

AD9708的时序图如下:

6d1e47aaf22d37d6a93693be4ca18a84.jpeg

由时序图可知,AD9280在每个输入clock的上升沿对输入的模拟信号做一次采集,采集数据由数据总线data输出;AD9708也是在每个输入clock的上升沿读取数据总线DB0-DB7上的数据,将其转换为相应的电流IOUTA/IOUTB输出。

这两个芯片的管脚虽然很多,但大多数都是与硬件设计有关。其实几乎所有的并行ADC和并行DAC与FPGA之间的接口只有一条时钟线与一组数据总线,数据总线的位宽即为ADC/DAC的位数。每个时钟周期ADC都会完成一次采集(DAC完成一次输出),因此时钟频率也就是ADC和DAC的采样频率。

FPGA设计

并行ADC和DAC的接口时序驱动非常简单,只要利用Quartus或Vivado自带的时钟管理IP核生成预期采样频率的时钟信号,驱动时钟线,从数据总线上读出或写入数据即可。

比如下面的代码实现了将ADC采集到的数据再通过DAC输出:

`timescale 1ns / 1ps

//-----------------------------------------------

// 将ADC采集到的数据通过DAC输出

//-----------------------------------------------

module adda_test

(

    input clk, 

    output daclk,

    output [7:0] dadata,       //DA data

    output adclk,

    input [7:0] addata        //AD data

);

PLL PLL_inst

(

    .clk_in1(clk),         // IN

    // Clock out ports

    .clk_out1(adclk),     // OUT 32Mhz

    .clk_out2(daclk),     // OUT 32Mhz

    // Status and control signals

    .reset(1'b0),          // IN

    .locked()

);      

assign dadata = addata;  

endmodule

上述代码中实例化了一个PLL IP核产生ADC和DAC所需频率的时钟,Quartus中该IP核叫做“PLL”,Vivado中该IP核叫做“Clocking Wizard”。

为了保证DAC输出与ADC采集到的信号相同,将两者时钟频率设置相同,且连接二者的数据总线。上述代码可以使用开发板和AD/DA模块进行实际测试。

编码方式问题

上文用到的AD9280和AD9708都是无符号数编码,而我们知道无论是Vivado还是Quartus中大多数的IP核采用的都是带符号数二进制补码的编码方式(二进制原码、补码;有符号数、无符号数的问题可参考https://blog.youkuaiyun.com/fpgadesigner/article/details/80512067 ),这就导致ADC/DAC的数据总线不能与IP核接口直接对接,必须做一定的转换处理。

考虑到上述数字系统的特点,市场上也存在不少以带符号数二进制补码接口的ADC/DAC,比如65M、12位ADC芯片AD9226。如果使用这种编码方式的芯片,数据总线就可以直接与IP核接口对接,不需要做特殊处理。

但是,我们总会不可避免的遇到类似这样的情况:

  1. ADC或DAC是无符号数编码,而设计中需要使用一些带符号数接口的IP核;

  2. ADC是带符号数编码,而设计中仅需获取测量值,并不需要与其它带符号数接口的模块对接。

当遇到情况1时,需要进行无符号数编码与带符号数编码之间的转换。将ADC采集到的8位无符号数转换为带符号数补码形式的代码如下:

/**** 将addata转化为带符号二进制补码形式 ****/

    reg [7:0] ad_data;

    always @ (posedge clk or negedge rst_n)

        if (!rst_n)  ad_data <= 8'd0;

        else ad_data <= addata - 128;    //AD9280采集输入

将带符号数补码转换为8位无符号数通过DAC输出的代码如下:

   /**** 将dadata转化为无符号数形式 ****/

    reg [7:0] da_data;

    always @ (posedge clk or negedge rst_n)

        if (!rst_n)  da_data <= 8'd0;

        else da_data <= dadata + 128;    //AD9708输出

当遇到情况2时,需要将不易直接观察的带符号数补码形式转换为带符号数原码形式,使其更加直观。代码如下:

always @(posedge ad_clk)                          //AD9226采集

    if(ad_ch1[11]==1'b1) begin                     //如果是负电压

        ch1_reg<=12'hfff - ad_ch1 + 1'b1;

         ch1_sig <= 45;                                //'-' asic码

     end

     else begin

       ch1_reg<=ad_ch1;

         ch1_sig<=43;                                //'-' asic码

     end

转换的依据是一个简单的运算关系:“补码的整数值”+“原码绝对值的整数值”=2^B,B为位宽。比如带符号数原码1110的补码为1010:1110取绝对值0110为6;1010为10,二者加起来为2^4=16。

上述代码便是利用了这个运算关系。为了节省位宽,先用12’hfff减掉补码,再加1,达到同样的效果,得到带符号数原码的绝对值。根据符号位便可以知道这个原码的正负情况。

5e29a9488d9ca52d5c7530bbf3d22f47.jpeg

想要了解FPGA吗?这里有实例分享,ZYNQ设计,关注我们的公众号,探索

adc电路fpga csdn_[走近FPGA]之开发板介绍篇 开发板概述在走近FPGA预告篇中,我们已经提到了系列文章使用的开发平台,硬木课堂Xilinx Artix 7 FPGA板,如下图所示。它使用的FPGA芯片型号为Xilinx Artix-7 XC7A75T,具有电平开关、LED、矩阵键盘、数码管等基本外设,同时还有高速ADC/DAC,音频Codec,SD卡,32位DDR3L(共1GB)外设用于SoC设计的进阶实验,另外,上方的I/O插槽可以直接插入... 阅读详情

相关推荐

9.8日fpga之DA/AD的学习

ADDA

liufulim的博客 3755

解析高速ADC和DAC与FPGA的配合使用

许多数字处理系统都会使用FPGA,原因是FPGA有大量的专用DSP以及block RAM资源,可以用于实现并行和流水线算法。因此,通常情况下,FPGA都要和高性能的ADC和DAC进行接口,比如e2v EV10AQ190低功耗四通道10-bit 1.25 Gsps ADC和EV12DS130A内建4/2:1 MUX的低功耗12-bit 3 Gsps DAC。 通常情况下,这些转换器的采样率都达到了GHz的级别。对工程师团队来说,除了混合信号电路板布局之外,理解和使用这些高性能的设备也是一个挑战。     这些e2v数据转换器具有带宽宽、性能好的特点—数据手册上通常称为模拟全功率带宽—即使是

FPGA 20个例程篇:20.USB2.0/RS232/LAN控制并行DAC输出任意频率正弦波、梯形波、三角波、方波(一)

如图7所示是数字变频的累加器步长和频率关系示意图,在简单地介绍完累加器步长和地址间映射后,就涉及到第三个知识点即频率分辨率了,那么在数字变频的过程中频率分辨率又是怎么计算出来的呢,对于分辨率相信大家也耳熟能详,比如现实生活中的显示屏有各种各样的分辨率如1920*1080、1024*768、640*480等,显然分辨率越高精确度越大,对于数字变频中其实也存在相似的说法,比如设定的精度理论上可以达到小数点前两位、前一位还是后一位、后两位、后三位等,而这个最小分辨率实际上参考时钟fclk与频率累加器位宽的比值。

wandou0511的博客 5460

FPGA 20个例程篇:4.串行DAC输出模拟电压控制LED亮度

二、常用通信协议,摸索探究: 4.串行DAC输出模拟电压控制LED亮度 首先在此表示抱歉,笔者因为最近杂七杂八的事情比较多,搞得整个人莫名其妙地忙起来,所以博客更新的相对缓慢些,期间也有朋友私信我催更,表示在等着新例程学习呢,打开优快云 APP看到这些留言心里有一丝欣慰。 之前的承诺20个FPGA例程精讲精析,笔者会尽最大可能保持每周一个的速度持续更新,因为编写和整理代码会消耗不少的时间,后续例程的代码也会慢慢复杂起来,下班回来要做饭和陪女友,另外还要持续地学习工作方面.........

wandou0511的博客 1万+

基于FPGA的ADC和DAC设计及嵌入式应用

综上所述,基于FPGA的ADC和DAC设计在嵌入式系统中具有重要的应用意义。本文提供了基于SAR ADC和R-2R网络型DAC的FPGA设计示例,并介绍了它们在信号处理、音频处理和图像显示等领域中的应用。通过合理的设计与应用,我们可以充分发挥FPGA在高速数据采集与处理中的优势,拓展嵌入式系统的功能和性能。本文将探讨基于FPGA的ADC和DAC设计以及它们在嵌入式系统中的应用,并提供相应的源代码。在嵌入式系统中,基于FPGA的DAC设计具有广泛的应用场景。ADC是指将连续的模拟信号转换为数字信号的设备。

WangWEel的博客 998

RGMII接口--->(001)FPGA实现RGMII接口(一)

(a)FPGA(Field Programmable Gate Array)是在PAL (可编程阵列逻辑)、GAL(通用阵列逻辑)等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。(b)FPGA工程师就业应用于通信、航空航天、汽车电子,还是人工智能、物联网等新兴领域。

2401_84405631的博客 1147

FPGA DAC模块 SPI通信

1.串行外设接口(SPI)是微控制器和外围IC(如传感器、ADC、DAC、移位寄存器、SRAM等)之间使用最广泛的接口之一。2.SPI是一种同步、全双工、主从式接口。来自主机或从机的数据在时钟上升沿或下降沿同步。主机和从机可以同时传输数据。SPI接口可以是3线式或4线式。DAC8830是TI的TI一款DAC芯片,他支持16bit数据输入,同时建立时间为1us,支持标准的3线SPI接口,最快可支持50Mhz。以下是接口定义。

qq_42565324的博客 5533

FPGA实战:AD9708+AD9280 ADDA回环与VGA波形显示

在数字信号处理与嵌入式系统开发中,模拟信号与数字信号的相互转换是连接物理世界与计算系统的关键桥梁。ADC负责将连续模拟量采样量化,DAC则重建波形,而FPGA凭借并行处理能力常被用作高速数据通路的核心控制器。然而,实际工程中AD/DA接口的时序对齐往往决定系统成败——时钟相位偏移、PCB走线延迟、建立保持时间不足都会引发数据错位或毛刺。通过PLL相移、set_input/output_delay约束、双口RAM乒乓缓存等常用设计手段,可以稳健地实现跨时钟域数据搬运。结合VGA显示与DDS波形发生器,还能构建

weixin_32349093的博客 121

【FPGA学习】4-DDS与并行ADC、DAC

• 修改代码完成以下任务 • 把DDS的rom改成16比特,高12位送给DAC • 不要忘记缩放DAC的输出缩放 • 生成不同频率的正弦波 – 仍然保持80MHz的DAC时钟速率 – 用3比特的拨码开关设定输出正弦波频率 – 000~ 0.5MHz、001 ~ 1MHz 、010 ~ 1.5MHz、011 ~ 2MHz – 100~ 2.5MHz、101 ~ 3.5MHz、110 ~ 4.5MHz、111 ~ 5.5MHz • 使用20...

sumshine_的博客 3294

ZYNQ7035实现高速ADC和DAC驱动【FPGA Vivado实现】

随着数字信号处理技术的快速发展,高效处理高速数据流的需求日益增加,ZYNQ7035提供了一种将高性能可编程逻辑(PL)与强大的处理系统(PS)相结合的解决方案。高速ADC/DAC的应用场合非常广泛,包括但不限于无线通信、数据采集系统、视频处理和测试测量设备等。实现ZYNQ7035与高速ADC/DAC的驱动,需要深入了解硬件的电气特性,掌握数据流的管理与控制,以及信号处理流程的优化。本章将概述ZYNQ7035平台的架构,介绍高速ADC/DAC的工作原理和实现驱动的总体思路。

weixin_35266799的博客 1344

FPGA控制ADC/DAC的Verilog设计与实战:从采样到波形生成

在数字信号处理与高速数据采集领域,FPGA凭借并行流水线架构和纳秒级时序控制能力,成为连接ADC与DAC的关键桥梁。通过Verilog硬件描述语言,设计者可以自定义采样状态机、跨时钟域数据缓冲以及波形发生逻辑,从而突破单片机在多通道同步采样和低抖动输出上的性能瓶颈。针对ADC捕获与DAC重建过程中的数据完整性,异步FIFO与格雷码指针机制能有效解决跨时钟域亚稳态问题;而参数化的模块设计则大幅提升了代码复用率,覆盖SPI、并行及高速串行接口的多种应用场景。本文围绕FPGA与ADC/DAC的联调实践,梳理了从状

weixin_34218890的博客 433

FPGA 30 综合数字ADC /DAC 信号发送采集系统设计(综合项目设计)

FPGA 30 综合数字ADC /DAC 信号发送采集系统设计 模块名称 : 综合数字ADC /DAC 信号发送采集系统设计 主要功能 :本实验设计了一个信号发送和采集系统的设计,在整个系统中,基于原先学习的key_filter 按键滤波模块,adc_12s022 模数转换驱动模块,dac_tlv5618 数模转换驱动模块,DAC_rom_siganl 信号rom存储器控制器模块,FIFO模块、FIFO_send_ctrl FIFO发送控制模块和uart_tx 串口发送模块构成了整个综合的实验系统。 .

lj1986817902的博客 3599

FPGA Verilog ADC/DAC设计详解:从接口时序到板上调试实战

模拟与数字世界的桥梁,离不开ADC与DAC的精确配合。FPGA凭借并行处理能力,成为高速数据采集与波形生成的核心器件,而Verilog硬件描述语言则赋予了工程师对接口时序的完全控制,从SPI串行采样到并行高速转换,再到R-2R电阻网络,均可在逻辑层精准实现。数字滤波技术如滑动窗口平均、CIC抽取与中值滤波,则进一步提升了信号质量,保障了不同应用场景下的精度需求。在工业控制、信号发生器、软件无线电等领域,成熟的ADC/DAC链路设计往往决定系统性能上限。围绕FPGA ADC/DAC的工程实践,详细解析接口时序

weixin_34189116的博客 387

基于QuartusII9.1的ADC和DAC控制仿真设计

在设计程序的过程中,由于ADC0832和DAC0832工作时序的特殊性,要以有限状态机的形式设计程序,在自己分析设计状态转换的过程中,将状态转换的程序设计和时序电路的状态转换联系了起来。而编程的过程中,由于对硬件语言的理解不到位,用高级语言的思维去理解时导致了一些问题,在解决问题的过程中加深了对程序设计底层实现的理解。从速度方面看,ADC0832工作频率为250KHZ,而DAC0832的转换时间约为1us,即DAC0832的转换速度远快与DAC0832,因此可使用250KHZ的时钟源作为两者共同的时钟源。

毕业作品网站 2117

基于FPGA的AD7616与DAC8820模块化设计与实现

AD_DA_CTL项目旨在构建一个基于FPGA的模数(AD)与数模(DA)转换控制系统,实现对模拟信号的高精度采集与还原。随着工业自动化、智能仪器与通信系统对数据采集与处理实时性要求的不断提升,传统的微控制器方案已难以满足高速、高精度、低延迟的需求。FPGA凭借其并行处理能力和灵活的硬件可编程特性,成为实现AD/DA控制的理想平台。本项目通过集成AD7616与DAC8820芯片,结合Verilog HDL语言开发驱动逻辑,实现对模拟信号的高效转换与处理。

weixin_42613018的博客 993

Cyclone10 FPGA读8位ADC芯片AD9280以太网数据传输例程Verilog源码Quartus17.1工程文件+文档

Cyclone10 FPGA读8位ADC芯片AD9280以太网数据传输例程Verilog源码Quartus17.1工程文件+文档资料,FPGA为CYCLONE10LP系列中的10CL025YU256C8. 完整的Quartus工程文件,可以做为你的学习设计参考。 module ad9280_sample ( input adc_clk, input rst, input [7:0] adc_data, output reg adc_buf_wr, output [15:0] adc_buf_data, input [31:0] sample_len, input ad_sample_req, output reg ad_sample_ack, input write_req_ack, output reg write_req ); //`define TRIGGER localparam S_IDLE = 0; localparam S_REQ = 1; localparam S_ACK_WAIT = 2; localparam S_SAMPLE = 3; localparam S_WAIT = 4; reg signed[15:0] adc_data_wide; reg signed[15:0] adc_data_wide_d0; reg [31:0] sample_cnt; reg [31:0] wait_cnt; reg signed[7:0] adc_data_signed ; reg ad_sample_req_d0 ; reg ad_sample_req_d1 ; reg ad_sample_req_d2 ; reg[2:0] state; assign adc_buf_data = adc_data_wide_d0; always@(posedge adc_clk or posedge rst) begin if(rst == 1'b1) adc_data_signed <= 8'd0; else adc_data_signed <= adc_data[7:0] - 8'd128 ; end always@(posedge adc_clk or posedge rst) begin if(rst == 1'b1) adc_data_wide <= 16'd0; else adc_data_wide <= {{8{adc_data_signed[7]}}, adc_data_signed[7:0]}; end always@(posedge adc_clk or posedge rst) begin if(rst == 1'b1) adc_data_wide_d0 <= 16'd0; else adc_data_wide_d0 <= adc_data_wide; end always @(posedge adc_clk or posedge rst) begin if (rs

FPGA实战指南:基于SPI接口的ADC/DAC数据采集传输系统设计

本文详细介绍了基于FPGA和SPI接口构建ADC/DAC数据采集传输系统的完整设计流程。针对高速、连续、不丢包的数据采集需求,阐述了FPGA并行处理相较于单片机的优势,并解析了SPI协议与ADC128S052、TLV5618等核心芯片的驱动实现。文章重点探讨了利用FIFO缓冲解决采集与传输速度矛盾的系统集成方案,并提供了硬件选型、调试技巧及PC端交互的实用指南。

zzz56的博客 141

《Kubernetes部署篇:基于x86_64+aarch64架构CPU+containerd一键离线部署容器版K8S1.33.3高可用集群》

《Kubernetes部署篇:基于x86_64+aarch64架构CPU+containerd一键离线部署容器版K8S1.33.3高可用集群》

东城绝神 1368
上一篇: 如何使用AXI Bridge IP 发送MSI中断
下一篇: 搞嵌入式硬件开发,工程师都有哪些独门绝学?
Hack电子
博客等级 码龄5年 1493粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值