МПСиС / lab_m1_vt_vt_ampsis_230100.62_niy06
.pdfЛабораторная работа № 4 Отладка проекта устройства
с микропрограммным управлением на учебном стенде
Лабораторное задание
Предлагается интегрировать разработанное ранее устройство с микропрограммным управлением в базовый проект для учебного стенда. Для этого необходимо организовать ввод информации в ваше устройство при помощи клавиатуры, кнопок или переключателей, а также отображение результатов на семисегментных индикаторах и линейках светодиодов, что потребует как аппаратной, так и программной доработки.
Конечный вариант устройства должен работать следующим образом: после включения и начальной установки ожидается ввод пары аргументов при помощи шестнадцатеричной клавиатуры, далее выполняется операция из табл.2 лабораторной работы № 2, аргументы и результат отображаются на индикаторах и устройство снова переходит к ожиданию ввода новой пары аргументов.
Описание учебного стенда и базового проекта
Учебный стенд представляет собой плату, на которой размещены программируемая логика и устройства ввода/вывода (рис.1). На задней и боковой сторонах платы установлены разъёмы для подключения источника питания, инструментального компьютера, монитора, дополнительных устройств ввода/вывода и т.д. Слева расположен переключатель для выбора одного из двух режимов программирования, который, для удачной загрузки в ОЗУ ПЛИС, должен быть в положении RUN.
На рис.2 представлена упрощенная структура стенда. Центральное место на плате занимает программируемая логическая интегральная схема фирмы Altera Cyclone II EP2C20F484C7N. Загрузка ОЗУ ПЛИС производится при помощи инструментального компьютера, кабеля программирования и ПО Quartus. Для подключения стенда к инструментальному компьютеру достаточно соединить соответствующим кабелем порт USB Blaster платы и USB-вход компьютера.
49
Рис.1. Внешний вид учебного стенда
Рис.2. Структура учебного стенда
Базовый проект для ПЛИС реализован в графическом виде
(BasicProject.bdf) и состоит из двух основных блоков: InputModule и OutputModule (рис.3), которые предназначены для ввода данных от кнопок, переключателей и клавиатуры и вывода данных на светодиоды и семисегментные индикаторы соответственно. Для сохранения работо-
50
способности базового проекта необходимо сохранять без изменений все входные подключения модуля InputModule и все выходные подключе-
ния, и вход clk модуля OutputModule.
Рис.3. Модули ввода/вывода
На стенде установлен генератор базовой тактовой частоты 50 МГц. С выхода Freq[0..31] можно снимать тактовые частоты с делителя базовой частоты (Freq[0] – 25 МГц, Freq[1] – 12,5 МГц и т.д.).
По шине Switch[0..9] передается состояние десяти переключателей, расположенных на плате снизу. Логическая «1» соответствует состоянию «Включено», логический «0» – «Выключено».
По шине KeyBoardBus[3..0] передается код нажатой клавиши с клавиатуры (используются шестнадцатеричные цифры от 0-9 и A-F). Каждое нажатие клавиши сопровождается логической «1» на сигнале
KeyPressed.
Сигналы Buton0, Button1 и Buton2, Button3 отображают состоя-
ние двух пар кнопок, расположенных на плате.
Шины HEX_0[3..0], HEX_1[3..0], HEX_2[3..0], HEX_3[3..0] пред-
назначены для передачи информации на четыре семисегментных индикатора, расположенных на плате. HEX_0 соответствуют крайнему правому индикатору, HEX_1 – второму справа и т.д. Управление отдельными сегментами реализовано в модуле OutputModule и ориентировано на отображение шестнадцатеричных цифр, т.е. при HEX_0[3..0] = 0000 на крайнем правом индикаторе будет отображен символ нуля, а при
HEX_0[3..0] = 1111 – символ F. Сигналы hex_0_off, hex_1_off, hex_2_off
и hex_3_off отвечают за горение семисегментных индикаторов. Если
51
hex_0_off выставить в единицу, индикатор HEX_0 погаснет. С остальными по аналогии.
С помощью шин LedRed[9..0] и LedGreen[7..0] можно управлять линейками светодиодов, расположенных на плате. Например, подача «1» на LedGreen[0] активирует крайний справа светодиод.
Пример проектирования
На рис.3 приведен пример схемы устройства с микропрограммным управлением, дополненной аппаратными модулями ввода/вывода. Данная схема имеет четыре входных порта (clk – тактовый сигнал, reset – сигнал начальной установки, KB – код нажатой клавиши, KP – индикатор нажатой клавиши) и один выходной порт (Indicator – коды для семисегментных индикаторов).
Модули ввода/вывода описаны на Verilog HDL, их листинги представлены на рис.4 и 5 соответственно. Из приведенных описаний видно, что оба модуля имеют регистровую память, адресуемую при помощи шины PortID.
Модуль ввода состоит из двух регистров, доступных для чтения. По нулевому адресу находится регистр готовности данных от клавиатуры, а по первому – сами данные. Таким образом, устройство с микропрограммным управлением должно опрашивать регистр готовности и при наличии в нем «1» считывать данные из первого регистра. Отметим, что регистр готовности сбрасывается при его чтении.
Модуль вывода состоит из четырех адресуемых регистров, каждый из которых соответствует определенному семисегментному индикатору. Так, запись данных в нулевой регистр приводит к отображению этих данных на крайнем правом индикаторе.
В табл.1 представлен пример программы, реализующей сложение двух 4-разрядных чисел.
Требования к отчету
В качестве отчета о выполнении лабораторной работы вы должны представить проект Quartus, содержащий схемы, Verilogописания, тестовые воздействия и результаты моделирования схемы устройства, выполняющей один из вариантов индивидуального задания, а также продемонстрировать его работу на учебном стенде.
52
|
|
|
|
|
|
|
|
|
|
DataInput |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
clk |
|
|
|
|
|
|
|
DataIn[3..0] |
||
|
|
|
|
|
|
|
clk |
DataOut[3..0] |
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
reset |
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
reset |
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
KB[3..0] |
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
KB[3..0] |
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
KP |
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
KP |
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
PortID[0] |
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
PortID |
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
PortRead |
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
PortRead |
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
inst2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Controller |
|
|
|
|
|
|
||
clk |
|
|
|
INPUT |
|
|
clk |
|
|
|
|
|
|
|
DataOut[3..0] |
||
reset |
|
|
|
VCC |
|
|
|
|
|
clk |
DataOut[3..0] |
|
|
|
|
||
|
|
|
INPUT |
|
|
reset |
|
|
|
|
PortID[2..0] |
||||||
KB[3..0] |
|
|
|
VCC |
|
|
|
|
|
reset |
PortID[2..0] |
|
|
|
|
||
|
|
|
INPUT |
|
DataIn[3..0] |
|
|
|
|
PortWrite |
|||||||
KP |
|
|
|
VCC |
|
|
|
|
|
DataIn[3..0] |
PortWrite |
|
|
|
|
||
|
|
|
INPUT |
|
|
|
|
|
|
|
PortRead |
||||||
|
|
|
|
VCC |
|
|
|
|
|
|
|
PortRead |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
inst
DataOutput
clk
clk Indicator[15..0]
OUTPUT
Indicator[15..0]
reset
Reset
PortWrite
DataOut[3..0] wr
Data[3..0]
PortID[1..0]
PortID[1..0]
inst1
Рис.4. Схема устройства с микропрограммным управлением, дополненная модулями ввода/вывода
53
Рис.5. Модуль ввода данных с шестнадцатеричной клавиатуры
Рис.6. Модуль вывода данных на семисегментный индикатор
54
Таблица 1
|
|
|
|
Пример микропрограммы |
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
№ |
Действие |
|
|
|
|
Микрокоманда |
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
БП |
ПП |
ПН |
S[3:0] |
M |
P0 |
ISR, |
|
A |
wr |
adr[2:0] |
v[3:0] |
||
|
|
|
|
|||||||||||
|
|
|
ISL |
|
||||||||||
|
0 |
1→Рг2 |
0 |
0 |
0 |
0000 |
0 |
0 |
00 |
|
0 |
0 |
000 |
0010 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
DataInput-0→Рг1 |
0 |
0 |
0 |
0000 |
0 |
0 |
00 |
|
1 |
0 |
000 |
0001 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
Рг1–Рг2 |
0 |
0 |
0 |
0110 |
1 |
1 |
00 |
|
0 |
0 |
000 |
0000 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
If R==0 PC=5 |
0 |
0 |
1 |
0000 |
0 |
0 |
00 |
|
0 |
0 |
000 |
0101 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4 |
PC=1 |
1 |
0 |
0 |
0000 |
0 |
0 |
00 |
|
0 |
0 |
000 |
0001 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5 |
DataInput-1→Рг1 |
0 |
0 |
0 |
0000 |
0 |
0 |
00 |
|
1 |
0 |
000 |
0001 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
6 |
Рг1→DataOutput-0 |
0 |
0 |
0 |
0000 |
0 |
0 |
00 |
|
0 |
0 |
000 |
1000 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
7 |
Рг1→БРОН-0 |
0 |
0 |
0 |
0000 |
0 |
0 |
00 |
|
0 |
1 |
000 |
0000 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
8 |
DataInput-0→Рг1 |
0 |
0 |
0 |
0000 |
0 |
0 |
00 |
|
1 |
0 |
000 |
0001 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
55 |
9 |
Рг1–Рг2 |
0 |
0 |
0 |
0110 |
1 |
1 |
00 |
|
0 |
0 |
000 |
0000 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
56
Продолжение табл.1
№ |
Действие |
|
|
|
|
Микрокоманда |
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
||
БП |
ПП |
ПН |
S[3:0] |
M |
P0 |
ISR, |
|
A |
wr |
adr[2:0] |
v[3:0] |
||
|
|
|
|||||||||||
|
|
ISL |
|
||||||||||
10 |
If R==0 PC=12 |
0 |
0 |
1 |
0000 |
0 |
0 |
00 |
|
0 |
0 |
000 |
1101 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
11 |
PC=8 |
1 |
0 |
0 |
0000 |
0 |
0 |
00 |
|
0 |
0 |
000 |
1000 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
12 |
DataInput-1→Рг1 |
0 |
0 |
0 |
0000 |
0 |
0 |
00 |
|
1 |
0 |
001 |
0001 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
13 |
Рг1→DataOutput-0 |
0 |
0 |
0 |
0000 |
0 |
0 |
00 |
|
0 |
0 |
000 |
1000 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
14 |
Рг1→БРОН-1 |
0 |
0 |
0 |
0000 |
0 |
0 |
00 |
|
0 |
1 |
001 |
0000 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
15 |
DataInput-0→Рг1 |
0 |
0 |
0 |
0000 |
0 |
0 |
00 |
|
1 |
0 |
000 |
0001 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
16 |
Рг1–Рг2 |
0 |
0 |
0 |
0110 |
1 |
1 |
00 |
|
0 |
0 |
000 |
0000 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
17 |
If R==0 PC=3 |
0 |
0 |
1 |
0000 |
0 |
0 |
00 |
|
0 |
0 |
100 |
0011 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
18 |
PC=15 |
1 |
0 |
0 |
0000 |
0 |
0 |
00 |
|
0 |
0 |
000 |
1111 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
19 |
15→Рг2 |
0 |
0 |
0 |
0000 |
0 |
0 |
01 |
|
0 |
0 |
000 |
0010 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Продолжение табл.1
|
№ |
Действие |
|
|
|
|
Микрокоманда |
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
||
БП |
ПП |
ПН |
S[3:0] |
M |
P0 |
ISR, |
|
A |
wr |
adr[2:0] |
v[3:0] |
|||
|
|
|
|
|||||||||||
|
|
|
ISL |
|
||||||||||
|
20 |
15→Рг2 |
0 |
0 |
0 |
0000 |
0 |
0 |
01 |
|
0 |
0 |
000 |
0010 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
21 |
0 |
0 |
0 |
0000 |
0 |
0 |
01 |
|
0 |
0 |
000 |
0010 |
|
|
|
|
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
22 |
DataInput-1→Рг1 |
0 |
0 |
0 |
0000 |
0 |
0 |
00 |
|
1 |
0 |
001 |
0001 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
23 |
Рг1–Рг2 |
0 |
0 |
0 |
0110 |
1 |
1 |
00 |
|
0 |
0 |
000 |
0000 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
24 |
If R==0 PC=29 |
0 |
0 |
1 |
0000 |
0 |
0 |
00 |
|
0 |
0 |
001 |
1101 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
25 |
|
0 |
0 |
0 |
0000 |
0 |
0 |
00 |
|
0 |
0 |
000 |
0100 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
26 |
1→Рг2 |
0 |
0 |
0 |
0000 |
0 |
0 |
00 |
|
0 |
0 |
000 |
0100 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
27 |
|
0 |
0 |
0 |
0000 |
0 |
0 |
00 |
|
0 |
0 |
000 |
0100 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
28 |
PC=15 |
1 |
0 |
0 |
0000 |
0 |
0 |
00 |
|
0 |
0 |
000 |
1111 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
57 |
29 |
БРОН-0→Рг2 |
0 |
0 |
0 |
0000 |
0 |
0 |
00 |
|
0 |
0 |
000 |
0110 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
58
Окончание табл.1
№ |
Действие |
|
|
|
|
Микрокоманда |
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
||
БП |
ПП |
ПН |
S[3:0] |
M |
P0 |
ISR, |
|
A |
wr |
adr[2:0] |
v[3:0] |
||
|
|
|
|||||||||||
|
|
ISL |
|
||||||||||
30 |
БРОН-1→Рг1 |
0 |
0 |
0 |
0000 |
0 |
0 |
00 |
|
0 |
0 |
001 |
0001 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
31 |
Рг1 + |
0 |
0 |
0 |
1001 |
1 |
0 |
00 |
|
0 |
0 |
000 |
1000 |
Рг2→DataOutput-0 |
|
||||||||||||
32 |
|
0 |
0 |
0 |
0000 |
0 |
0 |
00 |
|
0 |
0 |
000 |
0010 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
33 |
0→Рг2 |
0 |
0 |
0 |
0000 |
0 |
0 |
00 |
|
0 |
0 |
000 |
0010 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
34 |
0 |
0 |
0 |
0000 |
0 |
0 |
00 |
|
0 |
0 |
000 |
0010 |
|
|
|
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
35 |
|
0 |
0 |
0 |
0000 |
0 |
0 |
00 |
|
0 |
0 |
000 |
0010 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
36 |
PC=0 |
1 |
0 |
0 |
0000 |
0 |
0 |
00 |
|
0 |
0 |
000 |
0000 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
