Создаваемые имена для signal, port, variable, constant, function (и так далее) должны быть значащими
и понятными.
Пример
Для обозначения шины адреса RAM лучше использовать ram_addr, а не ra:
ram_addr : outstd_logic_vector(7downto0); -- верно
ra : outstd_logic_vector(7downto0); -- неверно
Номер
1.5
Описание
Наименование тактовых сигналов должно быть clk или, если тактовых сигналов в блоке
несколько, с префиксом clk_ . После префикса должны идти осмысленные названия,
а не нумерация. Так же старайтесь не использовать частоту в названиях тактовых сигналов.
Сигнал сброса, активный в логической единице (active-high), должен называться rst или
иметь префикс rst_ . Сигнал сброса, активный в логическом нуле (active-low), должен
называться rst_n или иметь префикс rst_ и постфикс _n.
Каждый файл должен содержать заголовок в виде комментария. Весь текст должен быть написан
на латинице.
В заголовке указывается следующая информация:
Названия файла (Filename)
Автор[ы] (Author)
Дата создания файла (Data)
Кратное описания (Annotation). Может быть
Версия (Version)
Дата последней модификации (Mod.Data)
Так же на усмотрение разработчика могут быть добавлены следующие поля:
Лицензию (License)
Почта для связи (E-mail)
Ссылка на репозиторий или сайт (Link)
Зависимости от других файлов (Dependency)
Детальное описание работы кода (Description)
Примечание (Note)
Пример
Обязательная часть заголовка:
-- Filename : jr_module.vhd-- Author : John Rambo-- Date : 07.06.1972-- Annotation : This file is written by a fictional character in the Rambo series.-- “They drew first blood”-- Version : 0.5-- Mod.Data : 11.02.1981
Большинство специалистов сходятся во мнении, что комментарии должны объяснять намерения
программиста, а не код; то, что можно выразить на языке программирования, не должно
выноситься в комментарии [Wikipedia - Комментарии]
Для описания signal, port, variable, constant, type старайтесь размещать комментарий в той же строке
Для описания function, process, procedure и других многострочных структур размещайте
комментарий строчкой выше.
Приветствуется комментирование групп из нескольких port или signal
Пример
---- верно:signal flag_position : std_logic; -- '1' - HOME position; '0' - FINISH position---- неверно:signal flag_position : std_logic; -- flag of position---- неверно:-- '1' - HOME position; '0' - FINISH positionsignal flag_position : std_logic;
---- верно:-- Manager State Machine of IIC interfaceprocess (clk)
begin---- неверно:process (clk) -- Manager State Machine of IIC interfacebegin
Каждое выражение VHDL должно находиться на отдельной строке.
Не группируйте объявления signal, port - пишите каждое на отдельной строке
Пример
a <= b and c; -- верно
c <= d or e; -- верно
a <= b and c; c <= d or e; -- неверноsignal a : std_logic; -- верноsignal b : std_logic; -- верноsignal a,b : std_logic; -- неверно
Номер
1.15
Описание
Объявляйте port в следующем порядке:
Входные порты:
Тактовые сигналы (clocks)
Сигналы сброса (resets)
Сигналы разрешения (enables)
Управляющие сигналы (control signals)
Порты адреса (address lines)
Порты данных (data lines)
Двунаправленные порты:
Тактовые сигналы (clocks)
Сигналы сброса (resets)
Сигналы разрешения (enables)
Управляющие сигналы (control signals)
Порты адреса (address lines)
Порты данных (data lines)
Выходные порты:
Тактовые сигналы (clocks)
Сигналы сброса (resets)
Сигналы разрешения (enables)
Управляющие сигналы (control signals)
Порты адреса (address lines)
Порты данных (data lines)
Допускается объединять крупные группы port для одного интерфейса. Такие группы размещаются
после списка выходных портов, а порядок портов внутри определяется вышеизложенным правилом.
Название entity должно совпадать с названием файла: entity_name.vhd
Пример
None
Номер
1.18
Описание
entity, architecture и configuration должны располагаться в одном VHDL-файле.
Пример
None
Номер
1.19
Описание
Создавайте function вместо многократного повторения одинакового кода. Делайте function
максимально универсальными, чтобы упростить их повторное использование.
Пример
None
Номер
1.20
Описание
Каждый процесс должен содержать метку (label). Метки должны иметь постфикс _PROC
Пример
SYNC_PROC : process (clk, rst)
-- ...endprocess SYNC_PROC;
Номер
1.21
Описание
При инициализации экземпляра component используйте следующие правила:
в начале ставьте префикс i_
дублируйте название или сокращайте его, если оно чрезмерно длинное
добавляйте постфикс _number с номерами экземпляров компонентов тогда,
когда их инициализируете больше одного
i_component_name [_number]
Пример
i_fir_0 : fir
portmap(
-- ...
);
i_fir_1 : fir
portmap(
-- ...
);
Правила создания переносимого кода
Номер
2.1
Описание
Используйте только типы данных из IEEE стандарта или типы и подтипы, которые основаны на
IEEE стандарте.
Используйте std_logic и std_logic_vector вместо std_ulogic и std_ulogic_vector
соответственно.
Используйте std_logic и std_logic_vector вместо bit и bit_vector соответственно.
Пример
None
Номер
2.3
Описание
Не используйте магические числа - числа, которые встречаются в коде без всякого объяснения.
Вместо магических чисел используйте generic или constant. Такая практика позволяет
упростить изменение всех вхождений чисел в коде и улучшить его читаемость.
Для однобитных '1' и '0' создание отдельных констант не обязательно.
Во многих случаях можно обойтись использованием предопределенных атрибутов языка VHDL
(Predefined Attributes).
Используйте для тактирования положительный фронт тактового сигнала (rising edge). Используйте
отрицательный фронт тактового сигнала (falling edge) только при необходимость работы
с удвоенной частотой.
Если в вашем модуле много триггеров, которые работают как по положительному,
так и по отрицательному фронту тактового сигнала, то стоит рассмотреть возможность разделения
на разные модули.
Пример
None
Номер
3.2
Описание
Не используйте для тактирования тактовые сигналы, сгенерированные последовательностной логикой
(gated clock).