文着眼于仲裁器( arbiter)的应用场景和优点,以及在VHDL中实现简单优先级仲裁器(simple priority arbiter)。
仲裁器( arbiter)是任何现代计算机系统的重要组成部分。从I2C和CAN等通信协议中的总线仲裁到多处理器系统中的存储器仲裁,工程师可以在需要共享资源的任何地方找到仲裁器。
仲裁器可以是同步(synchronous)的(即,时钟控制的)或异步(asynchronous)的,并且它们通过输入请求并基于这些请求准许对资源的访问来工作。
在嵌入式世界中,资源总是有限的。使用仲裁器( arbiter)可以简化资源控制并为竞争子系统增加优先级,同时提高系统性能和稳健电信大流量卡性。
基础知识
什么是仲裁器(Arbiter)?
在最基本的情况下,仲裁器(Arbiter)是一种设备,它接受作为输入的N个请求,并以one-hot(独热码)的形式输出单个授权。 one-hot(独热码)是一组任意大小的bit位,由除一个bit为1之外的全零的形式组成;即,只有一个bit位是逻辑高或“热(hot)”。以这种方式,仲裁器(Arbiter)查看其输入集并允许单个设备访问资源。
动作中的仲裁器(Arbiter)的例子
假设我们有三个设备(devices),每个设备都有一个与仲裁器(Arbiter)绑定的请求信号。这里的“设备(devices)”用作任何请求者的通用术语。请求者可以是FIFO(先电信大流量卡进先出)队列,CPU,状态机等。当设备需要访问资源时,它只是将其请求信号设置为高。仲裁器(Arbiter)检查其输入并授予访问权限。
图1显示了一个框图,下面是一个真值表。在该示例中,授权信号不以任何特定方式使用。授权信号如何提供对资源的访问取决于应用程序和实现。
图1
图1.带有请求和授权信号的仲裁器(Arbiter)
图1描述了每个设备独立发出请求的情况。
但是,当两个或更多设备同时发出请求时的情况呢?为了解决这个问题,我们可以在仲裁器(Arbiter)中建立优先级。
如何建立仲裁器(Arbiter)的优先权
图2显示了一个修改后的真值表,它根据请求给出了优先级。具有请求R3的Dev3优先于Dev2(具电信大流量卡有R2)和Dev1(具有R1)。带请求R2的Dev2优先于Dev1(带R1)。再次注意,授权输出始终是one-hot(独热码)形式的。这一点对于防止多个设备同时访问同一资源来说至关重要。
图2
图2.具有请求优先级和授权信号的仲裁器真值表
在设计中实施仲裁器(Arbiter)
现在我们知道仲裁器背后的基本思想以及逻辑行为是什么。从这里开始,我们可以开始实施我们的设计。
有不同的方法来实现相同的功能。您可以使用卡诺图(Karnaugh map)来简化上面的真值表,或者以硬件描述语言(hardware description language,HDL)开始实现。
我个人喜欢绘制逻辑图,如果它不是太复杂。将逻辑电信大流量卡门与真值表一起可视化的能力将在构建真值表时才能使之更容易。
Logisim中的仲裁器(Arbiter)
Logisim是一个面向数字设计者,业余爱好者和学生的开源逻辑模拟器。它完全是图形化的,使用户能够使用所有日常逻辑模块来构建和测试简单的设计,包括AND门,多路复用器,加法器,触发器,寄存器甚至随机存取存储器(RAM)。
下面的图3和图4显示了一个三位优先级仲裁器。带有字母“a”和“b”的标签称为隧道( tunnels),表示即使在它们之间没有绘制物理线路,也会连接具有相同字母的点。亮绿色路径表示逻辑高或TRUE(真值)信号。
图3
图3.在Logisim中模拟的三输入仲裁器(Arbiter)
首先,请电信大流量卡注意最高AND门(A1)的第一个输入保持高电平。该逻辑高电平在A2处获得AND,具有请求R3的补码。 A2的输出在A4处进行AND运算,并与请求R2的补码相对应。然后,A4的输出确定是否授予请求R1。
通过这种方式,您可以看到初始逻辑高电平在仲裁器(Arbiter)中的波动情况。如果任何请求变高,则其补码将传递给仲裁器(Arbiter),确保其下面的任何请求都不被授予。这就是我们如何创建仲裁器(Arbiter)的优先级。图3显示即使仲裁器正在接收两个请求R1和R3,也只输出一个授权(G3)。
图4显示了类似的情况,但是它现在的请求R1和请求R2在竞争访问资源。
图4
请求R2具有比R1更高的优先级,因电信大流量卡此高的授权信号是G2。我们可以看到,这个高优先级来自于请求R2在门A4处被求补的事实,保持A5的输出(即,授予G1)变高。
模拟小逻辑图,如上所述,非常适合快速验证概念。但是当需要构建大型的东西时,应该使用更复杂的工具。
VHDL中的仲裁器(Arbiter)
为了用VHDL实现我们的仲裁器(Arbiter),我使用了Xilinx ISE。其他工具如Quartus II或Active-HDL也可以使用。
下面的清单1显示了三输入优先级仲裁器的实现。
— Listing 1: Arbiter
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity arbiter is电信大流量卡
port(
R: in STD_LOGIC_VECTOR(3 downto 1);
G: out STD_LOGIC_VECTOR(3 downto 1));
end arbiter;
architecture grant of arbiter is
begin
G <= “100” when R(3) = 1 else
“010” when R(3) = 0 and R(2) = 1 else
“001” when R(3) = 0 and R(2) = 0 and R(1) = 1 else “000”;
end grant;
清单1.以VHDL实现的仲裁器请注意在实体块中使用std_logic_vector电信大流量卡来构建请求和授予端口。
R向量表示三个输入请求,G用于输出授权。就架构而言,我们只使用组合逻辑,这就是为什么你没有看到任何进程。
一旦架构开始,第一行在R(3)为高时将G设置为100,忽略其余输入。接下来,如果R(3)为低,则检查R(2)并且如果R(2)为高则将G设置为010。注意我们仍然忽略R(1)。如果R(3)和R(2)都很低,我们检查R(1)。如果R(1)为高,则G得到001。最后,如果所有输入都很低,我们使用else语句来确保G设置为000。这是在VHDL中实现我们的优先级方案的简单方法。
在Testbench中测试VHDL仲裁器(Arbiter)
现在来测试我们的代码。清单2显示了一个简单的电信大流量卡测试平台,我们可以使用它来实例化和测试我们的新设计。
— Listing 2: Arbiter TestBench
library ieee;
use ieee.std_logic_1164.all;
entity arbiterTest is
end arbiterTest;
architecture behavior of arbiterTest is
— Component Declaration for the Unit Under Test (UUT)
component arbiter
port(
R : in std_logic_vector(3 downto 1);
G : out std_lo电信大流量卡gic_vector(3 downto 1)
);
end component;
–Inputs
signal r : std_logic_vector(3 downto 1) := (others => 0);
–Outputs
signal g : std_logic_vector(3 downto 1);
begin
— Instantiate the Unit Under Test (UUT)
uut: arbiter port map (
r => R,
g => G
);
— Stimulus process
stim_proc: process
begin
r <= “000”;
wait for 1 n电信大流量卡s;
r <= “001”;
wait for 1 ns;
r <= “010”;
wait for 1 ns;
r <= “011”;
wait for 1 ns;
r <= “100”;
wait for 1 ns;
r <= “101”;
wait for 1 ns;
r <= “110”;
wait for 1 ns;
r <= “111”;
wait for 1 ns;
r <= “000”;
wait;
end process;
end;
清单2.在VHDL中实现的Arbiter测试平台虽然测试平台设计超出了本文的范围,但下面简要说明。
基本上,我声明仲裁器(Arbiter)组件以及测试信号r和g。然后我将仲裁器(Arb电信大流量卡iter)组件实例化为我的测试单元,并将测试信号映射到其端口。然后我运行所有八个输入组合,每个组合之间等待一个纳秒。我已经命令这些匹配图2中的真值表。测试平台的最后一部分将输入设置为000,然后永远等待。虽然有更优雅的方法来测试所有输入组合,但这似乎是最简单,最直接的实现。
为了了解仲裁器(Arbiter)在此测试平台中的行为,我在ISE中模拟了测试平台并生成了一个时序图,如图5所示。
图 5
图5. 仲裁器(Arbiter)测试平台的时序图
顶部栏是我们的请求向量,而第二栏是授权向量。
此授权向量已扩展,以便我们可以看到G3,G2和G1。请注意,当请求R3(请求向量的最高有效位)为高时,无论其他输入的电信大流量卡状态如何,授权G3也为高。当请求R2为高且R3为低时,G2为高。仅当除R1之外的所有请求都较低时,G1才为高。通过这个时序图,我们可以看到我们的仲裁器(Arbiter)的行为符合预期。
顾名思义,简单的优先级仲裁器很简单。有更好,更有效的方法来实现仲裁器(Arbiter)。优先级仲裁器(Arbiter)的一个问题是可能永远不会授予低优先级请求。可以解决的一种方法是使用循环仲裁器(Arbiter),它使每个请求者在短时间内访问资源。可以组合循环和优先级仲裁器(Arbiter)以获得两种实现的最佳效果。这些设计可能会在以后的文章中探讨。
结论
本文介绍了仲裁器(Arbiter),在VHDL中实现了一个简电信大流量卡单的优先级仲裁器(Arbiter)。仲裁器(Arbiter)是不同系统组件和系统资源之间的中介。这可能是需要访问共享内存的两个CPU内核,或者是两个试图控制通信总线的微控制器。无论何种应用,仲裁器(Arbiter)都是针对常见复杂问题的低成本且相对简单的解决方案。
友情提醒: 请添加客服微信进行免费领取流量卡!
QQ交流群:226333560 站长微信:qgzmt2
原创文章,作者:sunyaqun,如若转载,请注明出处:https://www.dallk.cn/48087.html