:
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は、プログラミング言語ではなく、第二には、強く型付けされただと第三信号割当値は、それらが作られているシミュレーション・サイクルに表示されることはありません。ケルビンプロセスの実行をトリガするブール信号として追加されている
留意されたいです。一度それを変更することなく。
このコードはシミュレーションしていますか? 'array_new_signal11'はどこで宣言されていますか?エラーメッセージとは何ですか? – EML