千兆以太网_接收模块设计_udp_rgmii_rx
一.功能:从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.网络结构:计算机网络的层次结构如图所示. 协议:传输层则包含UDP协议,TCP协议,网络层有arp协议和IP协议,数据链路层封装MAC帧,通过物理层的PHY物理收发芯片传输数据.用户数 ...
- 千兆以太网_发送模块设计_udp_rgmii_tx
一.功能:在FPGA开发板上,用户数据存于FIFO,经过UDP,IP,MAC封装,通过RGMII接口发送出去.完整的以太网应该包括收发功能,这里介绍发送模块. 二.实现:序列机 三.过程:发送顺序: ...
- 基于FPGA的数据采集、通讯和存储系统设计(即FPGA+RTL8211千兆以太网+SD卡存储+RTC+Uart+AD7606数模转换+电流放大采集等硬件设计及程序验证)
本文主要介绍了学生期间自己做的一个小项目,便于学习初期对fpga的整体把握,涉及了很多常见.常用.常考和面试常问的知识点. 可以作为入门后的拓展学习和应对一些找工作的项目面试. 下面对硬件及软件代码进 ...
- 基于亚信AX88179A芯片的USB 3.2转千兆以太网设计
发布日期: 2023/1/4 透过已被广泛使用于各种消费电子产品的USB接口,亚信电子AX88179A USB 3.2 Gen1转千兆以太网芯片解决方案,可以为轻薄短小的笔记本电脑.智能手机.平板电脑 ...
- 基于FPGA的千兆以太网设计
今天给大侠带来基于FPGA的千兆以太网设计,话不多说,上货. 一.设计概述 由于设计比较复杂,本篇带来设计流程以及设计思路,仅供各位大侠参考. 本篇通过管理数据输入输出MDIO配置PHY寄存器,使其工 ...
- 简谈基于FPGA的千兆以太网设计
简谈基于FPGA的千兆以太网设计 今天给大侠带来简谈基于FPGA的千兆以太网设计,话不多说,上货. 今天我们来简单的聊一聊以太网,以太网在FPGA学习中属于比较高级的内容了,有些大侠肯定会感觉以太网学 ...
- gpio 树莓派3a+_树莓派4正式发布!硬件性能大提升:CPU提升3倍,支持USB3.0、蓝牙5.0、千兆以太网、4G LPDDR4、H.265...
树莓派(Raspberry Pi)基金会,6月24日正式发布了Raspberry Pi 4 Model B. 树莓派是全球知名的基本计算微型电脑,深受全球开发者.编程者.极客等人士的追捧和喜爱. 这一 ...
- 【紫光同创国产FPGA教程】【第二十三章】千兆以太网传输实验
本原创教程由芯驿电子科技(上海)有限公司(ALINX)创作,版权归本公司所有,如需转载,需授权并注明出处(http://www.alinx.com). 适用于板卡型号: PGL22G 1. 简介 本实 ...
- 基于FPGA的千兆以太网的实现(1)
基于FPGA的以太网图片接收 项目简述 UDP协议讲解 V3学院的上位机传送图像数据的数据流 项目的实验框图 跨时钟域处理时序图 Image_ctrl时序图 工程代码 测试模块的代码 测试结果 总结 ...
- 工业级千兆以太网光纤收发器产品介绍
工业级光纤收发器是一种可以延长传输距离的一种工业交换机,它具有便捷.维护简单.抗干扰性能强.性能强大.运行稳定等优点.产品设计符合以太网标准,性能稳定可靠.该设备可广泛应用于智能交通.电信.安防.金融 ...
最新文章
- 每日记载内容总结50
- 用python tkinter显示Mandelbrot图
- php7.3安装yaf扩展(亲测)
- 显卡在电脑什么位置_告诉你什么配置的电脑显卡/GPU才能播放4K电影视频
- MySQL索引知识复习
- scsi协议_存储协议有哪些类型?常见存储协议分析
- MIPS之u-boot流程分析
- windows11无法添加朝鲜语输入法
- 企业报表系统搭建很难?其实选对工具就成功了一半
- 电脑(笔记本/台式)如何关闭UAC
- 关于Pearson相关系数的显著性p值如何计算以及背后原因的思考
- Unity小游戏教程系列 | 创建小型太空射击游戏(4)
- 【集合论】集合运算 ( 并集 | 交集 | 不相交 | 相对补集 | 对称差 | 绝对补集 | 广义并集 | 广义交集 | 集合运算优先级 )
- Python GIS神器shapely 2.0新版本来了
- macbook proa1708_苹果a1708是哪一年的
- Android百度语音集成——文字转语音
- Alpha选股:资本资产定价模型(CAPM)
- 黑马在线教育数仓实战5
- android 音标乱码的一些问题
- python分别统计男女人数_python实现爬虫统计学校BBS男女比例(一),python男女比例...
热门文章
- Ti的C28x系列的DSP(28069)使用经验,SCI与RS485(ADM2587EBRWZ)
- 魔兽服务器信息文件,魔兽世界2.4.3公众测试服务器补丁说明文档
- Memory barrier(内存屏障)
- Windows Message Queue 优先队列
- 解决浏览器Adobe Flash Player不是最新版本问题
- python数据可视化-简单案例
- python爬取晋江小说排行榜_【含代码】Python爬虫实战:爬取全站小说排行榜
- Theano入门神经网络(三)
- 内网即时通讯软件优点大全分享
- 广义线性模型和广义加法模型_广义线性模型代码