This repository has been archived by the owner on Sep 26, 2024. It is now read-only.
forked from bqwer/workbook
-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathlab_6.tex
303 lines (217 loc) · 22.1 KB
/
lab_6.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
\chapter{Лабораторная работа №6\\Контроллер \eng{PS/2} для клавиатуры}
\par{Для успешного применения цифровых устройств в реальности важно обеспечить их взаимодействие с внешним миром. Для этого существуют внешние интерфейсы для обмена информацией с другими устройствами и приборами. Внешние интерфейсы имеют различное функциональное назначение и спецификацию. Например, раньше для подключения клавиатуры и мыши использовался интерфейс \eng{PS/2}. Один с самых простых способов подключения устройств ввода-вывода.}
\vspace{4mm}
\par{Давайте изучим протокол и реализацию интерфейса \eng{PS/2}.}
\par{Интерфейс \eng{PS/2} сточки зрения соединения представляет собой два провода \kword{Clock} и \kword{Data}. По \kword{Clock} передаются синхроимпульсы, а по \kword{Data} предаются данные. На рисунке пример одной транзакции обмена.}
\begin{figure}[H]
\centering
\def\svgwidth{\columnwidth}
\includesvg{images/lab_6/diag}
\caption{Передача данных по протоколу PS/2}
\end{figure}
\par{Структура транзакции похожа на \eng{UART} и состоит из:}
\begin{enumerate}[noitemsep,topsep=0pt, after=\vspace{2pt}]
\item старт бит – всегда ноль;
\item 8 бит данных;
\item бит четности, равен 1 если количество единиц в данных четно и 0 если нечетно;
\item стоп бит – всегда единица.
\end{enumerate}
\par{Данные на линию выставляются, когда \kword{Clock} равен \textbf{1} и считываются, когда \kword{Clock} равен \textbf{0}. На практике данные обычно выставляются по положительному фронту и считываются по отрицательному.}
\par{Частота сигнала \kword{Clock} примерно 10-16.7кГц. Время от фронта сигнала \kword{Clock} до момента изменения сигнала \kword{Data} не менее 5 микросекунд.}
\vspace{4mm}
\par{Транзакции разделяются на два вида:}
\begin{enumerate}[noitemsep,topsep=0pt, after=\vspace{2pt}]
\item От устройства к контроллеру;
\item От контроллера к устройству.
\end{enumerate}
\par{На примере клавиатуры.}
\begin{enumerate}[noitemsep,topsep=0pt, after=\vspace{2pt}]
\item Клавиатура посылает на контроллер восьмибитный код нажатой клавиши;
\item Контроллер посылает на клавиатуру команды управления. Такие как, команды сброса, выключения светодиодов.
\end{enumerate}
\begin{figure}[H]
\centering
\def\svgwidth{\columnwidth}
\includesvg{images/lab_6/diag}
\caption{Передача восьмибитного пакета данных}
\end{figure}
\par{При транзакции от устройства (клавиатуры) к контроллеру сигналы на линиях \kword{Clock} и \kword{Data} генерирует устройство. Контроллер выступает в роли приемника считывая данные по отрицательному фронту \kword{Clock}.}
\par{При передаче в обратную сторону команд от контроллера к клавиатуре или мыши протокол отличается от описанного выше.}
\par{Последовательность обмена другая:}
\begin{enumerate}[noitemsep,topsep=0pt, after=\vspace{2pt}]
\item контроллер опускает сигнал \kword{Clock} в ноль на время примерно 100 микросекунд;
\item контроллер опускает сигнал \kword{Data} в ноль формируя старт бит;
\item контроллер отпускает сигнал \kword{Clock} в логическую единицу, клавиатура фиксирует старт бит;
\item далее клавиатура генерирует сигнал \kword{Clock}, а хост контроллер подает передаваемые биты;
\item после того, как контроллер передал все свои биты, включая бит четности и стоп бит, клавиатура посылает последний бит «ноль», который является подтверждением приема.
\end{enumerate}
\begin{figure}[H]
\centering
\def\svgwidth{\columnwidth}
\includesvg{images/lab_6/diag_r}
\caption{Распределение управления между контроллером и устройством}
\end{figure}
\par{Поскольку одним сигналом управляют два устройства, то довольно трудно понять, кто в какой момент времени управляет сигналом. По этому, диаграмма нарисована двумя цветами. Красный цвет – сигнал управляется контроллером, а синий – сигнал управляется устройством.}
\vspace{4mm}
\par{Давайте выясним какие коды же коды передает клавиатура для каждой клавиши.}
\par{Ниже приведена таблица кодов для клавиш. Каждой клавише соответствует код генерируемый при нажатии и код генерируемый при деактивации. Коды состоящие из нескольких байтов предаются в нескольких подряд идущих транзакций.}
\vspace{4mm}
\begin{center}
\begin{tabular}{ | l | l | l | l | l | l | }
\hline
\kword{KEY} & \kword{MAKE} & \kword{BREAK} & \kword{KEY} & \kword{MAKE} & \kword{BREAK} \\ \hline
A & 1C & F0,1C & R ALT & E0,11 & E0,F0,11 \\ \hline
B & 32 & F0,32 & APPS & E0,2F & E0,F0,2F \\ \hline
C & 21 & F0,21 & ENTER & 5A & F0,5A \\ \hline
D & 23 & F0,23 & ESC & 76 & F0,76 \\ \hline
E & 24 & F0,24 & F1 & 05 & F0,05 \\ \hline
F & 2B & F0,2B & F2 & 06 & F0,06 \\ \hline
\end{tabular}
\end{center}
\begin{center}
\begin{tabular}{ | l | l | l | l | l | l | }
\hline
\kword{KEY} & \kword{MAKE} & \kword{BREAK} & \kword{KEY} & \kword{MAKE} & \kword{BREAK} \\ \hline
G & 34 & F0,34 & F3 & 04 & F0,04 \\ \hline
H & 33 & F0,33 & F4 & 0C & F0,0C \\ \hline
I & 43 & F0,43 & F5 & 03 & F0,03 \\ \hline
J & 3B & F0,3B & F6 & 0B & F0,0B \\ \hline
K & 42 & F0,42 & F7 & 83 & F0,83 \\ \hline
L & 4B & F0,4B & F8 & 0A & F0,0A \\ \hline
M & 3A & F0,3A & F9 & 01 & F0,01 \\ \hline
N & 31 & F0,31 & F10 & 09 & F0,09 \\ \hline
O & 44 & F0,44 & F11 & 78 & F0,78 \\ \hline
P & 4D & F0,4D & F12 & 07 & F0,07 \\ \hline
Q & 15 & F0,15 & SCROLL & 7E & F0,7E \\ \hline
R & 2D & F0,2D & [ & 54 & FO,54 \\ \hline
S & 1B & F0,1B & INSERT & E0,70 & E0,F0,70 \\ \hline
T & 2C & F0,2C & HOME & E0,6C & E0,F0,6C \\ \hline
U & 3C & F0,3C & PG UP & E0,7D & E0,F0,7D \\ \hline
V & 2A & F0,2A & DELETE & E0,71 & E0,F0,71 \\ \hline
W & 1D & F0,1D & END & E0,69 & E0,F0,69 \\ \hline
X & 22 & F0,22 & PG DN & E0,7A & E0,F0,7A \\ \hline
Y & 35 & F0,35 & UP & E0,75 & E0,F0,75 \\ \hline
Z & 1A & F0,1A & LEFT & E0,6B & E0,F0,6B \\ \hline
0 & 45 & F0,45 & DOWN & E0,72 & E0,F0,72 \\ \hline
1 & 16 & F0,16 & RIGHT & E0,74 & E0,F0,74 \\ \hline
2 & 1E & F0,1E & NUM & 77 & F0,77 \\ \hline
3 & 26 & F0,26 & KP / & E0,4A & E0,F0,4A \\ \hline
4 & 25 & F0,25 & KP * & 7C & F0,7C \\ \hline
5 & 2E & F0,2E & KP - & 7B & F0,7B \\ \hline
6 & 36 & F0,36 & KP + & 79 & F0,79 \\ \hline
7 & 3D & F0,3D & KP EN & E0,5A & E0,F0,5A \\ \hline
8 & 3E & F0,3E & KP . & 71 & F0,71 \\ \hline
9 & 46 & F0,46 & KP 0 & 70 & F0,70 \\ \hline
` & 0E & F0,0E & KP 1 & 69 & F0,69 \\ \hline
- & 4E & F0,4E & KP 2 & 72 & F0,72 \\ \hline
= & 55 & F0,55 & KP 3 & 7A & F0,7A \\ \hline
\ & 5D & F0,5D & KP 4 & 6B & F0,6B \\ \hline
BKSP & 66 & F0,66 & KP 5 & 73 & F0,73 \\ \hline
SPACE & 29 & F0,29 & KP 6 & 74 & F0,74 \\ \hline
\end{tabular}
\end{center}
\begin{center}
\begin{tabular}{ | l | l | l | l | l | l | }
\hline
\kword{KEY} & \kword{MAKE} & \kword{BREAK} & \kword{KEY} & \kword{MAKE} & \kword{BREAK} \\ \hline
TAB & 0D & F0,0D & KP 7 & 6C & F0,6C \\ \hline
CAPS & 58 & F0,58 & KP 8 & 75 & F0,75 \\ \hline
L SHFT & 12 & FO,12 & KP 9 & 7D & F0,7D \\ \hline
L CTRL & 14 & FO,14 & ] & 5B & F0,5B \\ \hline
L GUI & E0,1F & E0,F0,1F & ; & 4C & F0,4C \\ \hline
L ALT & 11 & F0,11 & ' & 52 & F0,52 \\ \hline
R SHFT & 59 & F0,59 & , & 41 & F0,41 \\ \hline
R CTRL & E0,14 & E0,F0,14 & . & 49 & F0,49 \\ \hline
R GUI & E0,27 & E0,F0,27 & / & 4A & F0,4A \\ \hline
\end{tabular}
\end{center}
\vspace{4mm}
\par{Разработаем простой контроллер для клавиатуры. Контроллер предназначается для работы только в режиме устройство-контроллер.}
\par{Для начала определим функционал контроллера и набор сигналов.}
\par{Функционал:}
\begin{enumerate}[noitemsep,topsep=0pt, after=\vspace{2pt}]
\item Считываются данные с линии \eng{PS/2} по отрицательному фронту синхросигнала;
\item Проверяется корректность принятых данных. Проверяется стоп бит, бит четности и стартовый бит;
\item Выводит принятые данные на внешнюю шину и формирует сигнал готовности данных.
\end{enumerate}
\par{Набор сигналов:}
\begin{enumerate}[noitemsep,topsep=0pt, after=\vspace{2pt}]
\item \kword{areset} – асинхронный сброс, активный уровень \textbf{1};
\item \kword{clk\_50} – вход тактовой частоты с частотой 50 МГц;
\item \kword{\kword{Data}} – восьмибитная шина данных;
\item \kword{valid\_\kword{Data}} – сигнал готовности данных, равен \textbf{1} с момента завершения приема по \eng{PS/2} до начала следующей транзакции;
\item \kword{ps2\_clk} – тактовая линия \eng{PS/2}, является внешним сигналом для ПЛИС;
\item \kword{ps2\_dat} – сигнальная линия \eng{PS/2}, является внешним сигналом для ПЛИС.
\end{enumerate}
\par{\textbf{Примечание}. Сигналы \kword{ps2\_clk} и \kword{ps2\_dat} как внешние сигналы необходимо подключить к соответствующим пинам ПЛИС. Это пины \eng{H15(\kword{ps2\_clk}) $ $ J14(\kword{ps2\_dat})}, к которым на плате \eng{DE1} подключен коннектор \eng{PS/2}.}
\lstinputlisting[caption={Описание входов и выходов контроллера}]{./code_examples/lab_6/in_out.v}
\par{Прежде всего, необходимо надежно определять нисходящий фронт сигнала \kword{ps2\_clk}, так как его качество (крутизна фронтов, зашумленность) может сильно варьироваться в зависимости от клавиатуры и непосредственное тактирование от этого сигнала может вызвать некорректную работу всей схемы в целом.}
\par{Для определения нисходящего фронта мы используем вариант схемы для работы с кнопками. Схема представляет из себя десятибитный сдвиговый регистр, в который каждый такт \kword{clk\_50} сдвигается текущее значение \kword{ps2\_clk}. Схема ожидает момент, когда старшие 5 бит сдвигового регистра заполнены нулями, а младшие 5 бит -- единицами. В этот момент на 1 такт возводится сигнал \kword{ps2\_clk\_negedge}, который используется в остальной схеме.}
\lstinputlisting[caption={Описание схемы определения нисходящего фронта сигнала ps2\_clk}]{./code_examples/lab_6/clk_detect.v}
\par{Основой контроллера будет конечный автомат со следующей последовательностью действий:}
\begin{enumerate}[noitemsep,topsep=0pt, after=\vspace{2pt}]
\item Состояние покоя;
\item Прием стартового бита и его проверка. Если стартовый бит не равен 0 переходим в состояние покоя;
\item Прием данных;
\item Прием бита четности и стопового бита их проверка.
\item При правильных значениях стопового бита и бита четности формирования сигнала готовности данных.
\item Переход в состояние покоя.
\end{enumerate}
\lstinputlisting[caption={Описание конечного автомата контроллера}]{./code_examples/lab_6/state_m.v}
\par{Конечный автомат имеет три состояния \eng{IDLE, RECEIVE\_DATA, CHECK\_PARITY\_STOP\_BIT}.}
\par{\eng{IDLE} – состояние покоя в котором контроллер ожидает первого отрицательного фронта \kword{ps2\_clk}. Переход в состояние \eng{RECEIVE\_DATA} происходит по отрицательному фронту \kword{ps2\_clk} если \kword{ps2\_dat} равно 0, то есть пришел стартовый бит, иначе остаемся в \eng{IDLE}.}
\par{\eng{RECEIVE\_DATA} – состояние в ходе, которого происходит прием данных и бита четности. Переход в состояние \eng{CHECK\_PARITY\_STOP\_BIT} происходит при счетчике бит равном 8. Отсчитано 8 бит данных и идет прием бита четности.}
\par{Последнее состояние \eng{CHECK\_PARITY\_STOP\_BITS} длительностью в один период \kword{ps2\_clk}. В \eng{CHECK\_PARITY\_STOP\_BITS} происходит проверка бита паритета и стопового бита.}
\lstinputlisting[caption={Описание сдвигового регистра}]{./code_examples/lab_6/shift.v}
\par{Сдвиговый регистр необходим для приема и хранения данных и бита четности. По этому, разрядность регистра равна 9. По завершению транзакции в восьмом бите хранится бит четности с 7-0 бит данные. Данные непрерывным присваиванием выведены на внешнюю шину модуля.}
\par{Если обратиться к началу лабораторной работы то стоит заметить что данные передаются по интерфейсу \eng{PS/2} начиная с младшего бита. Логично будет использовать схему работы сдвигового регистра, при которой сдвиг происходит вправо. Таким образом, первый принятый бит окажется в 0 ячейке сдвигового регистра по окончании транзакции.}
\par{Запись в сдвиговый регистр происходит по отрицательному фронту \kword{ps2\_clk} и состоянию конечного автомата \eng{RECEIVE\_DATA}.}
\lstinputlisting[caption={Описание счетчика принятых бит}]{./code_examples/lab_6/count_bit.v}
\par{Счетчик принятых бит служит для контроля за процессом приема. Инкрементация счетчика происходит только в состоянии \eng{RECEIVE\_DATA}.}
\lstinputlisting[caption={Описание вырабатывания сигнала готовности к передаче}]{./code_examples/lab_6/parity.v}
\par{Последним нерассмотренным моментом остался вопрос генерации сигнала готовности данных. Как было сказано ранее сигнал готовности генерируется к конце транзакции в случае успешного приема и равен 1 до начала следующей транзакции. То есть пока конечный автомат в состоянии \eng{IDLE}.}
\par{Условием успешного окончания транзакции является стоповый бит равный 1 и бит четности равный рассчитанному значению.}
\par{Генерация сигнала готовности происходит в момент приема стопового бита. По этому для его проверки достаточно убедиться что значение на линии \kword{ps2\_dat} равно 1.}
\par{Для проверки бита четности необходимо рассчитать четность принятых 8 бит данных и сравнить ее с значением бита четности. Для упрощения читаемости кода используется функция расчета честности для 8 разрядного регистра согласно правилу отрицания побитового \eng{XOR} регистра. Правило расчета бита паритета можно узнать из стандарта на интерфейс \eng{PS/2}.}
\section{Полное описание контроллера PS/2}
\lstinputlisting[caption={Пример реализации контроллера PS/2}]{./code_examples/lab_6/ps2.v}
\section{Задание лабораторной работы:}
\begin{enumerate}[noitemsep,topsep=0pt, after=\vspace{2pt}]
\item{Ознакомиться с спецификацией на интерфейс \eng{PS/2} и представленной реализацией контроллера клавиатуры.}
\item{Построить временные диаграммы его работы с помощью САПР \eng{Altera Quartus}.}
\item{Подготовиться к выполнению индивидуального задания с использованием предложенного контроллера на лабораторной работе.}
\end{enumerate}
\section{Варианты индивидуальных заданий}
\begin{enumerate}
\setlength\itemsep{1em}
\item{
Выводить на семисегментные индикаторы только коды клавиш ''W'', ''A'', ''S'', ''D'' и ''пробел''.
}
\item{
Выводить на семисегментные индикаторы только коды клавиш ''1'', ''3'', ''5'', ''7'', ''9''.
}
\item{
Выводить на семисегментные индикаторы только коды клавиш, находящихся на num-pad.
}
\item{
Выводить на семисегментные индикаторы только коды клавиш ''Q'', ''W'', ''E'', ''R'', ''T'', ''Y''.
}
\item{
Выводить на семисегментные индикаторы только коды клавиш ''I'', ''D'', ''Q'', ''D''.
}
\item{
Выводить на семисегментные индикаторы только коды клавиш со стрелками.
}
\item{
Выводить на семисегментные индикаторы только коды клавиш ''I'', ''D'', ''K'', ''F'', ''A''.
}
\item{
Выводить на семисегментные индикаторы только коды клавиш F1 -- F12.
}
\item{
Выводить на семисегментные индикаторы только коды клавиш ''Z'', ''X'', ''C'', ''V'', ''B'', ''N''.
}
\item{
Выводить на семисегментные индикаторы только коды клавиш ''L'', ''J'', ''S'', ''P'', ''Q'', ''K''.
}
\end{enumerate}