微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 硬件工程师文库 > 用FPGA实现MAC核所要完成的功能

用FPGA实现MAC核所要完成的功能

时间:02-11 来源:网络整理 点击:

MAC发送模块

  MAC发送模块可将上层协议提供的数据封装之后通过MII接口发送给PHY。发送模块可接收主机接口模块的数据帧开始和数据帧结束标志,并通过 主机接口从外部存储器中读取要发送的数据,然后对数据进行封装,然后通过PHY提供的载波侦听和冲突检测信号,在信道空闲时通过MII接口将数据以4位的 宽度发送给PHY,最后由PHY将数据发送到网络上。
  发送模块由CRC生成模块(crc_gen)、随机数生成模块(random_gen)、发送计数模块(tx_cnt) 和发送状态机(tx_statem_模块等四个子模块组成。

CRC生成模块(crc_gen)

  该模块用于计算发送数据的CRC值,并将CRC值添加到数据帧的帧校验序列字段(FCS)内。为了提高效率,并考虑到MAC与PHY的数据通道 为4位,设计时可采用4位并行CRC计算方法,算法中可使用一个次态函数,并通过循环迭代来模拟移位操作。这样,发送模块就可以在边发送数据到PHY的同 时,一边计算CRC,这样当数据发送完时,CRC值也计算完成了。

随机数生成模块(random_gen)

  如在发送过程中检测到冲突,发送模块就先发送拥塞码(jam),随后停止发送。在下次重新发送之前,发送模块会先执行一个后退 (backoff)操作,即发送模块等待一个半随机(生成的随机数有范围限制)的时间之后再开始发送。该随机数就是由随机数生成模块产生的,它采用经典的 截断二元指数后退算法,后退的时间是一个与发生冲突次数有关的随机数,随着冲突的次数增多,用于生成该随机数的范同也将逐渐增大,以减少冲突的概率。

发送计数模块(tx_cnt)

  发送计数模块由半字节计数器(nibcnt)、字节计数器和重试次数计数器(retrycnt)三个计数器组成。其中重试次数计数器 (retrycnt)可对发送某个帧时产生冲突次数进行计数。当计数器的值达到最大重试次数时,它将放弃重试,并丢弃发送缓冲器内的数据。同时,重试计数 器的值还被随机数生成模块用于计算下次重试之前需要后退(backoff)的时隙的个数。
  半字节计数器和字节计数器分别用于对发送过程中的半字节(bibble)和字节进行计数。
  信道忙时,发送模块会一直等待,半字节计算器一直计数。当计数到额定等待时间时(最大帧长度的两倍,即3036字节时间),系统会根据设置放弃 发送或是一直等待(可选功能)。一旦信道空闲再进入帧间间隙周期(≥96个比特时间),南半字节计数器从零开始计数。帧间间隙分为两个部分,在前2/3个 周期中,如果检测到信道忙信号,则半字节计数器复位,发送模块重新开始等待;在后l/3周期中,即使检测到信道忙信号,半字节计数器也不会复位,而是继续 计数,以保证每个站点公平的竞争信道。而当半字节计数器的值达到帧问间隙周期时,此时如果有数据等待发送,发送模块就开始发送数据。此外,半字节计算器还 用于前序码的生成和短帧的判断,在数据帧的长度小于最小帧时,发送模块必须根据系统设置进行填充或不填充。
  字节计算器还可用于滞后冲突(late collision)和超长帧的判断。当滞后冲突发生时,正在发送的数据将被丢弃。超长帧的判断则是从对帧内容(包括FCS)进行字节计数,如果字节计数 器的值大于最大有效帧的长度(1518个字节),发送模块就根据系统设置(是否支持超长帧)丢弃或发送。

发送状态机模块(tx_statem)

  发送状态机模块是整个发送模块的核心,主要用于控制整个发送过程。发送状态机由I-die_State、Preamble_State、 Data0_State、 Da-tal_State、 PAD_State、 FCS_State、 IPG_State、Jam_State、BackOff_State、Defer_State等十个状态组成。
  系统复位后,发送模块即进入Defer_State状态,并一直检测载波侦听(CarrierSense)信号。当载波侦听信号变成无效(表示 信道空闲)时,状态机进人IPG_State状态。尔后,在等待一个帧间间隙之后,状态机则进入Idle_State状态。如果在帧间间隙的前2/3个周 期检测到信道忙信号,状态机将重新回到Defer_State状态。
  状态机进入Idle_State状态之后,发送模块将检测载波侦听信号和主机接口的发送请求。若主机模块请求发送,状态机将进入 Preamble_State状态,发送模块即通知PHY发送开始,同时开始发送前序码(7个0x5),然后发送帧起始定界符(SFD,0xd)。状态机 进入Data0_State后,发送模块将发送一个数据字节的低4位(LSB nibble),将当其进入Data1_State状态后,发送模块则发送数据字节的高4位(MSB nibble)。随后,状态机一直在data0和data1之间循环,直到数据发送完毕。当还剩一个字节时,主机模块将通过发送帧结束信号来通知发送模 块。如果数据帧的长度大于最小帧并且小于最大帧,状态机就进入FCS_State状态,此时发送模块则将CRC生成模块生成的CRC值添加到帧的FCS字 段中并发送给PHY。帧发送完之后,状态机进入Defer_State状态,之后是IPG_State和Idle_State状态。此后状态机又回到初始 状态,以重新等待新的发送请求。
  如果数据帧的长度小于最短帧,状态机就进入PAD_State状态,发送模块根据系统设置是否在数据之后来添加填充码。然后,状态机进入 FCS_State状态。如果数据帧的长度大于最大帧,而系统设置又支持发送超长帧,那么,状态机就进入FCS_State状态;如果不支持发送超长帧, 发送模块将放弃发送,状态机直接进入Defer状态,然后是IPG状态,最后回到Idle状态。
  在发送数据的过程中,发送模块会一直检查冲突检测信号(collision detected)。如果发现冲突且状态机正处于Preamble_State,状态机将在发送完前序码和SFD之后进入Jam_State,并发送拥塞 码,然后进入BackOff状态,以等待重试。之后,状态机经过Defer和IPG回到Idle状态。如果此时重试次数计数器的值没有达到额定值,发送模 块将重新开始发送刚才的帧,并将重试次数计数器的值加1;如果发现冲突且状态机处于data0、da-tal或FCS状态,而且没有超过冲突时间窗,那么 状态机将马上进入Jam状态发送拥塞码,之后经过BackOff、Defer、IPG、回到Idle,并根据重试计数器的值决定是否重新发送刚才的数据 帧;如果检测到发生冲突的时间超过了冲突时间窗,状态机将进入Defer状态,然后经过IPG到IDLE状态,并放弃重试。
  在全双工模式中发送帧时,不会进行延迟(defer),发送的过程中也不会产生冲突。此时,发送模块将忽略PHY的载波侦听和冲突检测信号。当 然,帧与帧之间仍然需遵守帧间间隙的规则。因此,全双工模式下的发送状态机没有Jam_State、。BackOff_State、 Defer_State三个状态。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top