2017-08-31 74 views
0

我想將平均變量值複製到2d陣列的特定位置。對於這個代碼,它是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 

,如通過平均的值指定。

由於雷諾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不是一種編程語言,其次它是強類型的,並且第三個信號分配值在其製作的模擬循環中從不可見。

請注意,開爾文已被添加爲布爾信號來觸發執行過程一次不改變它。

1

您試圖從兩個不同的進程中驅動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)); 

是一個過程的簡寫。它建模一個硬件驅動器,不斷將這些值強加給你的陣列信號(最後只是一堆電線)。

您的第二個過程也會嘗試爲您的數組的一個單元格(單元格array_new_signal11(3,2))強加一個值。在電氣工程中,這種情況稱爲短路:當兩位司機不同意時,你會期待什麼?這也是你的模擬器拒絕這個的原因:它不知道如何處理這個信號。

解決方案:

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; 

注::從一個單一的過程驅動該信號

  1. Average作爲一個變量,你應該對另一個錯誤:

    Average <= Total_Sum/8; 
    

    其應be:

    Average := Total_Sum/8; 
    
  2. 您在兩個嵌套循環中使用相同的循環索引(Column)。不知道你在做什麼,但這不是很安全。

  3. 即使我的建議是解決您的錯誤,您將遇到另一個問題:array_new_signal11既是您的過程的輸入(您讀取它)和輸出(您分配它)。因此它也應該在靈敏度列表中列出。在電氣工程中,這被稱爲組合環路,除非你想創建一個振盪器或一種隨機生成器,否則通常是非常不可取的。

  4. 您的過程對信號敏感Kelvin但不使用它。奇怪的情況。你有清楚的想法,你正在試圖建模什麼樣的硬件?

  5. 您可能認爲您的過程變量在每次過程恢復時都被重新初始化爲0(即每次更新Kelvin時)。情況並非如此:他們保留了他們分配的最後價值。可能不是你想要的。您應該在流程主體的開始初始化它們。