xzkzj123456 / AD_DA

集创赛校赛初赛作品

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

AD_DA

集创赛校赛初赛作品

系统功能简介

本系统利用FPGA制作一个波形产生、采集、显示装置。FPGA通过DA转换产生模拟信号的正弦波、三角波与锯齿波,同时,FPGA对输出的模拟信号进行 采集,并且可以将采集到的波形数据通过显示器显示出来。在显示器上可以通过时间栅格直接判断出波形的频率。

系统框架及硬件介绍

系统框架

本系统主要功能部件包括存储波形数据的片上ROM,AD/DA转换模块,高速缓冲的异步FIFO,800*480分辨率的RGBLCD显示屏。系统框图见图2.1。 为了产生波形,可以提前将波形数据以数字量存储在ROM里面,然后FPGA直接将数据读出输出到外接DA转换模块,DA转换芯片将采集到的数字量转化 为模拟量进行输出。ROM里面的波形数据由波形软件产生.coe文件,vivado中的ROMIP核可以直接将.coe文件包含进来,然后自动写入提前设定好的 ROM中。 采集模拟信号直接将DA输出端口和AD输入端口用杜邦线连接起来,模拟信号便可以直接进入AD模块,AD芯片将模拟信号转换为数字信号然后传送给 FPGA。FPGA将数据写入到FIFO中暂存。 LCD从FIFO中读取数据进行帧显示,然后再加上一些时间栅格,从而可以判断出波形的频率。

硬件介绍

FPGA

本系统采用的FPGA是xilinx7系列的ZYNQ7010,核心板型号为XC7Z010CLG400-1。它组合了一个双核 ARM Cortex-A9 处理器和一个的现场可编程门 阵列 (FPGA)逻辑部件。其板上具有一个RGBLCD接口和两个分别为202pin和122pin外部扩展接口,可以满足我们的LCD和用外部扩展接口连接的 AD/DA模块。

ROM

ROM为只读存储器,FPGA中没有专门的ROM硬件资源,一般是通过将RAM赋予初值并保持该初值。在本系统板上的BRAM 存储资源为 2.1Mbit。ROMIP 核使用BRAM进行配置成ROM,大小为256*8bit,进行存储.coe文件中的波形数据。

AD/DA模块

使用的 AD-DA 模块是正点原子推出的一款高速模数-数模转换模块(ATK_HS_AD_DA),高 速 AD 转换芯片和高速 DA 转换芯片都是由 ADI 公司 生产的,分别是 AD9280/3PA9280(两款芯片兼容)和 AD9708。

AD9708 芯片输出的是一对差分电流信号,为了防止受到噪声干扰,电路中接入了低通滤波 器,然后通过高性能和高带宽的运放电路,实现差分变单 端以及幅度调节等功能,使整个电路性能得到了 最大限度的提升,最终输出的模拟电压范围是-5V~+5V。 AD9280 芯片的输入模拟电压转换范围是 0V2V,所以电压输入端需要先经过电压衰减电路,使输入 的-5V+5V 之间的电压衰减到 0V~2V 之间,然后经过 AD9280 芯片将模拟电压信号转 换成数字信号。AD 转换芯片支持的最大时钟频率为 32Mhz。

FIFO

FIFO 的英文全称是 First In First Out,即先进先出。FPGA 使用的 FIFO 一般指的是对数据的存储具有先 进先出特性的一个缓存器,常被用于 数据的缓存,或者高速异步数据的交互也即所谓的跨时钟域信号传递。 它与 FPGA 内部的 RAM 和 ROM 的区别是没有外部读写地址线,采取顺序写入 数据,顺序读出数据的方式, 使用起来简单方便。 根据 FIFO 工作的时钟域,可以将 FIFO 分为同步 FIFO 和异步 FIFO。同步 FIFO 是指读时钟和写时钟 为同一个时钟,在时钟沿来临时同时发生 读写操作。异步 FIFO 是指读写时钟不一致,读写时钟是互相独立 的。Xilinx 的 FIFO IP 核可以被配置为同步 FIFO 或异步 FIFO。FPGA中的 FIFO基于BRAM块达到缓存需求。本系统配置的是异步FIFO,即跨时钟域的读写。

RGBLCD

TFT-LCD 的全称是 Thin Film Transistor-Liquid Crystal Display,即薄膜晶体管液晶显示屏,它显示的每 个像素点都是由集成在液晶后面 的薄膜晶体管独立驱动,因此 TFT-LCD 具有较高的响应速度以及较好的图 像质量。 本系统采用的是ATK-4384(4.3 寸, 800*480分辨率),七根信号线如图2.2.5。

软件设计

软件开发平台为vivado,创建工程后将顶层模块命名为hs_ad_da,然后再相继创建几个所需的模块:波形产生da_wave_send、波形采集ad_wave_rec、写FIFO fifo_wr、读FIFO fifo_rd、LCD器件配置ID信息rd_id、LCD时钟分频模块clk_div、LCD显示lcd_display、LCD驱动lcd_driver。

另外,还需要配置两个IP。配置ROMIP核:将memory type配置为单端口RAM,宽度选择8bit,深度选择256。然后导入COE FILE,也就是波形文件。配置FIFO IP核:将fifo implementation(实现方式)选择为独立的BRAM块,读写宽度选择为8bit,深度选择为1024。

DA模块转换的时钟是系统时钟50MHZ,周期就是20ns,这里降低了读ROM的时钟,每6个时钟才读取一次ROM的数据,所以正弦波模拟量输出的周期为 T= 256×20×6 (3.1) AD转换时钟为25MHZ,然后FIFO的写时钟相应的也为25MHZ。那么一个周期可以转换的数字量为 data_cnt=T ÷40 ns=768 (3.2) LCD的分辨率是800*480,波形显示直接截取其中横像素坐标在768以下,纵坐标在100-355之间的部分,纵坐标共可以有256种数据,正好可以对应波形的八位数据0 – 256。每个横坐标对应一个波形数据,如果相应的纵坐标等于相应波形数据,那么使LCD中该像素显示绿色,其他地方显示黑色。除此之外,在边界区域用蓝色框起来,栅格用白色竖直线条勾勒显现出来。

为了LCD能显示大于一个周期的波形便于观察,可以将FIFO的时钟设置为50MHZ,而LCD的像素时钟为25MHZ,那么在25MHZ的时钟域下将FIFO读出的数据赋值给一个二维数组: reg [7:0] lcd_data[1023:0] (3.3) 就会隔一个波形数据才赋值一次,相当于将波形数据进行压缩了,但是最终呈现的波形规律依旧不变,而可以显示2个周期的波形。 既然显示了2个周期,那个中间六条白色栅格线所分隔形成的八个栅格,每个栅格代表的时间为: t_div=T ÷4=7680ns (3.4) 我们可以根据这个数字判断出波形的频率。 在本系统中,像素时钟为25MHZ,FIFO的读写时钟分别为50MHZ,25MHZ,没办法做到对完整连续波形的实时显示,所以只能采集一段再显示,显示若干帧之后再进行采集显示。这样可以保证显示波形的稳定和连续。

实物结果展示

总结与规划

之前学过STM32单片机,看到这个题目的时候觉得并不复杂,步骤挺简单的,然而,作为一个FPGA初学者来说用FPGA、verilog、vivado等等新工具 去实现这样一个系统却并不容易,需要学习verilog语法、vivado的使用方法、FPGA中各种陌生的名词概念,调试分析也是每一个做比赛的人无比煎 熬的一环,虽然学的并不是很深很精,甚至很多东西仍然不知道不理解,但是好在我坚持了下来,将难题在各种苦寻搜索中大都解决了。本系统很多 地方我觉得还有改进、进一步完善的空间,但是碍于精力和能力,没有去进一步考虑。比如是否可以将三种波形文件同时存储起来,利用按键控制直 接切换,而不必每次都重新下载;fifo的读写时钟是否可以再快一点提高速度。目前这个结果我觉得已经让我很满意了,希望自己再之后的学习中进 步更大。

About

集创赛校赛初赛作品