基于FPGA的以太网控制器设计
时间:07-28
来源:互联网
点击:
2.4 发送状态机模块(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三个状态。
3 MAC接收模块
MAC接收模块负责数据帧的接收。当外部PHY将通信信道的串行数据转换为半字节长的并行数据并发送给接收模块后,接收模块会将这些半字节数据转换为字节数据,然后经过地址识别、CRC校验、长度判断等操作后,再通过主机接口写入外部存储器,并在主机接口模块的接收队列中记录帧的相关信息。此外,接收模块还负责前序码和CRC的移除。
接收模块由CRC校验模块、地址识别模块、接收计数器模块和接收状态机模块等四部分组成。
接收模块中的CRC校验模块可通过检查输入帧的CRC值来验证帧的正确性。其算法与CRC生成模块相同。
地址识别模块用于决定是否接收收到的帧,接收模块首先接收输入帧而不管目的地址,随后由地址识别模块检查帧中的目的地址。若MAC被设置为混杂模式(Promiscuous mode)且目的地址为广播地址,同时允许接收广播帧,帧则被接收。否则,帧被丢弃。
接收计数器模块由字节计数器(Bytecnt)和帧间间隙计数器(IFGcnt)组成。字节计数器在接收帧过程中将对字节进行计数,以用于识别帧中的各个字段(前序码、目的地址字段、数据、FCS等)以及判断超长帧。帧间间隙计数器则对两帧之间的间隔时间进行计数,以用于判断下一帧数据的开始。IEEE 802.3规定,两帧之间的间隔至少必须为96个比特时间(10 Mbps中为9 600ns,100 Mbps中为960 ns)。如果两帧之间的间隔小于要求,帧将被丢弃。
接收状态机为接收模块的核心,用于控制整个接收过程。接收状态机由Idle_State、Drop_State、Preamble_State、 SFD_State、 Da-ta0_State、Data1_State等六个状态组成。
系统复位后,状态机处于Drop_State。如果此时MII的数据有效信号(MRxDV)无效,状态机马上进入Idle_State状态,并一直处于Idle等待接收输入帧。
当接收模块检测到数据有效信号之后,状态机将进入Preamble_State,并开始接收前序码。此后再状态机进入SFD_State,接收一个字节的帧起始定界符,之后,根据IFGcnt计数器的值进入不同的状态。如果,IFGcnt所确定的时间大于96个比特时间,状态机将进入Data0状态以接收字节的低4位,然后是Data1状态,并接收字节的高4位,之后又回到Data0状态。状态机就一直在这两个状态之间循环,直到数据接收完毕(PHY清除MRxDV信号)后进入Idle,以重新等待接收新的数据;如果接收到帧起始定界符时,IFGcnt计数器所确定的时间小于96个比特时间,那么状态机将进入Drop_State状态,并一直维持该状态直到数据有效信号结束(PHY清除MRxDV信号)。之后,状态机再同到Idle等待接收新的数据。
如果在接收前序码、帧起始定界符和数据期间,数据有效信号被清除,那么,状态机将回到Idle。
发送状态机模块是整个发送模块的核心,主要用于控制整个发送过程。发送状态机由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三个状态。
3 MAC接收模块
MAC接收模块负责数据帧的接收。当外部PHY将通信信道的串行数据转换为半字节长的并行数据并发送给接收模块后,接收模块会将这些半字节数据转换为字节数据,然后经过地址识别、CRC校验、长度判断等操作后,再通过主机接口写入外部存储器,并在主机接口模块的接收队列中记录帧的相关信息。此外,接收模块还负责前序码和CRC的移除。
接收模块由CRC校验模块、地址识别模块、接收计数器模块和接收状态机模块等四部分组成。
接收模块中的CRC校验模块可通过检查输入帧的CRC值来验证帧的正确性。其算法与CRC生成模块相同。
地址识别模块用于决定是否接收收到的帧,接收模块首先接收输入帧而不管目的地址,随后由地址识别模块检查帧中的目的地址。若MAC被设置为混杂模式(Promiscuous mode)且目的地址为广播地址,同时允许接收广播帧,帧则被接收。否则,帧被丢弃。
接收计数器模块由字节计数器(Bytecnt)和帧间间隙计数器(IFGcnt)组成。字节计数器在接收帧过程中将对字节进行计数,以用于识别帧中的各个字段(前序码、目的地址字段、数据、FCS等)以及判断超长帧。帧间间隙计数器则对两帧之间的间隔时间进行计数,以用于判断下一帧数据的开始。IEEE 802.3规定,两帧之间的间隔至少必须为96个比特时间(10 Mbps中为9 600ns,100 Mbps中为960 ns)。如果两帧之间的间隔小于要求,帧将被丢弃。
接收状态机为接收模块的核心,用于控制整个接收过程。接收状态机由Idle_State、Drop_State、Preamble_State、 SFD_State、 Da-ta0_State、Data1_State等六个状态组成。
系统复位后,状态机处于Drop_State。如果此时MII的数据有效信号(MRxDV)无效,状态机马上进入Idle_State状态,并一直处于Idle等待接收输入帧。
当接收模块检测到数据有效信号之后,状态机将进入Preamble_State,并开始接收前序码。此后再状态机进入SFD_State,接收一个字节的帧起始定界符,之后,根据IFGcnt计数器的值进入不同的状态。如果,IFGcnt所确定的时间大于96个比特时间,状态机将进入Data0状态以接收字节的低4位,然后是Data1状态,并接收字节的高4位,之后又回到Data0状态。状态机就一直在这两个状态之间循环,直到数据接收完毕(PHY清除MRxDV信号)后进入Idle,以重新等待接收新的数据;如果接收到帧起始定界符时,IFGcnt计数器所确定的时间小于96个比特时间,那么状态机将进入Drop_State状态,并一直维持该状态直到数据有效信号结束(PHY清除MRxDV信号)。之后,状态机再同到Idle等待接收新的数据。
如果在接收前序码、帧起始定界符和数据期间,数据有效信号被清除,那么,状态机将回到Idle。
嵌入式 FPGA Verilog Altera Quartus Mentor ModelSim 仿真 相关文章:
- 基于FPGA的片上系统的无线保密通信终端(02-16)
- 基于Virtex-5 FPGA设计Gbps无线通信基站(05-12)
- 基于FPGA的DVI/HDMI接口实现(05-13)
- 基于ARM的嵌入式系统中从串配置FPGA的实现(06-09)
- FPGA按键模式的研究与设计(03-24)
- 周立功:如何兼顾学习ARM与FPGA(05-23)