Урок 1. Счётчик буфера
Начинаем с собранных наборов FL-01 «Игра в кубики» и FL-02 «Узкое место»: цех, пульт, Херби (станок 3, 2 секунды на деталь), прибор простоя и тумблер SLOW. Если их ещё нет, собери их по книгам FL-01 и FL-02: этот набор строится поверх. В этом уроке на пульте появится табло, которое показывает, сколько деталей ждут Херби, — буфер.
Сначала верни Херби. В последнем опыте FL-02 станок 3 ускорили до 1 секунды, и узкого места не стало. Сделай его снова медленным: Alt/⌘ + щелчок по станку 3 (третий от источника), пока на нём не будет «2s» — внизу экрана «Machine: 2 s per item». Время меняется по кругу: 0,5 → 1 → 2 → 4 секунды.
1.1. Идея: что такое буфер
Буфер — все детали между источником и Херби: на лентах, в буферах станков 1–3 и та, что сейчас у Херби в работе. Это очередь, из которой Херби берёт работу. Мерить её проще, чем кажется: буфер — это разность двух чисел:
- вошло — сколько деталей выпустил источник. Такое число на пульте уже есть: счётчик «выпущено» из FL-01, метки
R0…R7; - ушло — сколько деталей прошло Херби. Его будет считать новая ИК-пара поперёк ленты после станка 3 (
OUTH), как ИК-пара перед стоком считает «сделано».
буфер = вошло − ушло
Датчик стоит после Херби, а мерим очередь перед ним: всё, что вышло из источника и ещё не проехало датчик, сейчас либо ждёт Херби, либо у него в работе.
1.2. Идея: вычитание сложением
Вычитателя среди микросхем CMOS 4000 нет, а сумматор есть — CD4008, четыре бита. Вычитать будем сложением, тем же приёмом, что в любом процессоре: прибавить число со знаком минус.
Как получить «минус ушло»? Счётчик CD4029 умеет считать вниз (UD = 0). Начнём с нуля и на каждую деталь будем вычитать единицу: 0 → 255 → 254 → … В восьми битах 255 — это и есть −1, 254 — это −2: прибавь к 255 единицу, и восьмибитный счётчик перейдёт в 0. Такую запись отрицательных чисел называют дополнительным кодом. Значит, счётчик «ушло», идущий вниз от нуля, сразу хранит −ушло.
| Ушло | Счётчик вниз | Вошло, например 10 | Сумма (8 бит) |
|---|---|---|---|
| 0 | 0 | 10 | 10 |
| 1 | 255 | 10 | 265 → 9 |
| 3 | 253 | 10 | 263 → 7 |
Девятый бит суммы (перенос из старшего CD4008) никуда не подключён — он и «съедает» лишние 256.
1.3. Формула
H = −ушло— два CD4029 вниз:CLOCK = OUTH,UD = 0,BD = 1(двоичный),PE = R(кнопка R обнуляет), младшийCI = 0, старшийCI = COмладшего →H0…H7;Q = R + H— два CD4008: младшийA1…A4 = R0…R3,B1…B4 = H0…H3,CI = 0; старшийA1…A4 = R4…R7,B1…B4 = H4…H7,CI = COмладшего →Q0…Q7;- табло «буфер» читает шину
Q.
Почему два CD4029 и два CD4008, а не по одному: при выпуске деталь в секунду перед Херби копится до 18 деталей, а четыре бита досчитают только до 15.
1.4. Сборка
- Импортируй микросхемы набора: файл
drum-chips.json. В нём всё из FL-02 и ещё CD4585 и CD4008. Если редактор спросит про одинаковые микросхемы — они те же самые, можно оставить свои. - Вставь урок через
Cmd+Iповерх FL-02 (текст — в конце урока). Появятся:- на площадке — ИК-пара поперёк ленты между станками 3 и 4, табло «буфер» справа вверху с подписью;
- снаружи — два CD4029 и два CD4008.
1.5. Проверка
- Питание выкл и вкл → R → ПУСК (тумблер SLOW выключен).
- Смотри на табло «буфер».
| Что смотришь | Что видно |
|---|---|
| буфер, первые 30 секунд | растёт: 5 → 9 → 14 → 18 |
| буфер дальше | держится около 18: места перед Херби больше нет, источник ждёт |
| ИК-пара после Херби | деталь проехала — буфер −1 |
| источник выпустил деталь | буфер +1 |
Потом новая смена с включённым SLOW (ритм Херби): буфер держится около 4.
Восемнадцать деталей перед Херби — столько он будет делать 36 секунд. Так много запаса ему не нужно. В следующем уроке пульт сам будет выпускать деталь, только когда буфер станет меньше заданного числа.
Вставка урока 1 (Cmd+I)
# Lesson 1 — the buffer meter. Insert on top of FL-01 «The Dice Game» + FL-02 «The Bottleneck» (chip file drum-chips.json).# Buffer = parts between the source and Herbie (machine 3): on the belts, in the buffers of machines 1–3 and in Herbie.# In = the «released» counter of FL-01 (R0…R7). Out = a new IR pair across the belt after Herbie (OUTH).# The «out» counter (two CD4029) counts DOWN from 0: it holds −out (two's complement).# Two CD4008 add: Q = in + (−out) = in − out (mod 256).irtx txH{channel=2, ang=90}(In=VCC)at(txH, B, 450, 120)irrx rxH{channel=2, ang=90}(Out=OUTH)at(rxH, B, 430, 260)"TI CD4029B"(CLOCK=OUTH, UD=GND, BD=VCC, PE=RST, CI=GND, J1=GND, J2=GND, J3=GND, J4=GND, Q1=H0, Q2=H1, Q3=H2, Q4=H3, CO=COH)"TI CD4029B"(CLOCK=OUTH, UD=GND, BD=VCC, PE=RST, CI=COH, J1=GND, J2=GND, J3=GND, J4=GND, Q1=H4, Q2=H5, Q3=H6, Q4=H7)"TI CD4008B"(A1=R0, A2=R1, A3=R2, A4=R3, B1=H0, B2=H1, B3=H2, B4=H3, CI=GND, S1=Q0, S2=Q1, S3=Q2, S4=Q3, CO=CQ)"TI CD4008B"(A1=R4, A2=R5, A3=R6, A4=R7, B1=H4, B2=H5, B3=H6, B4=H7, CI=CQ, S1=Q4, S2=Q5, S3=Q6, S4=Q7)display shQ{busSource=Q}at(shQ, B, 760, 30)text tQ{text="buffer before Herbie"}at(tQ, B, 760, 14)Не получается? Что-то не работает →