Как присвоить один бит std_logic_vector 1, а другим - 0

Я получаю извне std_logic_vector с двоичным значением, которое представляет бит, который должен быть установлен на один, а другие на 0. Насколько я понимаю, это декодер, но решение этой проблемы с помощью оператора «когда» займет так много строк кода , плюс его нельзя перенастраивать.

Пример:

signal number : std_logic_vector(7 downto 0); 
signal output : std_logic_vector(255 downto 0);

output <= output(to_integer(unsigned(number))) and (others=>'0');

person Алекс    schedule 27.08.2018    source источник
comment
Я бы использовал оператор сдвига для вектора со значением «1».   -  person Oldfart    schedule 27.08.2018
comment
Возможный дубликат идей для гибкого / универсального декодера в VHDL   -  person    schedule 27.08.2018


Ответы (1)


Есть много способов сделать это. Все (синтаксически и семантически допустимые) способы могут быть смоделированы. Некоторые из них могут быть синтезированы, некоторые - нет, но, поскольку это зависит от вашего синтезатора, трудно сказать. Во-первых, давайте переименуем output в result: output не является ключевым словом языка VHDL, но это имя стандартного потока вывода, определенного в пакете std.textio. Таким образом, лучше избегать использования его в качестве идентификатора пользователя.

  1. Процесс с переменными и адресуемыми битами (упражнение: изучите агрегированную нотацию и поймите (others => '0')):

    process(number)
        variable tmp: std_logic_vector(255 downto 0);
    begin
        tmp := (others => '0');
        tmp(to_integer(unsigned(number))) := '1';
        result <= tmp;
    end process;
    
  2. Эквивалент без промежуточной переменной (упражнение: изучите назначение сигналов и поймите, почему это работает):

    process(number)
    begin
        result <= (others => '0');
        result(to_integer(unsigned(number))) <= '1';
    end process;
    
  3. Процесс с баррель-шифтером в VHDL 2002 (возможно, все еще не поддерживается вашими инструментами):

    architecture foo of bar is
        ...
        constant one: std_logic_vector(255 downto 0) := (0 => '1', others => '0');
        ...
    begin
        ...
        process(number)
        begin
            result <= one sll to_integer(unsigned(number));
        end process;
        ...
    end architecture foo;
    
  4. Одновременное назначение сигналов с помощью устройства сдвига в VHDL 2002 (упражнение: поймите, что одновременные назначения сигналов - это процессы, представьте себе эквивалентный процесс):

    architecture foo of bar is
        ...
        constant one: std_logic_vector(255 downto 0) := (0 => '1', others => '0');
        ...
    begin
        ...
        result <= one sll to_integer(unsigned(number));
        ...
    end architecture foo;
    
person Renaud Pacalet    schedule 27.08.2018