欢迎光临散文网 会员登陆 & 注册

神电测控:LabVIEW FPGA番外篇:实验63:FPGA2FPGA之间自定义高速通信协议(ACK/REQ)

2021-07-11 11:56 作者:神电测控  | 我要投稿

        核心思想:来自于PXI机箱背板上的总线,可以让多个板卡之间实现P2P总线互联。

        很多场合下,一片FPGA可能无法满足实际项目应用需求,比如一个非常复杂的算法可能需要借助多个FPGA并行计算;再比如要实现128路,每路50MS/s更新率的DAC模拟输出,此时就需要多个FPGA+多个AD9767模块共同参与协作,才能达到完美的效果!

        如果多个FPGA板子就近放在一起,板与板之间通过开放的引脚进行互联。其中一个板子充当主设备,负责与上位机PC主机通信,其余的FPGA板子则采用环形菊花链的方式组建网络。那么采用什么样的传输方式,可以将上位机下发的数据(比如任意波形)及时高效的传递给每一个FPGA进行共享呢?

        低速情况下,可以采用UART串口通信协议,好处是只占用两个FPGA IO口,但是波特率很难做上去;而传统的FSMC总线规则又太多,位宽有限制,不利于FPGA精简优化,逻辑资源消耗多;SPI总线同样存在数据传输速度瓶颈。

        为此,我们可以根据实际情况,采取自定义的ACK/REQ握手协议,配合不同的数据位宽,达到像ARM和RISC-V精简指令集那般的效果!兼顾通信带宽和FPGA逻辑资源的均衡。

        下面我们向大家简单介绍一下环形菊花链里面的多个FPGA数据转发共享自定义协议的实现方法。

1、介绍

        本节实验给出的LabVIEW FPGA程序,则使用简单的握手ACK/REQ协议数据以并行方式,通过连接在FPGA板与板之间的外部任意6个IO引脚,实现稳定、可靠、高速的传输。通信协议是一种单向发送/接收实现,其中,2两个IO分别作为ACK和REQ握手,余下4个IO作为半个字节的数据位宽,当然用户可以根据实际情况拓展数据位宽。

        范例程序包括带有两个FPGA终端的项目。一个充当发射器,一个充当接收器。时钟速率可以通过配置FPGA里面的定时循环时钟来调整传输带宽。由于两个FPGA板子之间通过异步握手,没有同步时钟线,虽然不会达到同步协议可能达到的速度,但是这个ACK/REQ异步通信协议对于来自两个甚至多个明显不同速率或漂移的时钟差异相当稳健。

2、基本配置

        本节实验演示的自定义协议需要ACK、REQ和4行数据线共计6个FPGA DIO。如果用户使用的是PXIe机箱背板总线或者PCI板卡上的RTSI总线,那么可以添加的数据线还是比较少的。但是如果,用户选择的是市面上通用的FPGA板子,那么可以修改此案例程序里面的自定义协议VI,以使用更多数据线来提高传输速度。

        另外,我们还提供了一个可以在上位机PC上直接模拟仿真这个自定义协议的示例VI,非常直观,模拟仿真完成后再分别编译下载到两个不同的FPGA目标板子里面进行测试。

3、操作原理

        发送端FPGA在空闲状态等待输入有效信号变高,然后在下一个循环迭代中(或单周期定时循环SCTL中的时钟周期),发送端将把该数据放在数据线上并置高ACK线;同时,接收端FPGA正在等待ACK线上的置高。当接收端FPGA看到ACK线为高电平时,它将接收来自数据线的数据并置高 REQ 线;发送端FPGA在取消确认ACK线之前等待REQ 线变高。一旦接收端FPGA看到ACK线被置低,接收端就会将REQ线置低,这样就完成了一次数据传输。最后,接收端和发送端FPGA又重新回到空闲状态,再次准备好进行下一次的数据传输。

        具体的两个FPGA终端项目浏览器,如图1所示。里面的两个核心收发子VI封装的时候,都是满足标准的四线握手来的,方便用户集成到自己的FPGA程序里面去。

图1:FPGA2FPGA自定义异步传输协议项目浏览器截图


4、发送端(FPGA 1)

        发送端FPGA VI前面板很简单,如图2所示,对应的程序框图里面有一个封装好的ACK/REQ通用型发送子VI,如图3所示。这个子VI包括了接收一个输入来定义用于每个函数的数字线、要传输的数据位以及与单周期定时循环 (SCTL) 中的其他函数一起使用的有效输入信号。这便是我们整本《LabVIEW FPGA开发宝典》反复强调的一个知识点:四线握手。

图2:发送端FPGA程序前面板(ACK/REQ半字)
图3:发送端FPGA程序框图(ACK/REQ半字)

        以后用户自己在封装VI时,也要考虑到四线握手,这样才能让每个函数VI都能方便的被调用,集成到自己的FPGA主程序里面去。这个子VI里面是一个加了反馈节点的标准状态机,如图4所示,技巧性很高,值得大家学习。

    

图4:发送端FPGA核心子VI状态机程序框图(满足四线握手)

        当我们点击FPGA VI前面板上的“Input Valid”按钮时,发送端FPGA就会将前面板上的数据发送给接收端。

5、接收端(FPGA2)

        接收端FPGA VI前面板也很简单,如图5所示,对应的程序框图里面有一个封装好的ACK/REQ通用型接收子VI,如图6所示,也满足四线握手。这个接收子VI接受数字线路分配的输入(对应发送端的同一条DIO),内部是一个标准的接收状态机,如图7所示。当接收到新数据时,将输出有效标志进行置位。

图5:接收端FPGA程序前面板(ACK/REQ半字)
图6:接收端FPGA程序框图(ACK/REQ半字)
图7:接收端FPGA核心子VI状态机程序框图(满足四线握手)

        需要注意的是:由于数据更新比较快,所以在实际的项目应用里面,应该根据这个子VI的输出有效信号将接收到的数据立刻存放到FIFO里面进行缓冲起来,以确保所有的数据不会丢失,如图8所示。这个FIFO也是四线握手的,贯穿了整个《LabVIEW FPGA开发宝典》,凡是遇到高速数据流通信的场合都会用到FIFO进行数据缓冲和转移(比如,UART、USB、千兆以太网、PCIe等)。

图8:将接收端的数据利用四线握手放到FIFO里面进行缓冲


神电测控:LabVIEW FPGA番外篇:实验63:FPGA2FPGA之间自定义高速通信协议(ACK/REQ)的评论 (共 条)

分享到微博请遵守国家法律