0

FPGAを使用して相互相関*操作を実行しようとしています。

私が現在苦労している重要な部分は、掛け算の部分です。超過またはオフセット表現** を使用する nx8 シフト レジスタの各 8 ビット要素を、乗算のために 0 を -1 として扱う nx1 シフト レジスタに対して乗算したいと考えています。

単一の要素に対してそれを行っていた場合、操作に対して次のようなことを行う可能性があります。

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 ループに 'assign' ステートメントを含めることはできません。for ループはbegin/endブロック内で使用することを意図しているため、invertedData/dataOut をwire型から型に変更regし、assign ステートメントを削除する必要があります。

  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 に答える