Nano Hash - криптовалюты, майнинг, программирование

Путаница VHDL с использованием параллельного кода и последовательного кода

Я пытаюсь закодировать 8-битный полный сумматор, используя только параллельный код в VHDL, но я получил ошибку в синтаксисе. В первом случае я сделал это:

    LIBRARY ieee;
    USE ieee.std_logic_1164.ALL;

    ENTITY concfulladder IS

        PORT(     A: IN std_logic_vector (7 DOWNTO 0);
                  B: IN std_logic_vector (7 DOWNTO 0);
                Cin: IN std_logic_vector (7 DOWNTO 0);
                Sum: OUT std_logic_vector(7 DOWNTO 0);
               Cout: OUT std_logic_vector(7 DOWNTO 0));
         
    END concfulladder;

    ARCHITECTURE cfulladder OF concfulladder IS


    BEGIN

      sum(0) <= '0' WHEN (A(0) XOR B(0) XOR CIN(0)) = '0' ELSE
                '1';
      cout(0) <= '0' WHEN ((A(0) AND B(0)) OR (Cin(0) AND A(0)) OR (Cin(0) AND B(0))) = '0' ELSE
                 '1';
      sum(1) <= '0' WHEN (A(1) XOR B(1) XOR CIN(1)) = '0' ELSE
                 '1';
      cout(1) <= '0' WHEN ((A(1) AND B(1)) OR (Cin(1) AND A(1)) OR (Cin(1) AND B(1))) = '0' ELSE
                 '1';
       sum(2) <= '0' WHEN (A(2) XOR B(2) XOR CIN(2)) = '0' ELSE
                 '1';
      cout(2) <= '0' WHEN ((A(2) AND B(2)) OR (Cin(2) AND A(2)) OR (Cin(2) AND B(2))) = '0' ELSE
                 '1';
       sum(3) <= '0' WHEN (A(3) XOR B(3) XOR CIN(3)) = '0' ELSE
                 '1';
      cout(3) <= '0' WHEN ((A(3) AND B(3)) OR (Cin(3) AND A(3)) OR (Cin(3) AND B(3))) = '0' ELSE
                 '1';
       sum(4) <= '0' WHEN (A(4) XOR B(4) XOR CIN(4)) = '0' ELSE
                 '1';
      cout(4) <= '0' WHEN ((A(4) AND B(4)) OR (Cin(4) AND A(4)) OR (Cin(4) AND B(4))) = '0' ELSE
                 '1';
       sum(5) <= '0' WHEN (A(5) XOR B(5) XOR CIN(5 )) = '0' ELSE
                 '1';
      cout(5) <= '0' WHEN ((A(5) AND B(5)) OR (Cin(5) AND A(5)) OR (Cin(5) AND B(5))) = '0' ELSE
                 '1';
       sum(6) <= '0' WHEN (A(6) XOR B(6) XOR CIN(6)) = '0' ELSE
                 '1';
      cout(6) <= '0' WHEN ((A(6) AND B(6)) OR (Cin(6) AND A(6)) OR (Cin(6) AND B(6))) = '0' ELSE
                 '1';
       sum(7) <= '0' WHEN (A(7) XOR B(7) XOR CIN(7)) = '0' ELSE
                 '1';
      cout(7) <= '0' WHEN ((A(7) AND B(7)) OR (Cin(7) AND A(7)) OR (Cin(7) AND B(7))) = '0' ELSE
                 '1';
             
  END cfulladder;

И все это правильно, я не получаю никаких ошибок. Но если я попытаюсь уменьшить количество строк с помощью цикла for, я получу ошибку:

PROCESS (all) IS

BEGIN

    FOR I IN 0 TO 7 LOOP

        Sum(I) <= '0' WHEN (A(I) XOR B(I) XOR CIN(I)) = '0' ELSE 
                     '1';
                     
        Cout(I) <= '0' WHEN ((A(I) AND B(I)) OR (Cin(I) AND A(I)) OR (Cin(I) AND B(I))) = '0' ELSE 
                      '1';

    END LOOP;

END PROCESS;

Ошибка: Ошибка рядом с текстом КОГДА; ожидание ;. Поискав решение в Интернете, я обнаружил, что не могу использовать последовательный код и параллельный код в одной программе. Есть ли решение этой проблемы?

04.10.2020

  • Условное назначение сигнала является только параллельным оператором в версиях стандарта VHDL до -2008. Вы можете использовать -2008, использовать эквивалентный оператор if или описать поток данных в задании, например. Sum(I) <= A(I) XOR B(I) XOR CIN(I); и Cout(I) <= (A(I) AND B(I)) OR (Cin(I) AND A(I)) OR (Cin(I) AND B(I));, которые предоставляют те же значения, используя операторы перегрузки, определенные в пакете IEEE std_logic_1164. 04.10.2020
  • Также используется оператор for generate. См. ответ Билла Линча, который также полезен в сумматорах общего размера. Здесь оператор генерации имеет эквивалент оператора блока для каждой итерации, каждый из которых содержит операторы параллельного назначения сигнала. 04.10.2020
  • Судя по тому, как вы используете зарезервированное слово all в списке конфиденциальности процессов, вы используете -2008. Операторы последовательного условного назначения сигналов могут быть не реализованы в вашей конкретной инструментальной среде. Точно так же вы, возможно, пропустили передачу флага -2008 анализатору инструментов (компилятору). Замена приведенным выше оператором процесса на параллельные операторы, найденные в архитектуре, будет успешно анализировать (например, ghdl -a --std=08 concfulladder.vhdl, недавний коммит ghdl 1.0-dev v0.37.0-773-gd85a1a9). 04.10.2020

Ответы:


1

when..else допускается внутри процесса только при использовании VHDL 2008 или более поздних версий. В предыдущих версиях вам нужно было использовать операторы when..else вне процесса.

04.10.2020
  • Это неправильно. См. 11.6 Операторы параллельного назначения сигналов, цель BNF *conditional_waveforms *, которая определена в 10.5.3 Условные назначения сигналов. 11.6 Параллельные операторы присваивания сигнала Параллельный оператор присваивания сигнала представляет собой эквивалентный оператор процесса, который присваивает значения сигналам. См. 11.3 Оператор процесса. Часть оператора процесса содержит последовательность из нуля или более последовательных операторов, здесь оператор условного присваивания сигнала (10.5.3). 04.10.2020
  • @user1155120 user1155120 Какую часть вы считаете неверной? Что в VHDL-2008 условное назначение теперь разрешено в процессе, или что до VHDL-2008 условное назначение не разрешалось в процессе? 05.10.2020
  • Это неверно: when..else разрешено только внутри процесса при использовании VHDL 2008. Оператор параллельного назначения сигнала (11.6) может быть concurrent_conditional_signal_assignment, где промежуточный целевой условный сигнал определен в 10.5.3 и содержит зарезервированные слова when и else. Условные сигналы разрешены как в последовательных, так и в параллельных назначениях сигналов. Параллельные операторы не встречаются в операторах процесса. 05.10.2020
  • @user1155120 user1155120 Пункт 10 — это последовательные операторы. В разделе 10.5.3 подробно описаны условные назначения сигналов (последовательные в процессе). Следовательно, в VHDL-2008, когда else стало условным присвоением и действительно разрешено внутри процесса, а Tricky верен - если только вы просто не говорите слов, но в этот момент вы вводите в заблуждение сообщество. Вам также может понравиться 10.6.3 Условные назначения переменных. 06.10.2020
  • @jim Вот пример, демонстрирующий когда... else разрешено не только внутри процесса при использовании VHDL 2008 . «только» следует исключить, простое его перемещение было бы двусмысленным по отношению к утвержденной текущей редакции. Стандартный синтаксис является разрешающим, в то время как семантические ограничения являются ограничительными. Это устраняет тавтологическую двусмысленность. 06.10.2020
  • Нет. Гуглить можно только внутри шоу, почему только там не место. Это исключает другое использование. when..else допускается внутри процесса только при использовании VHDL 2008 или более поздних версий. 06.10.2020

  • 2

    Здесь нет необходимости в условных присваиваниях. Вместо этого попробуйте:

    PROCESS (all) IS
    BEGIN
    
        FOR I IN 0 TO 7 LOOP
            Sum(I) <= A(I) XOR B(I) XOR CIN(I);
                         
            Cout(I) <= (A(I) AND B(I)) OR (Cin(I) AND A(I)) OR (Cin(I) AND B(I));
        END LOOP;
    END PROCESS;
    

    С другой стороны, все логические операторы VHDL являются побитовыми, поэтому вы также можете записать это как (но обязательно проверьте это в моделировании):

    Sum <= A XOR B XOR CIN;
    Cout <= (A AND B) OR (Cin AND A) OR (Cin AND B);
    

    Исторически нам нужно было when else при принятии решений на основе массивов и получении скалярного значения. Например:

    Decode1 <= '1' when BlockSelect = '1' and Addr = X"A5" else '0';
    

    С VHDL-2008 даже это использование исчезнет, ​​поскольку мы можем повторно выразить это с помощью ?= без использования условного присваивания.

    Decode1 <= BlockSelect and Addr ?= X"A5";
    

    Как и в случае с любым кодом VHDL-2008, ваш поставщик синтеза может пока не поддерживать его. Если они этого не делают (и вы включили VHDL-2008 в их инструментах), не забудьте отправить отчет об ошибке их реализации.

    05.10.2020
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..