本章以服务器常用的 4 通道 1000M 以太网卡为例讲述如何实现多个虚拟 DMA 通道.
1. 多通道 DMA 发
4 通道以太网卡的数据相互独立,需要 4 个虚拟 DMA 发通道实现 4 路数据独立传输.4 个虚拟 DMA 发通道如下:
多通道 DMA 发比较简单,因为 TLP 包中已经包含了具体的物理地址,4 个虚拟通道可以向 4 个不同的物理内存位置写数据.所以 DMA 发逻辑与单通道 DMA 发逻辑没有什么不同,关键点在增加的总线仲裁逻辑.
4 个网口都有数据要进行 DMA 发,发起 TLP 写请求,需要占用 PCIe 总线;4 个网口还要进行 DMA 收,发起 TLD 读请求;主机的 BAR 读操作要占用 PCIe 总线.但是 PCIe 总线只有 1 个逻辑通道(即使 PCIe 总线物理层为 x4 或更高宽度,但逻辑通道数是 1),所以各通道必须分时复用 PCIe 总线.
总线仲裁逻辑正是进行分时复用调度的功能.各种数据包有各自的特点:BAR 读操作较少,为了提高上位机的处理效率,一般希望 BAR 读操尽快完成;TLP 写请求包较大,会占用较长的总线时间;TLP 读请求包小,但是包数量多,占用的总线带宽不可忽视.
所以总线仲裁逻辑可以设置优先级:仲裁逻辑以 TLP 包为单位,总线采用抢占式调度,即必须一个 TLP 包传输完成再判断下次给哪个通道使用总线;高优先级的通道可以优先占用 PCIe 总线,直到 TLP 包传输完成后才能给低优先级的通道使用;相同优先级的通道采用轮询方式调度,这样每个通道占用总线的机会相同.
一般会将 BAR 读放在最高优先级,这样可以让 FPGA 以最快的速度响应,减少上位机等待时间;在本案例中 4 个 DMA 发通道和 4 个 DMA 收通道需要相同的优先级,放在第二优先级.在一些特殊的应用中也可以将各 DMA 通道放在不同的优先级,实现重要数据优先传输,普通数据空闲时传输的功能.
2. 多通道 DMA 收
DMA 收的过程本身就比 DMA 发复杂,需要 FPGA 先发起读请求,主机再返回数据才能完成 DMA 收的过程.4 个虚拟 DMA 收通道框图如下:
多个 DMA 收通道可以对多个内存地址就行读操作.多通道 DMA 收逻辑发起 TLP 读请求的方式与单通道 DMA 读相同.读请求也要通过总线仲裁逻辑分时复用 PCIe 总线.
这里增加了数据判别逻辑.DMA 发的过程只需要 FPGA 发起 TLP 写请求,请求中已经包含了物理地址,不会引起数据错乱;而 DMA 收的过程中,FPGA 发起 TLP 读请求包含了物理地址,但是主机返回的 CPLD 包中只有低 6bit 物理地址,不能通过物理地址判断是哪一个通道的数据包.所以需要在 TLP 读请求包中对每一个虚拟通道做上特殊标记,这样才能分辨主机返回的 CPLD 包是哪个通道读请求返回的数据包.
转载:http://xilinx.eetrend.com/blog/9836
来源: http://www.bubuko.com/infodetail-2453993.html