Пожалуйста, разъясните концепцию последовательного и одновременного выполнения в VHDL.

Я немного познакомился с Verilog еще в школе, и вот, год спустя, я купил плату Basys 3 FPGA. Моя цель - изучить VHDL.

Я читал бесплатную книгу под названием «Free Range VHDL», которая очень помогает понять язык VHDL. Я также просмотрел репозитории github, содержащие код VHDL, для справки.

Меня больше всего беспокоит разница между последовательным и параллельным выполнением. Я понимаю значение этих двух слов, но все еще не могу представить, почему мы можем использовать «процесс» для комбинационной логики (то есть семисегментного декодера). Я реализовал свой семисегментный декодер как условное назначение параллельных операторов. В чем была бы разница, если бы я реализовал декодер с использованием процесса и оператора switch? Я не понимаю слова последовательное выполнение процесса, когда речь идет о комбинационной логике. Я бы понял, если бы это была последовательная машина — конечная машина.

Может кто-нибудь объяснить эту концепцию?

Вот мой код для семисегментного декодера:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity hex_display_decoder is
    Port ( D: in STD_LOGIC_VECTOR (3 downto 0);
       SEG_OUT : out STD_LOGIC_VECTOR (6 downto 0));
end hex_display_decoder;

architecture dataflow of hex_display_decoder is
begin
  with D select
      SEG_OUT <=  "1000000" when "0000",
                  "1111001" when "0001",
                  "0100100" when "0010",
                  "0110000" when "0011",
                  "0011001" when "0100",
                  "0010010" when "0101",
                  "0000010" when "0110",
                  "1111000" when "0111",
                  "0000000" when "1000",
                  "0010000" when "1001",
                  "0001000" when "1010",
                  "0000011" when "1011",
                  "1000110" when "1100",
                  "0100001" when "1101",
                  "0000110" when "1110",
                  "0001110" when "1111",
                  "1111111" when others;
end dataflow;

Спасибо,

Джейк Хладик


person jakeh12    schedule 07.07.2016    source источник
comment
См. IEEE Std 1076-2008 11.6 Параллельные операторы присваивания сигналов Параллельный оператор присваивания сигналов представляет эквивалентный оператор процесса, который присваивает значения сигналам. В других разделах параллельных операторов будет описано, как они разработаны для моделирования/синтеза. Все разработанные модели имитируются выполнением последовательных операторов. Как требует понимания цикла моделирования VHDL. Free Range VHDL может оказаться недостаточным ресурсом. Если вы утверждаете, что показанный вами код работает, посетите сайт Code Review.   -  person    schedule 07.07.2016
comment
Спасибо! Я не знал, что есть страница обзора кода.   -  person jakeh12    schedule 07.07.2016
comment
Это может относиться к теме Code Review, при условии, что A) код работает, и B) код никоим образом не является гипотетическим или неполным.   -  person Quill    schedule 07.07.2016


Ответы (1)


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

Вы путаете две вещи:

  • Тип логики, которая может быть последовательной или комбинационной.
  • Порядок выполнения операторов, который может быть последовательным или параллельным.

Типы логики

В логическом дизайне:

  • Комбинационная схема реализует чистую логическую функцию без какого-либо состояния. В комбинационной схеме нет необходимости в часах.
  • Последовательная схема — это схема, которая изменяется каждый такт и запоминает свое состояние (с помощью триггеров) между тактами.

Следующий процесс VHDL является комбинационным:

process(x, y) begin
    z <= x or y;
end process;

Мы знаем, что это комбинационное, потому что:

  • У него нет часов.
  • Все его входные данные находятся в его списке конфиденциальности (круглые скобки после ключевого слова process). Это означает, что изменение любого из этих входных данных приведет к повторной оценке процесса.

Следующий процесс VHDL является последовательным:

process(clk) begin
    if rising_edge(clk) then
        if rst = '1' then
            z <= '0';
        else
            z <= z xor y;
        end if;
    end if;
end process;

Мы знаем, что это последовательно, потому что:

  • Он чувствителен только к изменениям на своих часах (clk).
  • Его выход изменяет значение только по переднему фронту тактового сигнала.
  • Выходное значение z зависит от его предыдущего значения (z находится с обеих сторон присваивания).

Модель исполнения

Короче говоря, процессы в VHDL выполняются следующим образом:

  • Операторы внутри процесса выполняются последовательно (т. е. один за другим по порядку).
  • Процессы выполняются одновременно относительно друг друга.

Замаскированные процессы

Так называемые параллельные операторы, по сути, все операторы вне процесса, на самом деле являются замаскированными процессами. Например, это параллельное назначение сигнала (т. е. назначение сигнала вне процесса):

z <= x or y;

Эквивалентен этому процессу:

process(x, y) begin
    z <= x or y;
end process;

То есть это эквивалентно такому же назначению внутри процесса, все входы которого находятся в списке чувствительности. Под эквивалентом я подразумеваю стандарт VHDL (IEEE 1076), фактически определяющий поведение параллельных назначений сигналов посредством их эквивалентного процесса.

Это означает, что, хотя вы этого и не знали, это ваше утверждение в hex_display_decoder:

SEG_OUT <=  "1000000" when "0000",
            "1111001" when "0001",
            "0100100" when "0010",
            "0110000" when "0011",
            "0011001" when "0100",
            "0010010" when "0101",
            "0000010" when "0110",
            "1111000" when "0111",
            "0000000" when "1000",
            "0010000" when "1001",
            "0001000" when "1010",
            "0000011" when "1011",
            "1000110" when "1100",
            "0100001" when "1101",
            "0000110" when "1110",
            "0001110" when "1111",
            "1111111" when others;

это уже процесс.

Что, в свою очередь, означает

Какая была бы разница, если бы я реализовал декодер, используя процесс и оператор switch?

Вовсе нет.

person Philippe Aubertin    schedule 07.07.2016