当前位置: 首页 > 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       ));

相关文章:

  • wpf DataGrid 行选择 命令绑定
  • vscode不能跳转到同一个工作区的其他文件夹
  • 阿里二面:聊聊 MySQL 主从同步方案的优缺点
  • 从虚拟现实到混合现实:沉浸式体验的未来之路
  • STM32 变量加载到flash的过程中
  • python打卡day24
  • 芋道(yudao-cloud)项目,后端接口报401-账号未登录解决方案
  • DELL R770 服务器,更换RAID卡教程!
  • 从SAM看交互式分割与可提示分割的区别与联系:Interactive Segmentation Promptable Segmentation
  • 智能体的典型应用:自动驾驶、智能客服、智能制造、游戏AI与数字人技术
  • 亚远景-基于ASPICE的汽车供应链质量管控培训
  • centos中JDK_PATH 如何设置
  • xss-labs靶场基础8-10关(记录学习)
  • 2025-05-13 表征学习
  • SWMM模型全解析:排水防涝、海绵城市设计等技术与二次开发
  • 计算机网络网络层(下)
  • Android Exoplayer多路不同时长音视频混合播放
  • 利用Backtrader实现回测策略的可视化与图表绘制
  • 广告推荐算法入门 day1 --项目选型
  • 人工智能_大模型数据标注主要做什么_拉框_人工智能训练师_数据标准师介绍---人工智能工作笔记0244
  • 英媒:英国首相住所起火,目前无人伤亡
  • 哈佛新论文揭示 Transformer 模型与人脑“同步纠结”全过程!AI也会犹豫、反悔?
  • 学者纠错遭网暴,人民锐评:“饭圈”该走出畸形的怪圈了
  • 姚洋将全职加盟上海财经大学,担任滴水湖高级金融学院院长
  • 中国海外发展:今年前4个月销售665.8亿元,花费305亿元拿地
  • 国家统计局:4月份居民消费价格同比下降0.1%