首先找到它的位置值,那麼你可以得到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
意圖是獲取元素的數量,因此在示例中爲enum_t。解決方案應該普遍適用。 – EquipDev 2014-09-28 05:32:07
那麼,如果你看看左邊的位置,你會發現它是0. 0到2的範圍是'長度'三。添加一個到正確的位置。 – user1155120 2014-09-28 05:40:58
好的,所以最簡單的方法是'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