我正在寻求使用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
答案 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
这有一些问题,但我认为你可以做到这一点。
您不能在for循环中使用'assign'语句。 for循环意味着在begin
/ end
块中使用,因此您需要将invertedData / dataOut从wire
类型更改为reg
类型,并删除分配语句。
除非使用特殊的恒定宽度选择运算符(需要verilog-2001支持),否则通常不能进行可变的部分选择。这看起来像这样:dataIn[n*8 +:8]
,这意味着:从n * 8 开始选择8位。
我不知道你的算法,但看起来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