mirror of
https://github.com/TinyTapeout/tt-support-tools.git
synced 2026-11-03 04:36:09 +01:00
feat(docs): add new datasheet generation method (#123)
(cherry picked from commit c36badfb60)
This commit is contained in:
committed by
Uri Shaked
parent
bef483ab40
commit
6e576d6de6
@@ -0,0 +1,102 @@
|
||||
= The Tiny Tapeout Multiplexer
|
||||
== Overview
|
||||
The Tiny Tapeout Multiplexer distributes a single set of user IOs to multiple user designs. It is the backbone of the
|
||||
Tiny Tapeout chip.
|
||||
|
||||
It has the following features:
|
||||
- 10 dedicated inputs
|
||||
- 8 dedicated outputs
|
||||
- 8 bidirectional outputs
|
||||
- Supports up to 512 user designs (32 mux units, each with up to 16 designs)
|
||||
- Designs can have different sizes. The basic unit is called a tile, and each design can occupy up to 16 tiles.
|
||||
|
||||
== Operation
|
||||
The multiplexer consists of three main units:
|
||||
1. The controller $dash.em$ used to set the address of the active design
|
||||
2. The spine $dash.em$ a bus that connects the controller with all the mux units
|
||||
3. Mux units $dash.em$ connects the spine to individual user designs
|
||||
|
||||
=== The Controller
|
||||
The mux controller has 3 input lines:
|
||||
#align(center)[
|
||||
#table(
|
||||
columns: 2, rows: 4,
|
||||
table.header(
|
||||
[Input], [Description]
|
||||
),
|
||||
`ena`, [Sent as-is (buffered) to the downstream mux units],
|
||||
`sel_rst_n`, [Resets the internal address counter to 0 (active low)],
|
||||
`sel_inc`, [Increments the internal address counter by 1]
|
||||
)
|
||||
]
|
||||
|
||||
It outputs the address of the currently selected design on the `si_sel` port of the spine (see below).
|
||||
|
||||
For instance, to select the design at address 12, you need to pulse `sel_rst_n` low, and then pulse `sel_inc` 12 times:
|
||||
|
||||
#figure(
|
||||
caption: [Mux signals for activating the design at address 12],
|
||||
|
||||
align(center)[
|
||||
#image("../resources/images/mux_select_addr_12.svg")
|
||||
]
|
||||
)
|
||||
|
||||
#figure(
|
||||
caption: [Mux Diagram],
|
||||
align(center)[
|
||||
#image("../resources/images/mux_diagram.svg", height: 55%)
|
||||
]
|
||||
)
|
||||
|
||||
#figure(
|
||||
caption: [Mux Controller Diagram],
|
||||
align(center)[
|
||||
#image("../resources/images/mux_controller.png")
|
||||
]
|
||||
)
|
||||
|
||||
Internally, the controller is just a chain of 10 D-flip-flops. The `sel_inc` signal is connected to the clock of the
|
||||
first flip-flop, and the output of each flip-flop is connected to the clock of the next flip-flop. The `sel_rst_n`
|
||||
signal is connected to the reset of all flip-flops.
|
||||
|
||||
The following Wokwi project demonstrates this setup:
|
||||
#link("https://wokwi.com/projects/36434780766")[wokwi.com/projects/36434780766].
|
||||
It contains an Arduino Nano that decodes the currently selected mux address and displays it on a 7-segment display.
|
||||
Click on the button labeled `RST_N` to reset the counter, and click on the button labeled `INC` to increment the counter.
|
||||
|
||||
=== The Spine
|
||||
The controller and all muxes are connected together through the spine. The spine has the following signals going to it:
|
||||
|
||||
*From controller to mux*:
|
||||
- `si_ena` $dash.em$ the `ena` input
|
||||
- `si_sel` $dash.em$ selected design address (10 bits)
|
||||
- `ui_in` $dash.em$ user clock, user `rst_n`, user_inputs (10 bits)
|
||||
- `uio_in` $dash.em$ bidirectional I/O inputs (8 bits)
|
||||
|
||||
*From mux to controller*:
|
||||
- `uo_out` $dash.em$ user outputs (8 bits)
|
||||
- `uio_oe` $dash.em$ bidirectional I/O output enable (8 bits)
|
||||
- `uio_out` $dash.em$ bidirectional I/O outputs (8 bits)
|
||||
|
||||
The only signal which is actually generated by the controller is `si_sel` (using `sel_rst_n` and `sel_inc`, as explained
|
||||
above). The other signals are just going through from/to chip I/O pads.
|
||||
|
||||
=== The Multiplexer
|
||||
Each mux branch is connected to up to 16 designs. It also has 5 bits of a hard-coded address (each unit gets assigned
|
||||
a different address, based on its position on the die).
|
||||
|
||||
The mux implements the following logic:
|
||||
If `si_ena` is 1, and `si_sel` matches the mux address, we know the mux is active. Then, it activates the specific
|
||||
user design port that matches the remaining bits of `si_sel`.
|
||||
|
||||
*For the active design*:
|
||||
- `clk`, `rst_n`, `ui_in`, `uio_in` are connected to the respective pins coming from the spine (through a buffer)
|
||||
- `uo_out`, `uio_oe`, `uio_out` are connected to the respective pins going out to the spine (through a tristate buffer)
|
||||
|
||||
*For all others, inactive designs* (including all designs in inactive muxes):
|
||||
- `clk`, `rst_n`, `ui_in`, `uio_in` are all tied to zero
|
||||
- `uo_out`, `uio_oe`, `uio_out` are disconnected from the spine (the tristate buffer output enable is disabled)
|
||||
|
||||
== Pinout
|
||||
// this pinout table must be populated from within the datasheet template itself
|
||||
Reference in New Issue
Block a user