FPGA代码:结合了某德扬和米联客的PCIE光纤通信项目(基于k7325t),上位机通过PCle把数据发送给FPGA,FPGA打包后通过光纤模块发送出去,同时FPGA保存光纤过来的数据到DDR3中,当DDR3中的数据存够一定数量把DDR3中的数据通过PCle发送给上位机目前资料收集的已经很全。
项目概述
本文基于明德扬光纤通信项目的设计文档,详细解析了系统中关键模块的功能设计与实现思路。该项目实现了基于FPGA的高速光纤通信系统,包含配置包文解析、DDR存储控制、光纤数据调度等核心功能模块。
核心模块功能详解
1. 配置包文解析模块 (cfg_pack_analy_rx)
功能描述
该模块负责解析来自PC端的配置包文,实现对FPGA内部寄存器的读写操作。模块通过识别特定的包文头来区分配置包文与数据包文。
包文格式定义:
- 包文头 (16位):用于识别配置包文,默认值16'hf88
- 读写属性 (1位):0表示写操作,1表示读操作
- 板卡编号 (15位):0-3表示发送卡,4表示接收卡
- 寄存器地址 (16位):目标寄存器地址
- 读写数据 (32位):写入数据或读取结果
- 无效填充 (48位):保留字段
设计要点
- 包文识别机制:通过比较输入数据的高16位与预设HEAD参数来识别配置包文
- 通道路由逻辑:根据板卡编号将包文路由到相应通道或进行本地寄存器操作
- 读写操作处理:写操作直接修改寄存器值,读操作将寄存器数据填充到返回包文中
关键信号说明
// 配置包文有效信号 assign flag_ctrl = din_vld && (din[127:112] == HEAD); // 通道有效指示 generate for(i=0; i<TOTAL_NUM; i=i+1) begin assign flag_id[i] = flag_ctrl && (din[110:96] == i); end endgenerate // 寄存器写使能 assign reg_wr = flag_ctrl && !din[111] && flag_id[LOCAL_ID];2. DDR存储控制模块 (ddr_mem_intf_guangxian)
功能架构
该模块实现DDR3存储器的读写控制,采用多级缓冲和突发传输机制来优化存储性能。
核心参数配置:
- 数据位宽:512位
- 突发长度:可配置的DDR操作单元
- 写水线:触发DDR写入操作的FIFO阈值
- 读水线:触发DDR读取操作的存储量阈值
状态机设计
模块采用四状态状态机管理DDR操作:
- IDLE:空闲状态,等待操作请求
- ADDR:地址发送状态,发送读写地址
- REQQ:请求状态,向DDR控制器发送操作请求
- DATA:数据传输状态,完成数据读写操作
关键技术实现
- 写FIFO管理:缓存输入数据,达到水线后启动批量写入
- 读FIFO统计:跟踪DDR中存储的数据量,优化读取时机
- 带宽均衡:读写操作交替执行,避免单一操作占用过多带宽
// 写准备好信号 assign chan_wr_rdy = (state == IDLE) && (wffo_count > cfg_wr_thd) && !wffo_empty; // 读写选择逻辑 always @(*) begin if (chan_wr_rdy && chan_rd_rdy) flag_sel_rw = ~flag_sel_rw; // 交替响应 else if (chan_wr_rdy) flag_sel_rw = 1'b0; // 写操作 else if (chan_rd_rdy) flag_sel_rw = 1'b1; // 读操作 end3. 光纤数据调度模块 (gtx2ddrSp)
功能特点
实现4路光纤数据的汇聚调度,将64位输入数据转换为512位输出,支持跨时钟域数据传输。
FPGA代码:结合了某德扬和米联客的PCIE光纤通信项目(基于k7325t),上位机通过PCle把数据发送给FPGA,FPGA打包后通过光纤模块发送出去,同时FPGA保存光纤过来的数据到DDR3中,当DDR3中的数据存够一定数量把DDR3中的数据通过PCle发送给上位机目前资料收集的已经很全。
调度策略:
- 以完整包文为单位进行通道选择
- 优先级固定:通道0 > 通道1 > 通道2 > 通道3
- 包文传输过程中不切换通道,确保数据完整性
实现机制
- 串并转换:通过pack_s2p模块将64位数据转换为512位
- 双FIFO结构:
- 数据FIFO:存储转换后的包文数据
- 信息FIFO:记录完整包文的存在状态
- 动态调度:基于信息FIFO状态选择输出通道
// 通道选择逻辑 always @(posedge clk_out or negedge rst_n) begin if (!rst_n) begin flag_sel <= 2'b00; end else if (!flag_add) begin // 空闲状态 if (!u_mfifo0_empty) flag_sel <= 2'b00; else if (!u_mfifo1_empty) flag_sel <= 2'b01; // 其他通道判断... end end4. 光纤协议处理模块 (gtxPackAndCodeMode2)
协议栈分层
该模块实现完整的光纤通信协议栈:
1. 用户层协议
- 包文头:16'h55aa(数据包文)或16'hf8f8(配置包文)
- 纯数据载荷
2. 协议层封装
| 包文头(16位) | 数据长度(16位) | 校验和(16位) | 无效值(16位) | 用户层数据 |3. 接口层转换
- 数据/K码信号与光纤物理接口的映射
- MSB/LSB模式转换
- 字节对齐处理
校验和计算
采用特殊的进位处理算法:
// 校验和计算示例 // 16'hB85E + 16'hFCED = 17'h1B84B // 进位处理:16'hB84B + 16'h1 = 16'hB84C系统数据流分析
配置数据流
- PC配置接收卡:PC发送配置包文→PCIE接口→配置解析模块→寄存器更新
- PC读取寄存器:读请求包文→寄存器数据填充→返回包文→PCIE上传
- 跨板卡配置:配置包文→光纤传输→目标板卡解析→寄存器操作
业务数据流
- 数据生成:测试模块产生业务数据
- 光纤传输:数据打包→物理传输→接收解包
- DDR存储:数据汇聚→缓冲存储→批量读写
- PC上传:DDR读取→数据调度→PCIE传输
设计亮点
1. 灵活的寄存器配置系统
- 基于XML的寄存器定义自动生成代码
- 支持多域寄存器结构
- 统一的读写接口规范
2. 高效的存储管理
- 水线触发机制减少DDR操作频率
- 突发传输优化带宽利用率
- 读写交替避免资源冲突
3. 可靠的光纤通信
- 多层协议保证数据传输可靠性
- 字节对齐处理解决物理层偏移
- 完整的错误检测机制
4. 智能数据调度
- 基于包文的调度单元保证数据完整性
- 优先级机制确保关键数据及时处理
- 带宽计算预防数据溢出
性能优化策略
带宽保障
- 输入总带宽:4路 × 3.125Gbps = 12.5Gbps
- 输出带宽:200MHz × 512bit × 60% × 50% = 30.72Gbps
- 输出带宽远大于输入需求,确保系统无瓶颈
时序优化
- 流水线设计解决建立时间违例
- 跨时钟域处理的同步机制
- 状态机的无冲突跳转条件
总结
该光纤通信项目展现了一套完整的高速数据采集与传输解决方案。通过模块化的设计思路、层次化的协议栈、智能的资源调度机制,实现了高性能、高可靠性的光纤通信系统。各核心模块间的协同工作确保了从数据采集、传输、存储到上传的全流程高效稳定运行。
项目的设计理念和实现方法为类似的高速数据通信系统提供了有价值的参考,特别是在FPGA基于光纤接口的复杂系统设计方面具有重要的实践指导意义。