您一旦能用好那一个IP核,  在动用IP核传输数据以前要对MAC层功用有个掌握

  本文设计思路源自明德扬至简设计法。在头里的几篇博文中,由于设计比较简单,全体的成效都以用verilogHDL代码编写达成的。大家要学会站在一代天骄的肩头上,那时候就该IP核登台了!

  在此之前在动用Altera的三速以太网MAC
IP的根底上,达成了UDP公约数据传输。此番为了将规划移植到xilinx
FPGA上,须要动用xilinx的三速以太网MAC
IP核,当然也足以友善用HDL编写,但必得对数码链路层协议有极其明显的认知。以下是在采纳xilinx
三速以太网MAC进度中的一些记下和总计。

  说白了,IP核便是旁人做好了的硬件模块,提供全体的客户接口和表明文书档案,更扑朔迷离的还或者有示例工程,你假若能用好那几个IP核,设计已经达成四分之二了。聊起来轻巧,从冗长的俄语文书档案和英特网种种非标准教程中吸收所需,并灵活运用依然需求下一番武功的。

  在利用IP核传输数据在此以前要对MAC层成效有个精晓。MAC层成成效一个词总结正是“成帧解帧”,具体来说TX方向对客户侧发送来的MAC帧增加前导码和帧尾校验和,对长度过短帧会在帧尾填充0直至最小帧长,其它流控模块能够依照须要发送pause帧。XC60X方向过滤掉不符合标准的数据帧并移除填充域,独有目的MAC地址与自身相符且帧尾校验和不易的数目帧才为有效数据帧,去除前导码和校验域后即发送给客商侧。接收端也会基于或然接受的pause帧做出暂停发送管理。

  作者觉着当中最重要的几点如下:

  认知以太网帧结构同样十一分首要,近期大范围的是Ethernet
II和IEEE802.3二种格式,总体能够归纳为:指标MAC地址  源MAC地址  长度/类型  有效载荷  帧校验,长度依次是6byte、6byte、2byte、46~1500byte、4byte。差距在于Ethernet
II帧长度/类型域解释为上层公约项目,而IEEE802.3同样地点是长度字段。区分两个的正规化是:当该字段值小于等于1500(十六进制的0x05DC)时,为IEEE802.3格式;当字段值大于等于1536(或许十六进制的0x0600)时,帧使用的是Ethernet
II格式。在那之中Ethernet II最为普及。

  1)
提须求IP核准确的挂钟和复位条件;

  IP核的安排很轻巧,依据自身的需要设置就可以。重视关怀第二页,这里选用使用土霉素II作为物理层接口,并接纳三速方式,能够因而接口改变传输速率。公海赌船网址 1

  2) 显明各种首要顾客接口功效;

  IP核配置生成输出文件后,和其余较为复杂的IP核同样要熟读文书档案和剖析example
design的结商谈意义。资料首要参照PG051.大家一向展开example
design顶层文件对工程有个总体的认知:

  3) 驾驭所需指令的操作时序;

//    --------------------------------------------------//    | EXAMPLE DESIGN WRAPPER                         |//    |                                                |//    |                                                |//    |   -------------------     -------------------  |//    |   |                 |     |                 |  |//    |   |    Clocking     |     |     Resets      |  |//    |   |                 |     |                 |  |//    |   -------------------     -------------------  |//    |           -------------------------------------|//    |           |FIFO BLOCK WRAPPER                  |//    |           |                                    |//    |           |                                    |//    |           |              ----------------------|//    |           |              | SUPPORT LEVEL       |//    | --------  |              |                     |//    | |      |  |              |                     |//    | | AXI  |->|------------->|                     |//    | | LITE |  |              |                     |//    | |  SM  |  |              |                     |//    | |      |<-|<-------------|                     |//    | |      |  |              |                     |//    | --------  |              |                     |//    |           |              |                     |//    | --------  |  ----------  |                     |//    | |      |  |  |        |  |                     |//    | |      |->|->|        |->|                     |//    | | PAT  |  |  |        |  |                     |//    | | GEN  |  |  |        |  |                     |//    | |(ADDR |  |  |  AXI-S |  |                     |//    | | SWAP)|  |  |  FIFO  |  |                     |//    | |      |  |  |        |  |                     |//    | |      |  |  |        |  |                     |//    | |      |  |  |        |  |                     |//    | |      |<-|<-|        |<-|                     |//    | |      |  |  |        |  |                     |//    | --------  |  ----------  |                     |//    |           |              |                     |//    |           |              ----------------------|//    |           -------------------------------------|//    --------------------------------------------------//------------------------------------------------------

  4)
知道个中寄存器地址及成效和布署情势、顺序;

  上边是官方提供的笺注,极度清晰地交给了工程结构:

  5)
会从官方示例工程中学会IP核准确运用办法;

example_clocks:     石英钟模块,提供工程中用到的持有时钟频域信号;

  今日来说讲一个最常用的IP核,FIFO。能够说它是FPGA能那样灵活管理数据的底蕴,常用于异步挂钟域管理、位宽转换以及要求多少缓存的场子。先来证明下,对于初学者和刚接触三个IP核的人来讲,不要过度关切IP核的每二个参数和机能,更没须要知道里面包车型地铁实际组织和专门的学问规律(还没忘在此之前使用的ILA吧,反正小编是不知晓具体怎么设计出来的)只需调整最常用的和最根本的,把IP核用起来就水到渠成了。先从生成IP核起首吧:

example_resets:     重新初始化模块,发生全部子模块的重新恢复设置确定性信号;

公海赌船网址 2

axi_lite_controller:    调整模块,内部通过情形机对MAC和PHY芯片举行早先化和对应安顿职业。

  配置向导中首先页中是挑选FIFO的接口形式和促成情势。这里大家用原始的接口格局。箭头处是兑现格局,假若须要异步挂钟域处理选拔读写独即小时方式。

basic_pat_gen_inst:
包测验模块,有三种形式:发送定位样式测量检验数据包和将选用数量包环回送出给PHY。

公海赌船网址 3

trimac_fifo_block:  
AXI-S接口异步FIFO和MAC IP核。

  第二页中供给极度重申的是读格局的选用。其实这里的First
Word Fall Through对应的就是Altera FPGA中FIFO IP核读格局中的Show
ahead形式嘛,换个名字而已。那些读形式的本性是在读使能有效此前,即把FIFO中第二个数据从读数据端口不断送出。在这种格局下,读使能时域信号倒疑似“读清”非数字信号,把上三回的多寡清除掉,让FIFO送出下几个数据。那样做的处是符合dout
和dout_vld匹合作的输出非频限信号情势。

  MAC
IP核包蕴的要紧接口类型及功效是:

公海赌船网址 4

克林霉素II接口–PHY数据通道    MDIO接口–PHY晶片配置管理    AXI-Stream接口–顾客数据通道    AXI-Lite接口–顾客调控管理

  第三页是安插部分可选的标记位,能够依靠需求灵活完毕部分标记位和抓手个性(笔者是一直没用过)。

  早先须要领会的是顾客数量接口,实际上AXI-Stream也不须要过多关切,只要精晓FIFO客商侧接口就可以。以发送方向为例:

公海赌船网址 5

公海赌船网址 6

  第四页可选FIFO内缓存数据量计数器,由于自家起来选用的是异步FIFO格局,所以此处有五个计数器分别与读侧和写侧时钟上涨沿同步。注意一点:那多少个计数器均表示FIFO缓存数据量,只不过在机械钟上稍微偏差,切不可错误精通为是写入了或然读出了有一点点个数据。

  tx_axis_fifo_tdata
8位数据,tx_axis_fifo_tvalid 数据有效提示,tx_axis_fifo_tready
MAC发送希图时域信号,tx_axis_fifo_tlast
数据包尾提示。接下来使用示例工程的testbench查看仿真波形,对顾客接口时序有三个直观的认知。官方testbench
demo_tb文件中会持续分别以10M 100M 一千M速率向example design
HighlanderX方向博来霉素II端口发送5个不等数据帧。先来看千兆网波形,在千兆方式下TX石英钟为由FPGA提供的125MHz信号gtx_clk_bufg,RX挂钟由PHY通过石英钟恢复生机获得125MHz石英钟非确定性信号。

公海赌船网址 7

公海赌船网址 8

  最后计算页,把前面包车型大巴参数和配置汇总下。没非常能够点击OK了!

  数据的流向为:gmii_rx_xx –>
rx_axis_mac_xx –> rx_axis_fifo_xx –> tx_axis_fifo_xx
–> tx_axis_mac_xx –> gmii_tx_xx。此时example
design中basic_pat_gen_inst模块设置为环回方式,会将MAC接收的数目环回到发送通道。由于第四个帧错误提醒时限信号gmii_rx_er拉高,而第5个帧MAC地址不合作,由此那四个数据帧被滤除掉。

  IP核生成好了,接下去要精确用起来。大家把以太网接口数据传输作为案例背景,日常来讲是FPGA逻辑+MAC
IP核+外界PHY集成电路的架构。若想让MAC
IP核正确接受待发送数据,供给将数据进行封包并到场MAC尾部音讯。

公海赌船网址 9

公海赌船网址 10

  上海体育场所来看第五个数据帧带有错误提醒非非确定性信号,FIFO模块才会将其遗弃。第七个数据包MAC地址不符,在MAC核内部被舍弃。以第多个数据包为例观望时序:

  为简化设计,先只怀想对封包后数据加多MAC底部的效果与利益,也便是说此时输入的多少就是长度符合以太网标准,且独具数据包格式的多寡。由于在数码部分输出前加额外的音讯,所以先要缓存输入的数量直到MAC头输出实现再将写入数据发送出来,因而必要用FIFO缓存数据。进一步解析,经过封包后的数码格式如下:

公海赌船网址 11

公海赌船网址 12

  包尾提醒和数量在MAC核收到FCS并检查评定结束后才输出有效。

  当中sop和eop分别是扬州,包尾提醒复信号,data_vld是多少有效提醒连续信号。由于数量位宽此处是三拾二个人,而数据的蝇头单元是字节,所以每一个三十二人数据不明确带有4个字节有效数据,使用data_mod提醒出无效字节数。为了让该模块输出端知道曾几何时输出完八个数据包,要把eop数字信号和数据连续信号拼接写入FIFO中,那样输出端发出eop时步向新一轮循环。要是依照写入sop确定性信号来作为初叶发送MAC底部和数目部分的申明,试想当三个短包紧跟着叁个长包写进FIFO中时,输出放正在送出上一长包剩下的多少个数据,无法响应短包的sop非确定性信号提醒,那么短包即被“扬弃”了。为了防止丢包现象,须要满意“读写隔绝法规”,即FIFO读操作和写操作两个不可能依赖一方的气象来调整另一方的行为。进一步引出“双FIFO架构”,使用数据FIFO缓存数据,而音信FIFO保留提醒音信,那样讲写侧的指令非能量信号写入新闻FIFO中,数据FIFO能够依靠消息FIFO读侧的新闻来推断读的表现,也就满意了读写隔绝准绳。

公海赌船网址 13

公海赌船网址 14

  该帧目标MAC地址是48’hda_02_03_04_05_06
源MAC地址是48’h5a_02_03_04_05_06
长度/类型域是16’h00_03,由此是解释为帧长度为3字节,负荷是01 02
03。环回后目标MAC地址和源MAC地址被basic_pat_gen_inst模块交流,TX方向顾客数量包为:

  在该模块中,能够在写侧现身sop能量信号时写入音讯FIFO一个提醒音讯,所以当新闻FIFO非空即表示有叁个数据包正在进入,此时出殡MAC头消息,随之读取数据FIFO中缓存数据,当读侧出现eop功率信号则读清新闻FIFO,循环往复完成了增加尾部消息的干活。

公海赌船网址 15

  MAC头部音讯为14字节,而数据位宽是三十一个人,即一遍发送五个字节,所以一定于尾部为多个四分之一目。因而在出殡和埋葬第八个底部数据时,低贰12位要用数据部分填充,前面包车型地铁数码也要随之移动。如此移位操作后,数据部分就晚了一拍输出最终15个人。如果最后那13个人数据中有有效字节,那么mac_data_vld当前节奏也要有效,且mac_data_eop和mac_data_mod跟着晚一拍输出;假使无有效字节,则依照常规境况输出。在代码中笔者使用end_公海赌船网址,normal和end_lag时限信号来分裂上述二种状态。必要非常注意的是,在活动操作后数据包中满含的不算字节个数也会产生变化。为了理清思绪和时序,画出大旨非实信号时序图:

  我们看下MAC核TX方向实际的顾客接口时序,FIFO模块屏蔽了顾客侧与MAC核之间的拉手应答机制,缓存至少三个多少帧即开首数据传输,进而简化了接口时序。

公海赌船网址 16

公海赌船网址 17

公海赌船网址 18

  当数码发送到物理层接口,由于数量包小于最小长度,因而发送到gmii接口上海重机厂复被填充至最小帧长。另外丰盛上前导码和校验和。

 

公海赌船网址 19

 

  再来看看百兆网,速率为100M时TX和瑞鹰X方向挂钟复信号均由PHY微电路提供。第四数据帧TX方向客商接口波形:

 

公海赌船网址 20

 

  FIFO提供的客商侧接口时序上与千兆网未有距离,石英钟频率是125MHz,位宽依旧是8bit,那么又是何许兑现百兆速率的啊?

 

公海赌船网址 21

   

  MAC核客户接口机械钟为25MHz,位宽为8bit,MAC核提供的tready确定性信号每两周期拉高七日期,速率为25M*8/2

100M,因此100M速率是经过tready时域信号限流完结的。综上,对100M和一千M速率下全双工以太网概念和帧结构、MAC
IP核配置以及着力顾客接口时序成效均举行了演讲,本人也在上学中,希望对我们有帮助。

 

 

 

 

 

 

 

 

 

 

 

 

 

  有了花色须求,设计思路后鲜明模块接口列表:

 公海赌船网址 22

 

  初步编写制定代码了:

  1 `timescale 1ns / 1ps
  2 
  3 module add_mac_head(
  4     input clk,
  5     input rst_n,
  6     input [31:0] app_data,
  7     input app_data_vld,
  8     input app_data_sop,
  9     input app_data_eop,
 10     input [1:0] app_data_mod,//无效字节数
 11 
 12     input mac_tx_rdy,//MAC IP发送准备就绪信号
 13     output reg [31:0] mac_data,
 14     output reg mac_data_vld,
 15     output reg mac_data_sop,
 16     output reg mac_data_eop,
 17     output reg [1:0] mac_data_mod
 18     );
 19     
 20     reg [34:0] wdata;
 21     reg wrreq,rdreq;
 22     reg wdata_xx;
 23     reg wrreq_xx,rdreq_xx;
 24     reg [1:0] head_cnt;
 25     reg head_flag,head_tmp,rd_flag,rd_flag_tmp;
 26     reg [34:0] q_tmp;
 27     
 28     wire [31:0] data_shift;
 29     wire add_head_cnt,end_head_cnt;
 30     wire head_neg;
 31     wire [34:0] q;
 32     wire rdempty_xx;
 33     wire sop_in;
 34     wire [2:0] head_len;
 35     wire [111:0] mac_head;
 36     wire [47:0] des_mac,sour_mac;
 37     wire [15:0] pack_type;
 38     wire rd_neg;
 39     
 40     fifo_generator_0 fifo_data (
 41   .clk(clk),      // input wire clk
 42   .din(wdata),      // input wire [34 : 0] din
 43   .wr_en(wrreq),  // input wire wr_en
 44   .rd_en(rdreq),  // input wire rd_en
 45   .dout(q),    // output wire [34 : 0] dout
 46   .full(),    // output wire full
 47   .empty()  // output wire empty
 48 );
 49 
 50     fifo_generator_1 fifo_message (
 51   .clk(clk),      // input wire clk
 52   .din(wdata_xx),      // input wire [0 : 0] din
 53   .wr_en(wrreq_xx),  // input wire wr_en
 54   .rd_en(rdreq_xx),  // input wire rd_en
 55   .dout(),    // output wire [0 : 0] dout
 56   .full(),    // output wire full
 57   .empty(rdempty_xx)  // output wire empty
 58 );
 59     
 60     //数据fifo写数据
 61     always@(posedge clk or negedge rst_n)begin
 62         if(!rst_n)
 63             wdata <= 0;
 64         else if(app_data_vld)    
 65             wdata <= {app_data_eop,app_data_mod,app_data};
 66     end
 67     
 68     always@(posedge clk or negedge rst_n)begin
 69         if(!rst_n)
 70             wrreq <= 0;
 71         else if(app_data_vld)
 72             wrreq <= 1;
 73         else 
 74             wrreq <= 0;
 75     end
 76     
 77     always@(posedge clk or negedge rst_n)begin
 78         if(!rst_n)
 79             wdata_xx <= 0;
 80         else if(sop_in)
 81             wdata_xx <= 1;
 82         else 
 83             wdata_xx <= 0;
 84     end
 85     
 86     assign sop_in = app_data_vld && app_data_sop;
 87     
 88     //当写侧出现sop时表明有一个数据包正在写入,此时写信息FIFO任意数据告知读侧开始发送MAC头部信息
 89     always@(posedge clk or negedge rst_n)begin
 90         if(!rst_n)
 91             wrreq_xx <= 0;
 92         else if(sop_in)
 93             wrreq_xx <= 1;
 94         else 
 95             wrreq_xx <= 0;
 96     end
 97     
 98     //MAC头部有14个字节 数据位宽是32位,即一个数据4个字节,需要发送4个数据(最后一个数据只有2个字节是头部)
 99     always@(posedge clk or negedge rst_n)begin
100         if(!rst_n)
101             head_cnt <= 0;
102         else if(add_head_cnt)begin
103             if(end_head_cnt)
104                 head_cnt <= 0;
105             else 
106                 head_cnt <= head_cnt + 1'b1;
107         end
108     end
109     
110     assign add_head_cnt = head_flag && mac_tx_rdy;
111     assign end_head_cnt = add_head_cnt && head_cnt == head_len - 1 - 1;
112     assign head_len = 4;
113     
114     //发送MAC头部标志位
115     always@(posedge clk or negedge rst_n)begin
116         if(!rst_n)
117             head_flag <= 0;
118         else if(end_head_cnt)
119             head_flag <= 0;
120         else if(!rdempty_xx && !rd_flag)
121             head_flag <= 1;
122     end
123     
124     //读数据FIFO标志位
125     always@(posedge clk or negedge rst_n)begin
126         if(!rst_n)
127             rd_flag <= 0;
128         else if(end_head_cnt)
129             rd_flag <= 1;
130         else if(rd_eop)
131             rd_flag <= 0;
132     end
133     
134     assign rd_eop = rdreq && q[34];
135     
136     always@(*)begin
137         if(rd_flag && mac_tx_rdy)
138             rdreq <= 1;
139         else
140             rdreq <= 0;
141     end
142     
143     //读侧出现eop读取完整版报文,此时读清信息FIFO
144     always@(*)begin
145         if(rd_eop)
146             rdreq_xx <= 1;
147         else
148             rdreq_xx <= 0;
149     end
150     
151     //寄存头部标志位找出下降沿
152     always@(posedge clk or negedge rst_n)begin
153         if(!rst_n)
154             head_tmp <= 0;
155         else 
156             head_tmp <= head_flag;
157     end
158     
159     assign head_neg = head_flag == 0 && head_tmp == 1;
160     
161     //寄存q用于移位操作
162     always@(posedge clk or negedge rst_n)begin
163         if(!rst_n)
164             q_tmp <= 0;
165         else 
166             q_tmp <= q;
167     end
168     
169     assign data_shift = {q_tmp[15:0],q[31:16]};
170     
171     //MAC头 14字节
172     assign mac_head  = {des_mac,sour_mac,pack_type};
173     assign des_mac        = 48'hD0_17_C2_00_E5_40  ;//目的MAC PC网卡物理地址
174     assign sour_mac       = 48'h01_02_03_04_05_06  ;//源MAC地址为01_02_03_04_05_06
175     assign pack_type      = 16'h0800               ;//IP数据报
176     
177     always@(posedge clk or negedge rst_n)begin
178         if(!rst_n)
179             rd_flag_tmp <= 0;
180         else 
181             rd_flag_tmp <= rd_flag;
182     end
183     
184     assign rd_neg = rd_flag == 0 && rd_flag_tmp == 1;
185     
186     //数据输出
187     always@(posedge clk or negedge rst_n)begin
188         if(!rst_n)
189             mac_data_sop <= 0;
190         else if(add_head_cnt && head_cnt == 0)
191             mac_data_sop <= 1;
192         else 
193             mac_data_sop <= 0;
194     end
195     
196     always@(posedge clk or negedge rst_n)begin
197         if(!rst_n)
198             mac_data_eop <= 0;
199         else if(end_normal || end_lag)
200             mac_data_eop <= 1;
201         else 
202             mac_data_eop <= 0;
203     end
204     
205     assign end_normal = rd_eop && q[33:32]      > 2'd1;
206     assign end_lag    = rd_neg && q_tmp[33:32] <= 2'd1;
207     
208     always@(posedge clk or negedge rst_n)begin
209         if(!rst_n)
210             mac_data <= 0;
211         else if(add_head_cnt)//由于MAC不是32位数据的整数倍,需要对数据进行移位
212             mac_data <= mac_head[111 - head_cnt*32 -: 32];
213         else if(head_neg)
214             mac_data <= {mac_head[15:0],q[31:16]};
215         else 
216             mac_data <= data_shift;
217     end
218     
219     always@(posedge clk or negedge rst_n)begin
220         if(!rst_n)
221             mac_data_vld <= 0;
222         else if(head_flag || rd_flag || end_lag)
223             mac_data_vld <= 1;
224         else 
225             mac_data_vld <= 0;
226     end
227     
228     //输出无效字节个数 由于输出端进行了数据移位,导致无效数据个数发生变化
229     always@(posedge clk or negedge rst_n)begin
230         if(!rst_n)
231             mac_data_mod <= 0;
232         else if(end_normal)
233             mac_data_mod <= q[33:32] - 2;
234         else if(end_lag && q_tmp[33:32] == 2'd1)
235             mac_data_mod <= 1;
236         else if(end_lag && q_tmp[33:32] == 0)
237             mac_data_mod <= 2;
238         else 
239             mac_data_mod <= 0;
240     end
241     
242 endmodule

 编写测验激励验证功能:

 1 `timescale 1ns / 1ps
 2 
 3 module add_mac_head_tb;
 4 
 5     
 6     reg clk,rst_n;
 7     reg [31:0] app_data;
 8     reg app_data_sop,app_data_eop,app_data_vld;
 9     reg [1:0] app_data_mod;
10     reg mac_tx_rdy;
11     
12     wire [31:0] mac_data;
13     wire mac_data_vld,mac_data_sop,mac_data_eop;
14     wire [1:0] mac_data_mod;
15 
16     add_mac_head add_mac_head(
17     .clk(clk),
18     .rst_n(rst_n),
19     .app_data(app_data),
20     .app_data_vld(app_data_vld),
21     .app_data_sop(app_data_sop),
22     .app_data_eop(app_data_eop),
23     .app_data_mod(app_data_mod),//无效字节数
24 
25     .mac_tx_rdy(mac_tx_rdy),//MAC IP发送准备就绪信号
26     .mac_data(mac_data),
27     .mac_data_vld(mac_data_vld),
28     .mac_data_sop(mac_data_sop),
29     .mac_data_eop(mac_data_eop),
30     .mac_data_mod(mac_data_mod)
31     );
32     
33     parameter CYC = 5,
34               RST_TIME = 2;
35               
36     integer i;
37               
38     initial begin
39         clk = 1;
40         forever #(CYC / 2.0) clk = ~clk;
41     end
42     
43     initial begin
44         rst_n = 1;
45         #1;
46         rst_n = 0;
47         #(CYC*RST_TIME);
48         rst_n = 1;
49     end
50     
51     initial begin
52         #1;
53         app_data = 0;
54         app_data_sop = 0;
55         app_data_eop = 0;
56         app_data_mod = 0;
57         app_data_vld = 0;
58         mac_tx_rdy = 1;
59         #(CYC*RST_TIME);
60         packet_gen(10,0);
61         packet_gen(5,0);
62         packet_gen(15,2);
63         #1000;
64         $stop;
65     end
66     
67     task packet_gen;
68         input [15:0] length;
69         input [1:0] invld_num;
70         begin
71             app_data_vld = 1;
72             app_data_sop = 1;
73             app_data = 32'h01020300;
74             for(i = 0;i < length;i = i + 1'b1)begin
75                 if(i == 1)
76                     app_data_sop = 0;
77                 else if(i == length - 1)begin
78                     app_data_mod = invld_num;
79                     app_data_eop = 1;
80                 end
81                 app_data = app_data +1'b1;
82                 #(CYC*1);
83             end
84             app_data_eop = 0;
85             app_data_vld = 0;
86             app_data_mod = 0;
87         end
88     endtask
89 
90 endmodule

   持续失败入四个长度分歧的报文,此处为了设计重用,用可参数化的task对鼓励报文举行打包。要求输入报文时只需调用packet_gen职务就能够兑现全数不一样尺寸,不相同无效字节个数的数据包。观望输出波形:

公海赌船网址 23

 mac侧输出四个包文数据如下:

公海赌船网址 24

 

 

 

公海赌船网址 25

公海赌船网址 26

 

 

 

   能够见到mac侧数据发送精确。本博文由于主要描述FIFO应用,这里只做出游为仿真,读者能够灵活运用,增加在自身的品类中。

相关文章