Lesson 3. 256×4 memory: the same circuit one level up
In picturesAfter this lesson you will have RAM256x4 — 256 words of 4 bits, 128 bytes: exactly as much memory as the processor kit's machine has. There are almost no new ideas: sixteen RAM16x4 chips from lesson 2 are put together into a big memory the same way sixteen rows were put together into RAM16x4.
3.1. The idea: the address splits in half
The address is 8 bits: A7 A6 A5 A4 | A3 A2 A1 A0.
- The low 4 bits go to all 16 blocks at once — in each one they pick a cell inside the block.
- The high 4 bits →
DEC16lights one wireb0–b15— which block is working:AND(bN, WE)— writing only into this block;AND(block output, bN)— only its data goes further. - An
ORof the 16 blocks for each bit — the output is the cell of the selected block.
| Inside RAM16x4 | Inside RAM256x4 |
|---|---|
| DEC16 picks a WORD4 row | DEC16 picks a RAM16x4 block |
| AND(r, WE) — write only into this row | AND(b, WE) — WE only to this block |
| AND(q, R) — the row gives out only if selected | AND(Q, b) — the block gives out only if selected |
| OR of 16 rows | OR of 16 blocks |
Example. Address 0010 0101 (hex 25): the high 0010 = 2 — block 2 is working; the low 0101 = 5 — cell 5 in it. Address 0001 0101 (15) — cell 5 too, but of block 1: a different cell.
3.2. The cost
Almost all of the memory is latches: 1,024 bits × 22 transistors. Together with row selection and the OR trees the RAM256x4 chip is 41,840 transistors, seven times more than the whole processor. In REAL such a circuit is slow to compute: after a switch is flipped the display updates in a second or two. In Fast — immediately.
3.3. Building
Step 1. Remove lesson 2's test bench
Lesson 3's test bench uses the same labels mA, mD, mQ. Two parts on one label are a short, so first delete lesson 2's test bench (the chips stay in the Library):
| Element | Action |
|---|---|
| Input, whose output = mA0 | delete |
| Input, whose output = mA1 | delete |
| Input, whose output = mA2 | delete |
| Input, whose output = mA3 | delete |
| Input, whose output = mD0 | delete |
| Input, whose output = mD1 | delete |
| Input, whose output = mD2 | delete |
| Input, whose output = mD3 | delete |
| Button WE, whose output = mWE | delete |
| RAM16x4, whose output = mQ0 | delete |
| three displays (buses mA, mD, mQ) | delete |
The VCC/GND power and lesson 1's test bench can stay.
Step 2. The RAM256x4 chip
What we build. Block selection, 16 "write" gates, 16 blocks, 64 "pass" gates and an OR tree.
INPUT PORTS: A0, A1, A2, A3, A4, A5, A6, A7, D0, D1, D2, D3, WE · OUTPUT PORTS: Q0, Q1, Q2, Q3
| Element | Pin | Direction | Label |
|---|---|---|---|
| DEC16 | I0 | in | A4 |
| DEC16 | I1 | in | A5 |
| DEC16 | I2 | in | A6 |
| DEC16 | I3 | in | A7 |
| DEC16 | Y0 | out | b0 |
| DEC16 | Y1 | out | b1 |
| DEC16 | Y2 | out | b2 |
| DEC16 | Y3 | out | b3 |
| DEC16 | Y4 | out | b4 |
| DEC16 | Y5 | out | b5 |
| DEC16 | Y6 | out | b6 |
| DEC16 | Y7 | out | b7 |
| DEC16 | Y8 | out | b8 |
| DEC16 | Y9 | out | b9 |
| DEC16 | Y10 | out | b10 |
| DEC16 | Y11 | out | b11 |
| DEC16 | Y12 | out | b12 |
| DEC16 | Y13 | out | b13 |
| DEC16 | Y14 | out | b14 |
| DEC16 | Y15 | out | b15 |
| AND | I0 | in | b0 |
| AND | I1 | in | WE |
| AND | O0 | out | w0 |
| AND | I0 | in | b1 |
| AND | I1 | in | WE |
| AND | O0 | out | w1 |
| AND | I0 | in | b2 |
| AND | I1 | in | WE |
| AND | O0 | out | w2 |
| AND | I0 | in | b3 |
| AND | I1 | in | WE |
| AND | O0 | out | w3 |
| AND | I0 | in | b4 |
| AND | I1 | in | WE |
| AND | O0 | out | w4 |
| AND | I0 | in | b5 |
| AND | I1 | in | WE |
| AND | O0 | out | w5 |
| AND | I0 | in | b6 |
| AND | I1 | in | WE |
| AND | O0 | out | w6 |
| AND | I0 | in | b7 |
| AND | I1 | in | WE |
| AND | O0 | out | w7 |
| AND | I0 | in | b8 |
| AND | I1 | in | WE |
| AND | O0 | out | w8 |
| AND | I0 | in | b9 |
| AND | I1 | in | WE |
| AND | O0 | out | w9 |
| AND | I0 | in | b10 |
| AND | I1 | in | WE |
| AND | O0 | out | w10 |
| AND | I0 | in | b11 |
| AND | I1 | in | WE |
| AND | O0 | out | w11 |
| AND | I0 | in | b12 |
| AND | I1 | in | WE |
| AND | O0 | out | w12 |
| AND | I0 | in | b13 |
| AND | I1 | in | WE |
| AND | O0 | out | w13 |
| AND | I0 | in | b14 |
| AND | I1 | in | WE |
| AND | O0 | out | w14 |
| AND | I0 | in | b15 |
| AND | I1 | in | WE |
| AND | O0 | out | w15 |
| RAM16x4 | A0 | in | A0 |
| RAM16x4 | A1 | in | A1 |
| RAM16x4 | A2 | in | A2 |
| RAM16x4 | A3 | in | A3 |
| RAM16x4 | D0 | in | D0 |
| RAM16x4 | D1 | in | D1 |
| RAM16x4 | D2 | in | D2 |
| RAM16x4 | D3 | in | D3 |
| RAM16x4 | WE | in | w0 |
| RAM16x4 | Q0 | out | m0_0 |
| RAM16x4 | Q1 | out | m0_1 |
| RAM16x4 | Q2 | out | m0_2 |
| RAM16x4 | Q3 | out | m0_3 |
| RAM16x4 | A0 | in | A0 |
| RAM16x4 | A1 | in | A1 |
| RAM16x4 | A2 | in | A2 |
| RAM16x4 | A3 | in | A3 |
| RAM16x4 | D0 | in | D0 |
| RAM16x4 | D1 | in | D1 |
| RAM16x4 | D2 | in | D2 |
| RAM16x4 | D3 | in | D3 |
| RAM16x4 | WE | in | w1 |
| RAM16x4 | Q0 | out | m1_0 |
| RAM16x4 | Q1 | out | m1_1 |
| RAM16x4 | Q2 | out | m1_2 |
| RAM16x4 | Q3 | out | m1_3 |
| RAM16x4 | A0 | in | A0 |
| RAM16x4 | A1 | in | A1 |
| RAM16x4 | A2 | in | A2 |
| RAM16x4 | A3 | in | A3 |
| RAM16x4 | D0 | in | D0 |
| RAM16x4 | D1 | in | D1 |
| RAM16x4 | D2 | in | D2 |
| RAM16x4 | D3 | in | D3 |
| RAM16x4 | WE | in | w2 |
| RAM16x4 | Q0 | out | m2_0 |
| RAM16x4 | Q1 | out | m2_1 |
| RAM16x4 | Q2 | out | m2_2 |
| RAM16x4 | Q3 | out | m2_3 |
| RAM16x4 | A0 | in | A0 |
| RAM16x4 | A1 | in | A1 |
| RAM16x4 | A2 | in | A2 |
| RAM16x4 | A3 | in | A3 |
| RAM16x4 | D0 | in | D0 |
| RAM16x4 | D1 | in | D1 |
| RAM16x4 | D2 | in | D2 |
| RAM16x4 | D3 | in | D3 |
| RAM16x4 | WE | in | w3 |
| RAM16x4 | Q0 | out | m3_0 |
| RAM16x4 | Q1 | out | m3_1 |
| RAM16x4 | Q2 | out | m3_2 |
| RAM16x4 | Q3 | out | m3_3 |
| RAM16x4 | A0 | in | A0 |
| RAM16x4 | A1 | in | A1 |
| RAM16x4 | A2 | in | A2 |
| RAM16x4 | A3 | in | A3 |
| RAM16x4 | D0 | in | D0 |
| RAM16x4 | D1 | in | D1 |
| RAM16x4 | D2 | in | D2 |
| RAM16x4 | D3 | in | D3 |
| RAM16x4 | WE | in | w4 |
| RAM16x4 | Q0 | out | m4_0 |
| RAM16x4 | Q1 | out | m4_1 |
| RAM16x4 | Q2 | out | m4_2 |
| RAM16x4 | Q3 | out | m4_3 |
| RAM16x4 | A0 | in | A0 |
| RAM16x4 | A1 | in | A1 |
| RAM16x4 | A2 | in | A2 |
| RAM16x4 | A3 | in | A3 |
| RAM16x4 | D0 | in | D0 |
| RAM16x4 | D1 | in | D1 |
| RAM16x4 | D2 | in | D2 |
| RAM16x4 | D3 | in | D3 |
| RAM16x4 | WE | in | w5 |
| RAM16x4 | Q0 | out | m5_0 |
| RAM16x4 | Q1 | out | m5_1 |
| RAM16x4 | Q2 | out | m5_2 |
| RAM16x4 | Q3 | out | m5_3 |
| RAM16x4 | A0 | in | A0 |
| RAM16x4 | A1 | in | A1 |
| RAM16x4 | A2 | in | A2 |
| RAM16x4 | A3 | in | A3 |
| RAM16x4 | D0 | in | D0 |
| RAM16x4 | D1 | in | D1 |
| RAM16x4 | D2 | in | D2 |
| RAM16x4 | D3 | in | D3 |
| RAM16x4 | WE | in | w6 |
| RAM16x4 | Q0 | out | m6_0 |
| RAM16x4 | Q1 | out | m6_1 |
| RAM16x4 | Q2 | out | m6_2 |
| RAM16x4 | Q3 | out | m6_3 |
| RAM16x4 | A0 | in | A0 |
| RAM16x4 | A1 | in | A1 |
| RAM16x4 | A2 | in | A2 |
| RAM16x4 | A3 | in | A3 |
| RAM16x4 | D0 | in | D0 |
| RAM16x4 | D1 | in | D1 |
| RAM16x4 | D2 | in | D2 |
| RAM16x4 | D3 | in | D3 |
| RAM16x4 | WE | in | w7 |
| RAM16x4 | Q0 | out | m7_0 |
| RAM16x4 | Q1 | out | m7_1 |
| RAM16x4 | Q2 | out | m7_2 |
| RAM16x4 | Q3 | out | m7_3 |
| RAM16x4 | A0 | in | A0 |
| RAM16x4 | A1 | in | A1 |
| RAM16x4 | A2 | in | A2 |
| RAM16x4 | A3 | in | A3 |
| RAM16x4 | D0 | in | D0 |
| RAM16x4 | D1 | in | D1 |
| RAM16x4 | D2 | in | D2 |
| RAM16x4 | D3 | in | D3 |
| RAM16x4 | WE | in | w8 |
| RAM16x4 | Q0 | out | m8_0 |
| RAM16x4 | Q1 | out | m8_1 |
| RAM16x4 | Q2 | out | m8_2 |
| RAM16x4 | Q3 | out | m8_3 |
| RAM16x4 | A0 | in | A0 |
| RAM16x4 | A1 | in | A1 |
| RAM16x4 | A2 | in | A2 |
| RAM16x4 | A3 | in | A3 |
| RAM16x4 | D0 | in | D0 |
| RAM16x4 | D1 | in | D1 |
| RAM16x4 | D2 | in | D2 |
| RAM16x4 | D3 | in | D3 |
| RAM16x4 | WE | in | w9 |
| RAM16x4 | Q0 | out | m9_0 |
| RAM16x4 | Q1 | out | m9_1 |
| RAM16x4 | Q2 | out | m9_2 |
| RAM16x4 | Q3 | out | m9_3 |
| RAM16x4 | A0 | in | A0 |
| RAM16x4 | A1 | in | A1 |
| RAM16x4 | A2 | in | A2 |
| RAM16x4 | A3 | in | A3 |
| RAM16x4 | D0 | in | D0 |
| RAM16x4 | D1 | in | D1 |
| RAM16x4 | D2 | in | D2 |
| RAM16x4 | D3 | in | D3 |
| RAM16x4 | WE | in | w10 |
| RAM16x4 | Q0 | out | m10_0 |
| RAM16x4 | Q1 | out | m10_1 |
| RAM16x4 | Q2 | out | m10_2 |
| RAM16x4 | Q3 | out | m10_3 |
| RAM16x4 | A0 | in | A0 |
| RAM16x4 | A1 | in | A1 |
| RAM16x4 | A2 | in | A2 |
| RAM16x4 | A3 | in | A3 |
| RAM16x4 | D0 | in | D0 |
| RAM16x4 | D1 | in | D1 |
| RAM16x4 | D2 | in | D2 |
| RAM16x4 | D3 | in | D3 |
| RAM16x4 | WE | in | w11 |
| RAM16x4 | Q0 | out | m11_0 |
| RAM16x4 | Q1 | out | m11_1 |
| RAM16x4 | Q2 | out | m11_2 |
| RAM16x4 | Q3 | out | m11_3 |
| RAM16x4 | A0 | in | A0 |
| RAM16x4 | A1 | in | A1 |
| RAM16x4 | A2 | in | A2 |
| RAM16x4 | A3 | in | A3 |
| RAM16x4 | D0 | in | D0 |
| RAM16x4 | D1 | in | D1 |
| RAM16x4 | D2 | in | D2 |
| RAM16x4 | D3 | in | D3 |
| RAM16x4 | WE | in | w12 |
| RAM16x4 | Q0 | out | m12_0 |
| RAM16x4 | Q1 | out | m12_1 |
| RAM16x4 | Q2 | out | m12_2 |
| RAM16x4 | Q3 | out | m12_3 |
| RAM16x4 | A0 | in | A0 |
| RAM16x4 | A1 | in | A1 |
| RAM16x4 | A2 | in | A2 |
| RAM16x4 | A3 | in | A3 |
| RAM16x4 | D0 | in | D0 |
| RAM16x4 | D1 | in | D1 |
| RAM16x4 | D2 | in | D2 |
| RAM16x4 | D3 | in | D3 |
| RAM16x4 | WE | in | w13 |
| RAM16x4 | Q0 | out | m13_0 |
| RAM16x4 | Q1 | out | m13_1 |
| RAM16x4 | Q2 | out | m13_2 |
| RAM16x4 | Q3 | out | m13_3 |
| RAM16x4 | A0 | in | A0 |
| RAM16x4 | A1 | in | A1 |
| RAM16x4 | A2 | in | A2 |
| RAM16x4 | A3 | in | A3 |
| RAM16x4 | D0 | in | D0 |
| RAM16x4 | D1 | in | D1 |
| RAM16x4 | D2 | in | D2 |
| RAM16x4 | D3 | in | D3 |
| RAM16x4 | WE | in | w14 |
| RAM16x4 | Q0 | out | m14_0 |
| RAM16x4 | Q1 | out | m14_1 |
| RAM16x4 | Q2 | out | m14_2 |
| RAM16x4 | Q3 | out | m14_3 |
| RAM16x4 | A0 | in | A0 |
| RAM16x4 | A1 | in | A1 |
| RAM16x4 | A2 | in | A2 |
| RAM16x4 | A3 | in | A3 |
| RAM16x4 | D0 | in | D0 |
| RAM16x4 | D1 | in | D1 |
| RAM16x4 | D2 | in | D2 |
| RAM16x4 | D3 | in | D3 |
| RAM16x4 | WE | in | w15 |
| RAM16x4 | Q0 | out | m15_0 |
| RAM16x4 | Q1 | out | m15_1 |
| RAM16x4 | Q2 | out | m15_2 |
| RAM16x4 | Q3 | out | m15_3 |
| AND | I0 | in | m0_0 |
| AND | I1 | in | b0 |
| AND | O0 | out | c0_0 |
| AND | I0 | in | m0_1 |
| AND | I1 | in | b0 |
| AND | O0 | out | c0_1 |
| AND | I0 | in | m0_2 |
| AND | I1 | in | b0 |
| AND | O0 | out | c0_2 |
| AND | I0 | in | m0_3 |
| AND | I1 | in | b0 |
| AND | O0 | out | c0_3 |
| AND | I0 | in | m1_0 |
| AND | I1 | in | b1 |
| AND | O0 | out | c1_0 |
| AND | I0 | in | m1_1 |
| AND | I1 | in | b1 |
| AND | O0 | out | c1_1 |
| AND | I0 | in | m1_2 |
| AND | I1 | in | b1 |
| AND | O0 | out | c1_2 |
| AND | I0 | in | m1_3 |
| AND | I1 | in | b1 |
| AND | O0 | out | c1_3 |
| AND | I0 | in | m2_0 |
| AND | I1 | in | b2 |
| AND | O0 | out | c2_0 |
| AND | I0 | in | m2_1 |
| AND | I1 | in | b2 |
| AND | O0 | out | c2_1 |
| AND | I0 | in | m2_2 |
| AND | I1 | in | b2 |
| AND | O0 | out | c2_2 |
| AND | I0 | in | m2_3 |
| AND | I1 | in | b2 |
| AND | O0 | out | c2_3 |
| AND | I0 | in | m3_0 |
| AND | I1 | in | b3 |
| AND | O0 | out | c3_0 |
| AND | I0 | in | m3_1 |
| AND | I1 | in | b3 |
| AND | O0 | out | c3_1 |
| AND | I0 | in | m3_2 |
| AND | I1 | in | b3 |
| AND | O0 | out | c3_2 |
| AND | I0 | in | m3_3 |
| AND | I1 | in | b3 |
| AND | O0 | out | c3_3 |
| AND | I0 | in | m4_0 |
| AND | I1 | in | b4 |
| AND | O0 | out | c4_0 |
| AND | I0 | in | m4_1 |
| AND | I1 | in | b4 |
| AND | O0 | out | c4_1 |
| AND | I0 | in | m4_2 |
| AND | I1 | in | b4 |
| AND | O0 | out | c4_2 |
| AND | I0 | in | m4_3 |
| AND | I1 | in | b4 |
| AND | O0 | out | c4_3 |
| AND | I0 | in | m5_0 |
| AND | I1 | in | b5 |
| AND | O0 | out | c5_0 |
| AND | I0 | in | m5_1 |
| AND | I1 | in | b5 |
| AND | O0 | out | c5_1 |
| AND | I0 | in | m5_2 |
| AND | I1 | in | b5 |
| AND | O0 | out | c5_2 |
| AND | I0 | in | m5_3 |
| AND | I1 | in | b5 |
| AND | O0 | out | c5_3 |
| AND | I0 | in | m6_0 |
| AND | I1 | in | b6 |
| AND | O0 | out | c6_0 |
| AND | I0 | in | m6_1 |
| AND | I1 | in | b6 |
| AND | O0 | out | c6_1 |
| AND | I0 | in | m6_2 |
| AND | I1 | in | b6 |
| AND | O0 | out | c6_2 |
| AND | I0 | in | m6_3 |
| AND | I1 | in | b6 |
| AND | O0 | out | c6_3 |
| AND | I0 | in | m7_0 |
| AND | I1 | in | b7 |
| AND | O0 | out | c7_0 |
| AND | I0 | in | m7_1 |
| AND | I1 | in | b7 |
| AND | O0 | out | c7_1 |
| AND | I0 | in | m7_2 |
| AND | I1 | in | b7 |
| AND | O0 | out | c7_2 |
| AND | I0 | in | m7_3 |
| AND | I1 | in | b7 |
| AND | O0 | out | c7_3 |
| AND | I0 | in | m8_0 |
| AND | I1 | in | b8 |
| AND | O0 | out | c8_0 |
| AND | I0 | in | m8_1 |
| AND | I1 | in | b8 |
| AND | O0 | out | c8_1 |
| AND | I0 | in | m8_2 |
| AND | I1 | in | b8 |
| AND | O0 | out | c8_2 |
| AND | I0 | in | m8_3 |
| AND | I1 | in | b8 |
| AND | O0 | out | c8_3 |
| AND | I0 | in | m9_0 |
| AND | I1 | in | b9 |
| AND | O0 | out | c9_0 |
| AND | I0 | in | m9_1 |
| AND | I1 | in | b9 |
| AND | O0 | out | c9_1 |
| AND | I0 | in | m9_2 |
| AND | I1 | in | b9 |
| AND | O0 | out | c9_2 |
| AND | I0 | in | m9_3 |
| AND | I1 | in | b9 |
| AND | O0 | out | c9_3 |
| AND | I0 | in | m10_0 |
| AND | I1 | in | b10 |
| AND | O0 | out | c10_0 |
| AND | I0 | in | m10_1 |
| AND | I1 | in | b10 |
| AND | O0 | out | c10_1 |
| AND | I0 | in | m10_2 |
| AND | I1 | in | b10 |
| AND | O0 | out | c10_2 |
| AND | I0 | in | m10_3 |
| AND | I1 | in | b10 |
| AND | O0 | out | c10_3 |
| AND | I0 | in | m11_0 |
| AND | I1 | in | b11 |
| AND | O0 | out | c11_0 |
| AND | I0 | in | m11_1 |
| AND | I1 | in | b11 |
| AND | O0 | out | c11_1 |
| AND | I0 | in | m11_2 |
| AND | I1 | in | b11 |
| AND | O0 | out | c11_2 |
| AND | I0 | in | m11_3 |
| AND | I1 | in | b11 |
| AND | O0 | out | c11_3 |
| AND | I0 | in | m12_0 |
| AND | I1 | in | b12 |
| AND | O0 | out | c12_0 |
| AND | I0 | in | m12_1 |
| AND | I1 | in | b12 |
| AND | O0 | out | c12_1 |
| AND | I0 | in | m12_2 |
| AND | I1 | in | b12 |
| AND | O0 | out | c12_2 |
| AND | I0 | in | m12_3 |
| AND | I1 | in | b12 |
| AND | O0 | out | c12_3 |
| AND | I0 | in | m13_0 |
| AND | I1 | in | b13 |
| AND | O0 | out | c13_0 |
| AND | I0 | in | m13_1 |
| AND | I1 | in | b13 |
| AND | O0 | out | c13_1 |
| AND | I0 | in | m13_2 |
| AND | I1 | in | b13 |
| AND | O0 | out | c13_2 |
| AND | I0 | in | m13_3 |
| AND | I1 | in | b13 |
| AND | O0 | out | c13_3 |
| AND | I0 | in | m14_0 |
| AND | I1 | in | b14 |
| AND | O0 | out | c14_0 |
| AND | I0 | in | m14_1 |
| AND | I1 | in | b14 |
| AND | O0 | out | c14_1 |
| AND | I0 | in | m14_2 |
| AND | I1 | in | b14 |
| AND | O0 | out | c14_2 |
| AND | I0 | in | m14_3 |
| AND | I1 | in | b14 |
| AND | O0 | out | c14_3 |
| AND | I0 | in | m15_0 |
| AND | I1 | in | b15 |
| AND | O0 | out | c15_0 |
| AND | I0 | in | m15_1 |
| AND | I1 | in | b15 |
| AND | O0 | out | c15_1 |
| AND | I0 | in | m15_2 |
| AND | I1 | in | b15 |
| AND | O0 | out | c15_2 |
| AND | I0 | in | m15_3 |
| AND | I1 | in | b15 |
| AND | O0 | out | c15_3 |
| OR4 | A | in | c0_0 |
| OR4 | B | in | c1_0 |
| OR4 | C | in | c2_0 |
| OR4 | D | in | c3_0 |
| OR4 | Y | out | g0_0 |
| OR4 | A | in | c4_0 |
| OR4 | B | in | c5_0 |
| OR4 | C | in | c6_0 |
| OR4 | D | in | c7_0 |
| OR4 | Y | out | g1_0 |
| OR4 | A | in | c8_0 |
| OR4 | B | in | c9_0 |
| OR4 | C | in | c10_0 |
| OR4 | D | in | c11_0 |
| OR4 | Y | out | g2_0 |
| OR4 | A | in | c12_0 |
| OR4 | B | in | c13_0 |
| OR4 | C | in | c14_0 |
| OR4 | D | in | c15_0 |
| OR4 | Y | out | g3_0 |
| OR4 | A | in | g0_0 |
| OR4 | B | in | g1_0 |
| OR4 | C | in | g2_0 |
| OR4 | D | in | g3_0 |
| OR4 | Y | out | Q0 |
| OR4 | A | in | c0_1 |
| OR4 | B | in | c1_1 |
| OR4 | C | in | c2_1 |
| OR4 | D | in | c3_1 |
| OR4 | Y | out | g0_1 |
| OR4 | A | in | c4_1 |
| OR4 | B | in | c5_1 |
| OR4 | C | in | c6_1 |
| OR4 | D | in | c7_1 |
| OR4 | Y | out | g1_1 |
| OR4 | A | in | c8_1 |
| OR4 | B | in | c9_1 |
| OR4 | C | in | c10_1 |
| OR4 | D | in | c11_1 |
| OR4 | Y | out | g2_1 |
| OR4 | A | in | c12_1 |
| OR4 | B | in | c13_1 |
| OR4 | C | in | c14_1 |
| OR4 | D | in | c15_1 |
| OR4 | Y | out | g3_1 |
| OR4 | A | in | g0_1 |
| OR4 | B | in | g1_1 |
| OR4 | C | in | g2_1 |
| OR4 | D | in | g3_1 |
| OR4 | Y | out | Q1 |
| OR4 | A | in | c0_2 |
| OR4 | B | in | c1_2 |
| OR4 | C | in | c2_2 |
| OR4 | D | in | c3_2 |
| OR4 | Y | out | g0_2 |
| OR4 | A | in | c4_2 |
| OR4 | B | in | c5_2 |
| OR4 | C | in | c6_2 |
| OR4 | D | in | c7_2 |
| OR4 | Y | out | g1_2 |
| OR4 | A | in | c8_2 |
| OR4 | B | in | c9_2 |
| OR4 | C | in | c10_2 |
| OR4 | D | in | c11_2 |
| OR4 | Y | out | g2_2 |
| OR4 | A | in | c12_2 |
| OR4 | B | in | c13_2 |
| OR4 | C | in | c14_2 |
| OR4 | D | in | c15_2 |
| OR4 | Y | out | g3_2 |
| OR4 | A | in | g0_2 |
| OR4 | B | in | g1_2 |
| OR4 | C | in | g2_2 |
| OR4 | D | in | g3_2 |
| OR4 | Y | out | Q2 |
| OR4 | A | in | c0_3 |
| OR4 | B | in | c1_3 |
| OR4 | C | in | c2_3 |
| OR4 | D | in | c3_3 |
| OR4 | Y | out | g0_3 |
| OR4 | A | in | c4_3 |
| OR4 | B | in | c5_3 |
| OR4 | C | in | c6_3 |
| OR4 | D | in | c7_3 |
| OR4 | Y | out | g1_3 |
| OR4 | A | in | c8_3 |
| OR4 | B | in | c9_3 |
| OR4 | C | in | c10_3 |
| OR4 | D | in | c11_3 |
| OR4 | Y | out | g2_3 |
| OR4 | A | in | c12_3 |
| OR4 | B | in | c13_3 |
| OR4 | C | in | c14_3 |
| OR4 | D | in | c15_3 |
| OR4 | Y | out | g3_3 |
| OR4 | A | in | g0_3 |
| OR4 | B | in | g1_3 |
| OR4 | C | in | g2_3 |
| OR4 | D | in | g3_3 |
| OR4 | Y | out | Q3 |
Select all → Ctrl+G → in the Library double-click the chip name → RAM256x4.
Step 3. The test bench
What we build. Eight address switches, four data switches, a WE button, three displays.
| Element | Pin | Direction | Label |
|---|---|---|---|
| power | out | out | VCC |
| ground | out | out | GND |
| input | Out | out | mA0 |
| input | Out | out | mA1 |
| input | Out | out | mA2 |
| input | Out | out | mA3 |
| input | Out | out | mA4 |
| input | Out | out | mA5 |
| input | Out | out | mA6 |
| input | Out | out | mA7 |
| input | Out | out | mD0 |
| input | Out | out | mD1 |
| input | Out | out | mD2 |
| input | Out | out | mD3 |
| button | out | out | mWE |
| RAM256x4 | A0 | in | mA0 |
| RAM256x4 | A1 | in | mA1 |
| RAM256x4 | A2 | in | mA2 |
| RAM256x4 | A3 | in | mA3 |
| RAM256x4 | A4 | in | mA4 |
| RAM256x4 | A5 | in | mA5 |
| RAM256x4 | A6 | in | mA6 |
| RAM256x4 | A7 | in | mA7 |
| RAM256x4 | D0 | in | mD0 |
| RAM256x4 | D1 | in | mD1 |
| RAM256x4 | D2 | in | mD2 |
| RAM256x4 | D3 | in | mD3 |
| RAM256x4 | WE | in | mWE |
| RAM256x4 | Q0 | out | mQ0 |
| RAM256x4 | Q1 | out | mQ1 |
| RAM256x4 | Q2 | out | mQ2 |
| RAM256x4 | Q3 | out | mQ3 |
Displays: address — ⚙ width 8, HEX, bus mA; data — width 4, HEX, bus mD; memory — width 4, HEX, bus mQ. Don't group into a chip.
3.4. Check
The address on the display is two hex digits: the left one is the block (A7–A4), the right one is the cell in the block (A3–A0).
| # | What you do | Address mA | Data | Display: address/data/memory |
|---|---|---|---|---|
| 1 | address 00, value 1, WE | 0000 0000 | 0001 | 00 / 1 / 1 |
| 2 | address 01, value 2, WE | 0000 0001 | 0010 | 01 / 2 / 2 |
| 3 | address 10 (block 1, cell 0), 3, WE | 0001 0000 | 0011 | 10 / 3 / 3 |
| 4 | address FF (the last), 9, WE | 1111 1111 | 1001 | FF / 9 / 9 |
| 5 | read address 00 | 0000 0000 | 1001 | 00 / 9 / 1 |
| 6 | read address 10 | 0001 0000 | 1001 | 10 / 9 / 3 |
| 7 | read address 01 | 0000 0001 | 1001 | 01 / 9 / 2 |
| 8 | read address FF | 1111 1111 | 1001 | FF / 9 / 9 |
Step 6 is the key one: addresses 00 and 10 have the same low bits (cell 0), but different blocks — the memory doesn't mix them up.
If not:
| You see | Where to look |
|---|---|
| 00 and 10 show the same thing | block DEC16: I0–I3 = A4–A7 (high bits), not A0–A3 |
| a write spoils all blocks at once | WE of block N = wN = AND(bN, WE), not a shared WE |
| garbage / orange is read | "pass": AND(mN_i, bN) before the OR tree |
Lesson 3 paste (Cmd+I)
First step 1 (delete lesson 2's test bench), then the paste.
chip RAM256x4 { portIn(A0) portIn(A1) portIn(A2) portIn(A3) portIn(A4) portIn(A5) portIn(A6) portIn(A7) portIn(D0) portIn(D1) portIn(D2) portIn(D3) portIn(WE) portOut(Q0) portOut(Q1) portOut(Q2) portOut(Q3) DEC16(I0=A4, I1=A5, I2=A6, I3=A7, Y0=b0, Y1=b1, Y2=b2, Y3=b3, Y4=b4, Y5=b5, Y6=b6, Y7=b7, Y8=b8, Y9=b9, Y10=b10, Y11=b11, Y12=b12, Y13=b13, Y14=b14, Y15=b15) AND(b0, WE, w0) AND(b1, WE, w1) AND(b2, WE, w2) AND(b3, WE, w3) AND(b4, WE, w4) AND(b5, WE, w5) AND(b6, WE, w6) AND(b7, WE, w7) AND(b8, WE, w8) AND(b9, WE, w9) AND(b10, WE, w10) AND(b11, WE, w11) AND(b12, WE, w12) AND(b13, WE, w13) AND(b14, WE, w14) AND(b15, WE, w15) RAM16x4(A0=A0, A1=A1, A2=A2, A3=A3, D0=D0, D1=D1, D2=D2, D3=D3, WE=w0, Q0=m0_0, Q1=m0_1, Q2=m0_2, Q3=m0_3) RAM16x4(A0=A0, A1=A1, A2=A2, A3=A3, D0=D0, D1=D1, D2=D2, D3=D3, WE=w1, Q0=m1_0, Q1=m1_1, Q2=m1_2, Q3=m1_3) RAM16x4(A0=A0, A1=A1, A2=A2, A3=A3, D0=D0, D1=D1, D2=D2, D3=D3, WE=w2, Q0=m2_0, Q1=m2_1, Q2=m2_2, Q3=m2_3) RAM16x4(A0=A0, A1=A1, A2=A2, A3=A3, D0=D0, D1=D1, D2=D2, D3=D3, WE=w3, Q0=m3_0, Q1=m3_1, Q2=m3_2, Q3=m3_3) RAM16x4(A0=A0, A1=A1, A2=A2, A3=A3, D0=D0, D1=D1, D2=D2, D3=D3, WE=w4, Q0=m4_0, Q1=m4_1, Q2=m4_2, Q3=m4_3) RAM16x4(A0=A0, A1=A1, A2=A2, A3=A3, D0=D0, D1=D1, D2=D2, D3=D3, WE=w5, Q0=m5_0, Q1=m5_1, Q2=m5_2, Q3=m5_3) RAM16x4(A0=A0, A1=A1, A2=A2, A3=A3, D0=D0, D1=D1, D2=D2, D3=D3, WE=w6, Q0=m6_0, Q1=m6_1, Q2=m6_2, Q3=m6_3) RAM16x4(A0=A0, A1=A1, A2=A2, A3=A3, D0=D0, D1=D1, D2=D2, D3=D3, WE=w7, Q0=m7_0, Q1=m7_1, Q2=m7_2, Q3=m7_3) RAM16x4(A0=A0, A1=A1, A2=A2, A3=A3, D0=D0, D1=D1, D2=D2, D3=D3, WE=w8, Q0=m8_0, Q1=m8_1, Q2=m8_2, Q3=m8_3) RAM16x4(A0=A0, A1=A1, A2=A2, A3=A3, D0=D0, D1=D1, D2=D2, D3=D3, WE=w9, Q0=m9_0, Q1=m9_1, Q2=m9_2, Q3=m9_3) RAM16x4(A0=A0, A1=A1, A2=A2, A3=A3, D0=D0, D1=D1, D2=D2, D3=D3, WE=w10, Q0=m10_0, Q1=m10_1, Q2=m10_2, Q3=m10_3) RAM16x4(A0=A0, A1=A1, A2=A2, A3=A3, D0=D0, D1=D1, D2=D2, D3=D3, WE=w11, Q0=m11_0, Q1=m11_1, Q2=m11_2, Q3=m11_3) RAM16x4(A0=A0, A1=A1, A2=A2, A3=A3, D0=D0, D1=D1, D2=D2, D3=D3, WE=w12, Q0=m12_0, Q1=m12_1, Q2=m12_2, Q3=m12_3) RAM16x4(A0=A0, A1=A1, A2=A2, A3=A3, D0=D0, D1=D1, D2=D2, D3=D3, WE=w13, Q0=m13_0, Q1=m13_1, Q2=m13_2, Q3=m13_3) RAM16x4(A0=A0, A1=A1, A2=A2, A3=A3, D0=D0, D1=D1, D2=D2, D3=D3, WE=w14, Q0=m14_0, Q1=m14_1, Q2=m14_2, Q3=m14_3) RAM16x4(A0=A0, A1=A1, A2=A2, A3=A3, D0=D0, D1=D1, D2=D2, D3=D3, WE=w15, Q0=m15_0, Q1=m15_1, Q2=m15_2, Q3=m15_3) AND(m0_0, b0, c0_0) AND(m0_1, b0, c0_1) AND(m0_2, b0, c0_2) AND(m0_3, b0, c0_3) AND(m1_0, b1, c1_0) AND(m1_1, b1, c1_1) AND(m1_2, b1, c1_2) AND(m1_3, b1, c1_3) AND(m2_0, b2, c2_0) AND(m2_1, b2, c2_1) AND(m2_2, b2, c2_2) AND(m2_3, b2, c2_3) AND(m3_0, b3, c3_0) AND(m3_1, b3, c3_1) AND(m3_2, b3, c3_2) AND(m3_3, b3, c3_3) AND(m4_0, b4, c4_0) AND(m4_1, b4, c4_1) AND(m4_2, b4, c4_2) AND(m4_3, b4, c4_3) AND(m5_0, b5, c5_0) AND(m5_1, b5, c5_1) AND(m5_2, b5, c5_2) AND(m5_3, b5, c5_3) AND(m6_0, b6, c6_0) AND(m6_1, b6, c6_1) AND(m6_2, b6, c6_2) AND(m6_3, b6, c6_3) AND(m7_0, b7, c7_0) AND(m7_1, b7, c7_1) AND(m7_2, b7, c7_2) AND(m7_3, b7, c7_3) AND(m8_0, b8, c8_0) AND(m8_1, b8, c8_1) AND(m8_2, b8, c8_2) AND(m8_3, b8, c8_3) AND(m9_0, b9, c9_0) AND(m9_1, b9, c9_1) AND(m9_2, b9, c9_2) AND(m9_3, b9, c9_3) AND(m10_0, b10, c10_0) AND(m10_1, b10, c10_1) AND(m10_2, b10, c10_2) AND(m10_3, b10, c10_3) AND(m11_0, b11, c11_0) AND(m11_1, b11, c11_1) AND(m11_2, b11, c11_2) AND(m11_3, b11, c11_3) AND(m12_0, b12, c12_0) AND(m12_1, b12, c12_1) AND(m12_2, b12, c12_2) AND(m12_3, b12, c12_3) AND(m13_0, b13, c13_0) AND(m13_1, b13, c13_1) AND(m13_2, b13, c13_2) AND(m13_3, b13, c13_3) AND(m14_0, b14, c14_0) AND(m14_1, b14, c14_1) AND(m14_2, b14, c14_2) AND(m14_3, b14, c14_3) AND(m15_0, b15, c15_0) AND(m15_1, b15, c15_1) AND(m15_2, b15, c15_2) AND(m15_3, b15, c15_3) OR4(A=c0_0, B=c1_0, C=c2_0, D=c3_0, Y=g0_0) OR4(A=c4_0, B=c5_0, C=c6_0, D=c7_0, Y=g1_0) OR4(A=c8_0, B=c9_0, C=c10_0, D=c11_0, Y=g2_0) OR4(A=c12_0, B=c13_0, C=c14_0, D=c15_0, Y=g3_0) OR4(A=g0_0, B=g1_0, C=g2_0, D=g3_0, Y=Q0) OR4(A=c0_1, B=c1_1, C=c2_1, D=c3_1, Y=g0_1) OR4(A=c4_1, B=c5_1, C=c6_1, D=c7_1, Y=g1_1) OR4(A=c8_1, B=c9_1, C=c10_1, D=c11_1, Y=g2_1) OR4(A=c12_1, B=c13_1, C=c14_1, D=c15_1, Y=g3_1) OR4(A=g0_1, B=g1_1, C=g2_1, D=g3_1, Y=Q1) OR4(A=c0_2, B=c1_2, C=c2_2, D=c3_2, Y=g0_2) OR4(A=c4_2, B=c5_2, C=c6_2, D=c7_2, Y=g1_2) OR4(A=c8_2, B=c9_2, C=c10_2, D=c11_2, Y=g2_2) OR4(A=c12_2, B=c13_2, C=c14_2, D=c15_2, Y=g3_2) OR4(A=g0_2, B=g1_2, C=g2_2, D=g3_2, Y=Q2) OR4(A=c0_3, B=c1_3, C=c2_3, D=c3_3, Y=g0_3) OR4(A=c4_3, B=c5_3, C=c6_3, D=c7_3, Y=g1_3) OR4(A=c8_3, B=c9_3, C=c10_3, D=c11_3, Y=g2_3) OR4(A=c12_3, B=c13_3, C=c14_3, D=c15_3, Y=g3_3) OR4(A=g0_3, B=g1_3, C=g2_3, D=g3_3, Y=Q3)} power(VCC)ground(GND)input(Out=mA0)input(Out=mA1)input(Out=mA2)input(Out=mA3)input(Out=mA4)input(Out=mA5)input(Out=mA6)input(Out=mA7)input(Out=mD0)input(Out=mD1)input(Out=mD2)input(Out=mD3)button{label="WE", hostKey="KeyW"}(mWE)RAM256x4(A0=mA0, A1=mA1, A2=mA2, A3=mA3, A4=mA4, A5=mA5, A6=mA6, A7=mA7, D0=mD0, D1=mD1, D2=mD2, D3=mD3, WE=mWE, Q0=mQ0, Q1=mQ1, Q2=mQ2, Q3=mQ3)display{bits=8, base="HEX", busSource="mA"}()display{bits=4, base="HEX", busSource="mD"}()display{bits=4, base="HEX", busSource="mQ"}()¿No te sale? Algo no funciona →