这些天一直在弄ZYNQ(矿板)驱动LTC2325-16 ADC,感觉FPGA太难了,对于我这样的新手它不像单片机那样可以“轻松”使用试错的方法通过不断修改代码来完成想要的功能,这样做真的是太太太太费时间了。这些天基本上都是在听CPU风扇呼呼的响,电费多了、睡眠少了、头发也掉了不少,不过经过这几天的学习遇到很多编译错误倒是都能轻松解决了。
LTC2325-16是一个4通道16位5MSPS的ADC,支持串行LVDS输出,时序看起来并不复杂。板子是我自己画的自己焊的,之前因为使用了劣质的1117烧过电源芯片,所以我不确定它是不是好的。矿板的差分对不是成对出现的和LTC2325-16连接需要通过排线转换,一旦有问题,哪哪都可能有问题。
开始感觉很轻松就能读到ADC数据,但是不稳定,经常有错误的数据,后来经过几天的调试发现原来是一对LVDS时钟线的其中一条没压接好,LTC2325-16能读到时钟,只是经常出错,因为时钟是100MHz的,手里的示波器才100MHz的带宽,看数据也比较困难,刚开始测量发现时钟的n线没有输出还以为是FPGA没配置好,因为对FPGA不熟悉总怀疑代码没写好,各种改代码最后才发现是数据线断了。
数据线接好以后读到的数据好了那么一点,不过还是不正常,后边这些天基本一起在弄LTC2325-16的时序,时序看起来比较简单(是我想简单了),我没有使用官方提供的verilog,因为那个代码是altera的,有一些和芯片相关的代码所以才自己写。
因为没法测量FPGA实际输出的时序,不确定自己写的看起来非常完美的波形到底哪里不对,后来没办法了,只好使用官方提供的代码,研究它关于altera相关的部分,主要是一个时钟PLL的代码,一个110MHz输入,2个55MHz,2个110MHz,一个220MHz,一个5MHz输出,5MHz还有55MHz和110MHz都有一路做了相位偏移。昨天开始弄的,理解完了觉得没问题了发现用ZYNQ弄不出来,原因是vivado里的clock wizard没法配置输出5MHz 相移1.62度4%占空比的时钟,占空比基本不能小于40%。
后来经过不断测试,发现如果输入是10MHz输出也是10MHz时配置可以很灵活,只要把相称和占空比乘2,然后再写一个代码,把10MHz输出的时钟的奇数电平设置成0,功能终于可以实现了。最后的时钟树像下边这样。
时钟的问题解决了,剩下就是改改代码,把数据通过AXI-FULL发送到PS端,ADC的设置使用AXI-LITE通过PS配置,改好以后测试了一下数据,还是比较满意的。
因为还没有实现PS端到PC的数据发送,电脑的波形显示是通过JTAG实现的,Xilinx SDK可以XSCT输出内存数据,通过mrd加地址和长度就可以把数据输出到窗口。
复制输出的数据,通过EXCEL整理,然后再把十六进制转成十进制就能看到波形。开始我是这么做的,后来发现比较麻烦,就用上位机接收粘贴的数据通过代码进行整理,这样能方便很多,基本上是输出、复制、粘贴就能看到波形。再后来发现复制也比较麻烦,因为数据很长,要从头复制到结尾。最后使用mrd -bin -file D:/ mem.bin 0x100 1000,把内存数据输出到文件,上位机点一个按钮然后自动在这个文件里读出ADC数据,这样就能方便一些了。
因为手里一直没有信号发生器,只能简单看一下采集的数据噪声大不大,前两天买了一台还没到,等设备到了再继续弄。
|