2013-03-13 95 views
3

在VHDL中有一種方法可以使用泛型類型嗎?因此,例如我想調用一個過程,但我不確定信號的類型是否需要作爲參數,是否可以將該參數聲明爲泛型? 與C++類似,您可以使用模板。是否有可能在vhdl中有泛型類型?

procedure eq_checker(name : string; sig : ANYTHING); should : ANYTHING; at : time) is 
    if (at = now) then 
    if sig = should then 
     report "has same value" severity note; 
    else 
     report "has not same value" severity note; 
    end if; 
    end if; 
end checker; 

至少應該可以使用不同的信號類型作爲「sig」。

回答

4

彼得艾舍登和吉姆·劉易斯的書 「VHDL-2008 - 只是新的東西」 與

第1章打開:增強泛型
1.1泛型類型

所以,如果您的工具支持VHDL-2008,現在可以聲明泛型類型,並且可以在子程序(不僅僅是實體)上聲明泛型。

如果他們遵循Ada模型,那麼當你第一次編譯它們,而不是實例化它們時,將會檢查泛型,這樣編譯的任何實例都可以工作,這與C++模板中bug可以處於休眠狀態的情況不同多年來,直到你實例化它們以特定的方式(因爲C++模板是不是真正的通用元編程接近宏)

例子:未經檢驗的,但寫成下面就上述書第17頁的例子...

procedure eq_checker 
     generic (type ANYTHING) 
     parameter(name : string; sig,should : ANYTHING; at : time) is 
begin 
    if (at = now) then 
    if sig = should then 
     report "has same value" severity note; 
    else 
     report "has not same value" severity note; 
    end if; 
    end if; 
end procedure eq_checker; 
+0

謝謝。我會去看看這是否真的解決了我的問題。但我希望如此 – Sadik 2013-03-13 11:37:15

+1

如果您發現工具不支持特定的VHDL-2008功能,請(a)更新缺少的內容(或評論)並(b)將它們報告爲工具供應商的錯誤。另請注意,仿真和綜合可能會提供不同級別的支持。 – 2013-03-13 11:40:27

+0

謝謝!看來我的版本中的Modelsim不幸地不支持泛型類型。他們並不是說它不被支持,但他們也沒有說它被支持。他們給我一個簡單的「近」通用「:語法錯誤」 – Sadik 2013-03-14 10:03:01

1

如果您在寫作的那一刻不知道類型,例如一個程序,你可以使用一個子類型。您可以隨時在合成之前更改子類型。 好的,這只是「有點通用」,但仍...它可能看起來像這樣:

PACKAGE generics_pkg IS 
-- type definition 
subtype data_type is integer; 

-- instantiation 
COMPONENT generics IS 
PORT(
    i: IN data_type; 
    ii : in data_type; 
    o: OUT std_logic  
); 
END COMPONENT; 

-- procedure 
procedure comp ( signal x,y: in data_type; 
        signal o: out std_logic); 

END PACKAGE generics_pkg; 

package body generics_pkg is 
procedure comp ( signal x,y: in data_type; 
        signal o: out std_logic) is 
begin 
    if x = y then 
     o<='1'; 
     report "same value" severity note; 
    else 
     o<='0'; 
     report "not same value" severity note; 
    end if; 
end procedure comp; 
+0

謝謝,但這種方式我只能爲一種類型打電話eq_checker,但我想在很多不同的州和許多州不同類型的信號 – Sadik 2013-03-14 10:00:59

+1

不能使用類型轉換(如** to_integer **或** to_unsigned **)在您調用它時儘快根據程序需要調整參數?通過這種方式,您可以編寫程序一個參數類型,但從不同類型的不同狀態使用它! – baldyHDL 2013-03-15 07:05:08

相關問題