Доступ к элементам массива с использованием std_logic_vector (VHDL) - PullRequest
0 голосов
/ 19 сентября 2018

Пожалуйста, смотрите код ниже:

....
port(
the_input: in std_logic_vector(0 to 3));
...
type dummy_array is array (0 to 2) of std_logic_vector (0 to 7);
signal ins_dummy: dummy_array := ( 8x"1",  8x"2", 8x"3");
...

Теперь я хочу получить доступ к элементам этого массива, используя биты the_input(0 to 1).Как я могу это сделать?как я знаю, массив принимает целые числа в качестве аргументов, но это ввод std_logic.Я пробовал много решений, доступных на разных форумах, но, похоже, ничего не работает.Например, когда я применяю это: to_integer(unsigned(the_input(0 to 1))), результат равен нулю.

Что происходит?Я не знаю.Есть предложения?

1 Ответ

0 голосов
/ 19 сентября 2018

Используя небольшой тестовый стенд ниже, я смог получить доступ к элементам массива, используя метод, который вы упомянули -> some_array (to_integer (unsigned (some_signal)))).

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;   
use std.textio.all;
use ieee.std_logic_textio.all;

entity test is
end entity test;

architecture behav of test is
    signal the_input : std_logic_vector(0 to 3);
    signal test_sig  : std_logic_vector(7 downto 0);
    type dummy_array is array(0 to 2) of std_logic_vector(7 downto 0);
    signal ins_dummy : dummy_array := (x"01", x"02", x"03");

begin

    test_sig <= ins_dummy(to_integer(unsigned(the_input)));

    process
    begin
    wait for 1 ns;
    the_input <= "0000";
    wait for 1 ns;
    the_input <= "0001";
    wait for 1 ns;
    the_input <= "0010";
    end process;
end architecture behav;

Однако этоИмитация и синтезатор могут жаловаться, потому что диапазон порта the_input больше, чем количество возможных опций массива.Возможно, вам придется добавить логику, чтобы гарантировать, что индексы массива, находящиеся «за пределами», не могут быть доступны.Надеюсь, это поможет.Возможно попробуйте:

test_sig <= ins_dummy(to_integer(unsigned(the_input))) when (the_input < 3) else
            others => '0';
...