Преобразование std_logic_vector в тип перечисления в VHDL - PullRequest
0 голосов
/ 06 августа 2020

Я хочу создать тестовую среду Verilog для проектов vhdl, но мой исходный код vhdl содержит некоторый тип перечисления, который не может быть принят границей смешанного языка Vivado Ref . Поэтому я создаю оболочку VHDL для преобразования типа перечисления в тип std_logic_vector или преобразования std_logic_vector в тип перечисления. Существует элегантный способ преобразования типа перечисления в std_logic_vector Преобразование типа перечисления в std_logic_vector VHDL . Но как преобразовать std_logic_vector в тип перечисления в VHDL?

1 Ответ

4 голосов
/ 06 августа 2020

Поскольку вы упоминаете Vivado, я думаю, вас больше интересует семантика синтеза, чем семантика моделирования. Таким образом, я предполагаю, что ваши объекты std_logic_vector несут информацию, которую можно рассматривать как двоичное представление целых чисел, и что вас не интересуют значения std_logic, отличные от '0' и '1'.

Чтобы преобразовать значения std_logic_vector в перечислимый тип, вам сначала понадобится достаточно большой перечислимый тип. Итак, если ваши векторы имеют длину N бит, вам понадобится перечисляемый тип 2^N значений, например, если N=16:

type s2e_t is (s2e0, s2e1,... , s2e65535);

(много ввода, но как вы просили. ..) Затем вы можете просто преобразовать свои векторные значения в неотрицательные целочисленные значения и выбрать соответствующее значение перечислимого типа с атрибутом val type (двойным атрибуту 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));
...