2014-09-28 70 views
4

具有枚舉類型,像下面的,是有一個很好的方式來獲得的枚舉類型enum_t元素的數量:根據答案從大衛如何獲得元素的數量枚舉類型

type enum_t is (ALFA, BRAVO, CHARLIE); -- Number of elements is 3 

-- Don't work: length is not valid attribute for enum_t 
constant ENUM_LENGTH : natural := enum_t'length; -- illegal! 

孔茨是可以做到的是:

constant ENUM_LENGTH : natural := enum_t'pos(enum_t'right) + 1; 

回答

3

首先找到它的位置值,那麼你可以得到VHDL告訴你它是什麼:

entity enum_length is 
end entity; 

architecture foo of enum_length is 
    type enum_t is (ALFA, BRAVO, CHARLIE); 
    constant enum_left:  natural := enum_t'POS(ALFA); 
    constant enum_right: natural := enum_t'POS(CHARLIE); 
begin 
    assert FALSE 
     Report "CHARLIE POS = " & natural'IMAGE(enum_right); 
end architecture; 

ghdl -r enum_length
enum_length.vhdl:9:5:@ 0毫秒:(斷言錯誤):CHARLIE POS = 2

參見IEEE標準一○七六年至2008年5.2.2.1(枚舉類型)一般,第6段:

每個枚舉字面值會產生一個不同的枚舉值。枚舉值之間的預定義順序關係遵循相應位置編號的順序 。列出的第一個枚舉文字的值爲 的位置編號爲零; 的位置編號比列表中的前一個 多一個。

因此,最左邊的枚舉值的位置是0.最右邊的枚舉值的位置比元素的數量少一個。您還可以找到最右邊的「VAL,找到它的位置:

entity enum_length is 
end entity; 

architecture foo of enum_length is 
    type enum_t is (ALFA, BRAVO, CHARLIE); 
    constant enum_left:  natural := enum_t'POS(ALFA); 
    constant enum_right: natural := enum_t'POS(CHARLIE); 
    constant enum_t_elems: natural:= enum_t'POS(enum_t'RIGHT) + 1; 
begin 
-- assert FALSE 
--  Report "CHARLIE POS = " & natural'IMAGE(enum_right); 

    assert FALSE 
     Report "enum_t number of elements = " & natural'IMAGE(enum_t_elems); 
end architecture; 

ghdl -r enum_length
enum_length.vhdl:13:5:@ 0毫秒:(斷言錯誤):enum_t元素的個數= 3

+0

意圖是獲取元素的數量,因此在示例中爲enum_t。解決方案應該普遍適用。 – EquipDev 2014-09-28 05:32:07

+0

那麼,如果你看看左邊的位置,你會發現它是0. 0到2的範圍是'長度'三。添加一個到正確的位置。 – user1155120 2014-09-28 05:40:58

+1

好的,所以最簡單的方法是'enum_t'pos(enum_t'right)+ 1',或者甚至需要做'enum_t'pos(enum_t'right) - enum_t'pos(enum_t'left)+ 1'?沒有一種方法是優雅的,但可能不是VHDL人做的很多... – EquipDev 2014-09-28 05:53:30