從問題構建最小的,完整的和可驗證的例子:
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
,如通過平均的值指定。
由於雷諾Pacalet注意到你有兩種不同的工藝駕駛array_new_signal11,這是不合法的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命令,加載部分,創建設計網絡的地方))完成。
雷諾Pacalet建議分配過程內的數組的值,但沒有中間等待語句的值不適用於在相同的模擬循環的後續使用。新的信號值在分配的相同模擬循環中不可用。
每個信號指派調度的波形更新和特定的模擬時間只有一個條目是可用的。在這種情況下,它將保證array(3,2)將是integer'left的八個值的平均值(這可能是不正確的,您應該得到錯誤,導致模擬在sum1在未標記的第3個循環語句第一個循環迭代)。
這就告訴我們你需要在讀取之前初始化數組。
上面的例子中成功的唯一原因是,有加在一起時不會違反類型整數的值範圍與指定的值沒有數組元素。
您可以通過使用整數的二進制數組等價物,並注意所需要的精度避開這樣的事情。
這個故事有幾個道德。首先,VHDL不是一種編程語言,其次它是強類型的,並且第三個信號分配值在其製作的模擬循環中從不可見。
請注意,開爾文已被添加爲布爾信號來觸發執行過程一次不改變它。
這是你正在模擬的代碼嗎? 'array_new_signal11'在哪裏聲明?什麼是錯誤信息? – EML