【问题标题】:Convert enum type to std_logic_vector VHDL将枚举类型转换为 std_logic_vector VHDL
【发布时间】:2017-02-15 16:30:02
【问题描述】:

我想知道是否可以将枚举类型(如 FSM 状态)转换为 std_logic_vector 或整数。我正在使用 OSVVM 为 FSM 做一个测试平台,我想使用记分板包自动将预期状态与实际状态进行比较。

谢谢!

【问题讨论】:

  • 最好和最简洁的方法是使用枚举输入和返回类型为 std_logic_vector(或整数)的函数实现一个函数,并使用 case 构造为其枚举对应项返回正确的 std_logic_vector。
  • 但是如果状态数量增加,功能也会增加。我需要更便携的东西...
  • 另见attribute enum_encoding

标签: vhdl


【解决方案1】:

要转换为整数,请使用:

IntVal := StateType'POS(State) ; 

从那里,很容易转换为 std_logic_vector,但我更喜欢尽可能使用整数,因为它们的存储空间比 std_logic_vector 小。为了验证,如果你在值小于 32 位时开始更多地考虑整数,会更容易。

如果你需要它作为std_logic_vector,你可以只使用numeric_std:

Slv8Val := std_logic_vector(to_unsigned(IntVal, Slv8Val'length)) ; 

为了验证,我大量使用 numeric_std_unsigned,所以转换更简单:

Slv8Val := to_slv(IntVal, Slv8Val'length) ; 

如果您有一个整数并且想要将其转换回枚举值,您可以使用 'VAL。

State := StateType'VAL(IntVal) ; 

在 OSVVM 中,我们使用具有解析值的记录来创建事务接口。我们有一个整数的解析类型(osvvm.ResolutionPkg.integer_max)。我们使用 'POS(我们输入时)和 'VAL(我们取出时)通过记录传输枚举值。

注意不要将 'VAL 与 'VALUE 混淆。 'VALUE 将字符串转换为值 - 与 'IMAGE 相反。

您当然可以在 SynthWorks 的 OSVVM 课程中学习所有这些内容:)。

【讨论】:

  • 这就是我一直在寻找的!谢谢吉姆!也感谢您的建议!
  • 有没有类似的方法从整数回到枚举类型?
  • @scary_jeff 它是 'VAL(但我怀疑你已经知道这一点)。上面编辑的示例。
  • @efe373 整数只有 0 和 1',并且在您的计算机中存储在一个单词中 - 假设它至少是 32 位平台。另一方面,std_logic_vector 基于 std_ulogic,它有 9 个值:U、X、0、1、Z、W、L、H、-。存储一位 Std_logic_vector 至少需要 4 位内存。因此,它需要更多的存储空间。
  • @efe373 是的。存储在计算机上而不是 FPGA 上——这很好。影响是仿真运行时间,而不是 FPGA。
【解决方案2】:

可能是这样的……

function my_func(inp : t_my_enum) return integer is
begin
    case inp is
        when stateA =>
            return 1;
        when stateB =>
            return 2;
        when others =>
            return 0;
    end case;
end function my_func;

... <= my_func(stateB);`

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-21
    • 2010-12-21
    • 1970-01-01
    • 2012-09-30
    • 2010-10-11
    • 1970-01-01
    相关资源
    最近更新 更多