处理系统
FPGA 分为 PL(可编程逻辑)和 PS(处理系统),本质上是将一个高性能的 ARM 处理器硬核与一个灵活的 FPGA 可编程逻辑集成在同一颗芯片上。
这种设计的核心目的,是让开发者能同时利用两者的优势,处理复杂任务。简单来说:
**PS (Processing System):**是固定的、高能的"大脑",擅长复杂决策和系统控制;
**PL (Programmable Logic):**是灵活、并行的"巧手",擅长高速数据处理和硬件定制
回到岗位职责来划分的话,PL侧开发任务由掌握Verilog语言的逻辑工程师负责,而PS侧则交给熟悉C语言的嵌入式工程师。
Microblaze
Xilinx的ZYNQ架构下系统集成了ARM处理器,而对于没有集成硬核处理器的芯片,Xilinx提供了用逻辑代码实现的软核处理器。这个软核是由 FPGA 内部的逻辑资源实现,虽然性能上比不了 ZYNQ 的硬件,但在一些控制的领域还是能做到游刃有余。同样的,xilinx 也提供了软核的 IP,这就是 MicroBlaze。现在手头的开发板是ku5p芯片,就以MicroBlaze来进行具体展开。ZYNQ下引脚、接口、DDR这些资源都会情绪划分为PL和PS,使用起来更加方便。
MicroBlaze IP首页配置项如下

Enable MicroBlaze Debug Module Interface(调试接口):
使能调试功能。用 Xilinx Microprocessor Debugger 来下载、调试程序。(推荐:除非面积资源奇缺,否则不要禁止这个功能。)
Use Instruction and Data Caches(指令和数据 cache,当使用外置 DDR 的时候使用):
当执行放在 LMB 之外的程序的时候,可以使用指令缓存来改善性能。指令缓存有如下特点:当使用外部存储时,激活这个选项可以明显地改善性能,即使这个缓存很小。后续工程中会演示外置DDR,因此这里配置时可以勾上。
Enable Exceptions(异常处理使能):
当使用一个支持异常的操作系统时,需要激活这个选项。或者在一个单独的程序中添加异常回调函数。
Use Memory Management(内存管理):
当使用一个支持虚拟内存保护的操作系统时(如 Linux),需要激活。(当你使能面积优化或者堆栈保护功能时,内存管理单元是不可见的,自动禁止)
**Enable Discrete Ports:**使能软核上的独立端口。
右下角Next进入下一页配置

这一页是关于移位器、浮点单元、整形乘法器,整形除法器、模式比较器、其他机器状态寄存器指令、加载、存储和交换指令、额外的流指令、容错功能。
MicroBlaze下的指令配置*
**使能桶型移位器(Enable Barrel Shifter):**使能软核中的筒形移位器硬件。激活这个参数,就可以使用如下指令(bsrl,bsra,...)使能这个可以提高应用的性能,但是会增大软核的尺寸。如果激活,编译器会自动使用筒形移位器指令。
**使能浮点单元(Enable Floating Point Unit):**使能一个单精度浮点单元(FPU)。使用 FPU 可以明显地提高应用的单精度浮点性能,同时也会增大软核的尺寸。
**使能整形乘法器(Enable Integer Multiplier):**使能一个整形乘法器硬件。若激活,则可以在给 MUL32 赋值时,使用 mul 和 muli 指令。当给 MUL64 赋值时,使用 mulh,mulhu,mulhsu 指令。这个参数可以设置为 NONE,可以把MUL 或者 DSP48 释放,用作其他用途。这样做对软核的面积影响很小。当使用这个选项,编译器自动使用 mul 指令。
**使能整形除法器(Enable Integer Divider):**使能一个整形除法器硬件。若激活,可以使用 idiv,iduvu 指令。使能这个选项可以提高应用中的除法性能,但是增大了软核的尺寸。当使用这个选项,编译器自动使用 idiv 指令。
**使能额外机器状态寄存器指令(Enable Additional Machine Status Register Instructions):**若激活,则可以读写 MSR,使用 msrset 和 msrclr 命令。可以提高访问 MSR 的性能。
**使能模式比较器(Enable Pattern Comparator):**如激活,则可以使用模式匹配指令 pcmpbf,pcmpeq,pcmpne。模式匹配字节查找指令(pattern comparator byte find, pcmpbf)返回找到的第一个字节的位置,提高字符串和模式匹配操作的效率。若使能,SDK 库会自动使用这个指令。pcmfeq 和 pcmpne 指令根据两个字是否相同,返回 1 或者 0。这些指令会提高 setting flags 的效率,编译器会自动使用它们。激活这个选项还可以 count leading zeros 指令,clz。clz 指令能提高优先级编码的效率。
**使能保留的加载/保存和交换指令(Enable Reserved Load/Store and Swap Instructions) :**lbur,lhur,lwr,sbr,shr,swr,swapb,和 swaph。这些指令能够以相对的字节序来读写数据,交换指令能交换字节或者半个字长。当用 little-endian 的 MicroBlaze 访问 big-endian 的网络时,可以提高效率。
**使能额外的流命令(Enable Additional Stream Instructions):**当使用 AXI4-Stream 链接时,提供额外的功能。这包括动态访问指令 GETD 和 PUTD,这两个指令用寄存器来选择接口。(重要:一定要激活流异常功能,才能使用这些指令,而且知道选择一个流链接)
这些配置选项,本质上是FPGA软核处理器(如MicroBlaze)的"硬件加速器开关" 。使能意味着在**"软件运行速度"** 和**"硬件面积开销"** 之间做取舍。在FPGA设计中,这就是经典的**"面积换性能"**。
-
桶形移位器、乘法器、除法器、FPU :将这些操作从几十甚至上百个时钟周期 缩短为1~2个时钟周期。
-
模式比较器(PCMPBF/CLZ) :将字符串查找、优先级编码(如寻找第一个1)从软件
for循环查找变为硬件直接输出结果,对操作系统调度和网络协议栈处理是巨大的提升。 -
额外MSR指令(msrset/msrclr) :让CPU能原子地修改机器状态寄存器,无需"读-改-写"序列,这对实时操作系统的关中断和任务切换至关重要,能避免临界区的数据竞争风险。
-
保留加载/交换指令(Swap/LWR/SWR) :让CPU原生支持字节序翻转 和大端/小端混访。这意味着CPU在读取网络报文(大端)时,数据在加载进寄存器的瞬间就已经转换好了,无需软件额外调用
ntohl函数。 -
额外流指令(GETD/PUTD) :让CPU拥有**"内存卸载"**能力,类似DMA。CPU可以直接通过寄存器指定通道,将数据流推送到硬件外设或从外设拉取,而无需经过内存缓冲,极大降低CPU搬运数据的负荷。
通过这些配置项的灵活设置,可以针对特定应用场景的"定制化加速",根据实际工程设计达到性能与资源的平衡。例如:纯控制逻辑(如I2C/SPI管理):只需勾选乘法器(面积影响小),关闭FPU和除法器,以最小面积节省FPGA逻辑资源;密集计算/AI推理:必须开启FPU、乘法器和桶形移位器,用面积换算力;网络通信:必开保留交换指令(处理字节序)和模式比较器(处理报文头解析);高速数据采集:必开额外流指令,实现数据直通CPU旁路。
进入下一页配置。
I-Cache 和 D-Cache配置
在CPU(包括FPGA中的MicroBlaze软核)中,指令缓存(I-Cache) 和 数据缓存(D-Cache) 是位于CPU核心与主存储器(如DDR)之间的两个独立的高速小容量存储器。它们的核心作用是缓解"内存墙"问题:即CPU处理速度极快,而DDR等主存访问速度较慢,CPU如果直接读写DDR,大部分时间都会浪费在等待上。
现代FPGA中的MicroBlaze以及绝大多数高性能CPU,其内部缓存都采用了 "哈佛架构(Harvard Architecture)"。如果不分开(冯·诺依曼架构),CPU取指令和读数据只能分时复用同一条总线。而分离后具备以下优势:
**并行执行:**CPU可以在通过I-Cache取指令的同时,通过D-Cache读写数据,实现流水线的真正并行,极大提高吞吐率。
**行为特性不同:**指令流是顺序的(适合预取),数据流是随机的(适合快速随机访问)。针对不同特性采用独立的硬件预测算法,效率更高。
**一致性简化:**指令通常不会被修改(除非自修改代码),数据缓存则涉及复杂的写回操作。分离后,它们各自的缓存一致性管理更简单。

使能外部Cache后IP多出对应的DC及IC接口,之前看到的 M_AXI_IP(指令接口)和 M_AXI_DP(数据接口),通常是关闭缓存(或未命中时) 使用的直接、非缓存访问路径。一旦在配置中启用了 Use Instruction Cache 和 Use Data Cache,CPU会优先走带缓存的专用接口(M_AXI_IC/DC),性能会得到质的飞跃,尤其是程序在DDR中运行时。

|------------------------|---------------------------|-------------------------------------------|
| 缓存类型 | 对应的 AXI 接口 (MicroBlaze) | 作用 |
| 指令缓存 (I-Cache) | M_AXI_IC (指令缓存接口) | 当缓存命中时,CPU直接从缓存取指;未命中时,通过此接口突发读取DDR填充缓存行。 |
| 数据缓存 (D-Cache) | M_AXI_DC (数据缓存接口) | 当缓存命中时,CPU直接读/写缓存;未命中时,通过此接口访问DDR。 |
这一页的配置是 MicroBlaze 的缓存(Cache)与内存映射 核心设置。与之前"算力单元(乘法器/FPU)"和"调试追踪"不同,这一页直接决定了CPU访问外部内存(DDR/Flash)的速度和实时性(确定性)。
1. 指令缓存(Instruction Cache)与数据缓存(Data Cache)
大小(Size in Bytes):均为 8kB
意义:这是目前配置下最小的缓存容量。8kB 只能存放约 2000 条汇编指令。对于简单的状态机控制(如I2C/SPI通信)完全够用,但如果跑 RTOS 或复杂算法,缓存命中率会很低,CPU会频繁去访问速度较慢的 DDR,导致性能瓶颈。
行长度(Line Length):均为 4
意义:指每次从内存搬运到缓存的"块大小"为 4 个字**(即 16 字节)**。这意味着即使CPU只读取 1 个字节,硬件也会把相邻的16字节一起搬进缓存。
影响:Line Length 较短(4),适合随机访问(代码跳跃大,不会浪费总线带宽搬运没用的数据);但如果处理大数组连续数据(如视频流),通常设为 8 或 16 会更高,这里设为4,本例程的应用场景更偏向于控制流而非海量数据流。
2. 缓存地址范围(Base Address & High Address):0x80000000 - 0xFFFFFFFF
意义:缓存只对 0x8000_0000 至 0xFFFF_FFFF(即高 2GB 地址空间)有效。如果程序(代码段)链接在 0x8000_0000 之后(通常外部DDR挂载在此地址),这些指令会被缓存,运行速度极快。如果你的程序放在 0x0000_0000 - 0x7FFF_FFFF(如片上本地存储器 BRAM 或 Flash),则完全不会被缓存,CPU必须直连该存储器,虽然响应延迟固定(高实时性),但速度受限于BRAM/Flash的访问速度。
用途:这种设置常用于"双区隔离"------把实时性要求最高的关键中断服务函数(ISR)放在低地址非缓存区(确保执行时间绝对固定),把大量非关键业务代码放在高地址缓存区(追求平均性能)。
3. Enable Writes & Use Cache for All Memory Accesses
Enable Writes:

在使能了Enable Writes时,CPU写数据只写到高速缓存(Cache)里就结束了 ,并不会立刻写入外部DDR。只有当该缓存行被新数据挤掉(驱逐)时,硬件才会把修改过的"脏数据"一次性写回DDR。由于写数据并不会直接访问DDR空间,频繁的变量赋值、堆栈操作(Push/Pop)现在几乎不占用外部总线带宽 ,速度会比未勾选时快 3~5倍。
那么,既然CPU写数据不立刻进DDR,而FPGA里的其他主机(如 DMA控制器、硬件加速器、另一个MicroBlaze核 )是直接读DDR的,它们永远读不到CPU刚更新的最新值 ,只能读到陈旧数据。因此在启用回写缓存后,如果CPU与DMA共享一块内存(如网络包缓冲区、ADC采样数组),则必须 在启动DMA传输前,在C代码中显式调用 Xil_DCacheFlushRange(addr, len) 将缓存里的脏数据强制刷回DDR。
在DMA传输完成后,CPU读取前,必须调用 Xil_DCacheInvalidateRange(addr, len) 丢弃缓存中的旧副本,强制CPU去DDR重新读入最新数据。
这里涉及到了工程设计中的PL与PS的交互,后面会另开文章展开。
Use Cache for All Memory Accesses

在该选项勾选后,Cache的缓存范围从"区域地址限定"变为"全地址覆盖",MicroBlaze 会完全无视 设置的 Base Address 和 High Address(0x80000000)。缓存控制器将对 0x00000000 ~ 0xFFFFFFFF 整个4GB地址空间的所有访问进行缓存。由此引出风险:
-
在Xilinx默认的地址分配中,AXI GPIO、UART、IIC、Timer、中断控制器 的外设寄存器,通常被分配在
0x40000000~0x7FFFFFFF的低地址段。 -
现在由于全缓存开启,CPU访问这些寄存器时,不会直接读写物理外设,而是去读写缓存中的"副本"。
-
写寄存器(如UART发送):数据只写进Cache就结束了,物理UART根本没收到数据,导致串口不发送。
-
读寄存器(如Timer计数值、GPIO电平):CPU永远读取Cache里陈旧的备份值,外设电平变化了,CPU读到的还是老数据。
-
中断控制器(INTC):如果中断挂起寄存器(IPR)被缓存,CPU永远清不掉中断,系统直接卡死。
因此,除非所有内存访问都指向纯RAM且无外设共享,否则切勿开启全缓存 。
同时这一选项的配置会带来一个信号传输路径上的差异,当 MicroBlaze 访问位于 Cacheable Range 内的外部存储器时,访问到底走 Cache 专用接口 还是 Peripheral AXI 接口。
AMD 官方文档对这个选项的定义也是如此:勾选时,即使 Data Cache 本身没有启用,位于可缓存地址范围内的访问也走 MicroBlaze 的 dedicated cache interface;取消后,则走 peripheral AXI。
4. 其余配置参考
|--------------------------------------|------------------------------|----------|------------------------------|
| 配置项 | 核心作用 | 类型 | 建议 |
| Use Distributed RAM for Tags | 用LUTRAM替代BRAM存储缓存标签,节省BRAM资源 | 资源优化 | 为节省BRAM或提升频率可开启 |
| Enable Write-back Storage Policy | 采用"写回"策略,提升数据访问速度 | 性能优化 | 追求高性能时建议开启,但需软件配合维护缓存一致性 |
| Number of Streams | 指令预取,减少CPU取指延迟 | 性能优化 | 代码含大量循环、追求高性能时建议启用 |
| Number of Victims | 缓存"避难所",减少数据被踢出后的重载开销 | 性能优化 | 数据访问模式复杂、追求高性能时建议启用 |
进入下一页配置。
MicroBlaze调试页面参数设置*
该页面的参数配置与后续Vitis下的嵌入式调试息息相关,是为嵌入式代码的调试所作的硬件资源准备。

1. 调试接口(Debug)------ 使能调试能力
配置为 BASIC:这意味着调试模块只保留最基础的JTAG连接功能。对CPU的意义:BASIC模式占用的LUT和块内存(BRAM)极少,适合量产发布或逻辑极其稳定的项目。但代价是它不支持复杂的硬件触发(如条件中断),如果程序跑飞,你只能靠 printf 或者瞪眼看波形。如果正在开发阶段,通常建议选 FULL(全功能)来获得更强大的在线调试体验。
2. 硬件断点/观察点(Hardware Breakpoints)------ 定义嵌入式侧的debug工具参数
配置为 1 个PC断点,0 个读写观察点的最精简配置:
PC断点(1个):允许CPU在运行到某个特定地址(函数入口)时暂停。只有1个,意味着你只能监控一处代码位置。
读写观察点(0个):这意味着你无法在CPU读写某个特定内存变量(比如全局变量被意外篡改)时触发暂停。
综合影响:这种配置下,调试能力非常有限。如果变量被野指针修改,你没法用硬件抓到"是谁写的",只能靠软件模拟断点。这节省了大量比较器资源,但建议仅在软件完全成熟后才这样设置。
3. 性能监测(Performance Monitoring)------ Vitis侧的寄存器实时显示
配置为 5 个事件计数器 + 1 个延迟计数器,宽度 32 位。
5个事件计数器:可以同时统计5种硬件事件,例如"指令缓存命中/缺失次数"、"流水线停顿周期数"、"外部总线等待周期数"等。
1个延迟计数器:通常用于统计某段特定代码(如中断服务函数)从进入到退出的总时钟周期。
32位宽度:如果CPU主频很高(如300MHz),32位计数器大约几十秒就会溢出。如果做长时间压力测试,这里建议改为64位。
实际作用:开启后,你可以在Vitis/SDK中运行程序时,实时读取这些寄存器的数值。它能精确告诉你:CPU的瓶颈到底在"计算"上,还是在"等内存数据"上,是优化软硬件划分的黄金数据来源。
4. 跟踪与剖析(Trace & Profiling)------ 嵌入式程序的运行记录
外部跟踪(External Trace):勾选后,CPU内部执行的指令流和程序计数器(PC)会通过专用引脚或AXI总线实时输出到外部逻辑分析仪或IP核。
跟踪缓冲区(Trace Buffer)大小:8kB:这是芯片内部的专用BRAM,用来暂存执行轨迹。8kB意味着它只能记录最后几千条指令的执行历史。
剖析缓冲区(Profile Buffer):NONE:这是个关键信号------表示你关闭了片上硬件剖析功能。剖析通常涉及对函数执行时间的精确采样。
系统内存与外设接口配置

本地内存总线(LMB)接口
首先Local Memory Bus为MicroBlaze标配信号,勾选使能。
-
Enable Local Memory Bus Instruction Interface (ILMB)
-
作用:启用指令侧的 LMB 接口。
-
详解 :这是 MicroBlaze 取指 专用的高速本地总线。LMB 是专为连接片上高速存储器(如 BRAM) 设计的简单、快速总线。启用后,CPU 可以通过此接口从 BRAM 中高速读取指令,这是保证系统实时性的基础。
-
-
Enable Local Memory Bus Data Interface (DLMB)
-
作用:启用数据侧的 LMB 接口。
-
详解 :这是 MicroBlaze 读写数据专用的高速本地总线。它同样用于连接高速的片上 BRAM,用于存放关键数据或堆栈(Stack),以提供确定性的低延迟访问。
-
设计要点 :LMB 总线(包括 ILMB 和 DLMB)的地址范围不能与 AXI 等接口的地址范围重叠。
AXI 和 ACE 接口
这部分负责连接系统内存(如 DDR)和各种外设(如 UART、GPIO)。
-
Select Bus Interface
-
作用 :选择用于外设和缓存访问的总线协议。
-
详解 :本次配置为
AXI总线(``ACE是 AXI 的缓存一致性扩展,主要用于多核系统中保持数据一致性)。
-
-
Enable Peripheral AXI Instruction Interface
-
作用:启用外设 AXI 指令接口。
-
详解 :这是一个只读 的 AXI4-Lite 接口(
M_AXI_IP)。使能后MicroBlaze可以通过标准的 AXI 总线去读取位于 DDR 或其它 AXI 从设备中的指令。
-
-
Enable Peripheral AXI Data Interface
-
作用:启用外设 AXI 数据接口。
-
详解 :这是一个读写 接口(
M_AXI_DP),默认使用 AXI4-Lite 协议,用于访问外设或内存。勾选后 MicroBlaze 可以通过 AXI 总线访问任何挂载在 AXI 总线上的外设(如 UART、GPIO、定时器)或内存(如 DDR)。
-
AXI-Stream流接口(Stream Interfaces)
-
Number of Stream Links
-
作用:指定 AXI4-Stream 流接口的数量。
-
详解 :标准AXi-Stream协议接口,包含tdata、tvalid、tready及tlast。每个"Link"由一对主/从接口组成,提供一个单向、点对点、低延迟 的数据流通道。它允许硬件加速器或协处理器直接与 MicroBlaze 的寄存器文件进行高速数据交换。"使能额外的流命令(GETD/PUTD)"功能,就需要在这里将
Number of Stream Links设置为大于 0 才能生效。
-
其他接口(Other Interfaces)
-
Enable Trace Bus Interface
-
作用:启用跟踪(Trace)总线接口。
-
详解 :这是一个强大的调试工具。启用后,可以输出 CPU 执行的指令地址、数据等详细信息。连接到 ILA 后,可以实现时钟周期级别的程序执行追踪,这对于分析复杂的时序或性能问题非常有价值。
-
-
Lockstep Interface
-
作用:配置锁步(Lockstep)模式。
-
详解 :
NONE表示禁用锁步功能 。锁步模式用于高可靠性场景,让两个 MicroBlaze 内核执行相同程序并比较输出,以检测硬件错误。这通常会成倍增加资源消耗。
-
至此MicroBlaze IP配置完毕
最小SoC工程构建
通过在Block Design界面直接运行Run Connection Automation


Vivado会自动补全一些外设IP并做好基础接线连接

添加UART IP
在Soc工程中添加一个基础uart IP可以在调试过程中通过串口打印信息


这里主要配置波特率、数据位数以及是否有校验位。配置供参考,只要在Vitis侧的串口保持一致的配置就可以。

设置完成后通过 AXI Interconnect 将 IP 挂载到AXI总线上。
添加MIG IP*
在前面的MicroBlaze配置时使能了I-Cache以及D-Cache,那么现在需要给MicroBlaze挂载上DDR外部存储。如果只访问Bram,那么这一步可以不做。
添加了MIG IP后,工程中先通过一个2*Slave 1*Master的AXI Interconnect将MIG IP挂载到AXI总线。

MIG IP Core 参数配置
第一页的参数最为重要

Memory Device Interface Speed 以及Controller Options都取决于外围硬件所选用的DDR颗粒型号。如果Memory Part下的器件型号没有包含硬件选用的实际型号,那么也可以通过Enable Custom Parts Data File来进行自定义器件的csv文件导入。所需的csv文件格式可在Vivado安装目录 .../data/ip/xilinx/mem_v1_4/csv/ 下找到 memparts.csv 作为参考格式参考。对应的DDR颗粒参数信息则需要去查阅datasheet。
进入下一页,主要是配置AXI接口的数据位宽

下一页Advanced Clocking可以例化IP提供多路不同频率的时钟。

下一页为一些高级设置,这里也给出配置项的说明描述。

- Debug Signals for controller (控制器调试信号)
- Disable/Enable :默认选择 Disable。如果勾选 Enable,MIG IP 内部会引出用于调试的额外信号(例如 IDELAY 控制信号、校准状态等),方便在 ILA (集成逻辑分析仪) 中抓取。注意:开启会增加大量的逻辑资源消耗。在调试完成后,建议关闭。
- Microblaze MCS ECC option (MicroBlaze MCS ECC 选项)
- 复选框(未勾选) :这是针对 MicroBlaze 微控制器系统 (MCS) 的特定选项。如果你使用的是纯 MicroBlaze 软核并且需要 ECC(错误检查和纠正)功能,且 MIG 控制器以 ECC 模式运行,可以勾选此项。普通 SoC 设计通常不勾选。
- Simulation Options (仿真选项)
-
Simulation Mode (仿真模式):
-
BFM (Bus Functional Model) :总线功能模型。这是一种速度极快的仿真方式,它不模拟真实的 DDR 物理层(PHY)时序,而是用数学模型模拟读写。适合用来快速验证你的 SoC 逻辑是否正确,通常比 RTL 级仿真快 10 倍以上。您当前选择的正是 BFM。
-
其他可选模式:RTL(真实底层逻辑仿真,速度慢但最精确)或 SystemVerilog。
-
-
Example Design Test Bench (示例设计测试平台):
- SIMPLE TG (Simple Test Generator):简单测试生成器。在仿真时,MIG 自带一个示例测试平台,会向内存发出简单的读写指令(如固定的写入数据再读出验证),用于快速验证 DDR 控制器通路是否正常。这也是最常用的仿真测试选项。
- Advance Memory Options (高级内存选项)
-
Enable Self Refresh (开启自刷新) :勾选后,DDR4 在闲置时会自动进入低功耗的自刷新状态。用于降低系统功耗。如果系统对功耗不敏感,或者在初始化阶段有特殊要求,建议不勾选。
-
Enable Save-Restore (开启保存恢复):允许在系统复位(如按复位键)时,将 DDR4 内部的寄存器状态保存下来,并在复位结束后恢复。常用于软核(如 MicroBlaze)热复位时不想丢失内存状态的设计。
-
Disable OBLUF on reset_n (复位时禁用输出缓冲器锁存功能) :DDR4 有防止输出缓冲器在复位信号无效前意外锁存的功能。勾选此项会使 MIG 控制器在复位拉低期间强制关闭 OBLUF(Output Buffer Latch-Up Feature)。通常用于解决某些特定板卡在复位时由于 I/O 电平冲突导致的不稳定问题。一般保持默认(不勾选)。
-
Enable Restore CRC (开启恢复 CRC) :开启 CRC 校验的自动纠错与恢复机制。这能增强数据在传输过程中的安全性,能检测并处理部分传输错误,但同时会增加额外的延迟和逻辑资源。
- Migration Options (迁移选项)
- Enable Migration (开启迁移) :如果勾选此项,MIG 会生成兼容不同密度、不同速度等级 DDR4 颗粒的配置参数。这样当你未来想将板子上的 DDR4 芯片更换为更大容量或不同品牌的芯片时,不需要重新生成 IP 核,只需要修改部分参数即可。如果你确定未来的量产或改版不会更换 DDR 芯片,建议不勾选(节省资源)
BD design总图参考
这里给出一张工程的BD design的总图参考,外围接口可以根据实际资源调整。输入信号无非就是DDR的参考时钟,输出则是DDR以及UART接口。

可以看到工程下直接采用DDR MIG的输出时钟ui_clk作为逻辑全局时钟。MIG模块的sys_rst复位图方便直接给了常数0,有条件的可以自行修改。
Address Editor的总线地址分配
在Block Design完成接线后,还需要非常关键的一步,那就是对AXI总线上的IP进行地址分配。在Address Editor下可以看到工程中的MicroBlaze所在的AXI总线,上方菜单栏会提示有哪些IP处在Unassigned状态。

通过下箭头进行自动地址全分配

在自动分配后可以根据设计需求调整每个IP的及地址及对应的空间大小,例如一个自研IP所包含的寄存器极少,那么在总线上就无需分配大段的空间。总之按需分配,多寄存器多得。
同时可以看到DDR4的Memory Map分配在了0x80000000之后,这里就对应到之前在MicroBlaze下,缓存地址范围是从0x80000000之后开始。
添加约束及工程编译
这一步肯定少不了,约束文件照例参考原理图设计,综合、布局布线、生成比特。
导出硬件平台.xsa文件

这一步建议勾上Include bitstream,方便嵌入式工程的独立迁移调试。

最终可以在文件夹下看到这两个文件,那么即具备了用Vitis搭建嵌入式工程的基础条件。

这篇写的有点太长了,Vitis的工程搭建就下一篇再写吧。
下一篇会介绍Vitis下如何创建嵌入式工程,以及基础的hello world运行,PS与PL的GPIO接口操作。
Fin