OpenCores
URL https://opencores.org/ocsvn/wbuart32/wbuart32/trunk

Subversion Repositories wbuart32

[/] [wbuart32/] [trunk/] [doc/] [src/] [spec.tex] - Blame information for rev 2

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 dgisselq
\documentclass{gqtekspec}
2
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3
%%
4
%% Filename:    spec.tex
5
%%
6
%% Project:     wbuart32, a full featured UART with simulator
7
%%
8
%% Purpose:     To describe, for LaTeX, how to build the specification file
9
%%              for the wbuart32 core(s).  This file is not nearly as
10
%%      interesting as the file it creates, so I suggest you read spec.pdf
11
%%      first, before deciding you are really interested in this file.
12
%%
13
%% Creator:     Dan Gisselquist, Ph.D.
14
%%              Gisselquist Technology, LLC
15
%%
16
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
17
%%
18
%% Copyright (C) 2015-2016, Gisselquist Technology, LLC
19
%%
20
%% This program is free software (firmware): you can redistribute it and/or
21
%% modify it under the terms of  the GNU General Public License as published
22
%% by the Free Software Foundation, either version 3 of the License, or (at
23
%% your option) any later version.
24
%%
25
%% This program is distributed in the hope that it will be useful, but WITHOUT
26
%% ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY or
27
%% FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
28
%% for more details.
29
%%
30
%% You should have received a copy of the GNU General Public License along
31
%% with this program.  (It's in the $(ROOT)/doc directory, run make with no
32
%% target there if the PDF file isn't present.)  If not, see
33
%% <http://www.gnu.org/licenses/> for a copy.
34
%%
35
%% License:     GPL, v3, as defined and found on www.gnu.org,
36
%%              http://www.gnu.org/licenses/gpl.html
37
%%
38
%%
39
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
40
%%
41
%%
42
\usepackage{import}
43
\usepackage{bytefield}
44
\usepackage{amsmath}
45
\project{WBUART32}
46
\title{Specification}
47
\author{Dan Gisselquist, Ph.D.}
48
\email{dgisselq (at) opencores.org}
49
\revision{Rev.~0.1}
50
\begin{document}
51
\pagestyle{gqtekspecplain}
52
\titlepage
53
\begin{license}
54
Copyright (C) \theyear\today, Gisselquist Technology, LLC.
55
 
56
This project is free software (firmware): you can redistribute it and/or
57
modify it under the terms of  the GNU General Public License as published
58
by the Free Software Foundation, either version 3 of the License, or (at
59
your option) any later version.
60
 
61
This program is distributed in the hope that it will be useful, but WITHOUT
62
ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY or
63
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
64
for more details.
65
 
66
You should have received a copy of the GNU General Public License along
67
with this program.  If not, see \texttt{http://www.gnu.org/licenses/} for a copy.
68
\end{license}
69
\begin{revisionhistory}
70
0.1 & 8/26/2016 & D. Gisselquist & Initial Draft Specification\\\hline
71
\end{revisionhistory}
72
% Revision History
73
% Table of Contents, named Contents
74
\tableofcontents
75
\listoffigures
76
\listoftables
77
\begin{preface}
78
It may be that building a UART is a mandatory coming of age task for any HDL
79
designer.  The task is simple, easy, and there's not all that much to it.
80
This project comes out of some of my first experiences with Verilog.
81
 
82
Since then, it has been augmented with a very useful capability for
83
simulating a UART connection when using Verilator.  It is this, perhaps
84
unusual, addition to the core set that makes this core worth taking note of.
85
 
86
I hope you find it useful.
87
\end{preface}
88
 
89
\chapter{Introduction}\label{ch:intro}
90
\pagenumbering{arabic}
91
\setcounter{page}{1}
92
%
93
% Introduction
94
%
95
% This section contains the introduction to the core, describing both its
96
% use and its features.
97
%
98
 
99
% What is old
100
The Universal Asynchronous Serial Transport, or UART, has become quite the
101
common protocol between devices.  It is simple to wire up, easy to use, and
102
easy to process.  This core provides one implementation of the logic necessary
103
to use such a communications scheme.
104
 
105
% What does the old lack?
106
% What is new
107
% What does the new have that the old lacks
108
% What performance gain can be expected?
109
 
110
While you are likely to find many UART examples out there, this particular
111
UART implementation offers something many of these other examples do not: a
112
Verilator simulation capability.  This will allow the user to connect, via
113
a TCP/IP port or a telnet application, to the UART of their desired chip.  As
114
a result, full two-way interaction can be had between a simulation and a
115
terminal or other port.  Indeed, this may even be sufficient to connect a
116
CPU, capable of running Linux, to a terminal to verify that yes it can truly
117
run Linux--all within Verilator.
118
 
119
\chapter{Architecture}\label{ch:arch}
120
 
121
The HDL portion of the core itself consists of three files: {\tt rxuart.v},
122
{\tt txuart.v}, and {\tt wbuart-insert.v}.  These are, respectively, the
123
receive UART code, the transmit UART code, and an example of how the receiver
124
and transmitter may be connected to a Wishbone bus.
125
 
126
Each of the core files, {\tt rxuart.v} and {\tt txuart.v}, are fully capable.
127
They each accept a 29--bit setup value specifying baud rate, the number of bits
128
per byte (between 5 and 8), whether or not parity is used, whether that parity
129
is even, odd, or fixed mark or fixed space.  This setup register will be
130
discussed further in Chap.\ref{ch:registers}.
131
 
132
A further note on the {\tt rxuart.v} module is in order.  This module double
133
latches the input, in the proper two buffer fashion to avoid problems with
134
metastability.  Then, upon the detection of the start bit (i.e. a high to low
135
transition), the port waits a half of a baud, and then starts its baud clock
136
so as to sample in the middle of every baud following.  The result of this is
137
a timing requirement: after $N+2$ baud intervals ($N+3$ if parity is used),
138
where $N$ is the number of bits per byte, this calculated middle sample must
139
still lie within the associated bit period.  This leaves us with the criteria
140
that,
141
\begin{eqnarray}
142
\left|\left(N+2\right)
143
        \left(\frac{f_{\mbox{\tiny SYS}}}{f_{\mbox{\tiny BAUD}}}
144
                -{\mbox{\tt CKS}}\right)\right|
145
        &<& \frac{f_{\mbox{\tiny SYS}}}{2f_{\mbox{\tiny BAUD}}},
146
        \label{eqn:baudlimit}.
147
\end{eqnarray}
148
where $f_{\mbox{\tiny SYS}}$ is the system clock frequency,
149
$f_{\mbox{\tiny BAUD}}$ is the baud rate or frequency,
150
{\tt CKS} is the number of clocks per baud as set in the configuration
151
register, and $N$ is the number of bits per byte.  What this means is that,
152
for transmission rates where $f_{\mbox{\tiny BAUD}}$ approaches
153
$f_{\mbox{\tiny SYS}}$, the number of data rates that can actually be
154
synthesized becomes limited.
155
 
156
Connecting to either {\tt txuart.v} or {\tt rxuart.v} is quite simple.  Both
157
files have a data port and a strobe.  To transmit, set the data and strobe
158
lines.  Drop the strobe line as soon as the strobe is asserted and the busy line
159
is not.  Likewise, to connect to the {\tt rxuart.v} port, there is a data
160
and a strobe.  This time, though, these two wires are outputs of the port as
161
opposed to inputs.
162
When the strobe is high, the data is valid.  It will only be high for one
163
clock period.  If you wish to connect this output to a bus, a register will be
164
needed to hold the strobe high until the data is read.  Also, while the strobe
165
is high, the {\tt o\_break} line will indicate whether the receiver is in a
166
``break'' state, {\tt o\_frame\_err} will indicate whether or not there was a
167
framing error (i.e., no stop bit), and {\tt o\_parity\_err} will indicate
168
wheher or not the parity matched.
169
 
170
The {\tt tx\_busy} line may be inverted and connected to a transmit interrupt
171
line.  In a similar fashion, the {\tt rx\_stb} line, or the bus equivalent of
172
{\tt rx\_ready}, may be used for receive interrupt lines.
173
 
174
An example of how to put this configuration together is found in
175
{\tt wbuart-insert.v}.  In this example given, the {\tt rx\_data} register
176
will have only the lower eight bits set if the data is valid, higher bits will
177
be set upon error conditions, and cleared automatically upon the next byte read.
178
In a similar fashion, the {\tt tx\_data} register can be written to with a byte
179
in order to transmit that byte.  Writing bit nine will place the transmitter
180
into a ``break'' condition, only cleared by writing a zero to that bit later.
181
Reading from the {\tt tx\_data} register can also be used to determine if the
182
transmitter is busy (via polling), whether it is currently in a break condition,
183
or even what bit is currently being placed to the output port.
184
 
185
The C++ simulation portion of the code revolves around the file
186
{\tt bench/cpp/uartsim.cpp} and its associated header.  This file defines a
187
class, {\tt UARTSIM}, which can be used to connect the UART to a TCP/IP stream.
188
When initialized, this class takes, as input, the TCP/IP port number that the
189
class is to connect with.  Once connected, using this is as simple as
190
calculating the receive input bit from the transmit output bit when the
191
clock is low, and the core takes care of everything else.
192
 
193
\chapter{Operation}\label{ch:ops}
194
 
195
% This section describes the operation of the core.  Specific sequences, such
196
% as startup sequences, as well as the modes and states of the block should be
197
% described.
198
%
199
 
200
To use the core, a couple of steps are required.  First, wire it up.  The
201
{\tt wbuart-insert.v} file should provide a good example of how to wire it up.
202
Second, set the UART configuration register.  This is ideally set in an
203
initial statement within the code somewhere, but can easily be set elsewhere
204
by writing to this register from the bus.
205
 
206
From a simulation standpoint, it will also need to be wired up.  Somewhere,
207
internal to the top--level Verilator C++ simulation file, you'll want to
208
have a line similar to,
209
\begin{tabbing}
210
{\tt if (!clk)} \= \\
211
\> {\tt tb->i\_rx} {\tt = } {\tt uartsim(tb->o\_uart, setup);}
212
\end{tabbing}
213
 
214
To use the transmitter, set the {\tt i\_stb} and {\tt i\_data} wires.  Drop
215
the strobe line any time after {\tt (i\_stb)\&\&(!o\_busy)}.
216
 
217
To use the receiver, grab the data any time {\tt o\_stb} is true.
218
 
219
From the standpoint of the bus, there are two ways to handle receiving and
220
transmitting: polling and interrupt based, although both work one character at
221
a time.  To poll, repeatedly read the receive data register until only no
222
bits but the bottom eight are set.  This is an indication that the byte is
223
valid.  Alternatively, you could wait until the an interrupt line is set and
224
then read.  In the {\tt wbuart-insert.v} example, the {\tt rx\_int} line will
225
be set, and automatically cleared upon any read.  To write, one can read from
226
the transmit data register until the eighth bit, the {\tt tx\_busy} bit, is
227
cleared, and then transmit.  Alternatively, this negation of this bit may be
228
connected to an interrupt line.  Writing to the port while idle will start
229
it transmitting.  Writing to the port while it is busy will fill a one word
230
buffer that will get sent as soon as the port is idle for one clock.
231
 
232
 
233
\chapter{Registers}\label{ch:registers}
234
% This section specifies all internal registers.  It should completely cover
235
% the interface between the CPU and the host as seen from the software point
236
% of view.
237
 
238
% List of Registers
239
 
240
% Register 1 Description
241
%
242
% You shall choose the style of register you prefer.  Do not use both options
243
% in one and the same document.  (Table of bits, vs. byetarray type of
244
% description).
245
 
246
The core really only has one register associated with it, which is the setup
247
register.  The format of this register is important, although not necessarily
248
trivial or obvious.  We'll cover two other registers here, though, associated
249
with the example wishbone connections from {\tt wbuart-insert.v}.  All three
250
of these registers are shown in Tbl.~\ref{tbl:reglist}.
251
\begin{table}
252
\begin{center}
253
\begin{reglist}
254
SETUP   & & 30 & R/W & UART configuration/setup register.\\\hline
255
RX\_DATA & & 12 & R(/W) & Read data, reads from the UART.\\\hline
256
TX\_DATA & & 12 & (R/)W & Transmit data: writes send out the UART.\\\hline
257
\end{reglist}\caption{UART Registers}\label{tbl:reglist}
258
\end{center}\end{table}
259
 
260
Since the connections presented are only examples, they are listed without
261
addresses, as their wishbone bus connectivity will be determined once they
262
are connected.
263
 
264
\section{Setup Register}
265
The setup register is perhaps the most critical of all the registers.  This
266
is shown in Fig.\ref{fig:SETUP}.
267
\begin{figure}\begin{center}
268
\begin{bytefield}[endianness=big]{32}
269
\bitheader{0-31}\\
270
\bitbox{2}{00}
271
\bitbox{2}{N}
272
\bitbox{1}{S}
273
\bitbox{1}{P}
274
\bitbox{1}{F}
275
\bitbox{1}{T}
276
\bitbox{24}{Baud CLKS}
277
\end{bytefield}
278
\caption{SETUP Register fields}\label{fig:SETUP}
279
\end{center}\end{figure}
280
It is designed so that, for any 8N1 protocol (eight data bits, no parity, one
281
stop bit), only the number of clocks per baud interval needs to be set.  The
282
top two bits are unused, making this a 30--bit number.  The other fields
283
are: $N$ sets the number of bits per word.  A value of zero corresponds
284
to 8--bit words, a value of one to seven bit words, and so forth up to a value
285
of three for five bit words.  $S$ determines the number of stop bits.  Set this
286
to one for two stop bits, or leave it clear for a single stop bit.  $P$
287
determines whether or not a parity bit exists (1 for parity, 0 for none),
288
while $F$ determines whether or not the parity is fixed.  Tbl.~\ref{fig:parity}
289
lists out the various values possible here.
290
\begin{table}\begin{center}
291
\begin{tabular}{ccc|l}
292
P&F&T&Setting \\\hline\hline
293
1 & 0 & 0 & Odd parity          \\\hline
294
1 & 0 & 1 & Even parity \\\hline
295
1 & 1 & 0 & Parity bit is a Space (1'b0)\\\hline
296
1 & 1 & 1 & Parity bit is a Mark (1'b1)\\\hline
297
 
298
\end{tabular}\caption{Parity setup}\label{tbl:parity}
299
\end{center}\end{table}
300
 
301
\section{RX\_DATA Register}
302
Fig.~\ref{fig:RXDATA}
303
\begin{figure}\begin{center}
304
\begin{bytefield}[endianness=big]{32}
305
\bitheader{0-31}\\
306
\bitbox{20}{20'h00}
307
\bitbox{1}{B}
308
\bitbox{1}{F}
309
\bitbox{1}{P}
310
\bitbox{1}{S}
311
\bitbox{8}{RWORD}
312
\end{bytefield}
313
\caption{RXDATA Register fields}\label{fig:RXDATA}
314
\end{center}\end{figure}
315
breaks out the various bit fields of the receive
316
data register used in the {\tt wbuart-insert.v} example of connecting it to
317
a bus.  In particular, the $B$ field indicates that the receive line is in
318
a break condition.  The $F$ and $P$ fields indicate that a frame error or
319
parity error were detected.  These are valid like the data word: when the strobe
320
line is set.  The $S$ field will be false when the {\tt RWORD} is valid.
321
Hence, if {\tt (RWORD \& ~0x0ff)} is zero there is a word ready to be received
322
without error.
323
 
324
\section{TX\_DATA Register}
325
Fig.~\ref{fig:TXDATA}
326
\begin{figure}\begin{center}
327
\begin{bytefield}[endianness=big]{32}
328
\bitheader{0-31}\\
329
\bitbox{20}{2'h00}
330
\bitbox{1}{C}
331
\bitbox{1}{O}
332
\bitbox{1}{B}
333
\bitbox{1}{S}
334
\bitbox{8}{TWORD}
335
\end{bytefield}
336
\caption{TXDATA Register fields}\label{fig:TXDATA}
337
\end{center}\end{figure}
338
breaks out the various bit fields of the transmit data register used in
339
{\tt wbuart-insert.v}.  The $C$ field indicates whether or not the receive
340
data line is high or low, the $O$ field indicates the same for the transmit
341
line.  These aren't particularly useful or valuable, but they don't fit in the
342
receive data register since they would violate the error condition detector.
343
They're thrown in here for whatever useful purpose one might find.  The $B$
344
field, when set, sends a break condition down the wire.  Writing to the TXDATA
345
register, clearing the $B$ field, will clear the transmitter from the break
346
condition without transmitting anything.  The $S$ field is similar to the RXDATA
347
strobe register.  It will be true whenever the transmitter is busy or a byte
348
is waiting for it.  It will be clear only when the transmitter is idle.
349
 
350
To use the transmitter, simply write a byte to the TXDATA register with the
351
upper 24--bits clear to transmit.
352
 
353
\chapter{Clocks}\label{ch:clocks}
354
The UART has been tested with a clock as fast as 200~MHz
355
(Tbl.~\ref{tbl:clocks}).
356
\begin{table}\begin{center}
357
\begin{clocklist}
358
{\tt i\_clk} & (System) & 200~MHz & & System clock\\\hline
359
\end{clocklist}
360
\caption{Clock Requirements}\label{tbl:clocks}
361
\end{center}\end{table}
362
It should be able to use slower clocks, but only subject to the ability to
363
properly set the baud rate as shown in Eqn.~\eqref{eqn:baudlimit} on
364
Page~\pageref{eqn:baudlimit}.
365
 
366
I do not recommend using this core with a baud rate greater than a quarter
367
of the system clock rate.
368
 
369
% This section specifies all of the clocks.  All clocks, clock domain passes
370
% and the clock relations should be described.
371
 
372
% Name | Source |    Rates (MHz)    | Remarks | Description
373
%               | Max|Min|Resolution|
374
\chapter{Wishbone Datasheet}\label{ch:wishbone}
375
 
376
Tbl.~\ref{tbl:wishbone}
377
\begin{table}[htbp]
378
\begin{center}
379
\begin{wishboneds}
380
Revision level of wishbone & WB B4 spec \\\hline
381
Type of interface & Slave, Read/Write, pipeline reads supported \\\hline
382
Port size & 32--bit \\\hline
383
Port granularity & 32--bit \\\hline
384
Maximum Operand Size & 32--bit \\\hline
385
Data transfer ordering & (Irrelevant) \\\hline
386
Clock constraints & None.\\\hline
387
Signal Names & \begin{tabular}{ll}
388
                Signal Name & Wishbone Equivalent \\\hline
389
                {\tt i\_wb\_clk} & {\tt CLK\_I} \\
390
                {\tt i\_wb\_cyc} & {\tt CYC\_I} \\
391
                {\tt i\_wb\_stb} & {\tt STB\_I} \\
392
                {\tt i\_wb\_we} & {\tt WE\_I} \\
393
                {\tt i\_wb\_addr} & {\tt ADR\_I} \\
394
                {\tt i\_wb\_data} & {\tt DAT\_I} \\
395
                {\tt o\_wb\_ack} & {\tt ACK\_O} \\
396
                {\tt o\_wb\_stall} & {\tt STALL\_O} \\
397
                {\tt o\_wb\_data} & {\tt DAT\_O}
398
                \end{tabular}\\\hline
399
\end{wishboneds}
400
\caption{Wishbone Datasheet}\label{tbl:wishbone}
401
\end{center}\end{table}
402
is required by the wishbone specification in order to declare the core as
403
wishbone compliant, and so it is included here.  It references the connections
404
exemplified by {\tt wbuart-insert.v}.  The big thing to notice is that this core
405
acts as a wishbone slave, and that all accesses to the core
406
registers are 32--bit reads and writes to this interface.
407
 
408
What this table doesn't show is that all accesses to the port take a single
409
clock.  That is, if the {\tt i\_wb\_stb} line is high on one clock, the
410
{\tt i\_wb\_ack} line will be high the next.  Further, the {\tt o\_wb\_stall}
411
line is tied to zero.
412
 
413
Also, this particular wishbone implementation assumes that if {\tt i\_wb\_stb},
414
then {\tt i\_wb\_cyc} will be high as well.  Hence it only checks whether or not
415
{\tt i\_wb\_stb} is true to determine if a transaction has taken place.  If your
416
bus does not meet this requirement, you'll need to AND {\tt i\_wb\_stb} with
417
{\tt i\_wb\_cyc} before using the core.
418
 
419
\chapter{I/O Ports}\label{ch:ioports}
420
% This section specifies all of the core IO ports
421
 
422
In it's simplest form, the UART offers simply two I/O ports: the {\tt i\_rx}
423
line to receive, and the {\tt o\_tx} line to transmit.  These lines need to be
424
brought to the outside of your design.  Within verilator, they need to be
425
connected inside your verilator test bench, as in:
426
\begin{tabbing}
427
{\tt if (!clk)} \= \\
428
\> {\tt tb->i\_rx} {\tt = } {\tt uartsim(tb->o\_uart, setup);}
429
\end{tabbing}
430
 
431
A more detailed discussion of the connections associated with these modules
432
can begin with Tbl.~\ref{tbl:rxports}, detailing the I/O ports of the
433
UART receiver, and Tbl.~\ref{tbl:txports},
434
\begin{table}\begin{center}\begin{portlist}
435
{\tt i\_clk}    & 1 & Input & The system clock \\\hline
436
{\tt i\_reset}  & 1 & Input & A positive, synchronous reset \\\hline
437
{\tt i\_setup}  & 30 & Input & The 30--bit setup register \\\hline
438
{\tt i\_uart}   & 1 & Input & The input wire from the outside world. \\\hline
439
{\tt o\_wr}     & 1 & Output & True if a word was received.  At this time,
440
                {\tt o\_data}, {\tt o\_break}, {\tt o\_parity\_err}, and
441
                {\tt o\_frame\_err} will also be valid. \\\hline
442
{\tt o\_data}   & 8 & Output & The received data, valid if {\tt o\_wr} \\\hline
443
{\tt o\_break}  & 1 & Output & True in the case of a break condition \\\hline
444
{\tt o\_parity\_err}    & 1 & Output & True if a parity error was detected \\\hline
445
{\tt o\_frame\_err}     & 1 & Output & True if a frame error was detected \\\hline
446
{\tt o\_ck\_uart}       & 1 & Output & A synchronized copy of {\tt i\_uart} \\\hline
447
\end{portlist}\caption{RXUART port list}\label{tbl:rxports}
448
\end{center}\end{table}
449
detailing the I/O ports of the UART transmitter.
450
\begin{table}\begin{center}\begin{portlist}
451
{\tt i\_clk}    & 1 & Input & The system clock \\\hline
452
{\tt i\_reset}  & 1 & Input & A positive, synchronous reset \\\hline
453
{\tt i\_setup}  & 30 & Input & The 30--bit setup register \\\hline
454
{\tt i\_break}  & 1 & Input & Set to true to place the transmit channel into a break condition\\\hline
455
{\tt i\_wr}     & 1 & Input & An input strobe.  Set to one when you wish to transmit data, clear once it has been accepted\\\hline
456
{\tt i\_data}   & 8 & Input & The data to be transmitted, ignored unless
457
                {\tt (i\_wr)\&\&(!o\_busy)} \\\hline
458
{\tt o\_uart}   & 1 & Output & The wire to be connected to the external port\\\hline
459
{\tt o\_busy}   & 1 & Output & True if the transmitter is busy, false if it will receive data\\\hline
460
\end{portlist}\caption{TXUART port list}\label{tbl:txports}
461
\end{center}\end{table}
462
 
463
The ``ports'' associated with the {\tt wbuart-insert.v} example may be
464
inferred from the wishbone data sheet.
465
 
466
% Appendices
467
% A. May be added to outline different specifications.  (??)
468
 
469
 
470
% Index
471
\end{document}
472
 
473
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.