Создание и отладка проекта в среде разработки XILINX VIVADO

Ознакомление со средами программирования ПЛИС Xilinx Vivado и Xilinx ISE в процессе создания модели дешифратора и интерфейса RS-232. Дешифратор (декодер) – устройство, преобразующее кодовую комбинацию, поступающую на входы, в сигнал на одном из выходов.

Рубрика Программирование, компьютеры и кибернетика
Вид лабораторная работа
Язык русский
Дата добавления 26.12.2019
Размер файла 1,6 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Размещено на http://www.allbest.ru/

Отчет по лабораторной работе

Создание и отладка проекта в среде разработки XILINX VIVADO

Д.С. Ерастов

Москва 2019

Введение

В настоящее время проектирование больших систем осуществляется с применением так называемых языков описания высокого уровня (Hardware Description Languages - HDL) VHDL и Verilog. Язык описания аппаратуры Verilog был разработан фирмой Gateway Design Automation в 1984 г. После поглощения последней фирмой Caddence язык получил широкое распространение среди разработчиков и стал не менее популярен, чем VHDL.

В отличие от VHDL, структура и синтаксис которого напоминают такие "сложные" языки, как АДА или АЛГОЛ, Verilog обеспечивает более лаконичный и удобочитаемый синтаксис, характерный для очень популярного в среде программистов и разработчиков встроенных систем языка Си [1].

Vivado - САПР от компании Xilinx, предназначенная для создания цифровых устройств с применением языков высокого уровня.

В данной лабораторной работе необходимо ознакомиться со средами программирования ПЛИС Xilinx Vivado и Xilinx ISE, в процессе создания модели дешифратора и интерфейса RS-232.

Создание и отладка проекта в среде разработки XILINX VIVADO

Цель работы: освоить среду разработки Xilinx Vivado. Разобрать пример с созданием дешифратора, его симуляцией, увидеть его схему. Разработать собственный проект в соответствии с заданием.

Теоретические данные

Дешифратор (декодер) - устройство, преобразующее кодовую комбинацию, поступающую на входы, в сигнал на одном из выходов. В общем случае это устройство с m входами и n выходами, причём число выходов n = 2m. Как правило, входы обозначаются весами двоичных разрядов, а выходы нумеруются от 0 до n­1. Условное графическое обозначение дешифратора представлено на рисунке 1.1.

Рисунок 1.1 - Условное графическое обозначение дешифратора

Работу дешифратора с тремя входами и восемью выходами можно представить следующей таблицей истинности (таблица 1.1).

Таблиц 1.1 - Таблица истинности для дешифратора

Создадим новый проект. В процессе создании проекта, при выборе типа проекта, укажем "RTL Project" - проект со схемой, построенной на принципе уровней регистровых передач (от англ. Register Transfer Level). Смысл такой схемы заключается в том, что она полностью описывает структуру данного устройства, элементами которой являются схемотехнические принципы (триггеры, регистры и т.д.).

Также существуют другие типы проектов:

- Post-synthesis Project - создать проект для работы с уже синтезированным проектом. В проект можно добавить уже готовые модули, провести синтез и создать файл для программирования ПЛИС;

- I/O Planning Project - создать проект для работы с входами и выходами ПЛИС; декодер программирование интерфейс

- Imported Project - импортировать проект из других сред разработки ПЛИС: Synplify или Xilinx ISE;

- Example Project - создать проект для работы с одним из проектов-примеров.

Меню выбора типов проекта приведено на рисунке 1.2.

Рисунок 1.2 - Меню выбора типа проекта

Следующим важным шагом является выбор ПЛИС (во вкладке "Parts"), для которой создаётся проект, или сразу выбрать отладочную плату (вкладка "Boards"). В данном разделе выбираются следующие параметры:

- Product category - назначение ПЛИС;

- Family - семейство;

- Sub-Family - подсемейство;

- Package - комплекция;

- Speed Grade - класс скорости;

- Temp Grade - временные параметры.

Так как в данной работе выбор этих параметров значения не имеет, можно выбрать сразу плату, например, ZENQ-7 ZC702 (рисунок 1.3).

Рисунок 1.3 - Меню выбора платы

После создания проекта откроется основное окно рабочей среды (рисунок 1.4), состоящее из основных элементов:

- Flow Navigator (если дословно - "навигатор потока") - навигация по этапам проектирования цифрового устройства;

- Project Manager (менеджер проекта) - управление проектом (добавление ресурсов, IP-ядер, настройка);

- "Подвал" - позволяет открыть консоль, сообщения об этапах компиляции.

Рисунок 1.4 - Рабочая среда Xilinx Vivado

Для дальнейшей работы необходимо создать модуль на VHDL или Verilog, который опишет работу проектируемого устройства. Для этого нажимаем кнопку "Add Sources" во "Flow Navigator".

В появившемся окне из предложенных вариантов выбираем тип источника "Add or Create Design Sources". Далее, в окне, создаем новый модуль командой "Create File".

В окне создания нового модуля (рисунок 1.5) выбираем имя и язык, на котором он будет написан.

Рисунок 1.5 - Окно создания нового модуля

Для удобства можно сразу определить, какие входы и выходы есть у объекта, который мы будем описывать. Их можно определить в поле "I/O Port Definitions", окна "Define Module" (рисунок 1.6):

Port Name - имя входа/выхода - порта;

Direction - вход или выход (input/output);

Bus - является ли порт шиной;

MSB/LSB - старший/младший значащие разряды.

Рисунок 1.6 - Окно "Define Module"

Для того, чтобы перейти к редактированию модуля, надо дважды щёлкнуть левой кнопкой мыши по нему в разделе "Sources" менеджера проектов (Project Manager), справа откроется редактор кода (рисунок 1.7).

В коде необходимо описать работу дешифратора. После служебного слова "module" идёт название самого модуля: "Decoder". В скобках указываются параметры: входящий сигнал А (трёхразрядная шина), входящий сигнал EN (разрешение работы), выходящий сигнал Х (семиразрядная шина). Блок "always @" указывает, что при определённом изменении входных сигналов необходимо делать то, что пойдёт дальше в скобках "begin-end". Если после оператора "always @" стоит "*", это означает, что работать блок будет при изменении любых сигналов. Внутри находится условный оператор: "if (<условие>) begin … end". А внутри условного оператора блок "case (<условие>) …", предполагающий более двух ветвлений.

Рисунок 1.7 - Редактор кода модуля

После того, как модуль написан, надо его сохранить. Для этого необходимо нажать кнопку "Save File". После этого автоматически пройдёт проверка файла на синтаксические ошибки.

Тестирование

Далее нужно написать небольшой "Testbench" - ещё один модуль, который необходим для симуляции проекта. В нём мы зададим временные параметры, в которые происходят изменения сигналов. Важно: тестбенч не имеет входных и выходных параметров. После объявления модуля описываются переменные, с которыми работает тестбенч, затем объявляется объект класса "Decoder".

После того, как тестбенч написан, можно снова сохранить файл и запустить поведенческую симуляцию по кнопке "Run Simulation" в разделе "Flow Navigator". На симуляции можно увидеть временные диаграммы (рисунок 1.8) тех сигналов, которые описаны в тестбенче. Это важный и обязательный этап проверки описанной схемы (описали модуль - описали схему). Те сигналы, которые состоят из нескольких "проводов" (являются шинами), можно развернуть, также можно регулировать масштаб временных диаграмм.

Рисунок 1.8 - Временная диаграмма работы модуля

Также можно посмотреть, какую схему составил Vivado на основе написанного кода. Для этого в меню "Flow Navigator", в разделе "RTL Analysis" нажимаем "Schematic".

Изначально, схема находится в свернутом состоянии, в виде блока, имеющего входы и выходы (рисунок 1.9). Для просмотра внутреннего строения блока (рисунок 1.10) нужно нажать на крестик в верхнем левом углу.

Рисунок 1.9 - Блок модуля

Рисунок 1.10 - Схема модуля на основе написанного кода

Создание многоуровневого проекта в XILINX ISE. Импорт из XILINX ISE В XILINX VIVADO

Цель работы: научиться создавать иерархию источников в дереве проекта. Успешно произвести перенос проекта из Xilinx ISE в Xilinx Vivado.

Задание: смоделировать в среде разработки Xilinx ISE устройство, которое передаст информацию, принятую по 8-ми разрядной шине, на вход интерфейса RS-232. Считать тактовую частоту равной частоте передачи информации. Обеспечить сброс хранилища памяти (буфера). Обеспечить возможность управления приёмом и передачей информации. После удачного моделирования импортировать проект в среду Xilinx Vivado.

Теоретические данные

Xilinx ISE - САПР, с помощью которой можно проводить реализацию различных проектов на ПЛИС до 7-го поколения включительно.

RS-232 (англ. Recommended Standard 232) - уровень асинхронного интерфейса. В настоящее время используется для устаревшего или специального оборудования, в данный момент вытеснен интерфейсом USB. Данный интерфейс обеспечивает передачу данных или каких-либо сигналов. На данный момент разъём имеется на некоторых персональных компьютерах, так как некоторые устройства используют или использовали RS-232, например, компьютерные мышки.

Асинхронный интерфейс (UART) предполагает последовательную передачу данных по одному биту в строго определённый промежуток времени. Существует ряд общепринятых скоростей (биттрейтов), с которыми передаются данные: 300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400, 460800, 921600 бит в секунду.

Принято, что ждущим (неактивным) состоянием входа и выхода UART является логическая "1". Перед началом передачи информационной последовательности бит выдается сигнал о начале - стартовый бит, соответствующий логическому "0". После приёма стартового бита происходит приём ещё 9 бит (для 8-битных сигналов): 8 информационных и проверочный стоп-бит, соответствующий логической "1". В случае если стоп-бит оказывается неравен единице, UART фиксирует ошибку. В результате можно получить временную диаграмму, представленную на рисунке 2.1.

Рисунок 2.1 - Временная диаграмма

При передаче больших массивов информации важно обеспечить временное хранение данных. Для этого в информатике используется буфер. Часто буфер используется, если различны скорости приёма и передачи данных. На рисунке 2.2 изображён буфер, который может хранить m сигналов по n + 1 бит. Также в нём имеются входы сброса, загрузки и чтения: если на вход загрузки "load" приходит сигнал "1", буфер считывает информацию, приходящую по каналу "data", если на входе чтения "read" сигнал "1", то буфер выдаёт информацию на выход "out". При сбросе (на входе "reset" уровень "1") буфер очищается от информации.

Рисунок 2.2 - Пример буфера

Буфер может быть организован по принципам FIFO (First In First Out) или LIFO (Last In First Out). В первом случае первый информационный блок, который в буфер вошёл, будет выдан первым при сигнале на чтение. А во втором на чтение будет выдан последний блок, вошедший в буфер.

После запуска программы Xilinx ISE создадим новый проект. Первым шагом задается имя проекта, путь к папке, в которую он будет сохранятся и тип источника верхнего уровня (рисунок 2.3). В нашем случае, тип источника верхнего уровня - HDL.

Рисунок 2.3 - Меню создания проекта

На следующем шаге определяемся с аппаратным обеспечением, на котором будем работать (рисунок 2.4). В нашем случае платформа не важна. Поэтому, как и в предыдущей работе, выберем аппаратную часть "ZYNQ XC7Z020"

Рисунок 2.4 - Меню выбора аппаратного обеспечения

После создания проекта откроется основное окно рабочей среды. Чтобы добавить новый модуль, нужно во всплывающем меню проекта, на вкладке "Hierarchy", выбрать кнопку "New Source" (рисунок 2.5).

Рисунок 2.5 - Всплывающее меню проекта

Первым шагом, при создании нового модуля, задаем его имя и тип. В нашем случае, тип модуля должен быть "Verilog Module". Так же необходимо проследить, чтобы был отмечен пункт "Add to project" (рисунок 2.6).

Рисунок 2.6 - Меню создания модуля

Далее задаются входы и выходы нового модуля (рисунок 2.7).

Рисунок 2.7 - Меню задания входов и выходов нового модуля

После создания нового модуля открывается редактор кода. В коде необходимо описать работу устройства, передающего данные на вход интерфейса RS-232, принятые 8-ми разрядной шине. Проект состоит из нескольких модулей, описывающих работу отдельных устройств, таких как: буфер FIFO (BuferFIFO), счетчик (Counter), мультиплексор (Multiplex), дешифратор (Decoder) и трансмиттера (Transmitter). На рисунке 2.8 представлен редактор кода буфера FIFO.

Рисунок 2.8 - Редактор кода модуля

Тестирование

Для тестирования создается новый модуль. Алгоритм его создания ничем не отличается от создания рабочего модуля за одним не большим исключением: тип рекомендуется указывать "Verilog Test Fixture" (рисунок 2.9). В этом случае, в фале, сразу генерируется основной код тестового модуля.

Рисунок 2.9 - Меню создания тестового модуля

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

После того, как тестовый модуль написан, можно запустить симуляцию. Для этого, в разделе "Design" должен стоять флажок на пункте "Simulation", в разделе "Hierarchy" выделен тестовый модуль. После щелчка по пункту "Simulate Behavioral Model" из раздела "ISim Simulator" запуститься симуляция.

Симуляция проходит в несколько этапов. Сначала, всегда, запускается процесс проверки синтаксиса (Behavioral Check Syntax). Если ошибок не обнаружено происходит симуляция модели. В дополнение нужно сказать, что процесс проверки ошибок синтаксиса (Behavioral Check Syntax) можно запускать отдельно.

В результате появляется окно "ISim" (рисунок 2.10). В нем можно увидеть диаграмму входных и выходных сигналов. Также, в разделе "Instance and Process Name" можно увидеть другие сигналы, не попавшие на диаграмму. Чтобы увидеть уровень напряжения нужного сигнала, необходимо перетащить его на панель "Name".

Рисунок 2.10 - Окно результатов симуляции

Перенос проекта начинается со стандартных действий, а именно - создание проекта в среде Xilinx Vivado, но при выборе типа проекта (рисунок 1.2) необходимо указать, что это будет импорт проекта из другой среды (Imported Project).

Когда программа попросит указать путь к проекту Xilinx ISE, необходимо указать на файл с расширением ".xise", находящийся в папке проекта (рисунок 2.11).

Рисунок 2.11 - Меню импорта проекта

После успешного импорта проекта можно просмотреть лог. В данной работе, для наглядности произведем запуск симуляции еще раз (рисунок 2.12).

Рисунок 2.12 - Симуляция импортированного проекта из среды Xilinx ISE

Так же можно просмотреть схему модуля, воспользовавшись меню "Flow Navigator", в разделе "RTL Analysis".

Рисунок 2.13 - Схема модуля на основе импортированного кода

Приложение А.

Текст программы дешифратора и тестового модуля

module Decoder _1(

input [2:0] A, //трехразрядная шина входа А

Input EN, //разрешающий вход

output [7:0] X //восьмиразрядный выход X

);

//входы и выходы по умолчанию объявлены как переменные типа wire

reg [7:0] X ; //выход хранит значения, по этому должен быть типа reg

always @* //при любом изменении сигналов

Begin

//только при разрешении работы

If (EN)

Begin

X =0; //обнулить шину

X [ A ]=1; //А-тому разряду положить "1"

End

End

Endmodule

module Testbench_1;

//!Тестбенч не имеет входных и выходных параметров.

//После объявления модуля описываются переменные

//с которыми работает тестбенч

reg [2:0] A;

reg EN;

wire [7:0] X;

//зетем объявляется объект класса decoder

Decoder _1 dc _1(A, EN, X);

Initial

Begin

A =2;//подача сигнала 2(010) на шину A

EN =1;//сигнал разрешения (или 0, или 1)

#5; // длительность сигнала (5 нс)

A=3;

#4;

A=7;

#9;

EN=0;

A=0;

#7

EN=1;

#6

A=5;

End

Endmodule

Приложение Б.

Текст программы асинхронного интерфейса и тестового модуля

Module Decoder(

input [2:0] A,//трехразрядная шина А

Input CLK,//вход синхронизации

output [7:0] X / /восьмиразрядная выходная шина

);

//объявление входов/выходов

wire CLK;

wire [2:0] A;

reg [7:0] X;

//реагирование на любой входящий сигнал

always @*

Begin

X =8' b 00000000; //Обнуление шины X (=0)

X [ A ] = 1;// проводу с номером А из шины X присвоить 1

End

Endmodule

Module Counter(

Input CLK,//вход синхронизации

Input CE,//разрешающий вход

output [2:0] Q //выходная трехразрядная шина

);

//объявление входов/выходов

wire CLK;

wire CE;

reg [2:0] Q = 0;

//реакция на фронт (0 - > 1)синхронизирующего сигнала

always @(posedge CLK)

// если разрешена работа

If(CE)

Begin

Q = Q +1;//увеличение числа на выходе

End

Endmodule

Module Multiplexer(

Input CLK,//вход синхронизации

Input CE,//разрешающий вход

input [2:0] A,//двухразрядная шина A

input [7:0] D,//восьмиразрядная шина D

Output F //выход F

);

//объявление..

//входов/выходов,..

wire CLK;

wire CE;

wire [2:0] A;

wire [7:0] D;

//.., вспомогательных регистров, и..

wire [7:0] DD;

reg F;

//.., и включаемых модулей

Decoder DC _1(CLK, A, D);

//реакция на любое изменение входящих сигналов

always @*

//если нразрешена работа

If (CE)

Begin

F = D [ A ]&& DD [ A ];//подать на выход F сигнал с провода с номером A из шин D и DD

End

Endmodule

Module BuferFIFO(

Input RST,//вход сброса

Input LOAD,//вход загрузки (записи)

Input READ,//вход чтения

input [7:0] DATA,//восьмиразрядная шина ввода данных DATA

output [7:0] OUT //восьмиразрядная шина вывода данных OUT

);

//объявление входов/выходов

wire RST;

wire LOAD;

wire READ;

wire [7:0] DATA;

reg [7:0] OUT;

//объявление вспомогательных регистров:

//счетного i

//памяти database

reg [3:0] i ;

reg [7:0] database [6:0];

//начальная инициализация

//обнуление счетного регистра

//обнуление выходной шины

Initial

Begin

i=0;

OUT = 0;

End

//реакция на фронт сигналов READ,RST,LOAD

always @ (

Posedge READ or

Posedge RST or

Posedge LOAD)

Begin

//реакция на сброс

If (RST)

Begin

//очистка памяти через счетчик (каждый i-ый восьмиразрядный регистр

for(i=0; i<=6; i=i+1)

Begin

database[i] = 8'HXX;

End

End

Else

//реакция на загрузку

If(LOAD)

Begin

//запись данных в буфер

for(i=0; i<=6; i=i+1)

Begin

database[6-i] = database[6-(i+1)];

End

database[0]=DATA;

End

Else

//реакция на чтение

If(READ)

Begin

//выгрузка данных из буфера на шину дынных

OUT=database[6];

for(i=0; i<=6; i=i+1)

Begin

database[6-i] = database[6-(i+1)];

End

End

End

Endmodule

Module Transmitter(

input [7:0] DATA,//восьмиразрядная шина данных

input RST_buf,//сброс буфера

input LOAD_buf,// загрузка в буфер

input READ _ buf,//чтение из буфера

Input CLK,//вход синхронизации

Output WORD / /выходной провод

);

//объявление входов/выходов

wire [7:0] DATA;

wire RST_buf;

wire LOAD_buf;

wire READ_buf;

wire CLK;

wire WORD;

wire [7:0] out_buf;

wire [2:0] timer;

//объявление входящих модулей

// и перенаправление им сигналов

Counter CT_1(CLK, READ_buf, timer);

BuferFIFO BF_1(RST_buf, LOAD_buf, READ_buf, DATA, out_buf);

Multiplexer MUX_1(CLK, READ_buf, timer, out_buf, WORD);

Endmodule

module Testbench;

//Входы (Inputs)

//объявление входов

reg [7:0] DATA;

reg RST_buf;

reg LOAD_buf;

reg READ_buf;

reg CLK;

//Выходы (Outputs)

//объявление выходов

wire WORD;

//объявление тестируемого модуля

//Instantiate the Unit Under Test (UUT)

Transmitter uut (

DATA(DATA),

.RST_buf(RST_buf),

.LOAD_buf(LOAD_buf),

.READ_buf(READ_buf),

CLK(CLK),

WORD(WORD)

);

//обнуление значений

Initial

Forever

Begin

#5;

CLK = ~CLK;

End

Initial

Begin

// Инициализация входов

DATA = 83;//подача даных для записи в буфер

RST _ buf = 0;//не очищать буфер

LOAD _ buf = 1;//загрузить в буфер данные с шины DATA

READ _ buf = 0;//отключение чтения из буфера

CLK = 0;//синхроимпуль в 0

#10;//подача сигнала в течение 10 нс

//ЗАПИСЬ В БУФЕР

LOAD _ buf =0;//отключить загрузку в буфер

#10; ;//подача сигнала в течение 10 нс

LOAD _ buf =1;//включить загрузку в буфер

DATA = 80;//подача данных для записи в буфер числа 80

#10; ;//подача сигнала в течение 10 нс

LOAD_buf = 0;

#10;

LOAD_buf = 1;

DATA = 65;

#10;

LOAD_buf = 0;

#10;

LOAD_buf = 1;

DATA = 82;

#10;

LOAD_buf = 0;

#10;

LOAD_buf = 1;

DATA = 84;

#10;

LOAD_buf = 0;

#10;

LOAD_buf = 1;

DATA = 65;

#10;

LOAD_buf = 0;

#10;

LOAD_buf = 1;

DATA = 75;

#10;

//ЧТЕНИЕ ИЗ БУФЕРА

LOAD_buf = 0;

READ_buf = 1;

#80;

READ_buf = 0;

#5;

READ_buf = 1;

#80;

READ_buf = 0;

#5;

READ_buf = 1;

#80;

READ_buf = 0;

#5;

READ_buf = 1;

#80;

READ_buf = 0;

#5;

READ_buf = 1;

#80;

READ_buf = 0;

#5;

READ_buf = 1;

#80;

READ_buf = 0;

#5;

READ_buf = 1;

#80;

READ_buf = 0;

#100;

End

Endmodule

Размещено на Allbest.ru


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.