-
Notifications
You must be signed in to change notification settings - Fork 6
/
lab_2.tex
367 lines (291 loc) · 24.2 KB
/
lab_2.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
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
\chapter{Лабораторная работа №2\\Регистры и счётчики}
\par{Функции цифровых устройств, естественно, не сводятся к реализации разнообразных ФАЛ. Нам хотелось бы использовать цифровые устройства для обработки информации, вычислений. Но для осуществления этих возможностей нам недостаёт элемента памяти, который мог бы хранить промежуточные результаты. Ведь невозможно сделать калькулятор, если нет возможности сохранить вводимые числа и результат вычисления.}
\par{Элемент памяти — один из самых важных элементов цифровых устройств. Чтобы не делать ошибок при разработке цифровых устройств, необходимо понять место этого узла, его идею и инструменты языка \eng{Verilog}, связанные с ним.}
\par{Первый элемент памяти, который мы рассмотрим — это \textbf{защелка} (англ. \eng{latch}).}
\par{Защелка является основой всех элементов памяти. Она состоит из двух элементов И-НЕ (или из двух элементов ИЛИ-НЕ, в зависимости от базиса, выбранного при проектировании), соединенных по следующей схеме:}
\begin{figure}[H]
\centering
\def\svgwidth{\columnwidth}
\includesvg{images/lab_2/RS_latch}
\caption{Структура \eng{RS}-защелки}
\end{figure}
\par{У защелки два входа и два выхода. Входами являются сигналы \quotes{сброс} и \quotes{установка в единицу} или по-английски \quotes{reset} и \quotes{set}. В зависимости от элементов, из которых состоит защелка, полярность входных сигналов будет меняться. В базисе И-НЕ сброс и установка происходят, когда соответственно сигналы \eng{R} или \eng{S} находятся в нуле, поэтому их обозначают как \quotes{не-сброс} и \quotes{не-установка}, чтобы отразить этот факт. Выход защелки — это тот бит данных, который она хранит. Два выхода отличаются полярностью — один из них инвертирует хранимый бит. Ниже приведена таблица со всеми возможными комбинациями входных сигналов и временная диаграмма работы защелки.}
\begin{figure}[H]
\centering
\begin{tikztimingtable}[%
timing/dslope=0.1,
timing/.style={x=6.5ex,y=2ex},
very thick,
x=4ex,
timing/rowdist=3ex,
timing/name/.style={font=\sffamily\scriptsize},
]
S & 1L 4H \\
R & 3H 2L \\
Q & 3H 2L \\
\extracode
\begin{pgfonlayer}{background}
\draw [->,>=latex] (0,0ex) -- (32.5ex+1,0ex);
\draw [->,>=latex] (0,-3ex) -- (32.5ex+1,-3ex);
\draw [->,>=latex] (0,-6ex) -- (32.5ex+1,-6ex);
\draw [->,>=latex] (0,-6ex) -- (0,4ex);
\node [align=center,scale=0.6,text width=6ex] at (2ex, -8ex) {Установка\\в \quotes{1}};
\node [align=center,scale=0.6,text width=6ex] at (12ex,-8ex) {Хранение};
\node [align=center,scale=0.6,text width=6ex] at (26ex,-8ex) {Сброс в \quotes{0}};
\begin{scope}[semitransparent ,semithick]
\foreach \i in {6.5ex, 19.5ex} {
\draw[darkgray,dotted] (\i,4ex) -- (\i,-10ex);
}
\end{scope}
\end{pgfonlayer}
\end{tikztimingtable}
\caption{Временная диаграмма работы \eng{RS}-защелки}
\end{figure}
\par{Опишем защелку на языке \eng{Verilog}, опираясь на её структуру, которую мы рассмотрели выше. Нам понадобятся два входа, два выхода и два элемента И-НЕ, которые мы опишем с помощью операций И (оператор \&) и НЕ (оператор \textasciitilde).}
\lstinputlisting[caption={Описание \eng{RS}-защелки на языке \eng{Verilog HDL}}, ]{./code_examples/lab_2/rs_latch.v}
\par{Элемент памяти нам, прежде всего, нужен для хранения данных. Для того, чтобы защелкой стало удобнее пользоваться, немного изменим схему подключения управляющих сигналов.}
\begin{figure}[H]
\centering
\def\svgwidth{\columnwidth}
\includesvg{images/lab_2/D_latch}
\caption{Структура \eng{D}-защелки}
\end{figure}
\par{Защелка теперь будет работать следующим образом: при высоком уровне на входе \quotes{разрешить работу} (\qeng{enable}) данные со входа \quotes{данные} (\qeng{data}) будут проходить через защелку на выход, при низком уровне на входе \quotes{разрешить работу} защелка будет сохранять на выходе последнее значение со входа \quotes{данные}, которое было до переключения сигнала \quotes{разрешить работу}. Работа такой защелки показана на временной диаграмме ниже.}
\begin{figure}[H]
\centering
\begin{tikztimingtable}[%
timing/dslope=0.1,
timing/.style={x=6ex,y=3ex},
very thick,
x=5ex,
timing/rowdist=4ex,
timing/name/.style={font=\sffamily\scriptsize},
]
EN & 1L 2H 2L \\
D & 3H 2L \\
Q & 1X 2H 2L \\
\extracode
\begin{pgfonlayer}{background}
\draw [->,>=latex] (0,0ex) -- (30ex+0.4,0ex);
\draw [->,>=latex] (0,-4ex) -- (30ex+0.4,-4ex);
\draw [->,>=latex] (0,-8ex) -- (30ex+0.4,-8ex);
\draw [->,>=latex] (0,-8ex) -- (0,4ex);
\node [scale=0.6] at (3ex, -9ex) {Хранение};
\node [scale=0.6] at (12ex,-9ex) {Запись};
\node [scale=0.6] at (24ex,-9ex) {Хранение};
\draw [->,thick] (-1.6,-1.9) to [out=-90,in=180] (-0.6,-3.4) to [out=0,in=90] (2.5ex,-4);
\node [align=center, above, text width= 10 ex, scale=0.8] at (-2.3,-1.9) {неизвестное значение};
\begin{scope}[semitransparent ,semithick]
\foreach \i in {6ex, 18ex} {
\draw[darkgray,dotted] (\i,4ex) -- (\i,-10ex);
}
%\vertlines[darkgray,dotted]{6ex,18ex}
\end{scope}
\end{pgfonlayer}
\end{tikztimingtable}
\caption{Временная диаграмма работы \eng{D}-защелки}
\end{figure}
\par{Как мы уже говорили, использовать структурные описания не всегда удобно. В большинстве случаев использовать поведенческое описание намного эффективнее. Поведенческое описание часто формулируется гораздо лаконичнее, и, так как его легче понять человеку, улучшается читаемость кода и уменьшается вероятность ошибок при его написании.}
\lstinputlisting[caption={Поведенческое описание \eng{D}-защелки на языке \eng{Verilog HDL}}, ]{./code_examples/lab_2/d_latch.v}
\par{Если добавить к этой схеме еще две защелки, то можно привязать изменение \quotes{содержимого} защелки к переходу управляющего сигнала из \quotes{0} в \quotes{1}, то получим следующую структуру:}
\begin{figure}[H]
\centering
\def\svgwidth{\columnwidth}
\includesvg{images/lab_2/dff_struct}
\caption{Структура \eng{D}-триггера}
\end{figure}
\par{Эту схему можно немного доработать, введя управляющие сигналы сброса, установки в единицу и разрешения работы. Упрощенно такая схема изображается следующим образом.}
\begin{figure}[H]
\centering
\def\svgwidth{\columnwidth}
\includesvg{images/lab_2/dff}
\caption{Графическое обозначение \eng{D}-триггера}
\end{figure}
\par{Эта схема получила широчайшее применение в цифровой схемотехнике и называется \eng{d}-триггер (от слова \qeng{data} — данные). Ниже приведена временная диаграмма работы \eng{d}-триггера.}
\begin{figure}[H]
\centering
\begin{tikztimingtable}[%
timing/dslope=0.1,
timing/.style={x=3ex,y=2ex},
very thick,
x=3ex,
timing/rowdist=4ex,
timing/name/.style={font=\sffamily\scriptsize},
]
CLK & 3{c} N(C1) 2{c} N(C2) 2{c} N(c1) 2{c} N(c2) 2{c} N(C3) 2{c} N(C4) 2{c} N(c3) 2{c} N(c4) 2{c} N(c5) 2{c} N(c6) 2{c} N(c7) 2{c} N(c8) 2{c} N(c9) 2{c} N(c10) 1.5{c}\\
D & 1.5L N(D1) H N(D2) H N(d1) 1L N(d2) 1H N(D3) 1L N(D4) H N(d3) H N(d4) H N(d5) L N(d6) L N(d7) L N(d8) L N(d9) L N(d10) 0.5L\\
EN & 6.5H L N(E1) L N(E2) L N(E3) L N(E4) L N(E5) L N(e6) L N(E6) L N(E7) 0.5L\\
S & 12.5L N(S1) 0.5H 2L \\
R & 3L N(R1) 0.5H N(R2) H N(R3) 0.5H 10L\\
Q & 0.5X 2L 0.5H 2.5L 1H 6L 2.5H\\
\extracode
\draw [semithick, color=red]
(C1) ellipse (.1 and .2)
(C2) ellipse (.1 and .2)
(C3) ellipse (.1 and .2)
(C4) ellipse (.1 and .2)
(D1) ellipse (.1 and .2)
(D2) ellipse (.1 and .2)
(D3) ellipse (.1 and .2)
(D4) ellipse (.1 and .2)
(E1) ellipse (.1 and .2)
(E2) ellipse (.1 and .2)
(E3) ellipse (.1 and .2)
(E4) ellipse (.1 and .2)
(E5) ellipse (.1 and .2)
(E6) ellipse (.1 and .2)
(E7) ellipse (.1 and .2)
(S1) ellipse (.1 and .2)
(R1) ellipse (.1 and .2)
(R2) ellipse (.1 and .2)
(R3) ellipse (.1 and .2);
\node [color=red,scale=.8] at (c1) {$\times$};
\node [color=red,scale=.8] at (c2) {$\times$};
\node [color=red,scale=.8] at (c3) {$\times$};
\node [color=red,scale=.8] at (c4) {$\times$};
\node [color=red,scale=.8] at (c5) {$\times$};
\node [color=red,scale=.8] at (c6) {$\times$};
\node [color=red,scale=.8] at (c7) {$\times$};
\node [color=red,scale=.8] at (c8) {$\times$};
\node [color=red,scale=.8] at (c9) {$\times$};
\node [color=red,scale=.8] at (c10) {$\times$};
\node [color=red,scale=.8] at (d1) {$\times$};
\node [color=red,scale=.8] at (d2) {$\times$};
\node [color=red,scale=.8] at (d3) {$\times$};
\node [color=red,scale=.8] at (d4) {$\times$};
\node [color=red,scale=.8] at (d5) {$\times$};
\node [color=red,scale=.8] at (d6) {$\times$};
\node [color=red,scale=.8] at (d7) {$\times$};
\node [color=red,scale=.8] at (d8) {$\times$};
\node [color=red,scale=.8] at (d9) {$\times$};
\node [color=red,scale=.8] at (d10) {$\times$};
\node [color=red,scale=.8] at (e6) {$\times$};
\draw [color=red,semithick,shorten >=.3ex,shorten <=.3ex] (C1) -- (D1);
\draw [color=red,semithick,shorten >=.3ex,shorten <=.3ex] (C2) -- (D2);
\draw [color=red,semithick,shorten >=.3ex,shorten <=.3ex] (C3) -- (D3);
\draw [color=red,semithick,shorten >=.3ex,shorten <=.3ex] (C4) -- (D4);
\begin{pgfonlayer}{background}
\draw [->,>=latex] (0,0ex) -- (\twidth+0.2,0ex);
\draw [->,>=latex] (0,-4ex) -- (\twidth+0.2,-4ex);
\draw [->,>=latex] (0,-8ex) -- (\twidth+0.2,-8ex);
\draw [->,>=latex] (0,-12ex) -- (\twidth+0.2,-12ex);
\draw [->,>=latex] (0,-16ex) -- (\twidth+0.2,-16ex);
\draw [->,>=latex] (0,-20ex) -- (\twidth+0.2,-20ex);
\draw [->,>=latex] (0,-20ex) -- (0,4ex);
\end{pgfonlayer}
\end{tikztimingtable}
\caption{Пример работы регистра}
\end{figure}
\par{Заметим, что сигнал \eng{C} называют \quotes{тактирующим} сигналом или \quotes{сигналом синхронизации}. Обычно в роли этого сигнала выступает сигнал от внешнего источника (чаще всего кварцевого резонатора) со стабильной частотой. А сами цифровые устройства, для работы которых необходим сигнал синхронизации, называют синхронными.}
\par{Сигнал синхронизации играет очень большую роль в цифровых устройствах. Прежде всего, он необходим для того, чтобы избежать непредсказуемого и нестабильного поведения триггеров в цифровых устройствах.}
\lstinputlisting[caption={Описание \eng{D}-триггера на языке \eng{Verilog HDL}}, ]{./code_examples/lab_2/d_flipflop.v}
\par{В описании появилось новое ключевое слово \eng{posedge}. Оно используется только в списке чувствительности блока \eng{always} и означает событие перехода сигнала, имя которого стоит после этого ключевого слова, из состояния \quotes{0} в состояние \quotes{1}.}
\par{Ключевое слово \eng{posedge} было введено прежде всего для того, чтобы описывать схемы, содержащие триггеры. Ведь триггеры, как мы уже говорили, могут менять своё состояние только в момент положительного фронта (англ. \eng{positive edge}) сигнала синхронизации.}
\par{Добавление в список чувствительности события \eng{posedge rst} позволяет описать поведение триггера в момент асинхронного сброса: как только случается переход \eng{rst} из \quotes{0} в \quotes{1} срабатывает блок \eng{always} и проверка условия \kword{if} (\eng{rst}) дает положительный результат, триггер сбрасывается в \quotes{0}.}
\par{}
\par{Если объединить несколько триггеров в группу, то получится то, что в цифровой схемотехнике называют \quotes{регистр}.}
\lstinputlisting[caption={Описание регистра на языке \eng{Verilog HDL}}, ]{./code_examples/lab_2/register.v}
\par{Элементы памяти позволяют нам сохранять информацию для дальнейшей обработки или хранить готовый результат вычисления, хранить промежуточные результаты.}
\par{Запомните описание регистра. Оно используется при проектировании практически любого цифрового устройства с помощью \eng{Verilog}.}
\par{Необходимо отметить важную концепцию языка \eng{Verilog}. \textbf{Переменные типа \eng{reg} могут быть изменены только в пределах одного блока \eng{always}. Переменные доступны для проверки в любом из блоков, но изменять их значение можно только в одном из них.}}
\lstinputlisting[caption={Пример присвоения значения переменной а разных блоках \eng{always} на языке \eng{Verilog HDL}}, ]{./code_examples/lab_2/error_example.v}
\par{Одной из простейших, и в тоже время широко распространённой, цифровой схемой на основе регистров является счётчик.}
\par{Счётчик считает количество тактов, которое прошло с момента его обнуления.}
\par{Такая простая схема, тем не менее, используется практически в каждом цифровом устройстве. Как будет показано дальше, счётчик легко можно доработать таким образом, чтобы отсчитывались не такты, а какие-то события. Например, событиями могут быть: нажатие кнопки, принятие пакета данных, срабатывание датчика, выполнение какого-то условия (периодическое) и другое.}
% \par{}
\par{Итак, для того чтобы реализовать счетчик нам понадобится регистр и сумматор. Причем сумматор будет складывать значение, хранящееся в регистре с константой (в нашем случае единицей) а результат сложения будет поступать на вход регистра.}
% \par{}
\par{В результате получим следующую схему:}
\begin{figure}[H]
\centering
\def\svgwidth{\columnwidth}
\includesvg{images/lab_2/counter}
\caption{Структура восьмибитного счетчика}
\end{figure}
\par{На временной диаграмме ниже хорошо видно как работает счётчик:}
\begin{figure}[H]
\centering
\begin{tikztimingtable}[%
timing/dslope=0.1,
timing/.style={x=3ex,y=2ex},
very thick,
x=3ex,
timing/rowdist=3ex,
timing/name/.style={font=\sffamily\scriptsize},
]
CLK & 18{c} \\
R & 1L 0.5H 7.5L \\
EN & 2L 3H 2L 2H\\
count & 1X 2D{0} 1D{1} 1D{2} 3D{3} 1D{4} \\
\extracode
\begin{pgfonlayer}{background}
\draw [->,>=latex] (0,0ex) -- (\twidth+0.2,0ex);
\draw [->,>=latex] (0,-3ex) -- (\twidth+0.2,-3ex);
\draw [->,>=latex] (0,-6ex) -- (\twidth+0.2,-6ex);
\draw [->,>=latex] (0,-9ex) -- (\twidth+0.2,-9ex);
\draw [->,>=latex] (0,-9ex) -- (0,3ex);
\end{pgfonlayer}
\end{tikztimingtable}
\caption{Пример работы регистра}
\end{figure}
\par{Опишем поведение такого счётчика на \eng{Verilog}.}
\lstinputlisting[caption={Описание восьмиитного счетчика на языке \eng{Verilog HDL}}, ]{./code_examples/lab_2/counter.v}
\par{Для того чтобы можно было подсчитывать события, а не переходы сигнала синхронизации из \quotes{0} в \quotes{1} понадобится ввести еще одну схему. Её смысл и назначение заключается в следующем: нам необходимо из асинхронного события получить синхронный сигнал единичной длительности. Тогда, подавая такой сигнал на вход \eng{enable} счётчика, мы сможем считать количество произошедших событий.}
\par{Ниже представлена схема, позволяющая сделать это:}
\begin{figure}[H]
\centering
\def\svgwidth{\columnwidth}
\includesvg{images/lab_2/register}
\caption{Структура регистра на \eng{D}-триггерах}
\end{figure}
\begin{figure}[H]
\centering
\begin{tikztimingtable}[%
timing/dslope=0.1,
timing/.style={x=3ex,y=2ex},
very thick,
x=3ex,
timing/rowdist=3ex,
timing/name/.style={font=\sffamily\scriptsize},
]
CLK & 22{c} \\
D & 1.5L 4.5H 5L \\
Q & 3.5L 1H 6.5L \\
\extracode
\begin{pgfonlayer}{background}
\draw [->,>=latex] (0,0ex) -- (\twidth+0.2,0ex);
\draw [->,>=latex] (0,-3ex) -- (\twidth+0.2,-3ex);
\draw [->,>=latex] (0,-6ex) -- (\twidth+0.2,-6ex);
\draw [->,>=latex] (0,-6ex) -- (0,3ex);
\end{pgfonlayer}
\end{tikztimingtable}
\caption{Пример работы регистра}
\end{figure}
\par{Естественно такая схема работает только тогда, когда входной сигнал изменяется с частотой меньшей, чем частота синхронизации.}
\par{Сигнал \eng{out} в таком случае подключается к входу \eng{enable} счётчика.}
\section{Задание лабораторной работы}
\par{Описать на языке \eng{Verilog} цифровое устройство, функционирующее согласно следующим принципам:
\begin{enumerate}[noitemsep,topsep=0pt, after=\vspace{2pt}]
\item Ввод информации происходит с переключателей \eng{SW}[9:0] и кнопок \eng{KEY}[0], \eng{KEY}[1]. Внешний источник сигнала синхронизации: \eng{CLK}50;
\item \eng{KEY}[1] должна функционировать как общий асинхронный сброс устройства;
\item При нажатии на \eng{KEY}[0] записывать данные с \eng{SW}[9:0] в десятиразрядный регистр;
\item Содержимое десятиразрядного регистра выводить на \eng{LEDR}[9:0];
\item При нажатии на \eng{KEY}[0] увеличивать 8-ми разрядный счётчик нажатий на 1, если произошло событие, указанное в индивидуальном задании студента;
\item Содержимое счётчика выводить в шестнадцатеричной форме на \eng{HEX}0 и \eng{HEX}1 (цифры с 0 до 9 и буквы \eng{A}, \eng{B}, \eng{C}, \eng{D}, \eng{E}, \eng{F})
\end{enumerate}}
\par{Выполнив описание модуля на языке \eng{Verilog} необходимо построить временные диаграммы его работы с помощью САПР \eng{Altera Quartus}.}
\par{Привязать входы модуля к переключателям \eng{SW}, отладочной платы, а выход к шине \eng{HEX}0[6:0], получить прошивку для ПЛИС и продемонстрировать её работу.}
\section{Пример индивидуального задания}
\par{Событием является наличие 3 и более единиц на SW[9:0] в момент записи в регистр.}
\lstinputlisting[caption={Решение индивидуального задания (фрагмент кода лабораторной работы)}, ]{./code_examples/lab_2/task_solution.v}
\section{Вопросы к защите лабораторной работы}
\begin{enumerate}[noitemsep,topsep=0pt, after=\vspace{2pt}]
\item Какие элементы памяти вы изучили в данной лабораторной работе?
\item Чем отличается \eng{RS}-защелка от \eng{D}-защелки?
\item Какие входы могут быть у триггера? Перечислите все и назовите их функции.
\item Какие блоки вашего цифрового устройства синхронные? Какие нет? Почему?
\item Какой фрагмент вашего кода описывает вывод значения счетчика на семи сегментный индикатор? Как называется эта цифровая схема?
\item Продемонстрируйте код реализующий индивидуальное задание.
\item Покажите в коде лабораторной код счётчика.
\item Что такое сигнал синхронизации?
\end{enumerate}