金瑞

用AX88180和FPGA实现千兆网——460Mbit/s实现

0
阅读(35707)

上一篇随笔中提到了用AX88180和FPGA实现千兆网的传输,用软件发送是不可能获得高速的,于是用硬件Verilog语言写了发送程序,因为 我接受数据不需要高速所以为写接收的硬件程序,逻辑流程还是比较简单的,就是读几个寄存器,然后写几个寄存器,之后将N个数据发送到TX缓存,之后写发送 控制寄存器启动发送(难点是要多个等待周期读写数据)。我想这可以用状态机的方式轻松实现,虽然我之前没有看过更没有写过Verilog的状态机。但是我 过于乐观了!

上网搜有关状态机的教程,还是比较多的,随便搞了一个PDF看,状态机写法有三种:1段,2段,3段式!2段最流行,于是按逻辑写了个两段式 的,自己逻辑思维还好,1个多小时搞定。接下来调试,由于开始就把它和AX88180的avalon接口放在了一起,另外还有读RAM的主Avalon端 口和模块,所以没想到一个模块一个模块的看波形,因为也不好看。于是就用SignalTap II硬件看波形,结果让我很失望:波形一个是很乱,一个是有很多没有波形。哥顿时凌乱了!经验太不足了,好几天处于崩溃中!当然工作还要继续做下去,于是把send函数单独做一个工程测试,看到波形很是不对,我状态机和例中是一样的:第一段时序(做状态转移),第二段组合逻辑(对所有信号敏感),很标准啊!

突然有一天(好几天后了,这几天哥一直处于半崩溃中,一直在想这个状态机),灵感凸现,问题就在第二段“对所有信号敏感”,因为我在这一段中对很多变量 做了加法,有好多个计数器,所以第二段在一个周期要执行N次,这不是我的本意,我要的是1个周期只执行一次!我之前对状态机的第二段也是很纠结的,就是不知道这个组合逻辑是一个时钟执行一次呢还是和时钟无关的呢,现在我知道了如果要是对所以信号敏感的话就和时钟无关了,要一个周期执行一次,必须只对时钟敏感!

顿悟之后没有几天就把Verilog程序写好了,当然中间还出现了好多问题,以至于我从简单到复杂,即:先只用Verilog取代for循环(发送N个 数据到TX缓存),其他的寄存器操作,还用C,这样做,我后来做到的速度是410Mbit/s~420Mbit/s 。后来改为整个发送函数都用 Verilog写,这样做可以得到460Mbit/s~470Mbit/s的速度。不知道是否还有提升空间,但是个人认为空间不大!

  有兴趣的可以和我联系QQ:286731850,EMAIL:menjinrui@gmail.com