2013-06-23 48 views
0

我正在尋找使用FPGA來執行互相關*操作。的Verilog平行檢驗和分配跨不同的大中移位寄存器

,我目前正在與掙扎secific部分是乘法件。我想將一個nx8移位寄存器的每個8位元素與一個nx1移位寄存器進行乘法運算,這個nx8移位寄存器使用過量或偏移量表示**,爲了乘法的目的,我將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

回答

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塊內使用,所以你需要從wire類型更改invertedData/DATAOUT到reg類型,並刪除指定的語句。

  2. 你一般不能有可變部分選擇,除非你使用特殊的恆定寬度選擇操作(需要的Verilog-2001支持)。這看起來像這樣:dataIn[n*8 +:8],這意味着:選擇8位從n * 8開始

  3. 我不知道你的算法,但它看起來像環/ 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 
+0

感謝您的答覆。我會給它一個鏡頭。至於第3點,在循環內的賦值語句中交換n循環。我的意思是n是代表數組大小的任何常量值。 –