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

ЛР / Основы разработки систем на кристалле (метода)

.pdf
Скачиваний:
19
Добавлен:
29.12.2023
Размер:
2.76 Mб
Скачать

Лабораторная работа 8

ПОСТРОЕНИЕ BRAM-ПАМЯТИ

С АДРЕСНЫМ ДОСТУПОМ ИЗ ПРОЦЕССОРНОЙ ЧАСТИ СИСТЕМЫ НА КРИСТАЛЛЕ

Цель работы

Разработка проекта блочной двухпортовой памяти, размещенной на ресурсах ПЛИС. Разработка приложения для записи и чтения данных процессорной системой из области программируемой логики. Проверка проекта на отладочной плате ZedBoad.

Основные вопросы, изучаемые перед выполнением работы

1.Архитектура системы на кристалле Xilinx Zynq7000.

2.Структура лабораторного макета ZedBoard.

3.Работа памяти BRAM.

4.Работа с интегрированным логическим анализатором.

Содержание работы

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

D:/(Год)/(Фамилия) (группа)/soc-lab-8

2. Создание проекта в Vivado 2016.4.

2.1. Создайте проект с именем Zynq pl_bram_lab_variant_(номер ва-

рианта) на примере с лабораторной работой 1 (рис. 70).

Рис. 70. Окно с примером создания проекта

2.2.Создайте Block Design и добавьте IP процессорной системы Zynq7 по аналогии с п. 3 лабораторной работы 1.

2.3.Настройте процессорную систему согласно п. 5 лабораторной ра-

боты 1.

70

2.4.Далее необходимо включить Master AXI Interface. Для этого от-

кройте PS-PL Configuration General AXI Non secure Enablement

иустановите галочку напротив M AXI GP0 interface.

2.5.Добавьте IP-элемент с названием AXI BRAM Controller.

2.6.Настройте AXI BRAM Controller, как показано на рис. 71. Затем продублируйте данный элемент на диаграмме.

Рис. 71. Окно настройки AXI BRAM Controller

2.7. Добавьте IP-элемент с названием Block Memory Generator и на-

стройте его согласно рис. 72.

Рис. 72. Настройки Block Memory Generator

71

2.8. Нажмите Run Connection Automation. Это позволит автоматически добавить и соединить необходимую периферию.

Примечание. Обратите внимание, что появился блок AXI Interconnect.

2.9. Соберите проект, соединив модули. Итоговый вид проекта показан на рис. 73.

Рис. 73. Общий вид диаграммы блочного проекта

2.10. Откройте вкладку Address Editor и убедитесь, что все элементы имеют адрес (рис. 74). Если присвоения не произошло, то кликните правой кнопкой мыши на элемент в данной вкладке и выберите пункт Assign Address. Занесите в протокол объем получившейся памяти.

Рис. 74. Адресное пространство проекта

2.11.Для проверки правильности конфигурации проекта нажмите Tools Validate Design или клавишу F6. Если ошибок не обнаружено, то повторно сохраните проект. Зарисуйте блок-схему в протокол.

2.12.Создайте HDL-wrapper по аналогии с лабораторной работой 3.

2.13.Синтезируйте проект. Затем запустите размещение проекта на кристалле ПЛИС.

2.14.Если ошибок не обнаружено, то сгенерируйте битовый поток.

3. Экспорт конфигурационных файлов в Xilinx SDK.

3.1.Нажмите на File Export Export Hardware.

3.2.В появившемся окне установите галочку напротив Include Bitstream

инажмите ОK.

72

3.3.Откройте папку проекта и найдите в ней директорию с названием имя проекта.sdk. В данной директории проконтролируйте наличие файлаархива с разрешением HDF.

3.4.Нажмите File Launch SDK и в появившемся окне нажмите ОK. Дождитесь запуска среды Xilinx SDK.

3.5.Создайте пакет поддержки платы. Убедитесь, что выбран пункт

Standalone, нажмите ОK.

4. Создание приложения.

4.1.Нажмите File New Application Project. В открывшемся окне введите имя приложения axi_bram и установите переключатель Board Support Package в положение Use existing. Нажмите Next. В списке пред-

лагаемых шаблонов приложения выберите Empty и нажмите Finish.

4.2.Нажмите правой кнопкой мыши на папке SRC проекта в дереве

Project Explorer и выберите пункт меню New Source File. В появив-

шемся окне введите имя файла main.c и нажмите Finish.

4.3. Найдите в дереве проекта файл maib.c и измените его содержимое согласно листингу:

#include <stdio.h> #include "xil_io.h" #include "xparameters.h"

int main(void){

int word1,word2,word3,word4,word5;

// word 1, 4 bytes Xil_Out8(XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR + 0x0, 0XAB); Xil_Out8(XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR + 0x1, 0xFF); Xil_Out8(XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR + 0x2, 0x34); Xil_Out8(XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR + 0x3, 0x8C); // word 2, 4 bytes Xil_Out8(XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR + 0x4, 0xEF); Xil_Out8(XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR + 0x5, 0xBE); Xil_Out8(XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR + 0x6, 0xAD); Xil_Out8(XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR + 0x7, 0xDE); // word 3, 4 bytes

Xil_Out16(XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR + 0x10, 0x1209); Xil_Out16(XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR + 0x12, 0xFE31); // word 4, 4 bytes Xil_Out16(XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR + 0x14, 0x6587); Xil_Out16(XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR + 0x18, 0xAAAA); // word 5, 4 bytes

Xil_Out32(0xE000A244, 0x0AAA);

73

word1 = Xil_In32(XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR); word2 = Xil_In32(XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR + 4); word3 = Xil_In32(XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR + 0x10); word4 = Xil_In32(XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR + 0x14); word5 = Xil_In32(0xE000A244);

printf("Word 1 = 0x%08x\n\r", word1); printf("Word 2 = 0x%08x\n\r", word2); printf("Word 3 = 0x%08x\n\r", word3); printf("Word 4 = 0x%08x\n\r", word4); printf("Word 5 = 0x%08x\n\r", word5); return(0);

}

4.4.Зафиксируйте в протокол ожидаемый результат работы программы,

атакже назначение подключаемых библиотек.

5. Проверка приложения на плате.

5.1.Убедитесь, что jtag-отладчик и UART от платы подключены

ккомпьютеру.

5.2.Включите питание платы, соблюдая технику безопасности.

5.3.Нажмите правой кнопкой мыши на названии приложения и далее

ввыпадающих списках Run As Run Configuration.

5.4.В открывшемся окне нажмите Xilinx C/C++ Application (GDB).

5.5.Активируйте галочку Program FPGA.

5.6.Настройте отладчик: перейдите во вкладку Application и убедитесь, что проект ссылается на нужное приложение, затем перейдите во вкладку STDIO Connection и установите COM-порт и скорость для UART.

5.7.Нажмите Save, а затем Run. Дождитесь компиляции проекта и прошивки платы.

5.8.Наблюдайте результат работы программы в консоли. Опишите результат работы в протоколе.

5.9.Измените программу согласно индивидуальному заданию.

Содержание отчета

1.Задача и цели лабораторной работы.

2.Блок-схема проекта в IP-Integrator с назначением каждого элемента.

3.Описание работы блока Bram Controller.

4.Описание работы блока Block Memory Generator с временными диаграммами, поясняющими функционал записи и чтения.

5.Все заметки из протокола.

6.Блок-схема алгоритма работы программы индивидуального задания.

7.Листинги модулей и исходного кода приложения из индивидуального задания с поясняющими комментариями каждой строки.

74

Задания к лабораторной работе

Ознакомьтесь с остальными методами из библиотеки xil_io.h. Измените проект таким образом, чтобы он работал согласно варианту, добавив печать отладочной информации в консоль:

1.Разработайте алгоритм, чтобы получить определенный функционал: запись 8-байтового слова по одному байту через bram_controller_0 и чтение данного слова через bram_controller_1, по четыре байта; запись и чтение 4-байтового слова по одному байту в память bram через bram_controller_1; запись и чтение 4-байтового слова по два байта в память bram через bram_controller_0; запись и чтение 4-байтового слова по одному байту

впамять DDR.

2.Разработайте алгоритм, чтобы получить определенный функционал: запись 8-байтового слова по два байта через bram_controller_1 и чтение данного слова через bram_controller_1, по четыре байта; запись и чтение 4-байтового слова по два байта в память bram через bram_controller_1; запись и чтение 4-байтового слова по четыре байта в память bram через bram_controller_1; запись и чтение 2-байтового слова по одному байту

впамять DDR.

3.Разработайте алгоритм, чтобы получить определенный функционал: запись 32-байтового слова по четыре байта через bram_controller_0 и чтение данного слова через bram_controller_1, по четыре байта; запись и чтение 2-байтового слова по два байта в память bram через bram_controller_0; запись и чтение 8-байтового слова по два байта в память bram через bram_controller_0; запись и чтение 8-байтового слова по два байта в память

DDR.

4.Разработайте алгоритм, чтобы получить определенный функционал: запись 16-байтового слова по одному байту через bram_controller_0 и чтение данного слова через bram_controller_0, по два байта; запись и чтение 8-байтового слова по одному байту в память bram через bram_controller_1; запись и чтение 8-байтового слова по четыре байта в память bram через bram_controller_1; запись и чтение 2-байтового слова по одному байту

впамять DDR.

5.Разработайте алгоритм, чтобы получить определенный функционал: запись 8-байтового слова по 8 байт через bram_controller_0 и чтение данного слова через bram_controller_1, по два байта; запись и чтение 8-байто- вого слова по четыре байта в память bram через bram_controller_1; запись и чтение 4-байтового слова по два байта в память bram через bram_controller_0; запись и чтение 4-байтового слова по четыре байта в память DDR.

6.Разработайте алгоритм, чтобы получить определенный функционал: запись 16-байтового слова по два байта через bram_controller_1 и чтение данного слова через bram_controller_0, по четыре байта; запись и чтение 4-

75

байтового слова по два байта в память bram через bram_controller_0; запись и чтение 8-байтового слова по два байта в память bram через bram_controller_1; запись и чтение 8-байтового слова по два байта в память

DDR.

7.Разработайте алгоритм, чтобы получить определенный функционал: запись 8-байтового слова по одному байту через bram_controller_0 и чтение данного слова через bram_controller_1, по 4 байта; запись и чтение 4- байтового слова по одному байту в память bram через bram_controller_1; запись и чтение 4-байтового слова по два байта в память bram через bram_controller_0; запись и чтение 4-байтового слова по одному байту

впамять DDR.

8.Разработайте алгоритм, чтобы получить определенный функционал: запись 16-байтового слова по два байта через bram_controller_0 и чтение данного слова через bram_controller_1, по одному байту; запись и чтение 32-байтового слова по 8 байт в память bram через bram_controller_0; запись и чтение 8-байтового слова по два байта в память bram через bram_controller_0; запись и чтение 16-байтового слова по 8 байт в память DDR.

76

Лабораторная работа 9

РАЗРАБОТКА ПРОЕКТА ДЛЯ УПРАВЛЕНИЯ СЕМИСЕГМЕНТНЫМ ИНДИКАТОРОМ

С ПОМОЩЬЮ ПОВОРОТНОГО ЭНКОДЕРА

Цель работы

Создание и использование пользовательского элемента для работы с поворотным энкодером. Разработка модуля для обработки дребезга контактов. Вывод данных в плисовую часть из процессора. Проверка проекта на отладочной плате ZedBoad.

Основные вопросы, изучаемые перед выполнением работы

1.Архитектура системы на кристалле Xilinx Zynq7000.

2.Структура лабораторного макета ZedBoard.

3.Принцип работы поворотного энкодера.

4.Фильтрация дребезга электрических контактов.

5.Подключение семисегментного индикатора к плате ZedBoard.

Содержание работы

1.Занесите распиновку внешнего подключаемого модуля семисегментного индикатора из лабораторной работы 6 в протокол.

2.Внешний модуль поворотного энкодера будет подключаться через специальный адаптер. Распиновка модуля приведена на рис. 75.

Vcc

GND

CLK

DT

SW

Рис. 75. Схематичный вид модуля поворотного энкодера

3. Создайте новую отдельную директорию для лабораторной работы по аналогии с лабораторной работой 1. Например, полный путь к директории для данной лабораторный работы:

D:/(Год)/(Фамилия) (группа)/soc-lab-9

77

4. Создание проекта в Vivado 2016.4.

4.1.Создайте проект с именем Zynq encoder_ssd_(номер варианта) по аналогии с п. 2 лабораторной работы 1.

4.2.Создайте Block Design и добавьте IP процессорной системы Zynq7 по аналогии с п. 3 лабораторной работы 1.

4.3.Настройте процессорную систему согласно п. 4 лабораторной ра-

боты 1.

4.4.Далее необходимо включить Master AXI Interface. Для этого от-

кройте PS-PL Configuration General AXI Non secure Enablement

иустановите галочку напротив M AXI GP0 interface.

4.5.Добавьте IP-элемент с названием AXI GPIO, смените имя данного

элемента на axi gpio_enc.

4.6.Добавьте IP-элемент с названием AXI GPIO, смените имя данного элемента на axi gpio_ssd.

4.7.Нажмите Run Connection Automation. Это позволит автоматически добавить и соединить необходимую периферию.

Примечание. Обратите внимание, что появился блок AXI Interconnect.

4.8. Добавьте файл устройства (Design Sources) с именем user_gpio_LED.v по аналогии с лабораторной работой 4. Впишите следующие строки согласно листингу:

module user_gpio_LED # ( parameter DATA_WIDTH = 8 )(

input [DATA_WIDTH-1:0] GPIO_in, output reg [DATA_WIDTH-1:0] ssd );

always @(*)

case (GPIO_in[3:0])

0:ssd <= 8'b11111110;

1:ssd <= 8'b10110000;

2:ssd <= 8'b11101101;

3:ssd <= 8'b11111001; endcase

endmodule

4.9. Добавьте файл устройства (Design Sources) с именем debounce.v по аналогии с лабораторной работой 4. Впишите следующие строки согласно листингу:

module debounce #(

parameter bounce_limit = 1024

)

78

(

input clk,

input switch_in, output reg switch_out, output reg switch_rise, output reg switch_fall );

reg [$clog2(bounce_limit)-1:0] bounce_count = 0; reg [1:0] switch_shift;

always @(posedge clk)

switch_shift <= {switch_shift,switch_in};

always @(posedge clk) if (bounce_count == 0) begin

switch_rise <= switch_shift == 2'b01; switch_fall <= switch_shift == 2'b10; switch_out <= switch_shift[0];

if (switch_shift[1] != switch_shift[0]) bounce_count <= bounce_limit-1;

end else begin

switch_rise <= 0; switch_fall <= 0;

bounce_count <= bounce_count-1; end

endmodule

4.10. Добавьте файл устройства (Design Sources) с именем user_gpio_encoder.v. Впишите следующие строки согласно листингу:

`timescale 1ns / 1ps

module user_gpio_encoder # ( parameter DATA_WIDTH = 8, parameter default_ms_limit = 100000, parameter ms_limit = default_ms_limit )(

input s_axi_aclk, input enc_a, input enc_b, input enc_sw,

input [DATA_WIDTH-1:0] sws,

output reg [DATA_WIDTH-1:0] enc_data = 0 );

79

Соседние файлы в папке ЛР