Linux学习笔记(二百五十四)——FPGA中VMEbus接口的实现

继续挂羊头卖狗肉……FPGA作为总线接口应用已经挺广泛的了,但VMEbus和USB等等的区别在于是一个异步总线不存在明确意义的外部时钟,所以有些特点;我自己目前使用的是一个前辈所写的接口,也稍稍读过一些别的实现,总归有些自己的看法。
VMEbus本质上来说是一个基于锁存器latch的标准,所以最原生的接口实现方式就是同样使用latch;但一方面在FPGA设计中应该尽量避免锁存器——一个完美的FPGA设计恨不得只由寄存器和组合逻辑构成——为了时序分析的方便;另一方面VMEbus的一些信号虽然在标准中并没有说明,但实际应用中受到硬件比如说Controller工作频率的限制,还是应当有适当的延迟,在不增加额外支出的情况下,这就得靠FPGA片上的触发器实现——我也见过通过FPGA片上buffer连成一串实现延迟的方式,但是很不喜欢-_-!所以这样一个接口的设计中引入时序逻辑是必要的。
我目前所使用的版本所采用的就是一个奇怪的混合结构——在直接跟VMEbus连接的信号使用latch,对于这些latch的控制信号则使用片上时钟和寄存器来产生适当的延迟。然后经过这样的接口所转换得到的片上总线同样以异步的方式运行——虽然可以工作,但这种异步到同步又到异步的设计直接给时序分析带来了很大麻烦,需要小心地处理和足够快的时钟才能避免发生hold time violation。而且……我总是觉得这样很丑……
那么怎样才能更漂亮呢?理想的设计是在接口处直接把一切都同步化,通过采样来探测VMEbus异步信号的上升和下降,并利用状态机实现跟latch等价的效果。我暂时没想好的是这样会导致片上总线也成为同步总线,会不会要求修改整个设计?就看我对这整个FPGA的图像和理解了。不管怎样要是有时间的话,我还是想用同步的方式尝试改写一次。

About huanhaoadam

Physics PhD Candidate
此条目发表在读书写字分类目录。将固定链接加入收藏夹。

留下评论