ЛР / Основы разработки систем на кристалле (метода)
.pdf
Таблица 6
Соответствие входных и выходных сигналов
SW[4] |
SW[5] |
LED[3] |
0 |
0 |
|
0 |
1 |
|
1 |
0 |
|
1 |
1 |
|
Рис. 33. Логический элемент 1
Рис. 35. Логический элемент 3
Таблица 7
Соответствие входных и выходных сигналов
SW[6] |
SW[7] |
LED[4] |
0 |
0 |
|
0 |
1 |
|
1 |
0 |
|
1 |
1 |
|
Рис. 34. Логический элемент 2
Рис. 36. Логический элемент 4
6.6. Введите программу согласно листингу:
#include <stdio.h> #include "xil_printf.h" #include "xparameters.h" #include "xgpiops.h" #include "xstatus.h" #include "math.h"
#define PIN_OFFSET 54 #define width_emio 16 #define led_low_adr 8
u8 SWS[8] = {};
u8 LED[5] = {};
int main()
{
static XGpioPs psGpioInstancePtr; XGpioPs_Config *GpioConfigPtr; int xStatus;
GpioConfigPtr = XGpioPs_LookupConfig(XPAR_XGPIOPS_0_DEVICE_ID);
30
xStatus = XGpioPs_CfgInitialize(&psGpioInstancePtr, GpioConfigPtr, GpioConfigPtr- >BaseAddr);
if(XST_SUCCESS != xStatus)
print(" PS GPIO INIT FAILED \n\r");
for (int i = 0; i < width_emio; i++){ if(i<=led_low_adr-1){
XGpioPs_SetDirectionPin(&psGpioInstancePtr, PIN_OFFSET + i, 0); XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, PIN_OFFSET + i, 0);
}
else {
XGpioPs_SetDirectionPin(&psGpioInstancePtr, PIN_OFFSET + i, 1); XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, PIN_OFFSET + i, 1);
}
}
while (1){
for(int i = 0; i<8; i++){
SWS[i] = XGpioPs_ReadPin(&psGpioInstancePtr, PIN_OFFSET+i);
}
LED[0]= SWS[0];
LED[1]= !(SWS[1]&&SWS[2]); LED[2]= ! SWS[3];
LED[3]= SWS[4]||SWS[5];
LED[4]= SWS[6]^ SWS[7];;
for(int i = 0; i<5; i++){
XGpioPs_WritePin(&psGpioInstancePtr, PIN_OFFSET+8+i, LED[i]);
}
}
return 0;
}
6.7. Опишите ожидаемый результат работы программы в протоколе.
Примечание. Обратите внимание, что начальное значение битов EMIO начинается с фиксированным смещением – со значения 54. А бит MIO, подключенный к процессорной подсистеме напрямую, имеет значение 7, что отражено маркировкой на отладочной плате MIO7 (LD9).
Функция XGpioPs_SetDirectionPin устанавливает направление передачи информации. Если последний параметр равен 1 – линия настроена на вывод, а если равна 0 – на ввод.
Функция XGpioPs_WritePin устанавливает соответствующее значение сигнала в линию.
31
7. Проверка приложения на плате.
7.1.Убедитесь, что jtag-отладчик и UART от платы подключены
ккомпьютеру, включите питание платы.
7.2.Нажмите правой кнопкой мыши на названии приложения и далее
ввыпадающих списках Run As → Run Configuration.
7.3.В открывшемся окне нажмите Xilinx C/C++ Application (GDB).
7.4.Настройте отладчик по примеру лабораторной работы 2.
7.5.Нажмите Save, а затем Run. Дождитесь компиляции проекта и прошивки платы.
7.6.Запрограммируйте FPGA по аналогии с лабораторной работой 2.
7.7.Сверьте ожидаемый результат работы переключателей и светодиодов с работой платы.
7.8.Измените программу согласно индивидуальному заданию.
Содержание отчета
1.Задача и цели лабораторной работы.
2.Чертеж блок-схемы проекта с отметками о назначении блоков.
3.Блок-схема алгоритма работы программы индивидуального задания.
4.Листинг исходного кода из индивидуального задания с обязательными поясняющими комментариями каждой строки.
5.Заметки из протокола.
Задание к лабораторной работе
Для выполнения самостоятельной работы создайте отдельное приложение внутри проекта: File → New → Application Project. Впишите имя приложения и установите переключатель в положение Use existing, указав на созданный ранее BSP.
1.Получите индивидуальную схему на логических элементах у преподавателя. Разработайте программу согласно полученному варианту. Реализуйте выход из цикла по нажатию BTN9.
2.Получите индивидуальную схему на логических элементах у преподавателя. Разработайте программу согласно полученному варианту. Реализуйте выход из цикла при SW[7] = 1.
3.Получите индивидуальную схему на логических элементах у преподавателя. Разработайте программу согласно полученному варианту. Реализуйте выход из цикла при SW[5] = 0.
4.Получите индивидуальную схему на логических элементах у преподавателя. Разработайте программу согласно полученному варианту. Реализуйте выход из цикла по нажатию BTN8.
32
5.Получите индивидуальную схему на логических элементах у преподавателя. Разработайте программу согласно полученному варианту. Реализуйте выход из цикла по нажатию BTN9.
6.Получите индивидуальную схему на логических элементах у преподавателя. Разработайте программу согласно полученному варианту. Реализуйте выход из цикла при LD[4] = 1.
7.Получите индивидуальную схему на логических элементах у преподавателя. Разработайте программу согласно полученному варианту. Реализуйте выход из цикла при SW[6] = 0.
8.Получите индивидуальную схему на логических элементах у преподавателя. Разработайте программу согласно полученному варианту. Реализуйте выход из цикла при LD[3] = 1.
9.Получите индивидуальную схему на логических элементах у преподавателя. Разработайте программу согласно полученному варианту. Реализуйте выход из цикла при SW[2] = 1.
10.Получите индивидуальную схему на логических элементах у преподавателя. Разработайте программу согласно полученному варианту. Реализуйте выход из цикла при LD[7] = 1.
11.Получите индивидуальную схему на логических элементах у преподавателя. Разработайте программу согласно полученному варианту. Реализуйте выход из цикла при LD[2] = 1 .
12.Получите индивидуальную схему на логических элементах у преподавателя. Разработайте программу согласно полученному варианту. Реализуйте выход из цикла при SW[3] = 0.
33
Лабораторная работа 4
РАЗРАБОТКА МНОГОФАЙЛОВОГО ПРОЕКТА НА ЯЗЫКЕ ПОВЕДЕНЧЕСКОГО ОПИСАНИЯ
Цель работы
Разработка модуля верхнего уровня с использованием возможности межсоединения модулей внутри проекта. Изучение возможности соединения нескольких модулей в проекте. Проверка готового модуля на плате.
Основные вопросы, изучаемые перед выполнением работы
1.Написание многофайловых модулей в проекте.
2.Соединение скользящих переключателей и светодиодов с частью PL
на плате ZedBoard.
3.Структура лабораторного макета ZedBoard.
4.Логические операторы, построение комбинационных схем.
Содержание работы
1. Создать новую отдельную директорию для лабораторной работы по аналогии с лабораторной работой 1. Например, полный путь к директории для данной лабораторный работы:
D:/(Год)/(Фамилия) (группа)/soc-lab-4
2. Создание проекта в Vivado 2016.4.
2.1. Создайте проект с именем sw_led_variant_(номер варианта) по аналогии с лабораторной работой 1 (рис. 37).
Рис. 37. Окно с примером создания проекта
2.2.Нажмите кнопку Project Manager, затем – Add Sources. В открывшемся окне выберите Add or Create Design Sources (добавить или создать файл разрабатываемого устройства). Далее – Next.
2.3.Для создания нового файла нажмите Create File.
34
2.4.В появившемся окне введите имя файла user and и убедитесь, что языком разработки выбран Verilog.
2.5.Нажмите OK, а затем Finish. В открывшемся окне Define Modules нажмите OK.
2.6.После успешного создания файла найдите и кликните на файл
sw led.v в дереве проекта.
Примечание. Должна быть активна кнопка Project Manager.
На этом этапе создан файл устройства (Design Source).
2.7. Откройте файл устройства (Design Sources) с именем user_and.v из дерева проекта. Впишите следующие строки согласно листингу:
module user_and( input a,b, output c
);
assign c= a&b; endmodule
2.8. Создайте файл устройства (Design Sources) с именем user_or по аналогии c пп. 3.2–3.6. Впишите следующие строки согласно листингу:
module user_or( input a,b, output c
);
assign c= a|b; endmodule
2.9. Создайте файл устройства (Design Sources) с именем user_not по аналогии c пп. 3.2–3.6. Впишите следующие строки согласно листингу:
module user_not( input a, output c
);
assign c = ~ a; endmodule
2.10.На данном этапе построено три примитива – И, ИЛИ, НЕ, на основании которых средствами языка Verilog возможно описать любое устройство, избегая при этом множественного копирования.
2.11.Создайте файл устройства (Design Sources) с именем top по ана-
логии c пп. 3.2–3.6.
2.12.Проект данной работы можно структурно перерисовать в виде блоков (рис. 38), где модуль top будет нести в себе объединяющее значение.
35
Рис. 38. Структурная схема проекта
2.13.Зафиксируйте данную схему в протокол.
2.14.Заполните файл top.v согласно листингу:
module top( input [7:0] in, output [4:0] out
);
wire and_to_not;
user_and and_0 (
.a (in[7]),
.b (in[6]),
.c (out[4])
);
user_or or_0(
.a (in[5]),
.b (in[4]),
.c (out[3])
);
user_not not_0(
.a(in[3]),
.c (out[2])
);
user_and and_0(
.a (in[2]),
.b (in[1]),
.c (and_to_not)
);
user_not not_1(
36
.a (and_to_not),
.c(out[1])
);
assign out[0] = in [0]; endmodule
2.15. Сохраните файл и обратите внимание на структуру проекта в окне Sources (рис. 39): файл top стал модулем верхнего уровня.
Рис. 39. Структура модулей в проекте
2.16. Запустите RTL-анализ и откройте Schematic.
Примечание. Обратите внимание на реализацию проекта (рис. 40) в окне RTL-ана- лиза и названия модулей.
Рис. 40. Структура модулей в окне RLT-анализа
37
2.17. Разверните все модули, нажав на знак «+» и изучите реализацию проекта в виде вентилей (рис. 41). Зафиксируйте данную диаграмму в протокол. Подпишите назначение логических вентилей.
Рис. 41. Внутренняя структура модулей проекта
вокне RTL-анализа
2.18.Создайте Simulation-файл с именем top_tb для модуля top.
2.19.Заполните содержимое тестирующего файла согласно листингу:
`timescale 1ns / 1ps
module top_tb( ); reg [7:0] in_tb; wire [4:0] out_tb; integer i;
top DUT(
.in (in_tb),
.out(out_tb)
);
initial begin
for(i=0; i<256; i=i+1) begin in_tb=i;
#10;
38
end end
endmodule
2.20. Запустите симуляцию и проследите работу модуля на временной диаграмме (рис. 42).
Рис. 42. Временная диаграмма симуляции для модуля top
2.21. Запишите несколько наборов входных и выходных значений из окна симуляции в протокол.
3. Создание обертки для проекта и constrains-файла.
3.1. Разрабатываемые устройства на ПЛИС не являются самозамкнутыми: так как есть Input и Output, то должны быть и внешние устройства, которые соединяются с ними для обработки данных. Поэтому для модуля top целесообразно разработать внешний модуль, связанный с физическими устройствами: данными устройствами будут служить переключатели и светодиоды. Создайте файл устройства с именем sw_led_wrapper по аналогии c пп. 3.2–3.6. Впишите следующие строки согласно листингу:
module sw_led_wrapper( input [7:0] sw,
output [4:0] led
);
top sw_led(
.in (sw),
.out (led) ); endmodule
39
