将 std_logic_vector 转换为 VHDL 中的枚举类型
Convert std_logic_vector to enum type in VHDL
我想为 vhdl 设计创建 verilog 测试台,但我的 vhdl 设计源包含一些 Vivado 的混合语言边界无法接受的枚举类型 Ref. So I create a VHDL wrapper to convert enum type to std_logic_vector type or convert std_logic_vector to enum type. There are some elegant way to converting enum type to std_logic_vector 。但是如何将 std_logic_vector 转换为 VHDL 中的枚举类型?
正如您提到的 Vivado,我猜您对综合语义比模拟语义更感兴趣。因此,我将假设您的 std_logic_vector
对象携带的信息可以被视为整数的二进制表示,并且您对 '0'
和 [=15= 以外的 std_logic
值不感兴趣].
要将 std_logic_vector
值转换为枚举类型,您首先需要足够大的枚举类型。所以,如果你的向量是 N
位长,你将需要一个 2^N
值枚举类型,例如,如果 N=16
:
type s2e_t is (s2e0, s2e1,... , s2e65535);
(输入很多,但正如您所要求的...)然后,您可以简单地将矢量值转换为 non-negative 整数值,并使用 val
选择相应的枚举类型值类型属性(pos
属性的对偶):
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
...
type s2e_t is (s2e0, s2e1,... , s2e65535);
signal e: s2e_t;
signal s: std_logic_vector(15 downto 0);
...
e <= s2e_t'val(to_integer(unsigned(s));
我想为 vhdl 设计创建 verilog 测试台,但我的 vhdl 设计源包含一些 Vivado 的混合语言边界无法接受的枚举类型 Ref. So I create a VHDL wrapper to convert enum type to std_logic_vector type or convert std_logic_vector to enum type. There are some elegant way to converting enum type to std_logic_vector
正如您提到的 Vivado,我猜您对综合语义比模拟语义更感兴趣。因此,我将假设您的 std_logic_vector
对象携带的信息可以被视为整数的二进制表示,并且您对 '0'
和 [=15= 以外的 std_logic
值不感兴趣].
要将 std_logic_vector
值转换为枚举类型,您首先需要足够大的枚举类型。所以,如果你的向量是 N
位长,你将需要一个 2^N
值枚举类型,例如,如果 N=16
:
type s2e_t is (s2e0, s2e1,... , s2e65535);
(输入很多,但正如您所要求的...)然后,您可以简单地将矢量值转换为 non-negative 整数值,并使用 val
选择相应的枚举类型值类型属性(pos
属性的对偶):
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
...
type s2e_t is (s2e0, s2e1,... , s2e65535);
signal e: s2e_t;
signal s: std_logic_vector(15 downto 0);
...
e <= s2e_t'val(to_integer(unsigned(s));