gpt4 book ai didi

vhdl - 如何通过枚举索引 std_logic_vector

转载 作者:行者123 更新时间:2023-12-04 16:54:09 27 4
gpt4 key购买 nike

我有一个像这样的 std_logic_vector:

cntrl_signals:out std_logic_vector(4 downto 0);

对该向量有索引的一种方法是为每个向量显式定义一个常量。
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);

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

最佳答案

那么你可以使用枚举,最好的方法是声明你自己的 std_logic 向量,由枚举而不是整数索引。

但可能更好的是记录而不是向量:

type Control_Signals is record
Clk : std_logic,
En : std_logic,
Foo : std_logic,
Bar : std_logic,
Baz : std_logic
end record;

编辑更多信息,以下评论:

对 std_logic_vector (以及 VHDL 的一般类型系统)的缺乏想象力的使用阻碍了 VHDL 的发展......

如果这是顶级实体,则 std_logic_vector 端口允许您在顶级测试平台中用综合后网表替换您的可综合设计。或者您可能必须遵守坚持使用 std_logic_vector 端口的过时编码风格指南。

但在任何其他情况下,我会在包中声明记录,在整个设计中使用该包,并制作记录类型的端口。该包应包含函数 to_slvto_control_sigs对于(很少,如果你做对了)真正需要 std_logic_vectors 的场合。

这同样适用于枚举:
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);

当然,枚举比 C 中的更强大一些;除了将它们用作数组索引类型之外,您还可以遍历它们。每当您更新枚举时,它都会使您的循环保持一致!

由枚举索引的记录或数组都可以工作;我更喜欢记录更清晰,更符合面向对象的实践。

在任何一种情况下,如果您将它用于实体端口,它就会变得更加有用。为传出总线信号(包括地址和数据)声明一个记录(或数组!),为传入信号声明另一个记录(或数组!),因为您不能在单个端口中混合方向......(现在 FPGA 中没有双向信号,所以不需要第三个端口)

现在您的设计受到保护,不受总线结构变化的影响;改变地址宽度或添加中断信号只会改变记录声明和任何实际用户;无需在整个层次结构中添加新信号...

关于vhdl - 如何通过枚举索引 std_logic_vector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13809260/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com