MicroBlaze IP核的组织结构采用哈佛架构,为数据和指令访问提供了独立的总线接口单元。MicroBlaze支持的主要内存接口是本地存储器总线(Local Memory Bus, LMB)和AMBA AXI4接口(AXI4)和ACE接口(ACE)。
LMB提供对片上双端口块RAM的单周期访问。AXI4接口提供到片上和片外外围设备以及存储器的连接。ACE接口提供到存储器的高速缓存一致连接。
MicroBlaze还支持多达16个AXI4 Stream接口端口,每个端口都有一个主端口和一个从接口。
1 特性
MicroBlaze软核处理器具有高度可配置性,允许您选择设计中所需的一组特定功能。
AMBA AXI4 Interface:用于外设接口,它支持高效的、基于包的传输。AXI4 是 ARM AMBA (Advanced Microcontroller Bus Architecture) 的一部分,是一种高性能、高带宽、低延迟的接口,用于在处理器、内存和其他 IP 核之间传输数据。
AMBA AXI4 Coherency Extension (ACE) Interface:用于缓存接口,它扩展了 AXI4 以支持缓存一致性。这对于需要多个处理器或处理器与加速器之间共享数据的应用非常有用。
LMB (Local Memory Bus):提供了一个简单的同步协议,用于在 MicroBlaze 处理器和 FPGA 上的其他模块(如块 RAM)之间进行高效的数据传输。它通常用于那些不需要 AXI4 接口的复杂性和带宽的应用。
AXI4-Stream:提供了一个非仲裁的、快速的流通信机制。它特别适用于需要连续数据传输的应用,如视频流或音频流。AXI4-Stream 接口可以配置为单向或双向,并可以连接多个设备,以实现高吞吐量的数据流。
Debug Interface:用于与 Microprocessor Debug Module (MDM) IP核一起使用,允许开发人员对 MicroBlaze 处理器进行调试。通过这个接口,开发人员可以访问处理器的内部状态、设置断点、单步执行代码等。
Trace Interface:用于性能分析。它允许开发人员捕获处理器在执行过程中的详细信息,如指令执行、数据访问等。这些信息可以用于分析处理器的性能瓶颈,并优化代码或硬件设计以提高性能。
这些接口的配置取决于具体的应用需求,开发人员可以根据需要选择适当的接口来优化他们的设计。
2 MicroBlaze的I/O接口概述
下图展示了MicroBlaze IP核的接口示意图。
- M_AXI_DP:外设数据接口,可以是AXI4-Lite或AXI4接口。用于连接外部设备,进行数据传输。
- DLMB (Data Local Memory Bus):数据接口,本地存储器总线(仅用于BRAM)。提供CPU与本地块存储器(如BRAM)之间的数据交换通道。
- M_AXI_IP:外设指令接口,AXI4-Lite接口。用于挂载AXI总线形式的接口外设IP,以传输指令信息。
- ILMB (Instruction Local Memory Bus):指令接口,本地存储器总线(仅用于BRAM)。提供CPU与本地块存储器(如BRAM)之间的指令交换通道。
- M0_AXIS..M15_AXIS:AXI4-Stream接口主设备直接连接接口。提供高速、非仲裁的流通信机制,支持主设备与其他设备间的数据传输。
- S0_AXIS..S15_AXIS:AXI4-Stream接口从设备直接连接接口。支持从设备与其他设备间的高速、非仲裁的流通信。
- M_AXI_DC:数据侧缓存AXI4接口。用于连接外部数据缓存,支持高速数据传输和缓存一致性管理。
- M_ACE_DC:数据侧缓存AXI Coherency Extension (ACE)接口。扩展AXI4接口以支持缓存一致性,用于多处理器或处理器与加速器间的数据共享。
- M_AXI_IC:指令侧缓存AXI4接口。用于连接外部指令缓存,支持指令的高速缓存和传输。
- M_ACE_IC:指令侧缓存AXI Coherency Extension (ACE)接口。与M_AXI_IC类似,但扩展了缓存一致性支持。
- Core:其他杂项信号,包括时钟、复位、中断、调试和跟踪。提供MicroBlaze IP核运行所需的基本控制和调试功能。
这些接口为MicroBlaze提供了丰富的外设连接和内存访问能力,支持各种嵌入式应用的需求。开发人员可以根据具体的应用场景选择合适的接口进行配置和使用。
3 睡眠和暂停功能
在MicroBlaze中,有两种明确的方法以受控的方式暂停执行:软件控制和硬件控制。
3.1 软件控制
通过执行MBAR(MicroBlaze Architecture Reference Manual)指令来进入睡眠模式。这种方式是通过编程实现的,即编写特定的指令让MicroBlaze进入休眠状态。
当MicroBlaze执行MBAR指令以进入睡眠模式并完成所有外部访问后,其流水线会停止,并设置Sleep、Hibernate或Suspend输出信号之一。此时可以安全地执行一些动作,如停止时钟、重置处理器或其他IP核。
这些输出信号的具体作用取决于系统设计和配置。例如,Sleep信号可能只是暂停处理器的执行,而Hibernate信号可能涉及保存处理器状态并完全关闭处理器的电源。Suspend信号可能表示处理器进入了一种低功耗状态,但仍然可以响应某些唤醒事件。
为了从睡眠模式中唤醒MicroBlaze,一个或多个Wakeup输入信号必须被设置为激活状态(通常是逻辑高电平,即“1”)。一旦这些信号被激活,MicroBlaze就会从睡眠状态中恢复,并继续执行MBAR指令之后的代码。
Dbg_Wakeup
输出信号是MicroBlaze处理器用于指示调试器请求唤醒的一个信号。当这个信号被激活时,外部硬件应该处理这个信号并唤醒处理器,同时执行任何必要的硬件操作,比如启动时钟。
在使用调试唤醒功能时,软件必须意识到这可能是唤醒的原因。如果处理器在唤醒后没有需要执行的其他操作,它可能会再次进入睡眠模式。这通常是由调试器或操作系统的调度程序来控制的。
在最简单的情况下,如果处理器唤醒前不需要执行额外的动作,可以将一个Wakeup输入信号直接连接到MicroBlaze的中断输入信号(如INT),而另一个Wakeup输入信号连接到MicroBlaze的Dbg_Wakeup输出。这样配置后,MicroBlaze可以在中断发生时或者当调试器请求时唤醒。
要实现软件复位功能,可以将MicroBlaze的Suspend输出信号连接到适当的复位输入上,以便在需要时复位处理器或整个系统。
以下表格总结了MicroBlaze处理器的MBAR睡眠模式指令:
下面图3-2中的框图,展示了如何使用睡眠功能来实现时钟控制。在这个例子中,当执行睡眠指令时,时钟会被停止,而任何中断或调试命令都会启动时钟并唤醒处理器。
当使用RTL模块代替IP核来实现时钟控制时,可以使用VHDL来编写相应的代码。以下是一个VHDL实现示例,用于在类似图3-2所示的框图中控制时钟。
library IEEE;
use IEEE.STD_LOGIC_1164.all;
library UNISIM;
use UNISIM.VComponents.all;
entity clock_control is
port (
clkin : in std_logic;
reset : in std_logic;
sleep : in std_logic;
interrupt : in std_logic;
dbg_wakeup : in std_logic;
clkout : out std_logic
);
end clock_control;
architecture Behavioral of clock_control is
attribute X_INTERFACE_INFO : string;
attribute X_INTERFACE_INFO of clkin : signal is ".com:signal:clock:1.0 clk CLK";
attribute X_INTERFACE_INFO of reset : signal is ".com:signal:reset:1.0 reset RST";
attribute X_INTERFACE_INFO of interrupt : signal
is ".com:signal:interrupt:1.0 interrupt INTERRUPT";
attribute X_INTERFACE_INFO of clkout : signal is ".com:signal:clock:1.0 clk_out CLK";
attribute X_INTERFACE_PARAMETER : string;
attribute X_INTERFACE_PARAMETER of reset : signal is "POLARITY ACTIVE_HIGH";
attribute X_INTERFACE_PARAMETER of interrupt : signal is "SENSITIVITY LEVEL_HIGH";
attribute X_INTERFACE_PARAMETER of clkout : signal is "FREQ_HZ 100000000";
signal clk_enable : std_logic := '1';
begin
clock_enable_dff : process (clkin) is
begin
if clkin'event and clkin = '1' then
if reset = '1' then
clk_enable <= '1';
elsif sleep = '1' and interrupt = '0' and dbg_wakeup = '0' then
clk_enable <= '0';
elsif clk_enable = '0' then
clk_enable <= '1';
end if;
end if;
end process clock_enable_dff;
clock_enable : component BUFGCE
port map (
O => clkout,
CE => clk_enable,
I => clkin
);
end Behavioral;
3.2 硬件控制
通过设置输入信号Pause
来暂停流水线。这里的“流水线”指的是处理器执行指令的并行处理过程。当Pause输入信号被设置为1(高电平),并且MicroBlaze已经完成所有外部访问时,处理器的流水线会停止,并且Pause_Ack输出信号会被设置。这个Pause_Ack信号是用来通知外部硬件,现在可以安全地执行诸如停止时钟、重置处理器或其他IP核等操作。为了从暂停状态恢复,Pause输入信号必须被清除到0(低电平)。当Pause信号变为低电平时,MicroBlaze将从之前暂停的地方继续执行指令。
Dbg_Continue
输出信号是 MicroBlaze 处理器提供的一个调试功能信号。当这个信号被激活(通常设置为高电平)时,它表示调试器请求处理器从暂停状态恢复执行。这个信号对于调试过程中需要精细控制处理器状态的情况非常有用。
在外部硬件设置或清除“Pause”状态后,为了避免由于错误地检测“Pause_Ack”而导致的问题,建议当外部硬件设置了“Pause”状态后,应该等待相应的“Pause_Ack”信号被设置。这通常表示系统或内部硬件已经成功接收到了“Pause”的请求,并且已经采取了相应的动作。
用于硬件控制的所有信号(Pause、Pause_Ack和Dbg_Continue)都是与MicroBlaze时钟同步。
图3-3中的框图展示了如何使用暂停功能来停止处理器以及如何实现时钟控制。在这个例子中,Pause
是一个外部硬件信号,用于暂停处理器的执行并停止时钟。当 Pause
被清除(设置为零)时,时钟被启用,并且处理器的执行恢复。这个例子假设外部逻辑监视 Dbg_Continue
信号,并在允许调试时清除 Pause
。