-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.html
374 lines (361 loc) · 30.9 KB
/
index.html
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
368
369
370
371
372
373
374
<!DOCTYPE HTML>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta charset="utf-8"/>
<title>Transport Triggered Architecture - Modular</title>
<link rel="stylesheet" href="css/fonts.css"/>
<link rel="stylesheet" href="css/guide.css"/>
<script src="js/pinout.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/wavedrom/2.6.3/skins/default.js" type="text/javascript"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/wavedrom/2.6.3/wavedrom.min.js" type="text/javascript"></script>
</head>
<body onload="WaveDrom.ProcessAll()">
<header>
<div class="title">
<a href="index.html">
<img src="img/logo.svg"/>
<span>TTAM Guide</span>
</a>
</div>
<nav>
<a href="https://github.com/dslik/ttam"><div>view on github</div></a>
</nav>
</header>
<main>
<h1>TTAM: Transport Triggered Architecture - Modular</h1>
<p class="subtitle">Design and implementation guide, Revision 1</p>
<hr/>
<h3>Table of Contents</h3>
<div><a href="#introduction">Introduction</a></div>
<div><a href="#bus-design">Bus design</a></div>
<div><a href="#ttam-carrier">Carrier Card</a></div>
<div><a href="#data-modules">Data Modules</a></div>
<div><a href="#processing-modules">Processing Modules</a></div>
<div><a href="#address-modules">Address Modules</a></div>
<div><a href="#mbcs">Manual Bus Control System</a></div>
<div><a href="#pccs">Program Counter Control System</a></div>
<h3>Introduction</h3>
<p id="introduction">A Transport Triggered Architecture (TTA) is a type of computer processor design where software instructions directly control the movement of data between processor components. Unlike traditional processor designs, there is only one instruction, <code>mov dst <= src</code>, where computation occurs as a <i>side effect</i> of data movement.</p>
<p>This project covers the documentation of a modular TTA implementation based around a series of 3U Eurocard carrier boards connected over a standard VME backplane. Each board hosts one or more TTA modules (TTAMs) that implement various <i>function units</i>. Examples of function units include everything from basic ALU operations, such as addition, multiplication, bit-wise operations, registers, memory, and all the way up to full I/O and complex processing units.</p>
<aside class="impl">
<img class="icon" src="img/ISO_7010_W001.svg"/>
<h5>WARNING</h5>
<div class="vs">TTAM cards are not compatible with standard VME cards, and the two types of cards must not be mixed.</div>
</aside>
<p>The goal of this project is to refresh my hardware design skills by implementing a "retro-computer" system that would have been state of the art in the 1980's. Whenever possible, components available in the 1980's have been used. Nothing in this project is particularly innovative, and everything associated with this project is released into the public domain.</p>
<h3 id="bus-design">Bus Design</h3>
<p>TTAM is a hybrid 16/8-bit system, with a data width (and instruction length) of 16 bits, and an address width of 8 bits. While a standard VME backplane is used, it is important to emphasize that TTAM is not compatible with VME cards.</p>
<h4>Address Bus</h4>
<script type="WaveDrom">
{reg:[
{bits: 8, name: "address (dst)", type: 4},
{bits: 8, name: "address (src)", type: 3}
], config:{bits: 16, hspace: 710}}
</script>
<p>The address bus is split into two 8-bit address busses: the <code>src</code> address bus and the <code>dst</code> address bus. This means that the system is only able to directly address 256 addresses, which are known as <i>sockets</i>.</p>
<p>The address bus lines are mapped to the VME pins A01 through A16.</p>
<h4>Data Bus</h4>
<script type="WaveDrom">
{reg:[
{bits: 16, name: "data", type: 1},
], config:{bits: 16, hspace: 710}}
</script>
<p>The data bus is a standard 16-bit bus.</p>
<p>The data bus lines are mapped to the VME pins D00 through D15.</p>
<h4>Control Lines</h4>
<p>Bus operations are controlled by three strobe lines: the address strobe, the data strobe, and the Data Acknowledgement (D<sub>ACK</sub>) strobe. This approach allows the system to be run sychronously or asynchronously.</p>
<p>The control lines are mapped to the VME pins as follows:</p>
<ul>
<li>Address Strobe - AS*</li>
<li>Data Strobe - DS0*</li>
<li>D<sub>ACK</sub> Strobe - DTACK*</li>
</ul>
<h4>Asynchronous Bus Operation</h4>
<p>TTAM <code>mov</code> instructions, literal encodings of source and destination addresses, are placed onto the address bus by a bus master, causing a first function unit write to the data bus, and a second function unit to read from the data bus. The bus cycle is typically managed by the <a href="#pccs">Program Counter Control System</a> (PCCS), but can be driven by any bus master.</p>
<ol>
<li>The PCCS first places the instruction onto the bus, and asserts the address strobe (a).</li>
<li>The rising edge of the address strobe (a) indicates that the address bus has stabilized, and triggers the source function unit (addressed by the <code>src</code> address on the address bus) to write to the data bus (b). Once the data bus has stabilized, the source function unit asserts the data strobe (c).</li>
<li>The rising edge of the data strobe (c) triggers the destination function unit (addressed by the <code>dst</code> address on the address bus) to read from the data bus. When the read operation is complete, D<sub>ACK</sub> is strobed (d).</li>
<li>The rising edge of the D<sub>ACK</sub> strobe tells the source function unit to stop driving the data bus, and triggers the PCCS to proceed to the next instruction.</li>
</ol>
<script type="WaveDrom">
{ signal : [
{ name: "Address Strobe", wave: "0..10........", node: "...a" },
{ name: "Address Bus", wave: "x.3.......x..", data: ["address (src, dst)"] },
{ name: "Data Bus", wave: "x....3....x..", data: "data", node: ".....b" },
{ name: "Data Strobe", wave: "0......10....", node: ".......c" },
{ name: "Data Acknowledge", wave: "0........10..", node: ".........d" },
],
edge:['a~>b ', 'b~>c ', 'c~>d ']}
</script>
<p>The absence of a data strobe indicates a source address bus error and will halt execution. The absence of a D<sub>ACK</sub> strobe indicates a destination address bus error and will halt execution. In both cases, the invalid address will remain present on the address bus. Detecting these conditions can be used to trigger a function unit that jumps to a monitor bus error handler.</p>
<h4>Synchronous Bus Operation</h4>
<p>In synchronous operation, the clock must be slower than the slowest function unit. The address strobe line is connected to the clock, and the data strobe line is connected to the clock through an inverter. D<sub>ACK</sub> is ignored.</p>
<script type="WaveDrom">
{ signal : [
{ name: "Clock", wave: "0..1...0...1." },
{ name: "Address Strobe", wave: "0..1...0...1." },
{ name: "Address Bus", wave: "x.3.......x..", data: ["address (src, dst)"]},
{ name: "Data Bus", wave: "x....3....x..", data: "data" },
{ name: "Data Strobe", wave: "1..0...1...0." },
{ name: "Data Acknowledge", wave: "0........10.." },
]}
</script>
<h4 id="bus-decoding">Bus Decoding</h4>
<p>For Functional Units to be triggered, the address bus must be decoded, and the control signals must be sequenced.</p>
<script type="WaveDrom">
{ signal : [
{ name: "Address Bus", wave: "x.3.......x.."},
{ name: "Address Decode", wave: "1.0.......1.."},
{ name: "Address Strobe", wave: "0..10........"},
{ name: "Read Select", wave: "1..0.....1..."},
{ name: "Data Strobe", wave: "0......10...."},
{ name: "Write Select", wave: "1......01...."},
{ name: "Data Acknowledge", wave: "0........10.."},
]}
</script>
<p>When the <code>src</code> and <code>dst</code> addresses are placed on the address bus, if the specified <code>src</code> address matches the base address programmed for a given functional unit, the address decode line is pulled low. This acts as an enable to allow the address strobe to be latched, and tell the functional unit to drive the data bus. The functional unit read select (RS) remains low until D<sub>ACK</sub> is strobed. If the specified <code>dst</code> matches the base address, when the Data Strobe is asserted, the functional unit write select (WS) is pulled low for the duration of the strobe.</p>
<p>An example of the logic for when there are two functional units sharing the same base address, and selected by the A0/A8 line, is shown below:</p>
<img src="img/address_decode.png" style="width: 700px;"/>
<h4>Bus Arbitration</h4>
<p>When a inactive bus master wants to become active, it first checks if IACK* is low. If IACK* is low, another inactive bus master has already requested to become active, and the inactive bus master must wait. If IACK* is high, the inactive bus master drives the IACK* low. When the active bus master detects IACK* is low, when it is able and willing to release the bus, it strobes DS1*. When the inactive bus master that is waiting for bus access detects the DS1* rising edge, it becomes the active bus master, and stops driving IACK* low.</p>
<aside style="position: relative; top: 6px;">
<p>Using the more logical BBSY* and BCLR* lines is avoided due to the desire to only use Row A and Row C pins on the VME J1 connector.</p>
</aside>
<p>IACK* is an open-collector bus line.</p>
<h3>Carrier Card (TTAM/C)</h3>
<p id="ttam-carrier">The TTAM carrier card is a standard 3U 160 mm Eurocard board that conforms to the VME mechanical specification. It provides bus isolation, power conditioning, and has sites to plug in two TTAM/A address modules, three TTAM/D data modules, and one TTAM/P processing module.</p>
<img src="img/ttam_carrier.png" style="width: 700px;"/>
<img src="img/Carrier_render.png" style="width: 700px;"/>
<p>Bill of Material:</p>
<table border="true" style="width: 700px;">
<tr><th>Number</th><th>Part</th><th>Description</th></tr>
<tr><td>C1</td><td></td><td>Main supply bulk capacitor - Value TBD</td></tr>
<tr><td>C2</td><td></td><td>1 uf SMT supply filter capacitor</td></tr>
<tr><td>C3, C4</td><td></td><td>0.1 uf SMT decoupling capacitor</td></tr>
<tr><td>CN1, CN2</td><td></td><td>32-pin 2-row connector for TTAM/A</td></tr>
<tr><td>CN3 - CN11</td><td></td><td>24-pin 2-row connector for TTAM/D and TTAM/P</td></tr>
<tr><td>CN12 - CN14</td><td></td><td>6-pin 1-row connector for JTAG</td></tr>
<tr><td>P1</td><td></td><td>Right-angle euro-DIN three-row connector</td></tr>
<tr><td>R1</td><td></td><td>2.2 k SMT resistor</td></tr>
<tr><td>R2</td><td></td><td>230 ohm SMT resistor</td></tr>
<tr><td>R3 - R6</td><td></td><td>10 K SMT pull-up resistor</td></tr>
<tr><td>LED1</td><td></td><td>SMT LED</td></tr>
<tr><td>U1, U2</td><td><a href="https://www.ti.com/lit/ds/symlink/sn74abt16245a.pdf">SN74ABT16245ADLR</a></td><td>Transceiver, Non-Inverting 2 Element 8 Bit per Element 3-State Output</td></tr>
<tr><td>U3</td><td><a href="https://assets.nexperia.com/documents/data-sheet/74LVC1G11.pdf">74LVC1G11GW</a></td><td>Single 3-input AND gate</td></tr>
<tr><td>U4</td><td><a href="http://ww1.microchip.com/downloads/en/DeviceDoc/20005725B.pdf">MIC2544-1YM</a></td><td>Hot Plug power controller</td></tr>
</table>
<h4>TTAM/D Connectors</h4>
<p>Each TTAM/D module has two 24-pin connectors.</p>
<h5>Data Bus Connector (Top Connector)</h4>
<p>The TTAM/D top connector carries the data bus and control lines. The pinout is as follows:</p>
<svg id="data_pinout" width="1px" height="1px"></svg>
<script>
var svg = svgen("svg", { width:500, height:220, id:"data_pinout" });
var element = document.getElementById('data_pinout');
drawPinout(svg, { width:2, length:12, names:["D14", "D12", "D10", "D08",
"TDI", "TCK", "TMS", "TDO",
"D06", "D04", "D02", "D00",
"D15", "D13", "D11", "D09",
"WS", "WA", "RS", "RA",
"D07", "D05", "D03", "D01"],
colors:["#D2C8BD", "#D2C8BD", "#D2C8BD", "#D2C8BD",
"#D3E5EB", "#D3E5EB", "#D3E5EB", "#D3E5EB",
"#D2C8BD", "#D2C8BD", "#D2C8BD", "#D2C8BD",
"#D2C8BD", "#D2C8BD", "#D2C8BD", "#D2C8BD",
"#F6E15D", "#F6E15D", "#F6E15D", "#F6E15D",
"#D2C8BD", "#D2C8BD", "#D2C8BD", "#D2C8BD"] });
element.parentNode.replaceChild(svg, element)
</script>
<p>The following connector pins are defined:</p>
<ul>
<li>D00 through D15 are input/outputs that connect to the system data bus through a '245 bus transceiver.</li>
<li>TDI, TCK, TMS and TDO provide JTAG boundary scan access.</li>
<li>WS (Write Select) is an input that is set high when a value is to be written to the functional unit (read from the data bus).</li>
<li>WA (Write Acknowledge) is an output that indicates when a write has successfully stored the value from the bus. It is typically connected to the WS line, either directly or through a delay element.</li>
<li>RS (Read Select) is an input that is strobed high when a value is to be read from the functional unit (to drives the data bus).</li>
<li>RA (Read Acknowledge) is an output that indicates when a value being read (driving the data bus) has stabilized and the value on the bus can be written to another functional unit. It is typically connected to the RS line, either directly or through a delay element.</li>
</ul>
<h5>Processing Connector (Bottom Connector)</h4>
<p>The TTAM/D bottom connector carries signals to the TTAM/P module. The pinout is as follows:</p>
<svg id="processing_pinout" width="1px" height="1px"></svg>
<script>
var svg = svgen("svg", { width:500, height:220, id:"processing_pinout" });
var element = document.getElementById('processing_pinout');
drawPinout(svg, { width:2, length:12, names:["P14", "P12", "P10", "P08",
"G4", "PWR", "GND", "G1",
"P06", "P04", "P02", "P00",
"P15", "P13", "P11", "P09",
"G5", "G3", "G2", "G0",
"P07", "P05", "P03", "P01"],
colors:["#D2C8BD", "#D2C8BD", "#D2C8BD", "#D2C8BD",
"#F6E15D", "#AB3535", "#000000", "#F6E15D",
"#D2C8BD", "#D2C8BD", "#D2C8BD", "#D2C8BD",
"#D2C8BD", "#D2C8BD", "#D2C8BD", "#D2C8BD",
"#F6E15D", "#F6E15D", "#F6E15D", "#F6E15D",
"#D2C8BD", "#D2C8BD", "#D2C8BD", "#D2C8BD"] });
element.parentNode.replaceChild(svg, element)
</script>
<p>The following connector pins are defined:</p>
<ul>
<li>P00 through P15 are an internal data bus connecting the TTAM/D to a TTAM/P.</li>
<li>G0 through G5 are general purpose pins. G0 is connected to either the G0N or G0S pin on the corresponding TTAM/A.</li>
<li>G2 and G3 on TTAM/D position #3 are connected to IACK* and DS1*, respectively.</li>
<li>PWR and GND provide power and ground, respectively.</li>
</ul>
<h4>TTAM/P Connectors</h4>
<p>Each TTAM/A module has three 32-pin connectors.</p>
<h5>Processing Connectors</h5>
<p>Each TTAM/P module has up to three 24-pin connectors, each with the pinout described above for the TTAM/D processing connector. Each of the three processing connectors are connected to the corresponding TTAM/D processing connector.</p>
<h4>TTAM/A Connectors</h4>
<p>Each TTAM/A module has a single 32-pin connector.</p>
<h5>Address Bus Connectors</h5>
<p>The TTAM/A connector carries address bus and control lines. The pinout is as follows:</p>
<svg id="address_pinout" width="1px" height="1px"></svg>
<script>
var svg = svgen("svg", { width:600, height:220, id:"address_pinout" });
var element = document.getElementById('address_pinout');
drawPinout(svg, { width:2, length:16, names:["A14", "A12", "A10", "A08",
"RAN", "WAN", "AS", "DS",
"DA", "ADIR", "WAS", "RAS",
"A06", "A04", "A02", "A00",
"A15", "A13", "A11", "A09",
"RSN", "WSN", "G0N", "GND",
"PWR", "G0S", "WSS", "RSS",
"A07", "A05", "A03", "A01"],
colors:["#D2C8BD", "#D2C8BD", "#D2C8BD", "#D2C8BD",
"#F6E15D", "#F6E15D", "#F6E15D", "#F6E15D",
"#F6E15D", "#F6E15D", "#F6E15D", "#F6E15D",
"#D2C8BD", "#D2C8BD", "#D2C8BD", "#D2C8BD",
"#D2C8BD", "#D2C8BD", "#D2C8BD", "#D2C8BD",
"#F6E15D", "#F6E15D", "#F6E15D", "#000000",
"#AB3535", "#F6E15D", "#F6E15D", "#F6E15D",
"#D2C8BD", "#D2C8BD", "#D2C8BD", "#D2C8BD"] });
element.parentNode.replaceChild(svg, element)
</script>
<p>The following connector pins are defined:</p>
<ul>
<li>A00 through A15 are input/outputs that connect to the system address bus a '245 bus transceiver. These lines are only driven as outputs when the board is acting as a bus master.</li>
<li>AS, DS, and DA are connected to the Address Strobe, Data Strobe and Data acknowledge lines, respectively. These are used by the TTAM/A to control the read and write control lines.</li>
<li>WSN/WSS are outputs that are connected to the WS input on the upper (north) and lower (south) TTAM/D modules.</li>
<li>WAN/WAS are inputs that are connected to the WA input on the upper (north) and lower (south) TTAM/D modules.</li>
<li>RSN/RSS are outputs that are connected to the RS input on the upper (north) and lower (south) TTAM/D modules.</li>
<li>RAN/RAS are inputs that are connected to the RA input on the upper (north) and lower (south) TTAM/D modules.</li>
<li>G0N/G0S are outputs that are connected to the G0 input on the upper (north) and lower (south) TTAM/D modules. This is typically for general purpose connections to TTAM/P modules.</li>
<li>ADIR is an output that controls the '245 and is used to write to the address bus. This line should be left disconnected unless the card acts as a bus master.</li>
<li>PWR and GND provide power and ground, respectively.</li>
</ul>
<h4>JTAG Boundary Scan Connector</h4>
<p>Three six-pin JTAG ports are located at the front of the card, and is connected to each of the TTAM/D data bus connectors. This allows for boundary-scan automated testing of a function unit without having to connect it to the bus.</p>
<h3 id="MBDS">Manual Bus Display System (MBDS)</h3>
<p>The MBDS is a dedicated card that displays the current state of the address and data busses, plus control signals, in binary. There are two modes of operation, a first mode displays the current bus state, and a second mode where the contents of one or two optionally installed register TTAM/D (and corresponding TTAM/As) is displayed. Four <a href="https://www.idt.com/us/en/document/dst/qs3390-datasheet">IDTQS3390</a> bus switches are used to switch between the bus signals and the outputs of the TTAM/D modules.</p>
<aside style="position: relative; top: 6px;">
<p>Using an HCMS-2913 to display the bus values in hex would be a nice enhancement to this board.</p>
</aside>
<p>In the second mode of operation the functional unit occupies a memory space of 2<sup>1</sup>:</p>
<pre><code>Addr RW Description
----------------------------------------------------
base + 0 RW Display Register 0 (data)
base + 1 RW Display Register 1 (address)</code></pre>
<h3 id="MBCS">Manual Bus Control System (MBCS)</h3>
<p>The MBCS is a dedicated bus-master card used to manipulate the bus state, single step the system, and transfer control between bus masters. There are two modes of operation, a first mode directly controls the current bus state, and a second mode where the contents of one or two optionally installed register TTAM/D (and corresponding TTAM/As) can be read.</p>
<p>In the second mode of operation the functional unit occupies a memory space of 2<sup>1</sup>:</p>
<pre><code>Addr RW Description
----------------------------------------------------
base + 0 RO Data Bus Switch Value
base + 1 RO Address Bus Switch Value</code></pre>
<h3>Data Modules (TTAM/D)</h3>
<h4 id="IVFU">Immediate Value Function Unit (IVFU)</h4>
<p>The IVFU TTAM/D transfers an 8-bit literal value from the address bus into a data register. This is accomplished by overloading the <code>dst</code> address to use as the literal. When an instruction <code>src</code> address targets the IVFU, the IVFU takes the <code>dst</code> address, and stores it into an immediate value register.</p>
<p>The functional unit occupies a memory space of 2<sup>2</sup>:</p>
<pre><code>Addr RW Description
----------------------------------------------------
base + 0 RO Lower 8 bits immediate
base + 1 RO Upper 8 bits immediate
base + 2 RO Immediate value register
base + 3 NA Unused (address reserved for north position)</code></pre>
<p>If an IVFU is located at the base address 0x08 and the <a href="#MBDS">MBDS</a> is located at the base address 0x04, to transfer the value 0x0B0E into the immediate value register, then to display it on the <a href="#MBDS">MBDS</a> output, the following TTAM code would be executed:</p>
<pre><code>mov 0x0E <- 0x08
mov 0x0B <- 0x09
mov 0x05 <- 0x0A</code></pre>
<p>The IVFU does not strobe the data strobe line, and skips the store phase by skipping to strobing the D<sub>ACK</sub> line. This is the only function unit that has this behaviour.</p>
<aside style="position: relative; top: 6px;">
<p>While this approach could be used more generally to extend the instruction set, it is avoided.</p>
</aside>
<p>The IVFU is implemented as a combination TTAM/D + TTAM/A module. As such, it can only be installed in TTAM/D position 3.</p>
<h4 id="GRDM">Generic Register Data Module (GRDM)</h4>
<p>When fully populated, the GRDM implements a single read-write register that can be used stand-alone or connected to a processing module.</p>
<p>WA is connected to G3 to signal to the TTAM/P when a new value has been written.</p>
<p>RS is connected to G1 to signal to the TTAM/P when a value is being read been written, and pulling G2 low allows the processing module to drive the bus.</p>
<p>G2 is connected to the output latch enable. Pulling G2 low allows the processing module to drive the bus.</p>
<p>When half-populated (U1, U2, U6, U7, U11, and U12), the GRAM implements a single read-only register driven by an output from a processing module.</p>
<p>Scan-test latches are used to allow a function unit to be tested independently of the rest of the system.</p>
<p>In order to allow the register to operate asynchronously, two delay lines are included, which provide the delay between when read select goes high and when the bus has stabilized, and to provide a delay between when write select goes high and the bus value has been successfully stored.</p>
<aside style="position: relative; top: 6px;">
<p>The delay logic may be moved onto the TTAM carrier at a future date.</p>
</aside>
<img src="img/GRDM_render.png" style="width: 700px;"/>
<p>Bill of Material:</p>
<table border="true" style="width: 700px;">
<tr><th>Number</th><th>Part</th><th>Description</th></tr>
<tr><td>C1 - C6</td><td></td><td>0.1 uf SMT decoupling capacitor</td></tr>
<tr><td>CN1, CN2</td><td></td><td>24-pin 2-row connector</td></tr>
<tr><td>R1 - R3</td><td></td><td>2.2 k SMT resistor</td></tr>
<tr><td>R4</td><td></td><td>50 k SMT resistor (pull-up)</td></tr>
<tr><td>LED1 - LED3</td><td></td><td>SMT LED</td></tr>
<tr><td>U1 - U4</td><td><a href="https://www.ti.com/lit/ds/symlink/sn74bct8374a.pdf">SN74BCT8374A</a></td><td>Octal D-Type Edge-Triggered Flip-Flops</td></tr>
<tr><td>U5, U6</td><td><a href="https://datasheets.maximintegrated.com/en/ds/DS1007.pdf">DS1007S-2</a></td><td>7-1 Silicon Delay Line</td></tr>
<tr><td>U7, U8, U13</td><td><a href="https://assets.nexperia.com/documents/data-sheet/74LVC1G04.pdf">74LVC1G04GW</a></td><td>Single inverter</td></tr>
<tr><td>U9, U11</td><td><a href="https://assets.nexperia.com/documents/data-sheet/74LVC1G86.pdf">74LVC1G86GW</a></td><td>2-input EXCLUSIVE-OR gate</td></tr>
<tr><td>U10, U12</td><td><a href="https://assets.nexperia.com/documents/data-sheet/74AUP1G09.pdf">74AUP1G09GW</a></td><td>Single 2-input AND gate with open drain</td></tr>
</table>
<p>The address of the GRDM register depends on the position it is installed on, and the base address of the corresponding <a href="#GRAM">GRAM</a>.</p>
<pre><code>Addr RW Description
----------------------------------------------------
base + 0 RW Register in south position
base + 1 RW Register in north position</code></pre>
<h3>Processing Modules (TTAM/P)</h3>
<h4>Arithmetic Logic Function Unit (ALFU)</h4>
<h4>Paged Memory Function Unit (PMFU)</h4>
<p>The PMFU TTAM/P provides a 16 or 32 address window into a larger 2<sup>21</sup> bit memory bank.</p>
<p>Depending on the configuration jumper, the address map occupies either memory space of 2<sup>4</sup> or 2<sup>5</sup>:</p>
<pre><code>Addr RW Description
----------------------------------------------------
base + 0 RW Memory window 0
base + 1 RW Memory window 1
...
base + N-1 RW Memory window 14
base + N RW Page</code></pre>
<p>The PMFU is implemented as a combination TTAM/P + TTAM/A module, and requires two <a href="#GRDM">GRDM</a> TTAM/D modules, one for the page access and one for memory access, installed in positions 1 and 2. The PMFU is typically co-hosted with the <a href="#IVFU">IVFU</a> on a single TTAM/C.</p>
<img src="img/ttam_carrier_pmfu.png" style="width: 700px;"/>
<h4>Stack Memory Function Unit (SMFU)</h4>
<h4>Queue Memory Function Unit (QUFU)</h4>
<h3>Address Modules (TTAM/A)</h3>
<h4 id="GRAM">Generic Register Address Module (GRAM)</h4>
<p>The GRAM provides read and write address decoding, and is implemented as a standard TTAM/A module. The circuit implemented as described in the <a href="#bus-decoding">Bus decoding</a> section.</p>
<img src="img/GRAM_render.png" style="width: 700px;"/>
<p>Bill of Material:</p>
<table border="true" style="width: 700px;">
<tr><th>Number</th><th>Part</th><th>Description</th></tr>
<tr><td>C1, C2</td><td></td><td>0.1 uf SMT decoupling capacitor</td></tr>
<tr><td>CN1</td><td></td><td>32-pin 2-row connector</td></tr>
<tr><td>DSW1</td><td></td><td>6 position SPST DIP switch</td></tr>
<tr><td>R1, R2</td><td></td><td>2.2 k SMT resistor</td></tr>
<tr><td>SRC, DST</td><td></td><td>SMT LED</td></tr>
<tr><td>U1, U2</td><td><a href="https://pdf1.alldatasheet.com/datasheet-pdf/view/65936/IDT/IDT74FCT521BTSO.html">IDT74FCT521BTSO</a></td><td>8-bit Identity Comparator</td></tr>
<tr><td>U3, U4</td><td><a href="https://assets.nexperia.com/documents/data-sheet/74LVC2G00.pdf">74LVC2G00DP</a></td><td>Dual 2-input NAND gate</td></tr>
<tr><td>U5, U6, U9, U10</td><td><a href="https://assets.nexperia.com/documents/data-sheet/74LVC1G04.pdf">74LVC1G04GW</a></td><td>Single inverter</td></tr>
<tr><td>U7</td><td><a href="http://www.ti.com/lit/ds/symlink/sn74lvc1g175.pdf">SN74LVC1G175DBV</a></td><td>Single D-Type Flip-Flop With Asynchronous Clear</td></tr>
<tr><td>U8</td><td><a href="https://assets.nexperia.com/documents/data-sheet/74LVC1G02.pdf">74LVC1G02GW</a></td><td>Single 2-input NOR gate</td></tr>
</table>
<aside style="position: relative; top: 6px;">
<p>The 74FCT521 was used because it was what I had on hand. All of these components could be replaced with a simple PAL or CPLD, which may be a follow-up project.</p>
</aside>
<h3>Program Counter Control System</h3>
</main>
<footer>
<p>Thanks for reading the TTAM documentation.</p>
<p class="small"><a href="#top">Table of contents</a></p>
</footer>
</body>
</html>