2017-08-31 5 views
0

平均変数値を2次元配列の特定の場所にコピーします。このコードはarray_new_signal11(3,2)です。VHDL:2D配列の特定の要素に新しい値を割り当てます。

どのように私はこれを行うことができますか?このコードは、シミュレーション中にエラーが発生します。

architecture Behavioral of Correction is 

type array_new is array (0 to 4, 0 to 4) of integer; 
signal array_new_signal: array_new; 

begin 

array_new_signal11 <= ((1,2,3,4,5), 
         (4,5,6,7,8), 
         (7,8,9,0,1), 
         (1,3,6,5,9), 
         (2,3,5,4,5)); 

    Process(kelvin) 
    variable Sum1: integer:= 0; 
    Variable Sum2: integer:= 0; 
    Variable Total_Sum: integer:= 0; 
    Variable Average: integer:= 0; 

    begin 

     for Row in 0 to 4 loop 
      for Column in 0 to 4 loop 

      if(Row = 1 and Column = 1) then 
       for Column in 1 to 3 loop 
        sum1 := array_new_signal11(Row, Column) + Sum1; 
       end loop; 
      end if; 

      if(Row = 2 and Column = 1) then 
       for Column in 1 to 3 loop 
        sum2 := array_new_signal11(Row, Column) + Sum2; 
       end loop; 
      end if; 
     end loop; 
     end loop; 
     Total_Sum := Sum1 + Sum2; 
     Average := Total_Sum/8; 
     **array_new_signal11(3,2) <= Average;** 
    end Process; 
    end Behavioral; 
+1

このコードはシミュレーションしていますか? 'array_new_signal11'はどこで宣言されていますか?エラーメッセージとは何ですか? – EML

答えて

3

entity correction is 
end correction; 

architecture behavioral of correction is 
    type array_new is array (0 to 4, 0 to 4) of integer; 
    signal array_new_signal11: array_new := ((1,2,3,4,5), 
              (4,5,6,7,8), 
              (7,8,9,0,1), 
              (1,3,6,5,9), 
              (2,3,5,4,5)); 
    signal kelvin: boolean; 
begin 

    -- array_new_signal11 <= ((1,2,3,4,5), 
    --       (4,5,6,7,8), 
    --       (7,8,9,0,1), 
    --       (1,3,6,5,9), 
    --       (2,3,5,4,5)); 

    process (kelvin) 
     variable sum1: integer:= 0; 
     variable sum2: integer:= 0; 
     variable total_sum: integer:= 0; 
     variable average: integer:= 0; 
    begin 
     for row in 0 to 4 loop 
      for column in 0 to 4 loop 
       if row = 1 and column = 1 then 
        for column in 1 to 3 loop 
         sum1 := array_new_signal11(row, column) + sum1; 
        end loop; 
       end if; 
       if row = 2 and column = 1 then 
        for column in 1 to 3 loop 
         sum2 := array_new_signal11(row, column) + sum2; 
        end loop; 
       end if; 
      end loop; 
     end loop; 
     total_sum := sum1 + sum2; 
     average := total_sum/8; 
     report "sum1 = " & integer'image(sum1) & ", " & 
      "sum2 = " & integer'image(sum2) & ", " & 
      "average = " & integer'image(average); 
     array_new_signal11(3,2) <= average; 
    end process; 
MONITOR_PROCESS: 
    process 
    begin 
     wait on array_new_signal11; 
     for row in 0 to 4 loop 
      report "row" & integer'image(row) & " = " & 
        integer'image(array_new_signal11(row,0)) & ", " & 
        integer'image(array_new_signal11(row,1)) & ", " & 
        integer'image(array_new_signal11(row,2)) & ", " & 
        integer'image(array_new_signal11(row,3)) & ", " & 
        integer'image(array_new_signal11(row,4)); 
     end loop; 
    end process; 
end behavioral; 

は、我々はレポート文は私たちに平均を伝え、新しい配列の値を報告してご覧ください。

我々は、行3列2を6に初期化され、現在4れた参照:

ghdl -a correction.vhdl 
ghdl -e correction 
ghdl -r correction 
correction.vhdl:42:7:@0ms:(report note): sum1 = 18, sum2 = 17, average = 4 
correction.vhdl:52:13:@0ms:(report note): row0 = 1, 2, 3, 4, 5 
correction.vhdl:52:13:@0ms:(report note): row1 = 4, 5, 6, 7, 8 
correction.vhdl:52:13:@0ms:(report note): row2 = 7, 8, 9, 0, 1 
correction.vhdl:52:13:@0ms:(report note): row3 = 1, 3, 4, 5, 9 
correction.vhdl:52:13:@0ms:(report note): row4 = 2, 3, 5, 4, 5 

平均の値によって指定されるように。

Renaud Pacaletはarray_new_signal11を駆動する2つの異なるプロセスがあります。これは、VHDLでは合法ではありません。これは、要素タイプの整数が解決されたデータタイプではないためです。

解決策は、宣言されたこの場合は配列を初期化することです。

それ以外の場合、配列シグナルの要素へのすべての割り当ては、同じプロセス内になければなりません。精緻化するとき、それが最初に示されたように、あなたが持っていた同時信号の割り当ては、同等のプロセス文に精緻化し、エラーを生成します:

ghdl -r correction 
for signal: .correction(behavioral).array_new_signal11(3,2) 
./correction:error: several sources for unresolved signal 
./correction:error: error during elaboration 

(リンクで構成されて推敲のGHDLシミュレータ部分(のために読み込み)は、シミュレーションを呼び出すときに実行されます(-rコマンド、読み込み部分、設計ネットワークが作成される場所))。

Renaud Pacaletは、プロセス内で配列値を代入することを提案しますが、介入するwait文を使用しないと、同じシミュレーションサイクルで値を使用することはできません。新しい信号値は、割り当てられた同じシミュレーションサイクルでは使用できません。

各信号割り当ては波形更新をスケジューリングし、特定のシミュレーション時間に対して1つのエントリのみが使用可能です。この場合、array(3,2)はinteger'leftの8つの値の平均であることが保証されます(間違っていると、ラベルのない第3ループ文の最初のループにsum1が累積されている間にシミュレーションを終了させるエラーが発生します)繰り返し)。

これは、読み込む前に配列を初期化する必要があることを示しています。

上記の例が成功する唯一の理由は、一緒に追加された配列要素が、指定した値のinteger型の値域に違反しないことです。

整数のバイナリ配列に相当するものを使用し、必要な精度に注意することで、このようなことを回避できます。

このストーリーにはいくつかの道徳があります。まず、VHDLは、プログラミング言語ではなく、第二には、強く型付けされただと第三信号割当値は、それらが作られているシミュレーション・サイクルに表示されることはありません。ケルビンプロセスの実行をトリガするブール信号として追加されている

留意されたいです。一度それを変更することなく。

1

あなたは、2つの異なるプロセスからarray_new_signal11信号をドライブしようとしています。はい、初めての同時信号割り当て:

array_new_signal11 <= ((1,2,3,4,5), 
         (4,5,6,7,8), 
         (7,8,9,0,1), 
         (1,3,6,5,9), 
         (2,3,5,4,5)); 

は、プロセスの略語です。これは、これらの値をアレイ信号(最後にワイヤの束である)に継続的に課すハードウェアドライバをモデル化します。

また、2番目のプロセスでは、配列の1つのセル(セルarray_new_signal11(3,2))に値を設定しようとします。電気工学では、このような状況をショートサーキットと呼びます.2人の運転者が同意しない場合、どのようなことを期待しますか?これは、シミュレータがこれを拒否する理由でもあります。この信号で何をすべきかはわかりません。

ソリューション:1つのプロセスからこの信号をドライブ:

process(kelvin) 
    ... 
begin 
    array_new_signal11 <= (
     (1,2,3,4,5), 
     (4,5,6,7,8), 
     ... 
    for Row in 0 to 4 loop 
     ... 
end process; 

注:

べき
Average <= Total_Sum/8; 

:あなたは上の別のエラーを持っている必要があり可変で

  1. Average be:

    Average := Total_Sum/8; 
    
  2. 2つのネストループで同じループインデックス(Column)を使用しています。あなたが何をしようとしているのか分かりませんが、これはあまり安全ではありません。

  3. エラーを修正するための私の提案でも、array_new_signal11は入力(読み込んだもの)とプロセスの出力(割り当てたもの)の両方です。したがって、感度リストにも記載する必要があります。電気工学では、これはコンビナトリアルループと呼ばれ、通常は非常に望ましくありません。ただし、オシレータや一種のランダムジェネレータを作成する場合を除きます。

  4. あなたのプロセスは信号Kelvinに敏感ですが、使用しません。奇妙な状況。どのハードウェアをモデル化しようとしているのか、はっきりしていますか?

  5. おそらく、プロセス変数がプロセスが再開するたびに(つまり、Kelvinが変更されるたびに)0に再初期化されていると思われます。これは当てはまりません。割り当てられた最後の値が保持されます。おそらくあなたが望むものではないでしょう。プロセス本体の先頭でそれらを初期化する必要があります。質問から、最小限の完全かつ検証可能な例を構築

関連する問題