AD7606 以太网采集传输 FPGA 设计 Verilog Vivado VHDL

名称:AD7606 以太网采集传输 FPGA 设计 Verilog Vivado VHDL

软件:Vivado

语言:VHDL

功能介绍

本设计面向 AD7606 多通道并行 ADC 数据采集与以太网传输应用,顶层模块完成 AD7606 控制、采样数据读取、DDR3 数据缓存以及 RGMII 以太网 PHY 通信接口连接。系统通过 FPGA 控制 AD7606 的复位、片选、读信号和转换启动信号,接收 16 位并行采样数据,并配合 busy、first_data 等状态信号完成采样时序管理。 采集到的数据进入内部读写控制链路后,可通过 DDR3 作为外部缓存进行突发读写,适合连续数据采集、缓存转发等场景。工程中包含 DDR3 MIG 相关接口信号与 AXI 主控访问逻辑,顶层参数定义了外部存储用户接口数据宽度、地址宽度和突发长度,便于围绕采样缓存深度和传输节奏进行二次开发。 以太网部分采用 GMII/RGMII 相关接口设计,包含 MAC、ARP、IP、UDP、ICMP 等模块,可用于构建基于 UDP 的采集数据网络发送链路。整体功能覆盖“ADC 采集 - 缓存 - 以太网发送”的典型高速采集系统框架,对需要学习 AD7606、DDR3 和以太网协议栈组合设计的 FPGA 项目具有较强参考价值。

运行环境

开发语言:Verilog 开发软件:Vivado 顶层模块:top 主要接口:AD7606 并行数据接口、RGMII 以太网 PHY 接口、DDR3 存储器接口、系统时钟与复位接口。

设计思路

设计以 top 模块为系统入口,将 AD7606 采样控制、帧读写控制、DDR3 缓存访问和以太网协议处理集中连接。AD7606 侧由 FPGA 输出 convstab、cs、rd、reset、os 等控制信号,并读取 ad7606_data、ad7606_busy、ad7606_first_data 等输入信号,用于完成 ADC 转换启动、转换状态判断和并行数据采集。 缓存链路围绕读写请求、突发长度、突发地址和数据有效信号展开。采样侧产生写入数据与写请求,经帧读写控制后写入 DDR3;读取侧根据读请求从 DDR3 取出缓存数据,再送往后级数据发送逻辑。DDR3 用户接口使用 64 位数据宽度,并通过 AXI 写地址、写数据、写响应、读地址、读数据等通道完成与 MIG 控制器的交互。 网络传输部分由以太网顶层和 MAC 收发模块组成,包含 ARP、IP、UDP、ICMP reply、CRC、命令控制等子模块。该结构能够处理基本网络通信所需的收发链路,便于在上位机端通过网络接收 FPGA 采集数据,也便于继续扩展自定义命令、参数配置或数据帧格式。 工程结构将采样、缓存和网络协议相对分层,适合按模块调试:先验证 AD7606 时序与数据读取,再验证 DDR3 突发读写,最后联调 UDP/RGMII 发送链路。

模块结构

主要模块包括: reset:系统复位相关逻辑。 frame_read_write:帧数据读写控制,连接采集数据、DDR3 突发访问和后级读取请求。 frame_fifo_read:帧缓存读取相关逻辑。 top:系统顶层,连接 AD7606、DDR3、RGMII PHY、AXI/MIG 用户接口以及各功能子模块。 util_gmii_to_rgmii:GMII 到 RGMII 接口转换相关逻辑。 eth_top、mac_top、mac_ctrl:以太网协议栈顶层与 MAC 控制逻辑。 mac_rx_top、mac_rx、arp_rx、ip_rx、udp_rx:以太网接收、ARP/IP/UDP 解析相关模块。 mac_tx_top、mac_tx、arp_tx、ip_tx、udp_tx、mac_tx_mode、ip_tx_mode:以太网发送、ARP/IP/UDP 组帧相关模块。 icmp_reply、arp_cache、crc、dpram:ICMP 响应、ARP 缓存、CRC 校验和双口 RAM 支撑模块。 aq_axi_master:AXI 主控访问逻辑,用于配合 DDR3 存储访问。

开发板验证

工程包含面向实际硬件连接的 XDC 管脚约束文件,覆盖 AD7606、RGMII 以太网 PHY、DDR3 以及相关时钟约束,可用于开发板综合、实现和引脚分配参考。约束文件为上板验证提供了硬件连接依据,适合在匹配接口资源的 FPGA 开发板上进行采集与以太网通信联调。

部分代码

以下展示顶层模块 top 的部分代码,完整代码可关注下方公众号卡片获取。

module top
(
input                            sys_clk,                //system clock 50Mhz on board
input                            rst_n,                  //reset ,low active
input[15:0]                      ad7606_data,             //ad7606 data
input                            ad7606_busy,             //ad7606 busy
input                            ad7606_first_data,       //ad7606 first data
output[2:0]                      ad7606_os,               //ad7606
output                           ad7606_cs,               //ad7606 AD cs
output                           ad7606_rd,               //ad7606 AD data read
output                           ad7606_reset,            //ad7606 AD reset
output                           ad7606_convstab,         //ad7606 AD convert start
output                           e_reset,                 //phy reset
output                           e_mdc,                  //phy emdio clock
inout                            e_mdio,                 //phy emdio data
output[3:0]                      rgmii_txd,              //phy data send
output                           rgmii_txctl,            //phy data send control
output                           rgmii_txc,              //Clock for sending data
input[3:0]                       rgmii_rxd,              //recieve data
input                            rgmii_rxctl,            //Control signal for receiving data
input                            rgmii_rxc,              //Clock for recieving data

inout [15:0]                     ddr3_dq,                //ddr3 data
inout [1:0]                      ddr3_dqs_n,             //ddr3 dqs negative
inout [1:0]                      ddr3_dqs_p,             //ddr3 dqs positive
// Outputs
output [13:0]                    ddr3_addr,              //ddr3 address
output [2:0]                     ddr3_ba,                //ddr3 bank
output                           ddr3_ras_n,             //ddr3 ras_n
output                           ddr3_cas_n,             //ddr3 cas_n
output                           ddr3_we_n,              //ddr3 write enable
output                           ddr3_reset_n,           //ddr3 reset,
output [0:0]                     ddr3_ck_p,              //ddr3 clock negative
output [0:0]                     ddr3_ck_n,              //ddr3 clock positive
output [0:0]                     ddr3_cke,               //ddr3_cke,
output [0:0]                     ddr3_cs_n,              //ddr3 chip select,
output [1:0]                     ddr3_dm,                //ddr3_dm
output [0:0]                     ddr3_odt                //ddr3_odt	
);
parameter MEM_DATA_BITS          = 64;             //external memory user interface data width
parameter ADDR_BITS              = 25;             //external memory user interface address width
parameter BUSRT_BITS             = 10;             //external memory user interface burst width
wire                            wr_burst_data_req;
wire                            wr_burst_finish;
wire                            rd_burst_finish;
wire                            rd_burst_req;
wire                            wr_burst_req;
wire[BUSRT_BITS - 1:0]          rd_burst_len;
wire[BUSRT_BITS - 1:0]          wr_burst_len;
wire[ADDR_BITS - 1:0]           rd_burst_addr;
wire[ADDR_BITS - 1:0]           wr_burst_addr;
wire                            rd_burst_data_valid;
wire[MEM_DATA_BITS - 1 : 0]     rd_burst_data;
wire[MEM_DATA_BITS - 1 : 0]     wr_burst_data;
wire                            read_req;
wire                            read_req_ack;
wire                            read_en;
wire[15:0]                      read_data;
wire                            write_en;
wire[15:0]                      write_data;
wire                            write_req;
wire                            write_req_ack;


wire                            ui_clk;
wire                            ui_clk_sync_rst;
wire                            init_calib_complete;
// Master Write Address
wire [3:0]                      s00_axi_awid;
wire [63:0]                     s00_axi_awaddr;
wire [7:0]                      s00_axi_awlen;    // burst length: 0-255
wire [2:0]                      s00_axi_awsize;   // burst size: fixed 2'b011
wire [1:0]                      s00_axi_awburst;  // burst type: fixed 2'b01(incremental burst)
wire                            s00_axi_awlock;   // lock: fixed 2'b00
wire [3:0]                      s00_axi_awcache;  // cache: fiex 2'b0011
wire [2:0]                      s00_axi_awprot;   // protect: fixed 2'b000
wire [3:0]                      s00_axi_awqos;    // qos: fixed 2'b0000
wire [0:0]                      s00_axi_awuser;   // user: fixed 32'd0
wire                            s00_axi_awvalid;
wire                            s00_axi_awready;
// master write data
wire [63:0]                     s00_axi_wdata;
wire [7:0]                      s00_axi_wstrb;
wire                            s00_axi_wlast;
wire [0:0]                      s00_axi_wuser;
wire                            s00_axi_wvalid;
wire                            s00_axi_wready;
// master write response
wire [3:0]                      s00_axi_bid;
wire [1:0]                      s00_axi_bresp;
wire [0:0]                      s00_axi_buser;
wire                            s00_axi_bvalid;
wire                            s00_axi_bready;
// master read address
wire [3:0]                      s00_axi_arid;
wire [63:0]                     s00_axi_araddr;
wire [7:0]                      s00_axi_arlen;
wire [2:0]                      s00_axi_arsize;
wire [1:0]                      s00_axi_arburst;
wire [1:0]                      s00_axi_arlock;
wire [3:0]                      s00_axi_arcache;
wire [2:0]                      s00_axi_arprot;
wire [3:0]                      s00_axi_arqos;
wire [0:0]                      s00_axi_aruser;
wire                            s00_axi_arvalid;
wire                            s00_axi_arready;
// master read data
wire [3:0]                      s00_axi_rid;
wire [63:0]                     s00_axi_rdata;
wire [1:0]                      s00_axi_rresp;
wire                            s00_axi_rlast;
wire [0:0]                      s00_axi_ruser;
wire                            s00_axi_rvalid;
wire                            s00_axi_rready;
wire                            clk_200MHz;



wire                            ad_data_req ;
wire                            ad_data_ack ;
// ... 以下代码略,完整源码请下载压缩包查看

代码获取:点击下方公众号卡片

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值