一.功能:从rgmii接口(物理芯片)接收数据(4位),并通过gmii转rgmii接口(fpga)把数据转化为8位,验证udp帧的正确性,并把用户数据提取出来(去掉帧头帧尾)存储。

二.接收过程(gmii):

①分段判断:

Ⅰ.前导码;

Ⅱ.mac帧头:mac地址和以太网类型(IP还是arp);

Ⅲ.ip帧头:IP地址和上层协议类型(udp还是TCP);

以上要素都正确则接收帧,有一个出错则舍弃帧。

②技巧:

Ⅰ.存下ip首部长度,用以判断ip帧头是否接受完(因为ip帧头长度不固定,有可填充字段);

Ⅱ.存下udp帧长度,用以确定用户数据的长度。(用户数据长度 = udp帧长度 - udp帧头长度);

Ⅲ.依旧是用计数器来接收数据,每个时钟上升沿到来接收一次数据,(因此接收数据的速率是固定的)。

三.实现(gmii):三段式状态机(3个always块)

根据udp帧数据的分段定义出几个状态;

②定义接收正确和接收错误的跳变信号;

③定义两个状态寄存器

第一个always块:用时序逻辑时刻更新状态寄存器;

第二个always块:用组合逻辑根据跳变信号判断是否要实现状态跳变:

第三个always块:用时序逻辑根据当前接收的数据设定跳变信号的值:

 四.状态描述(gmii)

如图:根据udp段分出以上状态。要用状态机实现接收模块时,应该先画出以上状态转移图,然后再根据改图写代码。

本接收模块没有设置udp校验,ip报头校验和mac帧crc32校验。

如果想要校验的话,得把每个接收到的数据传入crc32计算模块进行计算,得到计算结果与接收的crc32值比对。这个过程得用一个存储器把接收的用户数据先存储起来,等校验正确再输出,校验错误则舍弃。

五.系统框图

根据上述状态机的介绍设计完udpg_gmii_rx模块之后,接下来设计gmii转rgmii模块,此模块是难点。

 六.GMII转RGMII接收模块

RGMII接口的数据位宽为4,想要在125MHz的时钟频率下实现千兆的速率,就必须在时钟上升沿和下降沿都采样。

在Xilinx中, 想要实现GMII转RGMII接收接口转换,需要调用原语。在上节设计发送模块中已经介绍了输出寄存器ODDR的双沿采样原理。

在设计接收模块时,为了在时钟变化沿的数据是稳定的,我们需要对输入的数据进行一定的延时,如下:

想要实现信号延迟,有两种方法:

①针对时钟信号,用锁相环产生相移,得到另外一个延迟的时钟信号

②对于一般的信号,调用Xilinx原语:IDELAY2(或者IDELAY3等其他原语...根据不同芯片来选择)

对于Artix-7系列的芯片,可以选用IDELAY2原语来实现延时,一旦调用IDELAY2,就需要同时调用IDELAYCTRL来保证延时的精度,此外,需要调用BUFG和BUFIO原语来产生极小脉动的时钟,一个用于全局时钟,一个仅用于IO口(接入IDDR)。

rgmii模块框图:

原语代码解释:

//全局时钟缓存
BUFG BUFG_inst (.I            (rgmii_rx_clk),     // 1-bit input: Clock input.O            (rgmii_rx_bufg) // 1-bit output: Clock output
);
//全局时钟IO缓存
BUFIO BUFIO_inst (.I            (rgmii_rx_clk),      // 1-bit input: Clock input.O            (rgmii_rx_bufio) // 1-bit output: Clock output
);

直接输入时钟,再定义一个信号输出即可。输出的时钟相比输入的时钟脉动小,而频率相位等参数不变。

 (* IODELAY_GROUP = "rgmii" *) // Specifies group name for associated IDELAYs/ODELAYs and IDELAYCTRL//复制原语得到的<iodelay_group_name>这个是组名,给分组,使用时<>要修改成以上“”形式.输出不用连接 IDELAYCTRL IDELAYCTRL_inst (.RDY(),       // 1-bit output: Ready output输出悬空.REFCLK(refer_clk), // 1-bit input: Reference clock input/参考时钟,用锁相环mmcm来产生200MHz时钟.RST(0)        // 1-bit input: Active high reset input复位信号);

这里注意参考时钟频率。

 (* IODELAY_GROUP = "rgmii" *) // Specifies group name for associated IDELAYs/ODELAYs and IDELAYCTRL// 延时模块IDELAYE2 #(//以下参数在ug471说明书中可以找到解释.CINVCTRL_SEL("FALSE"),          // (FALSE, TRUE),动态切换输入时钟的极性。.DELAY_SRC("IDATAIN"),           // (IDATAIN(IBUF), DATAIN(FPGA内部逻辑))输入延迟数据来源.HIGH_PERFORMANCE_MODE("FALSE"), // Reduced jitter ("TRUE"), Reduced power ("FALSE")减少抖动。减少功耗.IDELAY_TYPE("FIXED"),           // FIXED固定延迟值, VARIABLE动态加载tap值, VAR_LOAD, VAR_LOAD_PIPE .IDELAY_VALUE(5'd0),             //(0-31)tap 要延迟的时长 = (0-31)x REFCLK_FREQUENCY对应的单位值.PIPE_SEL("FALSE"),              // (FALSE, TRUE)只有当IDELAY_TYPE选VAR_LOAD_PIPE 时这里才写true.REFCLK_FREQUENCY(200.0),        //  (190.0-210.0, 290.0-310.0) MHz.参考时钟频率,确定每个tap的延时精度。200MHz对应1tap=78ps.SIGNAL_PATTERN("DATA")          // (DATA,CLOCK)要延时的是数据还是时钟)IDELAYE2_rx_en (.CNTVALUEOUT(), // 5-bit output: tap值的监控输出.DATAOUT(rgmii_rx_en_delay),         // 1-bit output: Delayed data output.C(1'b0),                     // 1-bit input: Clock input,used in VARIABLE, VAR_LOAD, or VAR_LOAD_PIPE mode.CE(1'b0),                   // 1-bit input: Active high enable increment/decrement input.CINVCTRL(1'b0),       // 1-bit input: Dynamic clock inversion input动态转换时钟极性.CNTVALUEIN(5'b0),   // 5-bit input: Counter value input 动态加载tap值.DATAIN(1'b0),           // 1-bit input: Internal delay data input.IDATAIN(rgmii_rx_en),         // 1-bit input: Data input from the I/O.INC(1'b0),                 // 1-bit input: Increment / Decrement tap delay input.LD(1'b0),                   // 1-bit input: Load IDELAY_VALUE input.LDPIPEEN(1'b0),       // 1-bit input: Enable PIPELINE register to load data input.REGRST(1'b0)  

①对于延时模块,我们一般固定延时的值,即选择使用FIXED模式,很多输入和参数置0即可。参数的设置见代码后面的解释。

②如果有其他需求,需要延时值动态变化,则选择其他模式,这时候就要注意很多个输入和参数的设置,因为tap值与这些有关:

genvar i;//学习语法:genver产生一个变量i,generate for 和endgenerate为一个模块,
generate for ( i = 0 ; i < 4 ;i = i + 1)begin//generate模块是偷懒写法,IDDR #(.DDR_CLK_EDGE("SAME_EDGE_PIPELINED"), // "OPPOSITE_EDGE", "SAME_EDGE" //    or "SAME_EDGE_PIPELINED" 双沿采样的模式,输出的时间不同,见ug471.INIT_Q1(1'b0), // Initial value of Q1: 1'b0 or 1'b1.INIT_Q2(1'b0), // Initial value of Q2: 1'b0 or 1'b1.SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC" 复位同步还是'async异步') IDDR_rx_data (.Q1(gmii_rx_data[i]), // 1-bit output for positive edge of clock .Q2(gmii_rx_data[i+4]), // 1-bit output for negative edge of clock.C(rgmii_rx_bufio),   // 1-bit clock input/时钟输入.CE(1'b1), // 1-bit clock enable input/输入时钟使能,置1就行.D(rgmii_rx_data_delay[i]),   // 1-bit DDR data input   /这里要连接延迟后的数据.R(1'b0),   // 1-bit reset   /复位:置0就行.S(1'b0)    // 1-bit set     /复位:置0就行);end
endgenerate

双沿采样代码类似于ODDR,较为简单,SAME_EDGE_PIPELINED模式采样过程如下:

其他模式见说明书。

采样时钟的频率跟数据输入的频率是有要求的,要满足上面的形式才可以。

经过这次设计,学会两种方法来延迟信号,在调试IDDR过程中用好信号的延迟便可采样成功。

七.仿真结果:

①gmii转rgmii接收模块:

②gmii接收模块:

验证成功。

千兆以太网_接收模块设计_udp_rgmii_rx相关推荐

  1. 千兆以太网_基础知识

    基础知识: 1.网络结构:计算机网络的层次结构如图所示. 协议:传输层则包含UDP协议,TCP协议,网络层有arp协议和IP协议,数据链路层封装MAC帧,通过物理层的PHY物理收发芯片传输数据.用户数 ...

  2. 千兆以太网_发送模块设计_udp_rgmii_tx

    一.功能:在FPGA开发板上,用户数据存于FIFO,经过UDP,IP,MAC封装,通过RGMII接口发送出去.完整的以太网应该包括收发功能,这里介绍发送模块. 二.实现:序列机 三.过程:发送顺序:  ...

  3. 基于FPGA的数据采集、通讯和存储系统设计(即FPGA+RTL8211千兆以太网+SD卡存储+RTC+Uart+AD7606数模转换+电流放大采集等硬件设计及程序验证)

    本文主要介绍了学生期间自己做的一个小项目,便于学习初期对fpga的整体把握,涉及了很多常见.常用.常考和面试常问的知识点. 可以作为入门后的拓展学习和应对一些找工作的项目面试. 下面对硬件及软件代码进 ...

  4. 基于亚信AX88179A芯片的USB 3.2转千兆以太网设计

    发布日期: 2023/1/4 透过已被广泛使用于各种消费电子产品的USB接口,亚信电子AX88179A USB 3.2 Gen1转千兆以太网芯片解决方案,可以为轻薄短小的笔记本电脑.智能手机.平板电脑 ...

  5. 基于FPGA的千兆以太网设计

    今天给大侠带来基于FPGA的千兆以太网设计,话不多说,上货. 一.设计概述 由于设计比较复杂,本篇带来设计流程以及设计思路,仅供各位大侠参考. 本篇通过管理数据输入输出MDIO配置PHY寄存器,使其工 ...

  6. 简谈基于FPGA的千兆以太网设计

    简谈基于FPGA的千兆以太网设计 今天给大侠带来简谈基于FPGA的千兆以太网设计,话不多说,上货. 今天我们来简单的聊一聊以太网,以太网在FPGA学习中属于比较高级的内容了,有些大侠肯定会感觉以太网学 ...

  7. gpio 树莓派3a+_树莓派4正式发布!硬件性能大提升:CPU提升3倍,支持USB3.0、蓝牙5.0、千兆以太网、4G LPDDR4、H.265...

    树莓派(Raspberry Pi)基金会,6月24日正式发布了Raspberry Pi 4 Model B. 树莓派是全球知名的基本计算微型电脑,深受全球开发者.编程者.极客等人士的追捧和喜爱. 这一 ...

  8. 【紫光同创国产FPGA教程】【第二十三章】千兆以太网传输实验

    本原创教程由芯驿电子科技(上海)有限公司(ALINX)创作,版权归本公司所有,如需转载,需授权并注明出处(http://www.alinx.com). 适用于板卡型号: PGL22G 1. 简介 本实 ...

  9. 基于FPGA的千兆以太网的实现(1)

    基于FPGA的以太网图片接收 项目简述 UDP协议讲解 V3学院的上位机传送图像数据的数据流 项目的实验框图 跨时钟域处理时序图 Image_ctrl时序图 工程代码 测试模块的代码 测试结果 总结 ...

  10. 工业级千兆以太网光纤收发器产品介绍

    工业级光纤收发器是一种可以延长传输距离的一种工业交换机,它具有便捷.维护简单.抗干扰性能强.性能强大.运行稳定等优点.产品设计符合以太网标准,性能稳定可靠.该设备可广泛应用于智能交通.电信.安防.金融 ...

最新文章

  1. 每日记载内容总结50
  2. 用python tkinter显示Mandelbrot图
  3. php7.3安装yaf扩展(亲测)
  4. 显卡在电脑什么位置_告诉你什么配置的电脑显卡/GPU才能播放4K电影视频
  5. MySQL索引知识复习
  6. scsi协议_存储协议有哪些类型?常见存储协议分析
  7. MIPS之u-boot流程分析
  8. windows11无法添加朝鲜语输入法
  9. 企业报表系统搭建很难?其实选对工具就成功了一半
  10. 电脑(笔记本/台式)如何关闭UAC
  11. 关于Pearson相关系数的显著性p值如何计算以及背后原因的思考
  12. Unity小游戏教程系列 | 创建小型太空射击游戏(4)
  13. 【集合论】集合运算 ( 并集 | 交集 | 不相交 | 相对补集 | 对称差 | 绝对补集 | 广义并集 | 广义交集 | 集合运算优先级 )
  14. Python GIS神器shapely 2.0新版本来了
  15. macbook proa1708_苹果a1708是哪一年的
  16. Android百度语音集成——文字转语音
  17. Alpha选股:资本资产定价模型(CAPM)
  18. 黑马在线教育数仓实战5
  19. android 音标乱码的一些问题
  20. python分别统计男女人数_python实现爬虫统计学校BBS男女比例(一),python男女比例...

热门文章

  1. Ti的C28x系列的DSP(28069)使用经验,SCI与RS485(ADM2587EBRWZ)
  2. 魔兽服务器信息文件,魔兽世界2.4.3公众测试服务器补丁说明文档
  3. Memory barrier(内存屏障)
  4. Windows Message Queue 优先队列
  5. 解决浏览器Adobe Flash Player不是最新版本问题
  6. python数据可视化-简单案例
  7. python爬取晋江小说排行榜_【含代码】Python爬虫实战:爬取全站小说排行榜
  8. Theano入门神经网络(三)
  9. 内网即时通讯软件优点大全分享
  10. 广义线性模型和广义加法模型_广义线性模型代码