• FPGA与CPU进行数据通信有哪些方法?


    在进行FPGA设计时候,除了一些算法\验证等应用,其他情况下都需要FPGA和控制器进行数据交互(通信)。

    通用一点说,所有CPU的数字通信接口都可以和FPGA进行通信,在这里我们将相关接口简单分类,这里的接口主要指板间通信,像422、485之类的就不展开描述(协议层都是uart)。

    387f518b94f7dc66a871ee1db9d72b6f.png

    低速接口

    低速接口时单片机常用的接口,在和FPGA对接时候主要进行小数据量的通信。

    低速接口的优点就是简单,易于实现;缺点也是显而易见,就是通信带宽不高,无法进行大数据量通信。

    这里就简单说下SPI和UART,其中SPI是一种同步通信协议,UART是异步通信协议,区别就是有没有共享时钟信号。

    这两个协议的使用可以参考下面的通信方式:假设FPGA和CPU之间进行通信,FPGA需要将XADC采集的电压电流传输给CPU做健康管理,这里由两点需要注意:一是传输不需要实时;二是数据量不大,所以选择低速接口较合适,选择SPI和UART时候传输的区别如下:

    SPI接口:

    CPU做主,需要先将时钟信号发送到FPGA:

    6573cf0482bf76476661873da202898c.png

    然后使能CS:

    7029d2b9db20dfba02e20313f226e3a2.png

    接下来CPU的MOSI发送数据到FPGA:

    3732cab7ed3ac8f915c742a7ff583f5c.png

    FPGA的MISO需要反馈数据时候,同步的将数据反馈给CPU,如果MOSI不发送数据,则MISO也不能主动发送数据。

    aa6791417a6fcfec615f13afcd301fad.png

    UART接口

    对于UART就比较好理解了,CPU和FPGA协定好波特率,FPGA想要发送数据时候就将数据发给CPU即可(CPU需要利用中断触发接受数据)。

    LPC

    最后简单说下LPC(Low Pin Count),LPC常见的是在X86体系里常见的接口,主要用在南桥和EC之间通信(想想当年设计的笔记本还是挺虐的~),EC控制的矩阵键盘等通过LPC发送给南桥。

    8364b0e06cd1289d39c87abbf39f907e.png

    目前我应用的比较多的是和FT CPU之间进行通信,这方面用的比较少就不过多介绍了。

    低速接口实现

    关于这几个协议的实现,可以看下下面的文章,其中UART中详细介绍了RS232和UART区别。

    一天一个设计实例-3万字讲解UART和实例

    一天一个设计实例-IIC协议及FPGA实现

    一天一个设计实例-SPI协议及FPGA实现

    接下来就是高速接口

    高速接口

    FPGA中通过Serdes可以实现大部分高速接口。常见的就是PCIe和SRIO,在ZYNQ中还有AXI非常常用。

    对于PowerPC则可以使用PLB;Intel最新的FPGA则QPI也是比较常用的。

    对于传输视频:MIPI、BT.656、BT.1120这些接口也是非常常见的。

    高速接口我们只介绍PCIe,这也是非常常见的数据通信接口,在加速卡、数据中心,都是核心。

    PCIe的难点在于整体架构和CPU端的驱动,目前用于PCIe架构常用的就是DMA,至于原因,就不分析了,反正就是优势非常明显。

    大家对于PCIe还处于“恐慌”的状态,但是大家不必担心,下面给大家介绍几个常用的架构:

    a3ff8825230071bf422a75bdc5553444.png

    上面的基于PCIe的项目,都是非常成熟的架构,也是目前能在FPGA流行PCIe接口的主要原因,其中这些架构都在很多工程中得到应用。

    RIFFA和Alex的可以查看下面文章介绍:

    优秀的 Verilog/FPGA开源项目介绍(一)-PCIe通信

    下面是XILLYBUS的架构:

    f4683f53e2dd73bf2c6dc76717eff2d7.png

    官方网址:

    http://xillybus.com/

    Corundum可以查看下面文章:业界第一个真正意义上开源100 Gbps NIC Corundum介绍

    总结

    上面的介绍只有一部分常用接口,还有其他很多不常用的总线,像FSB总线、HT总线、DMI总线等,也是可以实现CPU和FPGA之间通信。

    今天就到这,我是爆肝的碎碎思,期待下期文章与你相见。

    95c9760d19b4a7de8ae2010ab9eb2899.png

    点个在看你最好看

  • 相关阅读:
    Python算法练习 10.15
    传奇服务端MirServer文件有何作用
    浅析kubernetes中client-go Informer
    Microsoft SQL Server中的错误配置
    基于Springboot高校毕业生招聘管理信息系统-计算机毕设 附源码 28393
    【2024】LeetCode HOT 100——二分查找
    【随想】每日两题Day.9
    使用接口根据关键词取视频列表详情
    遗留代码处理技巧与案例演示
    TransFuse跑自己的数据集
  • 原文地址:https://blog.csdn.net/Pieces_thinking/article/details/126416735