答:本课程讲述的是千兆网,对于百兆网来说,UDP IP MAC和ARP协议都是相同的, 不同的是MAC IP核、FPGA和PHY芯片的接口不同。 本课程提供的是千兆网的工程,如果要使用百兆网,需要根据上面的内容来修改。
【问题2】千兆网课程有实现TCP协议吗?
答:本千兆网课程实现的是UDP协议,没有TCP协议。
【问题3】请问下,三速以太网IP核配置时,32bit对齐选项的意义在哪里? 答:在接口为32bit时,每个VLD有效时的数量是4个字节。由于MAC头是14字节,不是4的整数倍, 在发送方向,在补上MAC头后, 必须调整数据(拿出2字节与MAC头最后2字节凑成一个4字节的有效数据),这样处理比较麻烦。 同时道理,接收方向,去掉14字节MAC头后, 会有一个VLD多出2字节的有效数据,这样调整也麻烦。为此,MAC IP核里有一个功能, 就是32位对齐功能。该功能决定,在SOP位置时, 最高2字节是否为无效数据。 当是无效数据模式时,发送方向插入2字节无效数据+14字节MAC头; 在接收方向,删除前16字节MAC头,剩下就是效数据。这样处理就方便很多了。
【问题4】 只要勾选了32bit对齐功能,IP核自动添加2字节的无效数据?
答:勾选对齐后,接收方向将删除无效数据,直接输出数据,即SOP位置的高2字节也是有效的, 一直到EOP位置。发送方向,认为从SOP到EOP的位置都是有效的。 不勾选的话,接收方向,IP核输出、SOP位置的高2字节是无效数据。 发送方向,进到IP核的数据里,将SOP位置的高2字节视为无效数据。 【问题5】如下图所示,当使用了PAD_EN功能时,接收方向,会将PAD去掉,但实际上没有去除,是怎么回事? 答:请看下面描述:第一段,当值小于600,该域反映的是长度,才会继续检查PAYLOAD长度, 进而才会有REMOVAL。 当值大于600时,该域反映的是类型而已,则不会REMOVAL。 【问题6】课程里会包含TCP协议吗? 答:TCP协议使用逻辑实现非常复杂,所以本课程不会包含此部分内容。
【问题7】RGMII支持10M/100M/1000M三种模式吗? 答:RGMII是"吉比特介质独立接口"的含义,即1000M的传输接口。其他几种接口包括GMII、MII等。 注意一下,10M/100M/1000M三种模式,指的是该“芯片”支持这三种接口,不是说RGMII支持。 当芯片采用了RGMII或GMII时,就传输1000M;当采用了MII 100M时,就是传输100M。 注意的是,RGMII和MII的部分管脚是可以复用的。
【问题8】千兆网配置寄存器的定义代码中,下面两个IP核数据手册中没有说明,是什么作用的? 答:第一行语句的作用是“等待10000个时钟周期”。目的是当完成前面的配置后,等待10000个时钟后,再去配置下面的寄存器。这是因为有时 候,配置完上面寄存器后,有可能要等一段时间才起作用,所以要等一等。这个“等待”功能是FPGA里面代码实现的。 第二句作用是测试使用的,可以删除,在调试时看看接口是否正确。
【问题9】本项目有没有配置外部的PHY芯片? 答:本项目是没有配置的,因为默认PHY芯片是不用配置就能正确使用的。
【问题10】、百兆网和千兆网的区别是什么? 答:1. IP核是一样的
2. 千兆网使用的是GMII接口,百兆网则是MII接口。gmii数据线是8位;MII接口使用是4位数据线,也就是TXD低4位和RXD低4位。
3. 时钟频率不同,千兆网是125M,百兆网是25M时钟。
4. 百兆网的TX时钟来自于PHY芯片,芯片管脚使用的是tx_clk,而不是gtx_clk。
5. MII接口的4位数据线,是先发1个字节的低4位,再发高4位。
【问题11】老师,咱们千兆网项目中,为啥用sharkwire抓包的时候 最大传输速率到不了千兆呢?
答:因为包文传输的时候,会有消耗的,例如包与包之间有帧间隙,并且每个包会有前导码和FCS部分。因此达不到理论的千兆。
【问题12】请问一下在千兆网工程里,初始化mac IP核时,signaltapii有些reg_cnt刚开始时,add_wdata会出现一小段莫名其妙的数据,是怎么回事 ? 【问题13】在千兆网的rx_filter模块中,读数据的时候为什么用add_cnt=m_empty==0,这个信息FIFO的不空作为读条件?
答:信息FIFO非空,表示数据FIFO中存有一个完整的包文,因为需要判断包文是否正确,所以需要数据FIFO中保存一个完整包文之后再读出。
由于本模块需要将32位的数据转成16位的,计数器cnt数两次,表示数据FIFO需要两个时钟读出一次,当遇到最后eop的时候,
由于可能存在无效字节,所以当无效字节为2个或者3个的时候,计数器只需要数一次就够了。
【问题14】在千兆网的rx_filter模块中,信息FIFO深度为什么设置为32,设置为1就可以了吧?
答:这里设置为32只是顺手而为,而且占用的资源也不是很多,所以就没有进行修改,深度改为1也是可以的。
【问题15】在udp发送的过程中,假设源端口为0x1234,目的端口为0x5678,那么发送的是12345678还是56781234?
答:发送的时候是按照12345678来发送的。
【问题16】为什么udp协议在发送和接收的时候,源端口和目的端口顺序会反? 答:包文的协议时固定的,只会按照源地址加目的地址的格式发送。
1. FPGA发送的时候,FPGA产生包文,端源端口是1234,目的端口是5678。然后发送格式是源+目,因此发送的是1234_5678
2. FPGA接收的时候,PC产生包文,源端口是5678,目的是1234,然后发送的是源+目,因此是5678_1234。
【问题17】请问一下,我编译千兆以太网的时候,为什么把这个clogb2文件添加进去就会报错,说是sv文件?还有这个文件有什么作用?谢谢
答:clogb2不是一个完整的module文件,它是被用include的方法加入代码中的。它不需要加到工程上,所以可以把它去掉。
【问题18】请问下,在做练习工程的时候,需要自己设计MAC首部发送电路,MAC首部14字节,但数据位是4字节的,我需要定义 发送首部的计数器,这里4是不能被14整除的,我应该怎么处理? 答:1、可以在设计代码的时,把产生的mac头、IP头、UDP头拼接起来的时候,在最高位补2字节的无效数据零。
2、或者在mac_ip核进行相关的设置,具体可以查看相关数据手册附:数据手册在打开IP核后如图所示位置查看
【问题19】千兆网转百兆网的时候,需要给phy芯片一个参考时钟,是怎么给的? 答:开发板上有一个12M的时钟芯片,是给phy芯片的。外部晶振的事,跟FPGA无关
【问题20】我的采样时钟就是模块的工作时钟(always块里的);现在从MAC_IP核输出的数据不正确,根据常见问题PDF里问题1和6的解答, 有两种情况,如果时钟没问题那就有可能是IP核的输入信号有问题。我对应的代码和signaltap采集到的数据如图:
请问这种情况下,输入的数据算是正确的吗?
答:结果是正确的。原因同上【问题9】
|