我个人把FPGA设计中会接触到的接口分为三大类:简单接口,一般接口和复杂接口。所谓简单接口是指的协议规则较简单的串行接口,比如SPI、UART、IIC等,这类接口我们可以自己编写代码来实现(当然也可以用IP核)。一般接口是指的协议规则较为复杂的并行接口,比如AXI、PCI、DDR等,我们可能理解起来还算容易,但是要自己编代码来实现,那就不容易了,一般实现就用IP核。复杂接口是指的数据传输通过协议包来完成的、协议规则复杂的通过差分信号传输的高速串行接口,比如PCIe、以太网、USB、CAN等,这些接口协议让我们理解它们的规则就存在着难度,如果还能自己编代码实现出来,那必然是技术大牛了,所以我们一般也是用IP核来实现(其实这类接口的IP核的使用方法都挺复杂的…)。
事实上,从总线技术的发展历史我们也可以看出,设备间的通信最开始就是用的简单串行接口,后来随着数据量和速度的逐步提高,就发展出了并行接口,再后来数据量和速度进一步提高,并行接口的很多问题暴露出来(比如并行线太多导致布线灾难,每条线的延迟不一样,时钟偏移等),于是又回到串行接口,只是这时的串行接口就属于复杂的高速串行接口了。高速串行接口的共同特点是差分信号传输、协议分层、使用协议包传输数据、使用一定的规则来保证数据的可靠性。因此,在具体讲复杂接口之前,我想先简单介绍三个基础知识点,OSI七层模型、Serdes技术和数据校验技术,这同时也是十分重要的设计思想。文中Serdes部分参考自https://www.cnblogs.com/rouwawa/p/13524703.html,后面我还会专门写文章来讲述Xilinx的serdes的IP以及数据校验技术。
一、OSI七层模型
国际标准化组织(ISO)曾提出过一个开放系统互连参考模型OSI-RM,全称是Open Systems Interconnenction Reference Model.这个模型将整个开放互联系统分为7层,如下图所示。