tag 标签: tse

相关博文
  • 热度 19
    2013-3-9 14:59
    3758 次阅读|
    4 个评论
    基于ARP请求和应答的TSE-MAC功能性验证          Qsys中集成了以太网MAC的IP核(姑且称它TSE-MAC),正所谓TSE(Triple Speed Ethernet),可以配置工作在10/100/1000Mbit的工作模式下。本文就要来试试它的功能性,自己动手,丰衣足食,搭个小系统,基本框图如下。   TSE-MAC中带了PHY芯片各个寄存器配置的MDIO接口控制逻辑,用户可以通过Avalon-MM总线相应的读写PHY芯片的寄存器。同时,MAC的一些配置寄存器也是通过Avalon-MM总线访问控制。因此,本系统也挂了个NIOS II上去,用于MAC初始化配置以及必要的PHY芯片控制。 其实大家最关注的应该是TSE MAC的数据流如何进行收发,既然是Altera的IP,那么自然要用到他们主打的Avalon-ST总线。RX和TX都有各自的Avalon-ST接口。本系统中,RX端连接到了一个256*8bit的onchip-RAM上,设计了一些逻辑,让Avalon-ST送出的数据自动的循环写入RAM中。通过JTAG接口,Quartus II中有个很实用的在线调试工具In-system Memory Content Editor可以实时的查看到当前RXRAM的所有数据情况。同样的,TX端也是连接到一个64*8bit的onchip-RAM上,也设计了一个简单的定时(2s多)发送功能,它自动读取TXRAM中的数据并通过Avalon-ST接口送往MAC,TXRAM中的数据也可以通过In-system Memory Content Editor在线写入。In-system Memory Content Editor真得是个很实用的小工具,大家在FPGA的调试和验证中可以非常灵活的使用它,力荐。          如图所示,这个仿真波形是发送端的Avalon-ST将TXRAM中存储的初始化帧数据发送给MAC。           我们后面希望通过发出一个ARP请求,然后看看PC端传回来的ARP应答,验证MAC的功能。先来简单的了解ARP请求的帧格式。            下面是我们写入到TXRAM中的一帧60Byte的ARP请求数据,正好可以对照上面给出的ARP帧请求定义。 //以太网首部(14Byte) 0000: ff ff ff ff ff ff                                 //目的主机为广播地址 0006: 00 1C 23 17 4A CB                  //源主机MAC地址为00-1C-23-17-4A-CB 000c: 08 06                                            //上层协议类型0x0806表示ARP //ARP请求(28Byte) 000e: 00 01                                           //硬件类型0x0001表示以太网 0010: 08 00                                           //协议类型0x0800表示IP协议 0012: 06 04                                           //MAC地址长度为6; IP地址长度为4 0014: 00 01                                           // op为0x0001表示请求目的主机的MAC地址 0016: 00 1C 23 17 4A CB                  //源主机MAC地址为00-1C-23-17-4A-CB 001c: c0 a8 01 69                                 //源主机IP地址(192.168.1.105) 0020: 00 00 00 00 00 00                   //目的主机MAC地址未知,全0待填写 0026: c0 a8 01 64                                //目的主机的IP地址(192.168.1.100) //填充数据(18Byte)填充aoc c0 a8 01 000 002c: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 003c: 00 00          目的主机便是我们的PC,它的MAC地址和IP地址都不是瞎编的,在目标PC的cmd中敲击“ipconfig /all”命令,如图所示。我们可以看到这个目标主机的MAC地址为2C-27-D7-1F-1D-E1,IP地址为192.168.1.100。假设我们只知道目的主机的IP地址,而不知道MAC地址,那么上面的ARP请求中就给出目的主机的IP地址,但使用广播MAC地址进行寻址。理论上,目的主机在接收到对他的ARP请求后,会产生一个ARP应答帧给源主机,实际是否如此,随后我们便可验证。            下一步,该连接的连接,该下载的下载,该运行的运行……在一切就绪之后,我们打开In-system Memory Content Editor,确认发送端RAM的数据是ARP请求帧,接着让它运转起来,如图所示,下面是TXRAM的ARP请求帧数据,上面是256Bytes的RXRAM,已经不断的收到了目的主机发回来的ARP应答了。有兴趣大家可以自己对照ARP应答帧格式的一些细节,这果然是一个非常“理想化”的应答帧(简直是废话,否则咱的IP如何正常收发啊?)。            回到目标PC,我们再来输入一个命令“arp -a”,此时,我们看到发出ARP请求的源主机已经出现在了它的动态列表中了,而且IP和MAC别无二致。            最后,我们再借助一个抓包工具解析下FPGA发过来的ARP请求帧。如下图所示。            简单的TSE-MAC功能性验证,果然名不虚传,“至少还是可以用的”(又是不折不扣的一句大废话)。不过,想表达的是,调试和验证的思路可以有,简单实用的辅助工具也可以有;想深入了解和熟悉一个陌生的接口或复杂的协议,FPGA则必须有。哈哈!
  • 热度 17
    2013-3-4 21:49
    3249 次阅读|
    4 个评论
    TSE的loopback功能设置和调试 所谓loopback,便是TSE的收发形成一个闭环,通常是在初步调试验证MAC的基本功能时使用。TSE的这个loopback功能的开启可有两道“门槛”,一个不能少,不仅软件编程开启,而且硬件也有“玄机”,一不留意恐怕你死活也搞不定它。尤其是当原型调试时,你还真搞不懂是loopback没配置好还是MAC的收发不工作。 废话不多说,直接上图。首先在配置TSE的IP组件时,需要勾选MAC Options页面的Enable local loopback on MII/GMII/RGMII选项,默认可是不勾选的,所以需要特别开启。在Small MAC模式下,没有loopback功能,所以无从设置。 在User guide中对此有专门说明。 其次,在软件编程时,使能Config寄存器的bit15,使LOOP_ENA功能被开启。 具体编程操作时,可以参考如下顺序进行操作。 初始化的代码如下。 //Ethernet初始化 void ethernet_init(void) { alt_u32 temp; //MDIO phy地址设置 = 5‘b10000(参考88E1111_datasheet page63) IOWR_ALTERA_TSEMAC_MDIO_ADDR0(MY_TSE_BASE,0x11); IOWR_ALTERA_TSEMAC_MDIO_ADDR1(MY_TSE_BASE,0x11); //MAC配置寄存器初始化 //关闭MAC数据流接收和发送使能位 do { IOWR_ALTERA_TSEMAC_CMD_CONFIG(MY_TSE_BASE,0x00802220); temp = IORD_ALTERA_TSEMAC_CMD_CONFIG(MY_TSE_BASE); } while(temp != 0x00800220); //MAC FIFO配置 /*  Tx_section_empty = Max FIFO size - 16 Tx_almost_full = 3 Tx_almost_empty = 8 Rx_section_empty = Max FIFO size - 16 Rx_almost_full = 8 Rx_almost_empty = 8 //Cut Throught Mode, Set this Threshold to 0 to enable Store and Forward Mode Tx_section_full = 16 //Cut Throught Mode, Set this Threshold to 0 to enable Store and Forward  Mode Rx_section_full = 16 */ IOWR_ALTERA_TSEMAC_TX_SECTION_EMPTY(MY_TSE_BASE,(MY_TSE_TRANSMIT_FIFO_DEPTH-16)); IOWR_ALTERA_TSEMAC_TX_ALMOST_FULL(MY_TSE_BASE,3); IOWR_ALTERA_TSEMAC_TX_ALMOST_EMPTY(MY_TSE_BASE,8); IOWR_ALTERA_TSEMAC_RX_SECTION_EMPTY(MY_TSE_BASE,(MY_TSE_RECEIVE_FIFO_DEPTH-16)); IOWR_ALTERA_TSEMAC_RX_ALMOST_FULL(MY_TSE_BASE,8); IOWR_ALTERA_TSEMAC_RX_ALMOST_EMPTY(MY_TSE_BASE,8); IOWR_ALTERA_TSEMAC_TX_SECTION_FULL(MY_TSE_BASE,0); IOWR_ALTERA_TSEMAC_RX_SECTION_FULL(MY_TSE_BASE,0); //MAC地址配置 //MAC address is 00-1C-23-17-4A-CB /* Low word (bits 31:0) of MAC address */ IOWR_ALTERA_TSEMAC_MAC_0(MY_TSE_BASE,0x17231c00); /* High half-word (bits 47:32) of MAC address. Upper 16 bits reserved */ IOWR_ALTERA_TSEMAC_MAC_1(MY_TSE_BASE,0x0000cb4a); //MAC功能配置 /*  //Maximum Frame Length is 1518 bytes Frm_length = 1518 //Minimum Inter Packet Gap is 12 bytes Tx_ipg_length = 12 //Maximum Pause Quanta Value for Flow Control Pause_quant = 0xFFFF //Set the MAC with the following option: // 100Mbps, User can get this information from the PHY status/PCS status //Full Duplex, User can get this information from the PHY status/PCS status //Padding Removal on Receive //CRC Removal //TX MAC Address Insertion on Transmit Packet //Select mac_0 and mac_1 as the source MAC Address Command_config Register = 0x00800220      */ IOWR_ALTERA_TSEMAC_FRM_LENGTH(MY_TSE_BASE,1518); IOWR_ALTERA_TSEMAC_TX_IPG_LENGTH(MY_TSE_BASE,12); IOWR_ALTERA_TSEMAC_PAUSE_QUANT(MY_TSE_BASE,0xffff); IOWR_ALTERA_TSEMAC_CMD_CONFIG(MY_TSE_BASE,0x00800220); //MAC复位 //Set SW_RESET bit to 1 do { IOWR_ALTERA_TSEMAC_CMD_CONFIG(MY_TSE_BASE,0x00802220); } while(IORD_ALTERA_TSEMAC_CMD_CONFIG(MY_TSE_BASE) != 0x00800220); //MAC数据流发送和接收使能 do {   //BIT15--loop_enable=1 IOWR_ALTERA_TSEMAC_CMD_CONFIG(MY_TSE_BASE,0x00808223); temp = IORD_ALTERA_TSEMAC_CMD_CONFIG(MY_TSE_BASE); } while(temp != 0x00808223); printf("Ethernet initial successful.\n"); } TSE的用户收发端的Avalon-ST接口都连接到了onchip-RAM上,实时观测到他们的收发数据帧是完全一致的。说明这个loopback功能和TSE收发已经完全正常了。
  • 热度 21
    2013-2-28 21:50
    2232 次阅读|
    5 个评论
    TSE-MAC的FIFO工作机制   最近在这条Altera三速以太网(TSE)的MAC,目前基本能够从这个挂在MAC上的Avalon-ST总线上收发PC的IP包了。 MAC是个试用版的IP核,内部框图如下。它通过MII/GMII/RGMII和FPGA外部的PHY交换数据。内部做了一些MAC该做的事,然后通过两个FIFO分别缓存以太网的收或发数据包。这两个FIFO读写的一端自然是MAC,另一端则是Avalon-ST总线。   再说这两个FIFO的管理也很有学问,它要实现的功能是在尽可能不丢包(FIFO不能溢出或空读)的情况下收发数据。如图所示,这是RX FIFO用于控制的几个寄存器示意图。   这里有4个寄存器。User guide上有如下的描述。   光是看看这些枯燥的文字恐怕很难理解清楚它的工作机理。如果自己动手操作一把,遇上几次收发故障,那么再回头消化下估计就不难了。 简单的来看,almost empty和almost full是实际上MAC希望提醒Avalon ST总线或PHY端(也可以理解为远端的以太网设备)注意当前FIFO真得快full或empty了。当然了,almost empty有一种情况不会发出预警,那便是在FIFO中已经出现了当前收发帧数据的eop(end of packet),这种情况下会继续读FIFO直到eop;almost full预警发出时,如果读FIFO端仍没有准备好要读FIFO,那么当前帧可能就要遭受丢弃的厄运了。 与此类似,section empty和section full则不是绝对的FIFO的empty或full状况指示,个人的理解,这两个寄存器主要是设计者根据PHY端和Avalon-ST端的实际速率状况,相互提前做出指示,让另一方能够尽早做出相关操作的报警。Section full寄存器如果设置为0时,则使能store and forward模式,该模式下,完整的接收一整个帧的数据时则发起Avalon-ST的读操作。      
相关资源