将枚举类型转换为std_logic_vector VHDL

14

我想知道是否可以将枚举类型(例如FSM状态)转换为std_logic_vector或整数。我正在使用OSVVM为FSM编写测试台,并希望使用scoreboard包自动比较预期状态和实际状态。

谢谢!


最好、最干净的方法是使用带有枚举输入和 std_logic_vector(或整数)返回类型的函数实现,并使用 case 构造返回其枚举对应项的正确 std_logic_vector。 - fpga_magik
但是如果状态数量增加,函数也会增加。我需要更具可移植性的东西... - ferdepe
请参考attribute enum_encoding - user1818839
2个回答

17

要将其转换为整数,使用:

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课程中学习所有这些知识。 :)

这正是我一直在寻找的!谢谢Jim!也感谢你的建议! - ferdepe
有没有类似的方法可以从整数返回到枚举类型? - scary_jeff
“但是我更喜欢在可能的情况下使用整数,因为它们比std_logic_vector在存储上更小” 是什么意思?@JimLewis - efe373
1
@efe373 整数只有0和1,并且存储在计算机中的单个字中 - 假设它至少是32位平台。另一方面,Std_logic_vector基于具有9个值的std_ulogic:U、X、0、1、Z、W、L、H、-。存储一个Std_logic_vector位至少需要4位内存。因此,它需要更多的存储空间。 - Jim Lewis
1
@efe373 是的。存储在计算机上而不是FPGA上 - 这是一个很好的观点。影响的是模拟运行时间,而不是FPGA。 - Jim Lewis
显示剩余2条评论

-1

或许是这样的...

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);`

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接