Verilog并行检查和分配不同大小的移位寄存器

时间:2013-06-23 19:13:15

标签: loops verilog

我正在寻求使用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,1个元素?

我的第一个是使用这样的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

1 个答案:

答案 0 :(得分: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循环中使用'assign'语句。 for循环意味着在begin / end块中使用,因此您需要将invertedData / dataOut从wire类型更改为reg类型,并删除分配语句。

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

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

  4. 因此,考虑到这些点,我相信这应该为你编译:

    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