Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
download-1402550944935.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
660.48 Кб
Скачать

2.3. Основы языка описания цифровых схем vhdl.

VHDL (VHSIC (very-high-speed-integrated-circuit) hardware description language) – специальный язык для описания высокоскоростных цифровых схем. Он отличается от всем привычных и широко используемых ныне императивных языков программирования (таких, как С++ или Pascal; далее будем называть их «обычными» языками). И основное его отличие заключается в следующем. Суть обычного языка программирования сводится к тому, что компьютер последовательно, команду за командой выполняет программу. И в каждый конкретный момент времени выполняется только одна команда (не будем сейчас рассматривать многозадачность и создание потоков, в простейшем случае – это так). И вообще говоря, это соответствует изначальной структуре всех процессоров – последовательное выполнение кода.

Но всем известно, что в цифровой схеме может одновременно, параллельно проходить несколько цепочек вычислений. Реализацию такой функциональности и даёт нам VHDL.

Чтобы понять, как реализован этот принцип, рассмотрим такой простой пример. Строки:

Net1 <= ‘0’;

Net2 <= Net1;

приведут к тому же результату, что и

Net2 <= Net1;

Net1 <= ‘0’;

а именно к тому, что двум цепям (сигналам, или просто кускам провода, если хотите), Net1 и Net2 будет присвоено значение «0», т.е. выражаясь понятиями цифровой схемотехники, логического нуля.

Здесь «<=», как нетрудно догадаться, это оператор присваивания в языке VHDL. В конце каждой команды ставится точка с запятой.

Значения сигналов пишутся в одинарных кавычках – ‘0’, ‘1’.

Значения шин – в двойных кавычках – “00001010”, X”0A”.

По умолчанию все данные представляются в двоичном коде, если же перед первой кавычкой стоит знак X – то в шестнадцатеричном.

Сами сигналы объявляются следующим образом:

signal Net1: std_logic;

signal Net2: std_logic = ‘1’;

Здесь во второй строчке сигналу присвоено значение по умолчанию, которое будет загружено в него сразу после загрузки кристалла.

Для объявления шины используется следующая конструкция:

signal Bus1: std_logic_vector (7 downto 0);

- это мы объявили 8-разрядную шину.

Помимо сигналов, можно объявлять также и всем привычные переменные целого типа, integer, которые нам также пригодятся (забегая вперед – для реализации счетчиков), к примеру:

signal Count: integer range 0 to 65535;

Простейшие логические операции, такие как НЕ, И, ИЛИ, исключающее ИЛИ, выполняются соответствующими ключевыми словами — not, and, or, xor, к примеру, следующая конструкция

y <= not (x1 and x2);

является аналогией такой схемы:

Рис. 2.3.1.

Еще одним важным элементом языка VHDL является процесс – он используется для описания как элементов комбинаторной, так и последовательностной логики. Выглядит он в общем случае вот так:

process (<all_input_signals_separated_by_commas>)

begin

<statements>;

end process;

Вне процессов описываются только элементы комбинаторной логики.

Есть в VHDL и оператор условия, используется внутри процесса:

if <condition> then

<statement>

elsif <condition> then

<statement>

else

<statement>

end if;

Есть и оператор CASE, также для процесса:

case (<2-bit select>) is

when "00" => <statement>;

when "01" => <statement>;

when "10" => <statement>;

when "11" => <statement>;

when others => <statement>;

end case;

У обоих последних операторов есть аналоги для использования вне процесса. Для IF:

<name> <= <expression> when <condition> else

<expression> when <condition> else

<expression>;

Для CASE:

with <choice_expression> select

<name> <= <expression> when <choices>,

<expression> when <choices>,

<expression> when others;

Всевозможные шифраторы-дешифраторы реализуются очень просто – при помощи выше описанных операторов CASE, и комбинаторных аналогов IF и CASE.

Чтобы описать простейший D-триггер, используется следующая конструкция (на рисунке 2.3.2, справа от кода, представлено соответствующее УГО элемента):

p rocess (C)

begin

if rising_edge(C) then

Q <= D;

end if;

end process;

Рис. 2.3.2.

Описание простейшего счетчика выглядит так:

process (<clock>)

begin

if <clock>='1' and <clock>'event then

if <clock_enable>='1' then

<count> <= <count> + 1;

end if;

end if;

end process;

Все эти конструкции запоминать не обязательно, т.к. они есть в специальном «Language Templates» среды Xilinx ISE WebPACK, работу с которой мы рассмотрим далее. Помимо выше приведенных, там еще очень много всевозможных шаблонов кода на все случаи жизни.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]