实验背景
在(四)中介绍了Github开源项目verilog-ethernet的移植思路,以及对MII接口和数据链路层等功能的仿真,下面介绍数据的跨时钟域传输,以太网数据传输过程和网络层数据传输相关的移植。
实验内容
数据的跨时钟域传输处理,以太网数据传输过程和网络层数据传输模块介绍与仿真。
实验步骤
对于MII接口,tx_clk和rx_clk均由PHY芯片提供,且为25MHz,上层模块传输数据的时钟可能并不是25MHz,这就有跨时钟域的问题,解决数据跨时钟传输一般的解决方法是使用fifo,verilog-ethernet项目中使用的模块是axis_async_fifo_adapter.v。文件如下:
可以看到,有两个类似的模块,其中axis_async_fifo.v的输入和输出数据是等位宽,而axis_async_fifo_adapter.v模块的输入和输出数据位宽可以不等。
上层模块将数据输入到axis_async_fifo_adapter模块中进行跨时钟时钟处理后,再输出到eth_mac_mii模块中。对应的顶层模块如下:
RTL视图如下:
该模块端口分为axis_in, axis_out和mii接口,如下:
对该模块进行仿真,测试模块代码片段如下:
在参数设置中,设置位宽都为8,使能TX(RX)_FRAME_FIFO模式,这个模式的功能是,当axis上数据传输结束后,就开始将fifo中的数据发送出去。
其中系统时钟设置为50MHz,即上层数据以50MHz时钟传输到axis_async_fifo_adapter模块。
传输50字节的数据到axis_async_fifo_adapter中。
启动仿真,查看axis_async_fifo_adapter波形,
可以看到数据在50MHz(s_clk)时钟下写入数据,以25MHz(m_clk)时钟读出数据,且读出数据是写入完成后自动进行的,正是TX_FRAME_FIFO模式的体现。下面查看mii_tx有关的信号
可以观察到,前导码和帧分隔码正确,在传输完50字节数据后,填充数据使整个帧达到64字节。
至此,上层数据的跨时钟域处理完成,下面就是数据逐层据封装的过程,以太网包数据结构如下:
14字节的帧头信息,有效数据和帧校验码如下表所示
对于网络层,分为IP首部和有效数据(payload);传输层分为UDP首部和有效数据。首先看以太网帧头部和有效数据。对应模块如下:
该模块主要端口如下:
分为首部信号和有效数据信号,首部信号中要目的mac地址,源mac地址,type信息。
输出数据信号如下:
创建该模块(eth_axis_tx)与eth_mac_mii_fifo模块的顶层文件,如下:
例化eth_axis_tx模块
例化eth_mac_mii_fifo模块
RTL视图如下:
对该顶层模块(eth_axis_tx_top)进行仿真,测试文件如下:
时钟信号如下:
系统时钟50MHz, mii_tx传输时钟25MHz。
仿真过程分为两步,第一步传输帧头信息,第二步传输有效数据信息:
帧头信息如下:
目的mac地址:22_33_44_55_66_77
源mac地址:88_99_aa_bb_cc_dd
type信息为:16’h08_00,表示上层协议类型为IP协议。
有效数据为20字节的数据。eth_axis_tx模块的输入波形如下:
在输出端口,将头部信息和有效数据合并,波形如下:
数据传输到eth_mac_mii_fifo模块,数据在25MHz时钟下传输:
mac地址和type信息传输正确,波形如下:
数据填充功能正常,波形如下:
下面进行网络层封装的分析,网络层使用IP协议,IP首部如下:
改图摘自《Computer Networks》第五版,作者为Andrew S.Tanenbaum和DAVID J. WETHERALL,各字段的介绍可以参考这本书。对应的模块如下:
该模块端口信息如下:
这里看到IP首部信息和以太网帧头信息,创建顶层模块,如下:
对应的顶层模块RTL视图如下:
对该顶层模块进行仿真,仿真文件如下:
首先传输首部信息
再传输有效数据
如果需要修改IP地址,mac地址等信息,只要修改对应信号的值即可,启动仿真,查看首部信息和有效数据输入:
mii_tx输出如下:
以太网帧头信息波形如下:
IP首部信息波形如下:
有效数据如下:
填充数据如下:
至此,网络层数据封装过程分析完成,后面将介绍传输层数据传输过程,约束文件的编写,以及板级验证。