名称: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 ; // ... 以下代码略,完整源码请下载压缩包查看
代码获取:点击下方公众号卡片
319

被折叠的 条评论
为什么被折叠?



