APP下载

基于FPGA的MMU IP软核设计及实现*

2019-10-09刘红伟梁超广朱慧惠

通信技术 2019年9期
关键词:开发板内存处理器

刘红伟,梁超广,朱慧惠,潘 灵,邵 龙,林 勤

(1.中国西南电子技术研究所,四川 成都 610036;2.航空工业西飞研究院,陕西 西安 710000)

0 引 言

随着FPGA技术的发展,Xilinx公司最新的UltraScale+系列的ZCU102开发板不同于zynq-7000系列,采用的是64位的处理器armv8+大规模可编程逻辑器件(Field-Programmable Gate Array,FPGA)的 SoC模式[1]。与 armv7不同,64位的armv8拥有其独特的内存管理机制[2]。

在armv8+FPGA的SoC模式中,ZCU102中的armv8可以很好地运行Linux嵌入式系统,实现丰富的对外接口(如串口、千兆网口、USB、EMMC以及I2C等);FPGA可以实现并行逻辑算法的加速或高速串行总线协议之间的逻辑转换(如Rapid IO和PCIE之间的数据协议转换),实现操作系统和并行逻辑器件之间的软硬件结合。为了能够访问Linux嵌入式操作系统中写入内存的数据,FPGA端需要一个内存管理单元(MMU)来配合Linux操作系统完成虚拟地址到物理地址的转换,直接通过物理地址访问处理器外挂内存的数据。本文针对这一需求设计了一个基于FPGA执行的包含TLB机制的支持虚拟地址到物理地址的转换的内存管理单元(MMU)IP软核,同时可以满足访问处理器外挂内存。

1 ZCU102平台简介

1.1 ZCU102开发板处理器和FPGA之间的数据通道简介

Zynq UltraScale+系列的ZCU102开发板是ARM和FPGA两种架构芯片结合的异构SoC,包括多处理引擎、显示、高速外设(如PCIE、USB以及SATA等)、低速I/O功能(如CAN、UART、SPI以及NAND等)和FPGA,如图1所示。处理引擎包括基于4核ARMCortexA53系列的处理器APU、大规模可编程逻辑阵列以及管理单元等。其中,处理器系统和FPGA之间通过AXI总线接口(ACP、M_AXI以及S_AXI等)多种互联选择,实现该异构SoC的整体应用的灵活性,满足用户许多不同的应用需求。

图1 ZCU102平台

AXI表示的是高级可扩展接口(Advanced eXtensible Interface,AXI),当前的版本是AXI4,是ARMAMBA®3.0开放标准的一部分。第三方厂家生产的许多芯片和IP包都是基于这个标准的。Xilinx把AXI4定义为FPGA架构内使用的优化的互联技术[3-4]。其中,ACP是加速一致性端口(Accelerator Coherency Port,ACP),总线宽度为64位,FPGA部分作为主接口;M_AXI和S_AXI是通用AXI接口,总线宽度32位;处理器系统和FPGA都有主或从接口。

1.2 FPGA上实现MMU过程流程

ZCU102的处理器armv8运行Linux操作系统中物理地址到虚拟地址的转换是采用页表映射的机制实现的。Linux内核部分生成数据分配的虚拟地址通过页表映射实现。FPGA部分可以通过访问数据线上的物理地址读取虚拟地址对应在内存中的数据。在开发板上,FPGA需要一个内存管理单元(MMU)完成操作系统中数据的虚拟地址到内存中物理地址的转换,之后FPGA端通过访问内存物理地址读取生成的数据,从而实现FPGA端和处理器端外挂内存的地址共享,实现数据从处理器端到FPGA端的传输。ZCU102开发板上处理器和FPGA之间的MMU功能实现过程的功能流程,如图2所示。处理器系统中armv8上运行Linux操作系统产生数据,之后将数据的头虚拟地址和L1页表地址通过M_AXI发到FPGA的S_AXI,之后传到FPGA的MMU(内存管理单元),解析出L2、L3、L4页表的物理地址。通过ACP读取下一级页表的地址,最后在FPGA的MMU中组合出数据虚拟地址对应的物理地址,访问内存,将数据读到FPGA,完成数据的传输过程。

图2 FPGA上实现MMU处理过程的功能划分

2 FPGA上的内存管理单元(MMU)的设计

FPGA上MMUIP软核的设计主要由2部分组成,如图1所示,一部分是虚拟地址到物理地址转换的逻辑,另一部分是TLB的逻辑。

2.1 Armv8的内存管理体系

运行在armv8的Linux采用分页式内存管理机制。内存空间分为用户(User)空间和内核(Kernel)空间[5]。当使用用户空间的地址进行翻译时,使用的是TTBR0_EL0寄存器的值作为查找表的基地址;当使用内核空间的地址进行翻译时,则使用TTBR1_EL1寄存器的值作为查找表的基地址,如图3所示。

图3 armv8内存映射机制

Armv8在执行Linux内核时支持多种内存转换粒度及其对应的虚拟地址位宽,如表1所示。

表1 不同内存转换粒度对应的虚拟地址位宽

2.2 MMU的原理及工作流程

本文的MMUIP核的设计依据运行在4kB的内存转换粒度和39bit的虚拟地址位宽内核的Linux来完成。整个MMU的工作原理流程如图4所示。

结合图2和图4的原理,设计MMUIP核VHDL逻辑工作流程如图5所示。

具体步骤如下:

(1)Linux端通过MAXI发送虚拟地址以及TTBR0_EL0或TTBR1_EL1寄存器的值;

(2)进入MMU工作的VHDL逻辑,TTBR0_EL0 或 TTBR1_EL1[47:12]与 虚 拟 地 址 [38:30]以 及“000”进行第一次拼接,获得L2页表地址并将其通过MMUIP端MAXI发送到PS的ACPSAXI接口上;

图4 MMU的工作原理流程

(3)将ACPSAXI接口获得的L2页表地址解析后得到PUD的值,同时MMUIP端MAXI接口将会获取到 PUD[47:12]的值、虚拟地址 [29:21]以及“000”进行第二次拼接,获得L3页表地址并发送给PS;

(4)将ACPSAXI接口获得的L3页表地址解析后得到PMD的值,同时MMUIP端MAXI接口将会获取到 PMD[47:12]的值、虚拟地址 [20:12]以及“000”进行第三次拼接,获得L4页表地址并发送给PS;

(5)将ACPSAXI接口获得的L4页表地址解析后得到PTE的值,并将PTE的值保存到TLB缓存中,同时MMUIP端MAXI接口将会获取到PTE[47:12]的值与虚拟地址[11:0]进行第四次拼接,获得物理地址并发送给PS;

(6)将ACPSAXI接口获得的物理地址解析后得到对应的数据,同时MMUIP端MAXI接口将会获取对应的数据进行保存;

(7)将虚拟地址进行间隔16bit的叠加,并判断数据是否获取完成。如果未完成且虚拟地址超出4kB的内存细粒度,则进入TLB缓存机制获取PTE的值;如果未完成但虚拟地址超出4kB的内存细粒度,则返回到步骤(2)。

2.3 MMU的VHDL逻辑及状态机的设计

按照2.2节的MMU工作原理,使用Vivado设计和封装IP核时,虚拟地址到物理地址的转换VHDL逻辑和MMU状态机的设计,分别如图6、图7所示。

该状态机采用单进程设计,共有11个状态。状态机从Read addr状态进入,读取到虚拟地址后进入Read tlb状态判断是否触发TLB缓冲器。如果触发,则进入Read Data cmd状态读取读数据指令,进而进入Read Data状态读数据后返回Read addr状态等待虚拟地址;如果没有触发,TLB缓存器则进入Read pud cmd状态读取读PUD值指令,进而进入Read pud状态读取PUD值。如果PUD值的后两位为全零,则表示未读取到有效的PUD值,进入PAGE FAULT状态,进而返回Read addr状态等待虚拟地址;如果读到有效的PUD值,则依次进入Read pmd cmd状态和Read pmd状态读取PMD值。如果PMD值的后两位为全零,则表示未读取到有效的PMD值,则进入PAGEFAULT状态,进而返回Read addr状态等待虚拟地址;如果读到有效的PMD值,则依次进入Read pte cmd状态和Read pte状态读取PTE值。如果PTE值的后两位为全零,则表示未读取到有效的PTE值,进入PAGEFAULT状态,进而返回Read addr状态等待虚拟地址;如果读到有效的PTE值,则依次进入Read data cmd状态和Read data状态读取读数据,随后返回Read addr状态等待虚拟地址。

图5 MMUIP软核VHDL逻辑工作流程

图6 虚拟地址到物理地址的转换VHDL逻辑

图7 MMU状态机

3 仿真及验证

3.1 仿真及验证平台

本文设计的是一个可以运行在ZCU102平台的MMUIP核。为了能够使该IP核可以正常工作,需要在ZCU102平台上运行64位的Linux系统,以及利用Vivado设计相应的工程进行测试。

本次测试的环境:Xilinx公司ZCU102 REVISION1.1开发板,Vivado 2018.3开发软件,64位Linux操作系统。

本次测试的基本流程:在Linux操作系统中创建一个函数,函数内容包括申请一段64位数据类型的用户空间内存,生成一段数据写入该段用户空间内存,并将该段用户内存空间的起始地址和TTBR0_EL0寄存器的值发送给MMU。

利用Vivado 2018.3软件创建Vivado工程,该Vivado工程包括MMU IP软核和ZCU102的PS的IP核。综合后添加ILA核调试工具生成bit文件和ltx文件,通过仿真器加载到开发板中即可调用Linux系统中设计的函数进行测试。

3.2 ILA调试工具仿真结果

64位的Linux内核在ZCU102开发板中初始化结束后调用函数,完成虚拟地址和TTBR0_EL0寄存器的值发送后,通过ILA调试工具可以得到如图8所示输出波形。

图8 ILA调试的仿真波形

通过调试平台得到的波形可以看出,MMU能够很好地读取到Linux内核分配的内存地址以及其相对应的数据。其中,虚拟地址的首地址为0x0038ca83a0,TTBR0_EL0寄存器的值为0x87aaab000,第一次与虚拟地址的[38:30]位拼接后查表得到的PUD的值为0x87a022003,第二次与虚拟地址的[29:21]位拼接后查表得到的PMD的值为0x87a816003,第三次与虚拟地址的[20:12]位拼接后查表得到的PTE的值为0x87bc9ff53,最终与虚拟地址的[11:0]位拼接得到的物理地址为0x87bc9f3a0,对应的值为0x1fff以及下一位的值0x1ffe。虚拟地址加16bit后为0x0038ca83b0,可以触发TLB缓存,直接可得其对应的物理地址为0x87bc9f3b0,对应的值为0x1ffd以及下一位的值0x1ffc,可以满足设计时的需求。

4 结 语

针对armv8的内存管理机制,结合FPGA对应用数据获取的高效率和大吞吐量的需求,本文设计了一个可以适用于Xilinx公司的ZCU102开发板的包含了TLB缓存的MMU IP软核。实验表明:该MMU IP软核可以从处理器端外挂的DDR存储颗粒内稳定高效地获取大吞吐量的数据,可以广泛应用于FPGA和处理器端之间数据通信的应用场景。

猜你喜欢

开发板内存处理器
基于STM32H7的FDCAN通信系统设计与实现∗
笔记本内存已经在涨价了,但幅度不大,升级扩容无须等待
“春夏秋冬”的内存
浅析单片机开发板的设计与制作
ARM宣布mbed Enabled Freescale FRDM—K64F开发板通过微软认证
内存搭配DDR4、DDR3L还是DDR3?
ADI推出新一代SigmaDSP处理器
上网本为什么只有1GB?
MiniGUI在基于OMAP5912开发板上的移植
火线热讯