2011-06-23 79 views
0

我有問題檢測存儲在std_logic_vector格式的二進制數的位置值。例如在下面的代碼中,我想知道INST_SPEED中的值是在0到99公里/小時之間。如果條件許多,代碼很長。問題在VHDL std_logic_vector的位置值

if INST_SPEED > "0001001" and INST_SPEED < "0010100" then   -- if INST_SPEED > 9 & INST_SPEED < 20 

     UPPER10 <= "0000001";     -- UPPER10 = 1 
     TEMP <= std_logic_vector(unsigned(INST_SPEED) - 10); 
     UPPER1 <= TEMP;      -- LOWER10 = INST_SPEED - 10 
     elsif INST_SPEED > "0010011" and INST_SPEED < "0011110" then -- if INST_SPEED > 19 & INST_SPEED < 30 
     UPPER10 <= "0000010";     -- UPPER10 = 2 
     TEMP <= std_logic_vector(unsigned(INST_SPEED) - 20); 
     UPPER1 <= TEMP;      -- LOWER10 = INST_SPEED - 20 
     elsif INST_SPEED > "0011101" and INST_SPEED < "101000" then -- if INST_SPEED > 29 & INST_SPEED < 40 
     UPPER10 <= "0000011";     -- UPPER10 = 3 
     TEMP <= std_logic_vector(unsigned(INST_SPEED) - 30); 
     UPPER1 <= TEMP;      -- LOWER10 = INST_SPEED - 30 

但是,現在我必須編寫一個類似的代碼來檢測範圍從0-999的值。如果我按照這個邏輯走,那就意味着90個這樣的條件!

有沒有人知道一個更簡單更智能的方法去做這個過程?這真的會幫助我,預先感謝!

回答

0

更改問題。我建議要麼實現一個模數函數來將二進制值轉換爲十進制值(如果不需要快速更新,這個值可能很小),或者可能更容易使用BCD作爲INST_SPEED值。當你在編寫東西的時候,你真的需要一個除法/模函數,這就是你試圖用你所有的條件進行硬編碼的東西。根據你的目標,你可能可以做到這一點「免費」(即:也許你正在使用的FPGA有未使用的硬件乘法器?)。

+0

嘿,是的,是的,昨天晚上,當我試圖睡覺時,我想到了這個問題。我認爲把每個數字依次分爲100個和10個是比較簡單的。因此,對於例如, 721,在第一次分組後,我將得到7作爲答案(數百位數值),剩餘21作爲答案。然後我除以10得到2作爲十進制值,最後1作爲單位或一個值。 –

+0

Thx幫助球員,真的很感激! –

0

夫婦的選擇,我能想到的:

  1. 如何創建一個大的LUT(查詢表)將被存儲在ROM?地址將是INST_SPEED值,輸出將是UPPER10或TEMP。您可以使用腳本(VHDL之外)生成ROM內容,然後將其粘貼到您的代碼中,或從具有VHDL文件IO支持的文件加載。
  2. 輸入和輸出之間是否真的沒有簡單的模式?這是否可以導出一些數學函數?
+0

Thx努力!我想我找到了解決方案... –