1

我有一个模块,它基本上是一个输入为 64 位的 LUT。LUT always 块包含一个 case 语句,它将输入与 200 多个不同的整数进行比较。case 语句中的默认 case 在为输出分配默认值之前检查输入是否 > 100。

我的问题是,当我合成时,它会导致一个 65 位比较器,我想知道是否有更好的方法可以做到这一点,以便不合成大型比较器。

这是我的代码片段:

    always @(in)
    begin
    case (in) 
        -100: out <= 495050;
        -99: out <= 500000;
        ...
         99: out <= 99500000;
        100: out <= 99504950;

        default: 
        begin
            if (in > 100)
                out <= 99504950;
            else
                out <= 495050;
        end
    endcase
end

谢谢,

费萨尔

4

2 回答 2

3

假设这in是一个 64 位数字,您可以做的就是将其砍掉,这样您只需“比较”最低的几位,然后您可以快速检查该数字是否超出所需范围。

例如,让我们只截取in8 位,并将其分配给 8 位有符号寄存器。这应该允许您在 -128 和 127 之间表示。

您可以通过以下方式测试完整数字是否大于 127:(!in[63] && (|in[62:8])检查是否有任何高位为1,并且 MSB 未设置)。

您可以通过以下方式测试完整数字是否小于 -128:(in[63] && !(&in[62:8])检查任何高位是否为0,并且设置了 MSB)。

现在你知道了三件事:

  1. 如果数字大于 127
  2. 如果数字在 127 和 -128 之间
  3. 如果数字小于-128。

对于中间情况,您应该能够使用一个小的 8 位 LUT,或者如果它在任一上限范围内,则使用您的默认值。

请注意,我可能希望有一个好的合成器自动为您执行此操作,但如果您查看生成的网表并且它太大,您可以尝试这样做,看看它是否能给您带来更好的结果。

于 2013-03-14T16:26:21.280 回答
2

看起来您已经计算了输入 x = [-100;100] 的一些函数值的表。如果是这样,最好从某个基地址开始将它们一个接一个地存储在内存中。所以要读取它们,您可以在地址总线上写入 base + X + 100 值,并获得您需要的值。

如果您需要一个巨大的多路复用器,您可能想尝试使用“并行”大小写指令。

至于“默认”中的比较器 - 我有同样的问题,所以我正在等待答案。

我想写这个作为评论,但我没有这样的特权

于 2013-03-14T07:52:14.360 回答