Vhdl 如何通过枚举索引std_逻辑_向量

Vhdl 如何通过枚举索引std_逻辑_向量,vhdl,Vhdl,我有一个标准逻辑向量,如下所示: cntrl_signals:out std_logic_vector(4 downto 0); type some_type is (clk, en, foo, bar, baz); 为该向量建立索引的一种方法是为每个向量显式定义一个常量 constant CLK_SIG:integer := 0; constant EN_SIG:integer := 1; constant FOO_SIG:integer := 2; constant BAR_SIG:in

我有一个标准逻辑向量,如下所示:

cntrl_signals:out std_logic_vector(4 downto 0);
type some_type is (clk, en, foo, bar, baz);
为该向量建立索引的一种方法是为每个向量显式定义一个常量

constant CLK_SIG:integer := 0;
constant EN_SIG:integer := 1;
constant FOO_SIG:integer := 2;
constant BAR_SIG:integer := 3;
constant BAZ_SIG:integer := 4;
我们的想法是使用这些来索引向量

cntrl_signals <= (CLK_SIG=>1,EN_SIG=>1,others=>0);
cntrl\u信号1,EN\u SIG=>1,其他=>0);

我的问题是,是否有一种很好的简写方法来声明索引(如C中的枚举)?

如果可以使用枚举,最好的方法是声明自己的std_逻辑向量,通过枚举而不是整数进行索引

但最好是记录而不是向量:

type Control_Signals is record
   Clk : std_logic,
   En  : std_logic,
   Foo : std_logic,
   Bar : std_logic,
   Baz : std_logic
end record;
有关详细信息,请编辑以下注释:

std_逻辑_向量(以及通常的VHDL类型系统)的缺乏想象力的使用阻碍了VHDL

如果这是一个顶级实体,那么std_logic_vector ports允许您在顶级测试台中用合成后的网表替换可合成的设计。或者,您可能必须遵守陈旧的编码风格指南,坚持使用std_逻辑_向量端口

但在任何其他情况下,我都会在包中声明记录,在整个设计过程中使用该包,并创建记录类型的端口。当您实际需要std逻辑向量时(如果正确的话,这种情况很少见),该软件包应包括用于slv和sigs的函数

这同样适用于枚举:

type Controls is (Clk, En, Foo, Bar, Baz);
type Control_Signals is array(Controls) of std_logic;
My_Bus_Ctrl : Control_Signals := (Clk => '1', En => '1', others => '0');
My_External_SLV_Port <= std_logic_vector(My_Bus_Ctrl);
类型控制为(Clk、En、Foo、Baz);
类型控制_信号是标准_逻辑的阵列(控制);
My_Bus_Ctrl:Control_信号:=(Clk=>'1',En=>'1',其他=>'0');

My_External_SLV_PortBrian有最好的答案,但还有一点信息:

您可以创建如下枚举:

cntrl_signals:out std_logic_vector(4 downto 0);
type some_type is (clk, en, foo, bar, baz);
如果您有该类型的
信号
变量
,则可以使用
'pos
属性将其转换回数字:

variable v : some_type := foo;

v'pos
将返回整数
2

第一个建议是什么样的?此外,cntrl_信号需要是std_逻辑_向量,因为它在实体端口声明中,对外可见。+1:
std_逻辑_向量(以及通常的VHDL类型系统)的缺乏想象力的使用阻碍了VHDL的发展…
非常正确,答案越来越长!但是“pos”和相反的,返回foo的某些类型的val(2)可能非常有用。如果它合成为一个hot,会发生什么情况,pos会给你元素的编号或值吗?i、 e.如果是一个热点,那么baz是否给出4或16?’位置始终给出类型数组中的位置(VHDL-2008第16.2.2节)。如果合成器将这些值映射到不同的表示形式,则当您请求“pos”的值时,它必须提供将其转换回的逻辑。