当前位置: 首页 > news >正文

专栏项目框架介绍

项目整体实现框图

如下图所示,是该项目的整体框图,项目的功能概括为:PC端下发数据文件,FPGA板卡接收数据文件,缓存至DDR中,待数据文件发送完毕,循环读取DDR有效写区域数据,将DDR数据同步到SFP时钟域,进行光纤传输,该项目中,涉及UDP协议栈、位宽转换、跨时钟、AXI读写DDR、gt收发器配置、同步码对齐等一系列操作,笔者会就框图中实现的功能做每一步介绍,最终实现整体功能,仿真与上板双重检验,确保代码的稳定。
在这里插入图片描述
UDP协议栈的实现,在笔者的FPGA实现UDP协议栈专栏中,已进行详细介绍,在本专栏中,便不再进行赘述,感兴趣的读者可以到下面这个链接学习
FPGA实现UDP协议栈
下面笔者就框图中所示的模块做介绍,其中有些小模块,在此框图中,笔者并未进行绘出,在下面文字中,会进行详细描述,给各位读者展现一个详细的数据流转过程。

项目功能模块介绍

  • UDP协议栈
    该模块实现与上位机通信,包含ping功能实现,与用户的交互接口定义为AXIS总线,可进行的位宽为8bit的udp报文上传与udp报文接收。

其模块接口如下

module udp_module(input                   i_rxc           ,input   [3 :0]          i_rxd           ,input                   i_rx_ctl        ,output                  o_txc           ,output  [3 :0]          o_txd           ,output                  o_tx_ctl        ,output                  o_udp_clk       ,output                  o_udp_rst       ,output  [15:0]          o_rec_len       ,output  [7 :0]          o_rec_data      ,output                  o_rec_last      ,output                  o_rec_valid
);

因为在本项目中,暂时不涉及udp报文的上传,故在本级模块中,未将输出数据接口引出,而是直接将接收到的数据传输至上位机,进行报文丢失校验。

  • udp命令检测与数据输出
    该模块进行DDR擦除与数据文件传输完毕的命令检测,以及有效数据的输出,避免命令数据缓存至DDR,造成数据错误。
    其模块接口如下
    输入为UDP报文,输出为DDR擦除,存储完毕,有效数据,运行在UDP时钟域
module udp_cmd_check(input               i_clk           ,input               i_rst           ,input   [7 :0]      i_udp_data      ,input               i_udp_valid     ,output  [7 :0]      o_udp_data      ,output              o_udp_valid     ,output              o_store_done    ,output              o_raddr_clear   );
  • 数据位宽转换与跨时钟处理
    该模块主要实现将1Byte数据(UDP时钟域)转换为4Bytes数据(DDR时钟域)
    其模块接口如下
    输入为check后的udp报文,输出为DDR时钟域写入数据
module ASYNC_BUF_DDR(input               i_udp_clk   ,input               i_udp_rst   ,input               i_ui_clk    ,input               i_ui_rst    ,input   [7 :0]      i_udp_data  ,input               i_udp_valid ,output  [31:0]      o_send_data ,output              o_send_valid);
  • ddr读写控制模块
    该模块主要实现功能:接收异步处理后的4Bytes数据,传输至DDR的AXI控制器,以及接收来自DDR的AXI控制器输出的读数据
    其模块接口如下:
module ddr_rw_control(input               i_ui_clk        ,input               i_ui_rst        ,/*ASYNC_BUF_DDR*/input   [31:0]      i_send_data     ,input               i_send_valid    ,input               i_read_cmd      ,input               i_raddr_clear   ,input               i_read_back     ,output  [15:0]      o_store_size    ,/*op-->axi*/output  [1 :0]      o_op_cmd        ,output  [29:0]      o_op_waddr      ,output  [29:0]      o_op_raddr      ,output              o_op_valid      ,input               i_op_ready      ,output  [31:0]      o_write_data    ,output              o_write_valid   ,input   [31:0]      i_read_data     ,input               i_read_valid    );

–内存读取控制器
该模块主要功能为:接收数据报文传输完成以及数据擦除指令,进行DDR数据的循环读取,并将读取到的数据转换至SFP时钟域,传输给光纤模块。
其模块接口如下:

module read_memory_ctrl(input               i_ui_clk        ,input               i_ui_rst        ,input               i_sfp_clk       ,input               i_sfp_rst       ,input               i_store_done    ,input   [15:0]      i_store_size    ,input               i_raddr_clear   ,output              o_read_back     ,output              o_read_cmd      ,input   [31:0]      i_read_data     ,input               i_read_valid    ,output  [31:0]      o_sfp_data      ,output              o_sfp_valid     );
  • ddr axi读写驱动
    该模块主要功能为:接收数据读写op指令,将将其转换为AXI4总线形式,进行数据写入与读取
    其模块接口如下
module ddr_axi_rw#(parameter           C_M_TARGET_SLAVE_BASE_ADDR	= 32'h00000000  ,parameter   integer C_M_AXI_BURST_LEN	        = 256           ,parameter   integer C_M_AXI_ID_WIDTH	        = 1             ,parameter   integer C_M_AXI_ADDR_WIDTH	        = 30            ,parameter   integer C_M_AXI_DATA_WIDTH	        = 32            ,parameter   integer C_M_AXI_AWUSER_WIDTH        = 0             ,parameter   integer C_M_AXI_ARUSER_WIDTH        = 0             ,parameter   integer C_M_AXI_WUSER_WIDTH	        = 0             ,parameter   integer C_M_AXI_RUSER_WIDTH	        = 0             ,parameter   integer C_M_AXI_BUSER_WIDTH	        = 0
)(input                                   init_calib_complete ,input   [1 :0]                          i_op_cmd            ,input   [29:0]                          i_op_waddr          ,input   [29:0]                          i_op_raddr          ,input                                   i_op_valid          ,output                                  o_op_ready          ,input   [31:0]                          i_write_data        ,input                                   i_write_valid       ,output  [31:0]                          o_read_data         ,output                                  o_read_valid        ,input									M_AXI_ACLK          ,input									M_AXI_ARESETN       ,output	[C_M_AXI_ID_WIDTH-1 :0]    		M_AXI_AWID          ,output	[C_M_AXI_ADDR_WIDTH-1 :0]  		M_AXI_AWADDR        ,output	[7 :0]                     		M_AXI_AWLEN         ,output	[2 :0]                     		M_AXI_AWSIZE        ,output	[1 :0]                     		M_AXI_AWBURST       ,output	                            	M_AXI_AWLOCK        ,output	[3 :0]                     		M_AXI_AWCACHE       ,output	[2 :0]                     		M_AXI_AWPROT        ,output	[3 :0]                     		M_AXI_AWQOS         ,output	[C_M_AXI_AWUSER_WIDTH-1 :0]		M_AXI_AWUSER        ,output	                            	M_AXI_AWVALID       ,input 	                            	M_AXI_AWREADY       ,output	[C_M_AXI_DATA_WIDTH-1 :0]  		M_AXI_WDATA         ,output	[C_M_AXI_DATA_WIDTH/8-1 :0]		M_AXI_WSTRB         ,output	                            	M_AXI_WLAST         ,output	[C_M_AXI_WUSER_WIDTH-1 :0] 		M_AXI_WUSER         ,output	                            	M_AXI_WVALID        ,input 	                            	M_AXI_WREADY        ,input 	[C_M_AXI_ID_WIDTH-1 :0]       	M_AXI_BID           ,input 	[1 :0]                        	M_AXI_BRESP         ,input 	[C_M_AXI_BUSER_WIDTH-1 :0]    	M_AXI_BUSER         ,input 	                               	M_AXI_BVALID        ,output	                               	M_AXI_BREADY        , output  [C_M_AXI_ID_WIDTH-1 :0]         M_AXI_ARID          ,output  [C_M_AXI_ADDR_WIDTH-1 :0]       M_AXI_ARADDR        ,output  [7 :0]                          M_AXI_ARLEN         ,output  [2 :0]                          M_AXI_ARSIZE        ,output  [1 :0]                          M_AXI_ARBURST       ,output                                  M_AXI_ARLOCK        ,output  [3 : 0]                         M_AXI_ARCACHE       ,output  [2 : 0]                         M_AXI_ARPROT        ,output  [3 : 0]                         M_AXI_ARQOS         ,output  [C_M_AXI_ARUSER_WIDTH-1 :0]     M_AXI_ARUSER        ,output                                  M_AXI_ARVALID       ,input                                   M_AXI_ARREADY       ,input   [C_M_AXI_ID_WIDTH-1 :0]         M_AXI_RID           ,input   [C_M_AXI_DATA_WIDTH-1 :0]       M_AXI_RDATA         ,input   [1: 0]                          M_AXI_RRESP         ,input                                   M_AXI_RLAST         ,input   [C_M_AXI_RUSER_WIDTH-1 :0]      M_AXI_RUSER         ,input                                   M_AXI_RVALID        ,output                                  M_AXI_RREADY         );

该模块与mig ddr3 ip一齐被例化在ddr_top模块

module ddr_top(input               i_ddr_clk       ,input               i_ddr_rstn      ,output  [14:0]      ddr3_addr       ,output  [2 :0]      ddr3_ba         ,output		        ddr3_cas_n      ,output  [0 :0]      ddr3_ck_n       ,output  [0 :0]      ddr3_ck_p       ,output  [0 :0]      ddr3_cke        ,output		        ddr3_ras_n      ,output			    ddr3_reset_n    ,output			    ddr3_we_n       ,inout   [31:0]		ddr3_dq         ,inout   [3 :0]		ddr3_dqs_n      ,inout   [3 :0]		ddr3_dqs_p      ,output  [0 :0]		ddr3_cs_n       ,output  [3 :0]		ddr3_dm         ,output  [0 :0]		ddr3_odt        ,output              ui_clk          ,output              ui_clk_sync_rst ,input   [1 :0]      i_op_cmd        ,input   [29:0]      i_op_waddr      ,input   [29:0]      i_op_raddr      ,input               i_op_valid      ,output              o_op_ready      ,input   [31:0]      i_write_data    ,input               i_write_valid   ,output  [31:0]      o_read_data     ,output              o_read_valid    );
  • 光纤传输器
    该模块主要功能为接收从DDR读取的数据(同步至SFP时钟域),进行帧头,进行帧尾封装,传输数据
    其模块接口如下:
gt_one_top gt_one_top_u0(.i_sysclk            (w_sys_clk         ),.i_gtrefclk_p        (i_gtrefclk_p      ),.i_gtrefclk_n        (i_gtrefclk_n      ),.o_gt_tx_p           (o_gt_tx_p         ),.o_gt_tx_n           (o_gt_tx_n         ),.i_gt_rx_p           (i_gt_rx_p         ),.i_gt_rx_n           (i_gt_rx_n         ),.o_sfp_disable       (o_sfp_disable     ),.o_sfp_txclk         (w_sfp_clk         ),.o_sfp_txrst         (w_sfp_rst         ),.i_send_data         (w_sfp_data        ),.i_send_valid        (w_sfp_valid       ));
http://www.xdnf.cn/news/426745.html

相关文章:

  • 【Redis】谈谈Redis的设计
  • 网安学途—流量分析 attack.pcap
  • 【TS入门笔记8---了解JSX】
  • G1在GC的时候会占用内存吗?占用的是分配的内存还是分配外的内存
  • JS Map使用方法
  • Linux上的rm和srm 命令
  • Femap许可网络配置
  • MRI、DX、CT 医学影像常用术语详解:概念与应用
  • 在Babylon.js中实现完美截图的艺术:包含Canvas和HTML覆盖层
  • 【完全平方数包含相同数】2021-11-30
  • LeetCode 3335.字符串转换后的长度 I:I先递推
  • 运用数组和矩阵对数据进行存取和运算——NumPy模块 之六
  • 浅谈 Redis 数据类型
  • 【PmHub后端篇】PmHub中基于Redis加Lua脚本的计数器算法限流实现
  • 【Canda】常用命令+虚拟环境创建到选择
  • aardio —— 虚表 —— 同一单元格内用不同的字体
  • maven中relativepath标签的含义及使用方法
  • TensorFlow 常见使用场景及开源项目实例
  • 大模型MCP之UV安装使用
  • 数据集-目标检测系列- 杨桃 数据集 Starfruit>> DataBall
  • leetcode 189. 轮转数组
  • 养生:打造健康生活的全方位策略
  • GPT-4.1和GPT-4.1-mini系列模型支持微调功能,助力企业级智能应用深度契合业务需求
  • Comparator不满足自反性错误,Comparison method violates its general contract
  • Cursor开发酒店管理系统
  • RevIN(Reversible Instance Normalization)及其在时间序列中的应用
  • SpringBoot中使用集群版Redis
  • sparkSQL读入csv文件写入mysql
  • 基于自动化工具autox.js的抢票(猫眼)
  • P1032 [NOIP 2002 提高组] 字串变换