0

我正在寻找使用 FPGA 执行互相关* 操作。

我目前正在努力解决的具体部分是乘法部分。我想将使用过量或偏移表示**的 nx8 移位寄存器的每个 8 位元素与 nx1 移位寄存器相乘,在该移位寄存器中,出于乘法的目的,我将 0 视为 -1。

现在,如果我对单个元素执行此操作,我可能会为操作执行以下操作:

input [7:0] dataIn;

input refIn;

output [7:0] dataOut;

wire [7:0] dataOut;
wire [7:0] invertedData;

assign invertedData = 8'd0 - dataIn;
assign dataOut <= refIn ? dataIn : invertedData;

我想知道如何将其扩展到 4、8、n 个元素?

我的第一个想法是使用这样的 for 循环:

for(loop=0; loop < n; loop = loop+1)
begin
    assign invertedData[loop*8+7:loop*8] = 8'd0 - dataIn[loop*8+7:n*8];
    assign dataOut[loop*8+7:loop*8] <= refIn[loop] ? dataIn[loop*8+7:loop*8] : invertedData[loop*8+7:loop*8];
end

这不会编译,但这或多或少是个想法,我似乎无法找到正确的语法来做我想做的事。

** http://www.cs.auckland.ac.nz/~patrice/210-2006/210%20LN04_2.pdf

4

1 回答 1

1
for(loop=0; loop < n; loop = loop+1)
begin
    assign invertedData[n*8+7:n*8] = 8'd0 - dataIn[n*8+7:n*8];
    assign dataOut[n*8+7:n*8] <= refIn[n] ? dataIn[n*8+7:n*8] : invertedData[n*8+7:n*8];
end

这有一些问题,但我认为你可以做到这一点。

  1. 在 for 循环中不能有“分配”语句。for 循环是在begin/end块内使用的,因此您需要将 reverseData/dataOut 从wire类型更改为reg类型,并删除分配语句。

  2. 您通常不能有可变部分选择,除非您使用特殊的恒定宽度选择运算符(需要 verilog-2001 支持)。看起来像这样:dataIn[n*8 +:8],这意味着:从 n*8 开始选择 8 位

  3. 我不知道你的算法,但看起来 loop/n 在你的陈述中是倒退的。您应该递增 n,而不是循环变量(否则所有语句都将在同一个部分选择上运行)。

所以考虑到这些点,我相信这应该为你编译:

always @* begin
    for(n=0; n< max_loops ; n=n+1)
    begin
        invertedData[n*8 +:8] = 8'd0 - dataIn[n*8 +:8];
        dataOut[n*8 +:8] <= refIn[n] ? dataIn[n*8 +:8] : invertedData[n*8 +:8];
    end
end
于 2013-06-23T19:54:44.550 回答