Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Sbornik_PLIS

.pdf
Скачиваний:
23
Добавлен:
05.01.2023
Размер:
5.21 Mб
Скачать

Первоначально нужно создать новый проект с теми же настройками, что

ив лабораторных работах 1 и 2 (Пункт 2.2.1) и дать ему имя.

2.2.2Проектирование цифрового устройства

Вданной лабораторной работе в качестве примера рассмотрено цифровое устройство, которое имеет вид, представленный на рисунке 3.1 и выполняет следующие функции:

Рис. 3.1. Схема цифрового устройства

Модули counter1 и counter2 понижают скорость внутреннего счетчика с разной скоростью.

Мультиплексор M2_1 в зависимости от положения переключателя SW0 выбирает, какая скорость счетчика будет использоваться.

Модуль to_leds выполняет функцию бинарного счетчика, который выводит своё состояние на 8 светодиодов и при нажатии кнопки RESET на следующем такте обнуляет счетчик.

Первоначально, как и в предыдущих лабораторных работах нужно создать схему.

Для этого нужно нажать правой кнопкой в свободной областе «Hierarchy» и выбрать «New Source». Дальше выбрать «Schematic»и дать ему название

(Рис. 3.2)

41

Рис. 3.2. Создание схемы

Следующая задача – разработать 3 модуля, которые будут описаны кодом на языке VHDL.

Модуль counter1и counter2

Так как внутренний счетчик отладочной платы имеет частоту 100 МГц, то для вывода информации на светодиоды и для комфортного визуального восприятия нужно понизить частоту.

Этим занимаются модули counter1 и counter2.

Создадим новый VHDL модуль с именем counter1 (Повторив предыдущий шаг, но выбрав вместо «Schematic» – «VHDL Module») с настройками, представленными на рисунке 3.3

Рис. 3.3. Настройки модуля counter1

42

Вокне редактора нужно добавить следующий код (Полный код приведен

вПриложении 3.1):

process(clk)

variable counter: integer := 0; -- Переменная для счетчика

variable flag: boolean := False;-- Флаг, который будет передавать состояние на -- выход

begin

if clk'event and clk = '1' then -- На верхнем фронте сигнала от 100МГц

 

 

-- генератора

if counter = 50000000 then

-- Если счетчик дошел до значения

 

 

-- 50 000 000, то

counter := 0;

 

-- Счетчик обнуляется

flag := not flag;

 

-- Флаг меняет значение на

 

 

-- противоположное

else

-- Если счетчик не дошел до значения

 

-- 50 000 000, то

counter := counter + 1;

-- Увеличиваем значение счетчика на 1

end if;

 

 

if flag = True then

 

-- Если значение флага True, то

clk_out <= '1';

 

-- На выход модуля подается 1

else

 

-- Если другое значение, то

clk_out <= '0';

 

-- На выход подается 0

end if;

 

 

end if;

end process;

Так как счетчик имеет тактовую частоту 100 МГц, то чтобы получить счетчик, который будет выдавать нам смену сигнала раз в секунду, нужна конструкция, которая будет подавать на выход состояние раз в 50 000 000 тактов входного счетчика, что и делает код, представленный выше.

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

Второй модуль counter2 создается точно таким же образом и с теми же настройками и кодом. Единственное изменение будет в строке:

if counter = 50000000 then

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

Проделав это так же сохраним, запустим проверку синтаксиса и создадим объект из этого файла.

Таким образом, переключившись на схему и выбрав в библиотеки символов категорию с название и путем нашего проекта, мы сможем добавить на схему модули counter1 и counter2 (Рис. 3.4).

43

Рис. 3.4. Модули counter1 и counter2на схеме

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

Модуль to_leds

Создание модуля происходит так же, как и в случае с предыдущими модулями counter1 и counter2, но в настройках портов будут следующие изменения (Рис. 3.5)

Рис. 3.5. Настройки модуля to_leds

44

Здесь важна галочка элемента led и представленные значения. Таким образом, элемент led будет 8-битной шиной, каждый бит которой будет привязан к соответствующему светодиоду. Такой способ упрощает обращения со всеми светодиодами и делает код чище и приятнее для чтения и понимания.

Так же, все порты, которые добавляются в мастере создания модуля можно впоследствии менять, дополнять или удалять. Мастер лишь упрощает написания кода, создавая готовый шаблон.

Поэтому к текущим портам добавим ещё один – кнопку, которая будет выполнять функцию сброса. Таким образом, область объявления портов будет выглядетьтак:

entity to_leds is

Port ( clk : in STD_LOGIC; btn_res : in STD_LOGIC;

led : out STD_LOGIC_VECTOR (7 downto 0)); end to_leds;

Следующий немаловажный шаг – добавление библиотек. В этом модуле потребуются дополнительные библиотеки, и верхняя область файла будет иметь следующий вид:

library IEEE;

use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL;

И основная часть кода:

process(clk, btn_res)

variable cnt: STD_LOGIC_VECTOR (7 downto 0) := "00000000"; -- 8-битная

-- переменная счетчика

begin

if clk'event and clk = '1' then -- На переднем фронте сигнала

if cnt = (cnt'range => '1') or btn_res = '0' then -- Если значение

-- счетчик 11111111 или кнопка в состояние 0 cnt := "00000000"; -- Сбросить счетчик

else -- Если нет, то

cnt := cnt + 1; -- Увеличение счетчика на 1 end if;

led <= cnt; -- Вывод на светодиоды состояние счетчика end if;

end process;

Примечание: строка btn_res = '0' может показаться необычной, так как в обычном состоянии не нажатая кнопка выдает 0, а нажатая 1. Но в данной работе используется кнопка RESET на плате, значения которой инвертированы.

С этим модулем нужно также провести все процессы, которые выполнялась с модулями counter1 и counter2: сохранение, проверка синтаксиса, создание символа.

После этих операций станет возможным добавить и этот модуль на схему

(Рис. 3.6)

45

Рис. 3.6. Добавление модуля to_leds на схему

Дальше нужно добавить мультиплексор (Mux – m2_1) на схему, соединить все элементы проводами (wire), добавить маркеры и переименовать их. Получится схема, как на рисунке 3.7.

Рис. 3.7. Итоговая схема

Примечание: Последний маркер LED в окне переименования имеет другую структуру (Рис. 3.8), так как это шина. В настройках переименования нужно выбрать следующие параметры и нажать кнопку Apply:

46

Рис. 3.8. Переименование шины

2.2.3 Создание связи с выводами отладочной платы

Создание файла связи происходит таким же образом, как и в предыдущей лабораторной работе.

Состоять файл должен из следующих строк:

#onBoard Leds

NET "LED<0>" LOC = "U18";

NET "LED<1>" LOC = "M14";

NET "LED<2>" LOC = "N14";

NET "LED<3>" LOC = "L14";

NET "LED<4>" LOC = "M13";

NET "LED<5>" LOC = "D4";

NET "LED<6>" LOC = "P16";

NET "LED<7>" LOC = "N12";

#clock pin

NET "CLOCK" LOC = "L15";

#onBoard SWITCHES

NET "SW0" LOC = "A10";

#onBoard PUSH BUTTONS

NET "RESET" LOC= "T15";

Важно, чтобы названия в этом файле соответствовали названиям маркеров вашего проекта.

2.2.4 Создание конфигурационного файла

Создание конфигурационного файла подробно описано в пункте 1.4

2.2.5 Конфигурирование отладочной платы

47

Конфигурирование отладочной платы подробно описано в пункте 1.5

После выполнения ознакомительного примера работы цифрового устройства следует отладить и запустит свой проект, выполненный в соответствии с вариантом, заданным в Таблице 3.1. Этот проект следует запустить в режиме симуляции, получить и зарисовать временные диаграммы.

Таблица 3.1 Варианты цифровых устройств для выполнения лабораторной ра-

боты

 

вар.

 

1.

4-х канальный мультиплексор 4×1 с сигналом разрешения выбора

 

номера канала

2.

8-битный контроллер четности

3.

4-битный последовательный сумматор с фиксированной точкой

4.

Простой D-триггер, переключаемый передним фронтом тактового

 

импульса

5.

D-триггер-защелка

6.

8-битный накапливающий счетчик со счетным входом

 

и асинхронным сбросом

7.

8-битный накапливающий/вычитающий счетчик с выбором направ-

 

ления счета

8.

D-триггер с асинхронным сбросом

9.

Демультиплексор 1×4

10.

8-битный накапливающий счетчик с синхронной загрузкой и асин-

 

хронным сбросом

3. Методические указания

Цифровые устройства функционируют непрерывно и параллельно. Множество компонентов схемы работают одновременно, формируя значения определенных сигналов. В результате в моделируемом устройстве параллельно, в физическом времени, происходит множество изменений состояний сигналов.

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

Тело архитектурного описания специфицируемого объекта, заключенное между begin и end, содержит совокупность параллельных операторов, иначе говоря операторов, выполняющихся параллельно друг с другом.

Последовательность записи параллельных операторов в теле архитектурного описания значения не имеет. Порядок выполнения (порядок срабатывания параллельных операторов) определяется не порядком записи операторов между begin и end, а другими правилами. Основным принципом здесь явля-

48

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

Одной из форм параллельных операторов являются процессы. Процессы являются базовыми конструкциями для задания поведения описываемой архитектуры с учетом параллельности выполняемых действий.

Для параллельного оператора process имеется возможность явно указывать сигналы, изменение которых запускает процесс. Для других параллельных операторов присваивания значений сигналам изменение любого входного сигнала инициирует их срабатывание [1].

Для поведенческой формы проекта оператор process может быть задан явно или неявно[2].

Другим, альтернативным поведенческому описанию архитектуры объекта на VHDL, является структурное описание архитектуры. Структурное описание позволяет описать систему как совокупность компонентов — подсистем, объединенных сигналами. Подсистемы также являются объектами моделирования, но находятся на более низком уровне иерархии структурирования и представления проектируемого устройства. Каждая подсистема, в свою очередь, может быть представлена совокупностью подсистем, и так далее, пока на каком-то уровне не будет задано поведенческое описание архитектуры компонента, или не будет использован предопределенный компонент.

Каждый компонент, используемый в структурном описании, должен быть сам описан как объект моделирования (entity). Каждое такое описание может быть размещено в отдельном файле или библиотеке.

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

Структурное описание объекта моделирования, находящегося на верхнем уровне иерархии, состоит из так называемых назначений компонентов. В рамках этих назначений определяются фактические значения обобщающих констант и связи с другими объектами.

В структурном описании объекта мы как бы собираем его из других компонентов. Задав декларацию компонентов, мы как бы написали спецификацию проектируемого объекта, определив, какого типа компоненты в него входят. С помощью конструкции instantiation — оператора назначения компонента, мы устанавливаем компоненты в проектируемый объект и связываем их в некоторую структуру[1].

4.Контрольные вопросы

1.Перечислите параллельные операторы языка VHDL.

2.Каково назначение оператора component в языке VHDL?

3.Чему соответствует компонент в логической схеме? Какие средства языка VHDL употребляются для соединения компонент?

49

4.Допустимо ли при конкретизации компонентов использовать оба направления (<=, =>) в зависимости от того, является ли порт входным или выходным?

5.Правда ли, что имя процесса специфицируется после ключевого слова process?

6.Каковы формы синтаксиса неявно заданного оператора process?

7.В чем особенность цифровых устройств последовательного типа?

8.Поясните назначение каждого из блоков, включенных в проект.

9.Поясните процедуру формирования тестов для элементов цифрового устройства.

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

11.С помощью временных диаграмм поясните принцип работы дешифратора.

12.С помощью временных диаграмм поясните принцип работы счетчика.

13.С помощью временных диаграмм поясните принцип работы D-триггера.

14.С помощью временных диаграмм поясните принцип работы J-K-триггера.

15.С помощью временных диаграмм поясните принцип работы R-S- триггера.

5.Литература

1.Суворова Е. А., Шейнин Ю. Е. Проектирование цифровых систем на

VHDL. — СПб.: БХВ-Петербург, 2003. – С. 85 - ,110-.118.

2.Бабак В.П. VHDL: справочное пособие по основам языка / В.П. Бабак, А.Г. Корченко, Н.П. Тимошенко, С.Ф. Филоненко и др. – М.: Издательский дом «Додэка-XXI», 2008.

3.Тарасов И.Е. Разработка цифровых устройств на базе ПЛИС Xilinx с применением языка VHDL. –М.: Горячая линия-Телеком. – 2005. – С. 99-123.

4.Грушвицкий Р.И. Проектирование систем на микросхемах с программируемой структурой: учебное пособие для ВУЗов / Р.И. Грушвицкий, А.Х. Мурсаев, Е.П. Угрюмов. – СПб.: БХВ-Петербург, 2006. – С.421-499.

5.Калабеков Б. А. Цифровые устройства и микропроцессорные системы. – М.: Радио и связь. – 2003. – С.98-126.

50

Соседние файлы в предмете Микропроцессорные устройства