2015-04-15 2 views
1

У меня есть следующие объявления:Как я могу индексировать в vhdl std_logic_vector?

signal count:STD_LOGIC_VECTOR (3 downto 0); 
signal txbuff:STD_LOGIC_VECTOR (7 downto 0); 
  1. DOUT является std_logic выход
  2. Я использую IEEE.NUMERIC_STD.ALL;

Я хочу использовать векторный счет как индекс в txbuff. Среди многих вещей, которые я пробовал следующий:

count<=std_logic_vector(unsigned(count)-1); 
dout<=txbuff(unsigned(count)); 

, но я получаю следующее сообщение об ошибке:

Line 99. Wrong index type for txbuff.

+0

Обратите внимание, что счетчик имеет длину 4 и может индексировать 2 ** 4 элемента, у которых txbuff имеет длину 8 (8 элементов). Использование большего целочисленного индекса может привести к названию среза 'dout <= txbuff (to_integer (unsigned (count)));' это вне диапазона для txbuff, вызывающего ошибку времени выполнения. Билл Линч подразумевает это в своем ответе. В вашем случае это будет 'dout <= txbuff (to_integer (unsigned (count (2 downto 0))));' или вы можете изменить размер счета? – user1155120

ответ

0

Мы действительно хотим, чтобы преобразовать число в integer, не unsigned или signed.

Для этого мы можем использовать to_integer, как определено в numeric_std. Вот пример:

LIBRARY ieee; 
USE ieee.std_logic_1164.ALL; 
USE ieee.numeric_std.ALL; 

entity conv_test is Port (
    data_in : in std_logic_vector(7 downto 0); 
    data_sel : in std_logic_vector(2 downto 0); 
    data_out : out std_logic 
); 
end conv_test; 

architecture Behavioral of conv_test is 
begin 
    data_out <= data_out(to_integer(unsigned(data_sel))); 
end Behavioral; 
0

Вам нужно преобразовать в целое число с помощью функции to_integer. Проверьте параметризованный MUX:

architecture RTL of MUX is 
begin 
    ----------------------------------------------------------------------- 
    -- MUX_RTL 
    ----------------------------------------------------------------------- 
    -- Implements a multiplexer 
    ----------------------------------------------------------------------- 
    MUX_RTL: process(DATA_IN, ADDR_IN) 
    variable ADDR_IN_INT : integer range 0 to 2**ADDR_WIDTH-1; -- holds the integer value of the address 
    begin 
    ADDR_IN_INT := to_integer(unsigned(ADDR_IN)); 
    DATA_OUT <= DATA_IN(ADDR_IN_INT); 
    end process MUX_RTL; 
end architecture RTL; 
3

Вам нужно целое число в качестве типа индекса. (Или с другими массивами, вы можете использовать любой дискретный тип, например, перечисление).

Другие ответы показали, как добраться туда, используя функции преобразования типов: вместо этого я спрошу, почему бы не сделать «подсчет» целого числа, например natural range 0 to 15? Он будет синтезировать все то же самое и сделать более чистый более простой код.

Смежные вопросы