Действительно ли нам нужен VHDL

       

Спецификация Интерфейса Системы


Действительно ли нам нужен VHDL? Представление Системы в VHDL: Единицы Проекта Объекты VHDL:Сигнал Спецификация Интерфейса Системы Конструкции VHDL для Описания Поведения Системы Описание Поведения при помощи Процессов Многократные Процессы в Архитектуре Определение Структуры Системы Испытание Проекта при помощи Испытательного стенда

Глава 4

Спецификация Интерфейса Системы

Содержание Главы 4

4.1. Краткий обзор Главы

4.2. Заголовок Объекта

4.2.1. Имя Объекта



4.2.2. Комментарии в VHDL

4.2.3. Описание Системы

4.2.4. . Завершение Объекта

4.3. Предложение порта

4.3.1. Значение Порта

4.3.2. Режим Порта

4.3.3. Документирование Порта

4.4. Предложение Generic

4.4.1. Что такое Generic?

4.4.2. Спецификация Generics

4.4.3. Применение Generics

Резюме

4.1. Краткий обзор Главы

Объекты уже были упомянуты ранее. Эта глава опишет их более подробно.

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

Секция 3 описывает декларацию порта системы. Mode Сигнала будут описаны более детально, и некоторые примеры будут рассмотрены.

В заключение, в Секции 4 будет представлена подробная информация относительно generics:, какие они, какой целе они служат и как они должны быть определены.

4.2.1. Имя Объекта

Ключевые вопросы:

Имя Объекта, формально названное идентификатором, служит прежде всего для целей документации. Из-за этого, рекомендуется составить название слов Объекта, которые лучше всего описывают то, что делает система. Так как язык VHDL регистро нечувствительный , идентификатор предпочтительно должен быть написан, используя смешанные литеры, например. FastBinary_Cntr.

Каждый идентификатор VHDL, включая имя Объекта, должен быть написан по этим правилам:

  • Он должен вмещаться в одну строку;
  • Он должен начаться с буквы;
  • Он может быть составлен только из букв, чисел и знаков подчеркивания;
  • Он не может иметь знаков подчеркивания в начале, или конец или два подчеркивает рядом;


  • Никакие пробелы не допускаются внутри идентификатора;
  • Литеры верхнего и нижнего регистра не различаются;
  • Зарезервированные слова не могут использоваться как идентификаторы.
  • Так называемые расширенные идентификаторы (которые могут содержать зарезервированные слова и специальные знаки) допускаются, но не рекомендуются. См. Детальное Руководство по применению .

    Примеры:

    Два различных имени для Объекта простого комбинаторного устройства (мультиплексор 2 на 1) предложены. Оба из них правильны.



    Entity Mux_2_to_1 is Entity Mux2to1 is

    ... ...

    End Entity Mux_2_to_1; End Entity Mux2to1;

    Entity identifier is

    End Entity Entity_simple_name;

    Рисунок:

    4.2.2. Комментарии в VHDL

    Ключевые вопросы:

    Не существует хорошего проекта без сопутствующей документации. Хорошая документация это не только большое количество страниц описания, но также и комментарии внутри спецификации. Это верно для всех языков программирования и языков аппаратного описания (включая VHDL).

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

    Примеры:

    Имеется один хороший и один плохой пример размещения комментариев в Объекта из предыдущей страницы:

    -- 2-line to 1-line data multiplexer - good comment example

    entity Mux_2_to_1 is

    port (I0, I1, Sel : in bit;

    Y : out bit);

    end entity Mux_2_to_1;

    entity –- bad comment example Mux_2_to_1 is

    port (I0, I1, Sel : in bit;

    Y : out bit);

    end entity Mux_2_to_1;

    Рисунок:

    4.2.3. Описание Системы

    Ключевые вопросы:

    Документирование Проекта была одна из главных причин для развития VHDL. Это отражено в богатстве языковых конструкций и в общепринятой системе описаний в начале каждого файла VHDL.

    Язык непосредственно не требует такого описания, написанного в форме комментария. Однако, это широко принятая практика, что хорошая спецификация VHDL должна быть задокументирована.



    Не имеется никакого "стандартного" способа написания описания системы, но отдельные элементы необходимы и могут быть найдены в большинстве проектов. Для написания профессиональной и полной документации документируйте каждый файл VHDL подобно примеру справа.

    Примеры:

    С практической точки зрения описание функциональных возможностей системы (данные как комментарий) очень полезены. В нашем случае (мультиплексор), эти функции можно давать как таблица истинности:

    -------------------------------------------------------

    -- Truth Table of 2-line to 1-line data multiplexer --

    -------------------------------------------------------

    --| SEL | I0 | I1 || Y |

    --|------------------------------|

    --| 0 | 0 | 0 || 0 |

    --| 0 | 0 | 1 || 0 |

    --| 0 | 1 | 0 || 1 |

    --| 0 | 1 | 1 || 1 |

    --| 1 | 0 | 0 || 0 |

    --| 1 | 0 | 1 || 1 |

    --| 1 | 1 | 0 || 0 |

    --| 1 | 1 | 1 || 1 |

    --|------------------------------|

    --

    entity Mux_2_to_1 is

    port (I0, I1, Sel : in bit;

    Y : out bit);

    end entity Mux_2_to_1;

    Рисунок:

    4.2.4. Завершение Объекта

    Ключевые вопросы:

    Последний элемент шаблона Объекта – его завершение.

    Сущность заканчивается оператором end. Это то, как большинство VHDL конструкций заканчиваются. Чтобы улучшить удобочитаемость, рекомендуем использовать любой (или оба) необязательных поля, которые могут следовать после end : ключевое слово entity и/или имя Объекта.

    Примеры:

    -- Сначала хороший пример декларации Объекта

    Entity Mux_2_to_1 is

    End Entity Mux_2_to_1;

    -- Второй хороший пример декларации Объекта

    Entity Mux_2_to_1 is

    End Mux_2_to_1;

    -- Сначала плохой пример декларации Объекта

    Entity Mux_2_to_1 is

    End Entity Mux2to1;

    -- Второй плохой пример декларации Объекта

    Entity Mux_2_to_1 is

    EndMux2_to_1;

    Рисунок:

    4.3.1. Значение Порта

    Ключевые вопросы:

    Концепция порта уже была упомянута ранее и пришло время обсудить ее более подробно.

    Стандартное описание Языка VHDL определяет порты как " каналы для динамической связи между блоком [то есть сущностью] и окружающей средой ".


    На практике это каналы – сигналы, которые формируют интерфейс системы. Так как полная связь проходит через порты то, таким образом каждый порт должен быть точно определен.

    Каждый порт определяется своим предложением порта(port clause), которое состоит из следующих элементов:

  • Необязательное ключевое слово signal;
  • Имя порта записанное в колонку;
  • Mode порта;
  • Тип порта;
  • Факультативно; начальное значение, которому предшествует: = символ;
  • Факультативно; комментарий, описывающий порт (строго рекомендуемый).

    Примеры:

    -- Сначала хороший пример декларации порта для 2- двоичных разряднов

    --- Полный адрес:

    entity Full_Adder is

    port (A0, A1, B0, B1, Cin : in bit;

    S0, S1, Cout : out bit);

    end entity Full_Adder;

    -- Второй хороший пример декларации порта для 2- двоичных разряднов

    -- Полный адрес:

    entity Full_Adder is

    port (A, B : in bit_vector (1 downto 0);

    Cin : in bit;

    S : out bit_vector (1 downto 0);

    Cout : out bit);

    end entity Full_Adder;

    -- Плохой пример декларации порта для 2- двоичных разряднов

    -- Полный адрес:

    entity Full_Adder is

    port (A, B : in bit_vector (1 downto 0);

    Cin : in bit := 'Z'; -- Bad static_expression

    -- Assignment target incompatible

    -- with right side

    S : out bit_vector (1 downto 0);

    Cout : out bit);

    end entity Full_Adder;

    Рисунок:

    4.3.2. Режим Порта

    Ключевые вопросы:

    Порты могут играть разное назначения: некоторые могут получать входные данные, некоторые могут посылать выходные результаты, а другие могут делать обе функции. Направление потока данных через порт определено mode порта.

    Имеются пять доступные способов:

  • in: Порт только получает данные; при этом он может читать такой сигнал, но записывать ему запрещено;
  • out: Порт только посылает данные; при этом он может записать такой сигнал, но читать ему запрещено;
  • inout: Порт реверсивен; он допускает как чтение так и запись сигнала;
  • buffer: Подобный inout, но он ограничен, так как записать можно только в него;
  • linkage: Также реверсивный порт, но с очень ограниченными правилами чтения и записи; фактически почти никогда не используется в проектах.
  • Только первые три mode могут использоваться для синтеза.

    Примеры:



    При объявлении порта Вы должны определить mode. Декларация порта для полного сумматора может выглядеть следующим образом:



    entity Full_Adder is

    port (A, B : in bit;

    Cin : bit;

    S : out bit;

    Cout : out bit);

    end entity Full_Adder;

    Рисунок:

    4.3.3. Документирование Порта

    Ключевые вопросы:

    Документировать должным образом порт столь же важно, как и хорошее описание Объекта, которое было обсуждено ранее. Хорошо - описанный порт должен иметь очевидное имя, которое обеспечивает указание на его функции. Кроме того, комментарий в конце строки должен обеспечить некоторую дополнительную информацию относительно этого сигнала.

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

    Примеры:

    Помимо описания системы в форме комментария, предшествующего декларации Объекта, это - хорошая идея и для документирования каждого порта подобным образом, то есть использованием комментариев. Имеются примеры таких комментариев для двух цепей, предварительно упомянутых: полный сумматор и мультиплексор:



    entity Full_Adder is

    port (A, B : in bit_vector (1 downto 0); -- Первый и второй операнд

    Cin : in bit; -- Вход переноса

    S : out bit_vector (1 downto 0);-- Результат действия

    Cout : out bit); -- Выход переноса

    end entity Full_Adder;

    entity Mux_2_to_1 is

    port (I0 : in bit; -- input data

    I1 : in bit; -- input data

    Sel : in bit; -- address select

    Y : out bit);-- output data

    end entity Mux_2_to_1;

    Рисунок:

    4.4.1. Что такое Generic?

    Ключевые вопросы:

    Стандартное описание Языка определяет generics как каналы для статической информации, которая будет сообщена к блоку из окружающей среды. Другими словами, generics поддерживает постоянные значения для различных параметров, как замечено, поступающих извне системы.

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


    Generics используется, чтобы описать постоянные значение. Например, они могут управлять размером модели, в частности шириной шин и размером таких параметеризированных (parameterized) блоков как n-битные адресные схемы или n-битные компараторы. Они могут также использоваться для выбора временных параметров, служа для зацикливания счетчика, и т.д.

    Примеры:

    Ниже приведенные примеры, показывают как использовать класс generic. Главная цель состоит в том, чтобы определить характерные (формальные) параметры данной единицы проекта:

    entity Mux2to1 is

    -- The generic constant tp is used to specify the timing

    -- parameters of the entity

    generic ( tp : time := 10 ns);

    port (I0, I1, SEL : in bit;

    Y : out bit);

    end entity Mux2to1;

    entity ROM is

    -- The generic constants Width and Depth are used

    -- to specify the number of data bits and address bits

    -- for the read only memory

    generic (Width : integer := 8;

    Depth : integer := 15);

    port (Addr_ROM : in bit_vector (Depth -1 downto 0);

    CS_ROM : in bit;

    Data_ROM : out bit_vector (Width -1 downto 0));

    end entity ROM;

    Рисунок:

    4.4.2. Спецификация Generics

    Ключевые вопросы:

    Generics определяются в Объектах (entitis) внутри класса generic, который располагается перед портами. Класс generic состоит из ключевого слова generic и списка generic, помещенного в круглые скобки. Подобно портам, объекты generic в списке generic отделяются точками с запятой.

    Каждая декларация generic состоит из следующих элементов:

  • Имя generic записанное в колонку;
  • Тип generic;
  • Необязательные параметры: значение generic, которому предшествует символ :=. Если значение не определено, и система используется как компонент на более высших уровня спецификации данных, значение должна быть поддержана через составляющие реализации (component instantiation); подробнее см. Главу 8;
  • Необязательный параметр комментарий, описывает generic.

    Примеры:

    -- Сначала хороший пример декларации generic:

    entity D_FF is

    generic (tp : time := 15 ns; -- propagation time



    ts : time := 10 ns; -- setup time

    th : time := 5 ns); -- hold time

    port (D, Clk : in bit;

    Q : out bit);

    end entity D_FF;

    - Второй хороший пример декларации generic:

    entity Full_Adder is

    generic (InDataWidth : positive := 8);

    port (A, B : in bit_vector (InDataWidth-1 downto 0);

    Cin : in bit;

    S : out bit_vector (InDataWidth-1 downto 0);

    Cout : out bit);

    end entity Full_Adder;

    Рисунок:

    4.4.3. Применение Generics

    Ключевые вопросы:

    Generics может использоваться где-нибудь в коде, где необходимы статические (то есть не изменяющий вовремени) значения. Фактически, строго рекомендуется использовать generics и константы вместо кодов написанных в самом тексте, потому это облегчает простые изменения в проекте. Параметры, которые обычно определены как generics следующие:

  • Размер комплексных объектов типа массивов или шин; так если generic используется для определения ширины шины, Вы можете изменять размер шины, изменяя generics предложение в начале спецификации. Используйте generics, для зацикливания счетчика и в подобных приложениях;
  • Выбор временных параметров: задержки, установки времени, времени переключения и любого параметра выбора времени, который используется в описании электронных элементов. Например, чтобы заменить медленный элемент на более быстрый (без того, чтобы изменять функциональные возможности) требуется только измененить значения generics, которые описывают временные параметры элемента. Если параметры выбора времени были бы жестко закодированы, каждая строка кода была бы должна быть проверена и изменена так, чтобы она содержала требуемую величину для выбранного времени.

    Примеры:

    Следующие два примера поясняют применение generics, для параметрического (parametrizable) декларирования устройства:

    entity Full_Adder_with_varying_structure is

    generic (InDataWidth : positive);

    port (A, B : in bit_vector (InDataWidth-1 downto 0);

    Cin : in bit;

    S : out bit_vector (InDataWidth-1 downto 0);

    Cout : out bit);

    end entity Full_Adder_with_varying_structure;



    entity RAM_with_varying_structure is

    generic (Width : positive;

    Depth : positive);

    port (Addr_RAM : in bit_vector (Depth -1 downto 0);

    CS_RAM : in bit;

    Data_RAM : out bit_vector (Width -1 downto 0));

    end entity RAM_with_varying_structure;

    Рисунок:

    Резюме

    1. Имя Объекта, формально названное идентификатором, служит больше всего для целей документирования.
    2. В VHDL каждый идентификатор, включая имя Объекта, должен создаваться за следующими правилами: он должен состоять из одной строки, он должен начинаться с буквы, он может включать в себя буквы, числа и знаки подчеркивания за исключением подчеркивания в начале, конце или два подчеркивания подряд. Никакие пробелы внутри идентификатора не допускаются; буквы верхнего и нижнего регистра не различаются, никакие зарезервированные слова не могут использоваться как идентификаторы.
    3. Комментарии в VHDL начинаются с двух дефисов (--) и заканчиваются в конце строки. Они могут быть расположены фактически где-нибудь, но не могут начинаться в середине идентификатора или зарезервированного слова.
    4. Одна из главных причин для развития VHDL была необходимость в документировании проектов. Это отражено в богатстве конструкций языка, и в общепринятой системе описаний используемой в начале каждого файла VHDL . Наличие документация - второй наиболее важный элемент хорошего проекта.
    5. Сущность может быть закончена простым оператором end. Много VHDL конструкций, заканчиваются этотим способ. Чтобы улучшить удобочитаемость, рекомендуется использовать одно (или оба) необязательных поля, которые могут следовать за end : ключевое слово entity или имя Объекта.
    6. Каждый порт определяется внутри класса порт и состоит из следующих элементов: необязательного ключевого слово signal, имени порта расположенного в колонку, mode порта, тип порта и необязательного параметра начальное значение, которому предшествует символ: =, а также рекомендуется комментарий, описывающий порт.
    7. Направление потока данных через порт определяется mode порта. Имеются три mode, которые могут использоваться для синтеза: in - порт получает данные, только извне и поэтому можно только читать сигналы, но записывать запрещено.


      Порт out - только посылает данные, и поэтому допускает только записывать сигналы, но чтение запрещено. Порт inout реверсивен; он допускает как считывание так и запись сигналов.
    8. Документирование портов комментариями в конце строки наиболее важно для технических систем, потому что имена должны соответствовать внешним запросам, т.е. существующим элементам,которые описанный в VHDL.
    9. Generics обеспечивают постоянные значения для параметров системы, которые находятся в наружной части. Они могут служить тем же самым целям что и постоянные значения: они управляют размером модели, учитывают временные параметры и т.д.
    10. Generics определеные в Объектах, находятся внутри класса generic, они расположены справа перед портами, и состоят из ключевого слова generic и списка generics в закрытых круглых скобках. Каждая декларация generic состоит из следующих элементов: имени generic расположенного в колонку; тип generic ; значение generic, которому предшествует символом :=; и необязательного комментария, который описывает generic .
    11. Generics может использоваться где-нибудь внутри кода, где используются статические (то есть не изменяющий) вовремени) значения.

    Далее>>

    Содержание раздела