【问题标题】:Understanding a simple round-robin arbiter verilog code了解一个简单的循环仲裁程序 verilog 代码
【发布时间】:2019-03-06 03:57:35
【问题描述】:

看看下面的arbiter.v 代码:

有人告诉我想想 rr_arbiter 是一个简化的ripple-borrow circuit 环绕。

'base' 是一个热信号,指示第一个请求应该是 考虑资助。

嗯?你们知道如何生成“基本”输入信号吗?

注意减法。借用逻辑使其搜索找到 下一个设置位。

为什么 ~(double_req-base) ?

module arbiter (
    req, grant, base
);

parameter WIDTH = 16;

input [WIDTH-1:0] req;
output [WIDTH-1:0] grant;
input [WIDTH-1:0] base;

wire [2*WIDTH-1:0] double_req = {req,req};
wire [2*WIDTH-1:0] double_grant = double_req & ~(double_req-base);
assign grant = double_grant[WIDTH-1:0] | double_grant[2*WIDTH-1:WIDTH];

endmodule

【问题讨论】:

    标签: verilog fpga round-robin


    【解决方案1】:

    编辑:正如有人指出的那样,我最初只指出了如何设置输入信号,并举了两个特殊情况作为例子。让我试着解释一下它是如何工作的。你的问题是一个好的开始:

    为什么 ~(double_req-base) ?

    正如有人向您指出的那样,这是基于ripple borrow subtractor 的原理。当您从另一个数字中减去一个数字时,无论您使用哪种数字系统,您都从最低的顺序开始,并尝试从相同的顺序中减去两个数字。在二进制示例中,如下所示:

    1011     =    11
    0010 -   =     2 -
    ──────        ────
    1001     =     9
    

    如您所见,1 - 1 是有效的并产生0。但是,如果无法做到这一点,您可以更高的订单号。 This image 显示了一个简单的例子,说明这在十进制系统中的样子。十进制系统中的示例可能是:

    1001     =     01(10)1     =    9
    0010 -   =     00  1 0 -   =    2 - 
    ──────         ─────────        ───
    0111     =     01  1 1     =    7
    

    由于0 - 1不可能在第二个位置,我们从第四个位置取1,将第三个位置设置为1,并将第二个位置设置为10(所以,十进制系统中的2) .这与example in the decimal system I posted before 非常相似。

    对仲裁器很重要:从base 的位置看,原始数字 (req) 的下一个 1 将设置为零。基本位置和0 之间的所有数字都将设置为1。将减法的结果取反后,从底部看,只有这个位置将是1

    但是,使用这种技术,比基数低的数字仍然可以是1。因此,我们将原始数字与您计算的数字 (double_req & ~(double_req-base)) 结合起来。这确保了可能的1s 在位置低于base 被消除。

    最后,它被加倍的事实确保它不会用完可以借用的头寸。如果它需要从这些“第二个”加倍块中借用,析取 (double_grant[WIDTH-1:0] | double_grant[2*WIDTH-1:WIDTH]) 确保它返回正确的索引。我在下面的示例中添加了一个示例。

    原帖

    您可以将base 解释为req 中的起始索引。这是代码将考虑仲裁的第一位。您应该将此值设置为last_arbitrated_position + 1

    看看我在下面创建的 4 位(伪代码)示例。让我们取一些任意数字:

    req  = 4'b1101 // Your vector from which one position should be arbitrated
    base = 4'b0010 // The second position is the first position to consider
    

    现在,来自arbiter.v,如下:

    double_req   = 1101 1101
    double_grant = 1101 1101 & ~(1101 1011) = 1101 1101 & 0010 0100 = 0000 0100
    

    在最后的步骤中,arbiter.v 然后实际分配了应该授予的位置:

    grant = 0100 | 0000 = 0100
    

    这是正确的,因为我们将第二个位置设置为基数,而下一个有效位置是第三个。另一个示例,其中基数是在req 中也有效的位置,是:

    req  = 4'b1111
    base = 4'b0010
    double_req   = 1111 1111
    double_grant = 1111 1111 & ~(1111 1101) = 1111 1111 & 0000 0010 = 0000 0010
    grant = 0010 | 0000
    

    这又是正确的,因为在这种情况下,我们定义了可能被仲裁的第一个位置是第二个位置,并且这个位置确实有效。

    您发布的代码示例还处理了最重要的位。这意味着如果您设置了一个基数,但没有大于该基数的有效位置,它将环绕并从最低有效位开始仲裁。这种情况的一个例子是:

    req  = 4'b0010
    base = 4'b0100
    double_req   = 0010 0010
    double_grant = 0010 0010 & ~(1110 0001) = 0010 0010 & 0001 1110 = 0010 0000
    grant = 0000 | 0010
    

    【讨论】:

    • 您已经证明它适用于两种特定情况,但您能解释一下为什么它通常有效吗?
    • @EML 你是对的,我最初只回答了问题中询问如何使用base 的部分。最好包括一个一般性的解释。因此,我编辑了我的答案,并添加了关于纹波借位减法器以及该仲裁器如何使用它的更一般性的解释。
    【解决方案2】:

    仲裁器的目的是找出要授予哪个请求,并避免将其重复授予同一源。

    现在假设我们设置了几个req 位和base,这是先前授予的请求的状态左移1。

    因此,您的任务是在基本位左侧(或在其处)找到第一个 set 位以授予请求。减法运算将翻转所有剩下的位 基础位,以第一个 set 位结束,例如

     1100 << req
    -0010 << base
     ====
     1010
     -^^-
      ^
    

    req[2] 位是我们要授予请求的位。它被翻转为“0”。它左边的所有位和基本位的右边位都没有改变。我们需要获取最后更改为 '0' 的位。

    这样做的方法是将请求的“和”值与减法结果的反转。更改的位将始终具有单一模式:最左边将是“0”,其余的将是“1”。最左边的将恰好在请求中存在“1”的位置。因此,反转将使其为“1”,并将左右反转所有未更改的位。将其与原始请求相结合将有效地消除未更改的位,并保证我们新找到的“1”将被保留。

     1010 << result of subtraction
    ~0101 << ~(req-base)
    &1100 << req
    =0100
    

    现在,如果我们要溢出,问题就会出现:

     0010
    -1000
     ====
     1010
    ~0101
    &1010
    =0000 << oops
    

    但我们想从请求中获取 bit[1]。 解决它的方法是在这个前面连接另一个req 的副本并继续减法以达到顶部的最低位 部分:

     0010 0010
    -0000 1000
     ====
     0001 1010
    ~1110 0101
    &0010 0010
    =0010 0000
    

    现在我们只需要在上下两部分之间进行选择:

    0010 | 0000 = 0010
    

    在这里,你得到了你的结果。

    【讨论】:

    • @Silicon1602 记得锁住并握住底座,直到选出下一个获胜者。 priority feedback mechanism using AND gate 来实现这个目的,在我们有10 条req 行循环处理的情况下,会使OR 门进入扇入和扇出问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多