Министерство образования и науки РФ
Федеральное государственное автономное
образовательное учреждение высшего образования
«Национальный исследовательский университет
«Московский институт электронной техники»
Факультет Микроприборов и технической кибернетики
Кафедра вычислительной техники
Практикум по программируемым логическим интегральным схемам
Отчет по курсовой работе
Работу выполнили
студенты группы МП-31
Денискин М.Ю.
Коробков Д.Ю.
Свинченко А.А.
Преподаватель:
Беклемишев Д.Н.
Москва 2017
Содержание
1. Постановка задачи
2. Средства разработки
3. Структура проекта
а) ps2protocol, KP, keytodigit
б) VGA
в) i2c
г) audiocodec, Mem
д) Labirint
4. Отладка устройства на учебном стенде
5. Заключение
6. Список использованной литературы
7. Приложение 1
8. Приложение 2
9. Приложение 3
10. Приложение 4
11. Приложение 5
Постановка задачи
Создание ВУ, которое выполняет следующие функции:
1. Выводит на экран монитора лабиринт с объектом на входе и позволяет пользователю
а) Задавать цвет лабиринта и объекта;
б) Перемещать объект влево, вправо, вверх и вниз при помощи клавиш клавиатуры с учётом наличия стенок в лабиринте;
в) Завершать показ лабиринта с объектом на экране монитора и начинать сначала.
2. Воспроизведение музыки через динамики: включение/выключение с помощью переключателя на учебном стенде.
Средства разработки
1. В ходе работы использовался САПР Quartus II и высокоуровневый язык описания аппаратуры Verilog HDL. При разработке ВУ применялись редакторы схем, кода Verilog HDL, средства симуляции и компиляции, встроенные в Quartus II.
2. Также использовался учебный стенд, который представляет собой плату, на которой размещены интегральная схема программируемой логики и устройства ввода/вывода (рис.1).
Рис.1. Внешний вид учебного стенда
На рис.2 приведена упрощенная структура стенда. Центральное место на плате занимает программируемая логическая интегральная схема фирмы Altera Cyclone II EP2C20F484C7N. Загрузка ОЗУ ПЛИС производится с помощью инструментального компьютера, кабеля программирования и САПР Quartus II.
Рис.2. Структура учебного стенда
Структура проекта
В состав ВУ входят следующие модули:
Labirint
VGA
ps2protocol,
KP, keytodigit
audiocodec,
Mem
i2c
Ниже представлено описание каждого из них.
ps2protocol, KP, keytodigit
Данные модули выполняют следующие функции:
1. Обеспечивают передачу кода нажатой клавиши с клавиатуры, работающей по интерфейсу PS/2, на ВУ, а также передачу на клавиатуру данных: байт данных задаётся с помощью переключателей 0-7 на стенде, а сам процесс передачи инициируется нажатием кнопки 1 (ps2protocol).
Рис.3. Временная диаграмма приёма кода клавиши (10001000)
2. Формируют сигнал нажатия клавиши KP («0», если ни одна из клавиш не нажата, иначе — «1») (KP).
3. Коды клавиш «0», «1», «2» - «E», «F» переводят в соответствующие шестнадцатеричные цифры и выдают сигнал, информирующий о нажатии данных клавиш (keytodigit).
HDL-описание этих модулей приведено в приложении 1.
VGA
Данный модуль обеспечивает передачу изображения на монитор по интерфейсу VGA совместно с модулем Labirint.
Рис.4. Временная диаграмма передачи строки пикселей по VGA. Передача кадра имеет тот же вид, за исключением того, что используется другая линия синхронизации — VSYNC
Режим VGA |
Длины временных промежутков при передаче строки |
||||||
Конфигурация |
Разрешение |
a (мс) |
b (мс) |
c (мс) |
d (мс) |
Частота передачи пикселей (МГц) |
|
VGA (60 Гц) |
640x480 |
3,8 |
1,9 |
25,4 |
0,6 |
25 (640/c) |
|
Таблица 1. Характеристики передачи строки пикселей
Режим VGA |
Длины временных промежутков при передаче кадра |
||||
Конфигурация |
Разрешение |
a (линии) |
b (линии) |
c (линии) |
d (линии) |
VGA (60 Гц) |
640x480 |
2 |
33 |
480 |
10 |
Таблица 2. Характеристики передачи кадра
Цвет пикселей задаётся с помощью 3 составляющих: R, G, B. Каждая из них определяется 4 битами (в самом интерфейсе VGA составляющие цвета являются аналоговыми сигналами, но на стенде присутствуют три 4-битных ЦАП, которые формируют эти сигналы).
Рис.5. Схема подключения VGA
HDL-описание этого модуля приведено в приложении 2.
i2c
Этот модуль обеспечивает передачу данных по интерфейсу I2C на конфигурируемый 24-битный аудиокодек Wolfson WM8731, поддерживающий частоту дискретизации от 8 кГц до 96 кГц (при воспроизведении музыки используется 8 кГц) и имеющий линейный вход, линейных выход и вход для микрофона (используется только линейный выход).
Р
ис.6.
Временная
диаграмма передачи данных на кодек по
I2C
Рис.7. Схема подключения WM8731
Если при передаче данных приёмник (WM8731) не выставил «0» на шине данных I2C_SDAT при ответе, то на стенде загорается зелёный светодиод 1.
При успешной передаче по I2C загорается зелёный светодиод 0.
HDL-описание этого модуля приведено в приложении 3.
audiocodec, Mem
Данный модуль выполняет следующие функции:
Хранит 53248 выборок звука, сжатых по алгоритму IMA ADPCM (находятся в модуле Mem — однопортовая ROM-память, сгенерированная средствами Quartus);
Декодирует эти выборки в 16-битные коды и подаёт их на ЦАП в WM8731.
Конфигурирует WM8731, посылая соответствующие данные по I2C.
-
Адрес регистра WM8731
Данные регистра WM8731
Что делает
0000110
001100111
Включает WM8731, линейный выход и ЦАП
0000100
000010000
Подключает к линейному выходу ЦАП
0000111
001010011
Задаёт следующие параметры:
1. Режим работы аудиокодека: Master Mode;
2. Режим подачи кода на ЦАП: DSP Mode A;
3. Размер выборок: 16 бит.
0001000
001001101
Задаёт следующие параметры:
1. Частота дискретизации ЦАП: 8 кГц;
2. Режим тактирования: USB Mode (12 МГц);
3. Входной тактовый сигнал делится на 2 (на вход подаётся 24 МГц).
0000010
0011111001
Изменяет значения на выходе ЦАП, близкие к 0 и подаваемые на левый динамик, для улучшения звука
0000011
0011111001
Изменяет значения на выходе ЦАП, близкие к 0 и подаваемые на правый динамик, для улучшения звука
Таблица 3. Настройки WM8731
При успешной конфигурации кодека загорается зелёный светодиод 3.
Рис.8. Временная диаграмма подачи выборки звука на ЦАП (n=16)
При выставлении «1» на линии LRCLK загорается зелёный светодиод 2 (если включена передача звука).
Воспроизведение музыки начинается, если переключатель 8 переведён в верхнее положение («1»). Звук перестаёт воспроизводиться, если этот переключатель в нижнем положении («0»).
HDL - описание этого модуля и выборки звука (в шестнадцатеричном виде) приведены в приложении 4.
Labirint
Это главный модуль. Он выполняет следующие задачи:
1. Хранит два кадра для монитора, один из которых изображает лабиринт, а другой — финальное сообщение. Также совместно с модулем VGA подаёт видеоданные на монитор.
Рис.9. Лабиринт.
Рис.10. Финальное сообщение
2. Обеспечивает передвижение объекта по лабиринту посредством нажатия пользователем клавиш «↑», «←», «→», «↓», учитывая наличие стенок.
3. Позволяет пользователю задавать цвет лабиринта и объекта, а также повторно запускать приложение с лабиринтом.
Алгоритм использования ВУ:
1. Ввод цвета лабиринта: на клавиатуре нажать на три клавиши, соответствующие шестнадцатеричным цифрам. Первая цифра - интенсивность красного цвета, вторая - зеленого, третья - синего. Возможен пропуск задания интенсивности цвета посредством нажатия на клавишу «Space».
2. Аналогично ввод цвета объекта. Цвета объекта и лабиринта не должны совпадать и не должны быть одновременно равны нулю.
3. Нажатие на клавишу «Enter».
4. После появления изображения лабиринта на экране монитора нужно переместить объект в лабиринте посредством нажатия клавиш «↑», «←», «→», «↓» к щели в самой правой стене этого лабиринта. При достижении данного места выведется сообщение «WIN!».
5. Нажатие на клавишу 0 на учебном стенде для перезапуска.
В любой момент времени можно перевести переключатель 8 в верхнее/нижнее положение, чтобы начать/остановить воспроизведение музыки.
HDL - описание данного модуля приведено в приложении 5.
Отладка устройства на учебном стенде
Отладку производим в соответствии с алгоритмом использования ВУ, описанным в предыдущем пункте.
Рис.11. Учебный стенд при вводе цвета лабиринта.
Рис.12. Учебный стенд при воспроизведении звука.
Рис.13. Экран монитора с лабиринтом и объектом.
Рис.14. Экран монитора с финальным сообщением.
Рис.15. Учебный стенд при прекращении показа лабиринта.
Заключение
В результате выполнения работы было разработано вычислительное устройство, выполняющее заданные функции, и была произведена его отладка на учебном стенде. Получены навыки в проектировании микропроцессорных систем, а также опыт работы со средствами разработки (САПР Quartus II и языком Verilog HDL).
Список использованной литературы
Беклемишев Д.Н., Орлов А.Н., Попов М.Г., Кудров А.А., Переверзев А.Л. Моделирование микропроцессорных систем на базе программируемых логических интегральных схем с использованием Verilog HDL и САПР Quartus II: учеб. пособие по курсу «Микропроцессорные средства и системы» / Под ред. А.Л. Переверзева. - М.: МИЭТ, 2014. - 100 с.: ил.
Приложение 1
module ps2protocol (
input clk50,
input dir,
input reset,
input [7:0] CODE,
inout PS2_CLK,
inout PS2_DAT,
output reg [7:0] KEYCODE,
output reg KP
);
reg [3:0] state;
reg dat;
reg clk;
reg [11:0] cnt;
reg start;
initial begin
state<=4'b0000;
dat<=1'b1;
clk<=1'b0;
cnt<=12'b0000_0000_0000;
start<=1'b0;
end
assign PS2_DAT=start?dat:1'bz;
assign PS2_CLK=clk?!clk:1'bz;
always @ (posedge clk50)
if (reset==1'b0)
begin
clk<=1'b0;
cnt<=12'b0000_0000_0000;
start<=1'b0;
end
else begin
if (!dir)
clk<=1'b1;
if (clk)
begin
cnt<=cnt+1;
if (cnt==12'd2990)
start<=1'b1;
if (cnt==12'd3000)
begin
clk<=1'b0;
cnt<=12'b0000_0000_0000;
end
end
if (state==4'b0000 && PS2_CLK==1'b1)
start<=1'b0;
end
always @ (negedge PS2_CLK ) begin
if (clk && state==4'b0000)
begin
dat<=1'b0;
state<=state+1;
end
if (start)
case (state)
4'b0001:
begin
dat<=CODE[0];
state<=state+1;
end
4'b0010:
begin
dat<=CODE[1];
state<=state+1;
end
4'b0011:
begin
dat<=CODE[2];
state<=state+1;
end
4'b0100:
begin
dat<=CODE[3];
state<=state+1;
end
4'b0101:
begin
dat<=CODE[4];
state<=state+1;
end
4'b0110:
begin
dat<=CODE[5];
state<=state+1;
end
4'b0111:
begin
dat<=CODE[6];
state<=state+1;
end
4'b1000:
begin
dat<=CODE[7];
state<=state+1;
end
4'b1001:
begin
dat<=!(^CODE);
state<=state+1;
end
4'b1010:
begin
dat<=1'b1;
state<=4'b0000;
end
endcase
else
case (state)
4'b0000:
if (PS2_DAT==1'b0)
begin
state<=state+1;
KP<=1'b0;
KEYCODE<=8'b0000_0000;
end
4'b0001:
begin
KEYCODE[0]<=PS2_DAT;
state<=state+1;
end
4'b0010:
begin
KEYCODE[1]<=PS2_DAT;
state<=state+1;
end
4'b0011:
begin
KEYCODE[2]<=PS2_DAT;
state<=state+1;
end
4'b0100:
begin
KEYCODE[3]<=PS2_DAT;
state<=state+1;
end
4'b0101:
begin
KEYCODE[4]<=PS2_DAT;
state<=state+1;
end
4'b0110:
begin
KEYCODE[5]<=PS2_DAT;
state<=state+1;
end
4'b0111:
begin
KEYCODE[6]<=PS2_DAT;
state<=state+1;
end
4'b1000:
begin
KEYCODE[7]<=PS2_DAT;
state<=state+1;
end
4'b1001:
begin
if (^KEYCODE==PS2_DAT)
KEYCODE<=8'b0000_0000;
state<=state+1;
end
4'b1010:
begin
if (PS2_DAT!=1)
KEYCODE<=8'b0000_0000;
state<=4'b0000;
KP<=1'b1;
end
endcase
end
endmodule
module KP (input [7:0] key, input ready, output reg KP=1'b0);
reg f=1'b0;
always @(posedge ready)
if (key==8'hF0)
f<=1'b1;
else
if (f)
begin
KP<=1'b0;
f<=1'b0;
end
else
KP<=1'b1;
endmodule
module keytodigit (input [7:0] key, output reg [3:0] digit, output reg err);
always @*
begin
err<=1'b0;
digit<=4'h0;
case (key)
8'h45:
digit<=4'h0;
8'h16:
digit<=4'h1;
8'h1E:
digit<=4'h2;
8'h26:
digit<=4'h3;
8'h25:
digit<=4'h4;
8'h2E:
digit<=4'h5;
8'h36:
digit<=4'h6;
8'h3D:
digit<=4'h7;
8'h3E:
digit<=4'h8;
8'h46:
digit<=4'h9;
8'h1C:
digit<=4'hA;
8'h32:
digit<=4'hB;
8'h21:
digit<=4'hC;
8'h23:
digit<=4'hD;
8'h24:
digit<=4'hE;
8'h2B:
digit<=4'hF;
default:
err<=1'b1;
endcase
end
endmodule
