最近一直在弄PCI9054,现在基本上已经弄完了,写点经验总结:
我用的PCI9054+FPGA的板子,首先说说制版上的注意问题,我没有画过板,是我们一位上司在画,但是中间跟他一起发现和解决了一些问题,还是有点感触。
板子设计中:
1、PCI时钟线,论坛上有人说PCI CLK时钟线要足够长,大约在1500mil±100mil,我一直不知道原因,后来我们一个老师点拨了我们说是,想这种并行线,每根数据数据线的值达到的时间不一样,因此只能靠时钟沿来将他们同步,如果你太短,时钟很快就来了,但是有些数据线信号还没有到来,那么就会造成并行数据的紊乱。听了觉得有道理,具体是不是这回事有待考证。
2、TEST引脚,这是一个测试引脚,当他有效的时候,按数据手册上说的,除了一个usero/..../引脚之外,其他的引脚都将挂起,事实上就是9054不工作。论坛上有人说,在调试过程中,TEST脚需要先拉高才能在开机的时候进入操作系统的界面,之前我们设计的那块板子也是这种情况,板子插上去,但是开机在Bios检测的时候,在屏幕的左上角总是显示一个光标,进入不了系统,我以为是这个原因,因为我们板子的TEST脚是悬空的。后来照那样做了,发现确实可以进入系统,但是其他问题依然存在。后来仔细一想也是,既然TEST拉高是让9054不工作,在开机的时候我不插板子,等到PC机启动之后我再插板子,岂不是一样。(当时觉得自己好SB!!)
3、EEPROM的EDI/O脚,数据手册上说了,如果没有EEPROM,那么这个脚需要拉低,9054以寄存器默认值进行启动。如果有EEPROM,不管是空白还是已经写入数据,都应该将其拉高。(后面这点数据手册上没有说,是在论坛上看到的)之前我们的板子出现的问题是,板子开机进入系统后插入,能找到设备,但是发现寄存器的值并不是EEPROM里面的值,而是寄存器默认值,而且本地配置寄存器的很多值都不能用PLXMon进行设置。因为我们的板子这个引脚直接连接到9054,没有拉高,但是后来拉高了,问题依然存在,所以究竟需不需要拉高,还有待考证。
4、本地时钟线,LCLK,之前对于这个时钟一直有个误区,现在看来真的很SB,居然会认为这个时钟是由9054提供的,因为之前买了块板子做实验,用FPGA编程的时候这个引脚是输入的,所以一直没有仔细看它提供的原理图。其实PCI9054是有两个时钟域,一个是PCI端的时钟域,这个时钟是固定的,PCI协议规范要求的33MHz,也是一个输入时钟,由PCI Bus端的主设备提供;另外一个是Local端的时钟域,这个时钟是用户自己选择的,但是数据手册上说最大支持50MHz,不知道这个限制究竟是由什么决定,个人感觉是因为PCI 9054 内的数据FIFO决定,因为在各种传输方式下的FIFO都是16个(for Local——>PCI)或者32个Lword(for PCI------>Local),按33和50的最大公约数来计算,就是每从本地端写入50个Lword,PCI端取走33个Lword,然后还剩下17个Lword在FIFO,这样的话,就有可能导致FIFO会满。这只是我的个人理解,我也没有试过高于50M的,也不知道会出现什么问题,比较疑惑的是,如果高于50M的话,也可以用插入内部等待的方式来平衡FIFO两端的速率问题。
5、本地字节使能信号LBE[3:0]#,本来按数据手册上说的,当他们都有效是表示本地为32位总线,而且是低电平有效,但是我们那块板子不知道为什么把它通过4k7的电阻拉高了,而且在PCI Target以及PCI DMA方式下,也就是9054作为本地总线的主机时,并没有因为他们拉高了而出现什么异常,这点让我很疑惑。后来我用PCI Initiator方式配置9054内部寄存器时,却发现,能从9054中把寄存器的值读出来,但是缺写不进去。后来在论坛上找到了一位大哥,他提醒了我,当我把它们拉低后,发现,数据果然听话的写进了寄存器,心中那个爽呀,呵呵,当然要谢谢那位大哥了。
6、论坛上也有人问过第5点中描述的问题,但是他们说最终解决时得益于那个WAIT信号,有的说开始没连,后来连了问题解决,有的说连了没置为无效,也就是拉高,后来拉高了问题解决,我的WAIT信号是一直拉高的,也没试过拉低后是否会出现那种问题。