Как назначить один бит std_logic_vector для 1 и другие для 0 - PullRequest
0 голосов
/ 27 августа 2018

Я получаю извне 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');

1 Ответ

0 голосов
/ 27 августа 2018

Есть много способов сделать это.Все (синтаксически и семантически обоснованные) способы могут быть смоделированы.Некоторые могут быть синтезированы, некоторые нет, но так как это зависит от вашего синтезатора, трудно сказать.Во-первых, давайте переименуем 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;
    
...