【问题标题】:How to index a std_logic_vector by enumeration如何通过枚举索引 std_logic_vector
【发布时间】:2012-12-10 21:07:13
【问题描述】:

我有一个像这样的 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 中的枚举)?

【问题讨论】:

    标签: vhdl


    【解决方案1】:

    你可以使用枚举,最好的方法是声明你自己的 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 中没有双向信号,所以不需要第三个端口)

    现在您的设计可以防止总线结构发生变化;更改地址宽度或添加中断信号只会更改记录声明和任何实际用户;无需在整个层次结构中添加新信号...

    【讨论】:

    • 第一个建议是什么样的?此外,cntrl_signals 需要是 std_logic_vector,因为它在实体端口声明中并且对外部可见。
    • +1:Unimaginative use of std_logic_vector (and VHDL's type system in general) is holding VHDL back...
    【解决方案2】:

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

    你可以像这样创建一个枚举:

    type some_type is (clk, en, foo, bar, baz);
    

    如果您有该类型的signalvariable,您可以使用'pos 属性将其转换回数字:

    variable v : some_type := foo;
    

    v'pos 将返回整数 2

    【讨论】:

    • 完全正确,答案越来越长!但是返回 foo 的 'pos 和相反的 some_type'val(2) 可能非常有用。
    • 如果它合成为 one-hot 会发生什么,pos 会给你元素的编号或值吗?也就是说,如果它是单热的,那么 baz 会给出 4 还是 16?
    • 'pos 始终为您提供类型数组中的位置(VHDL-2008 的第 16.2.2 节)。如果合成器将这些值映射到不同的表示,当您要求 'pos 的值时,它必须提供将其再次转换回来的逻辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多