Урок 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), как ИК-пара перед стоком считает «сделано».

буфер = вошло − ушло

Датчик стоит после Херби, а мерим очередь перед ним: всё, что вышло из источника и ещё не проехало датчик, сейчас либо ждёт Херби, либо у него в работе.

M1M2M3M4M5E2R2ушло — OUTHвошло — OUTR (счётчик R из FL-01)буфер = вошло − ушло
Урок 1: всё, что вышло из источника и ещё не проехало ИК-пару после Херби, — перед ним или у него в работе. Это и есть буфер.

1.2. Идея: вычитание сложением

Вычитателя среди микросхем CMOS 4000 нет, а сумматор есть — CD4008, четыре бита. Вычитать будем сложением, тем же приёмом, что в любом процессоре: прибавить число со знаком минус.

Как получить «минус ушло»? Счётчик CD4029 умеет считать вниз (UD = 0). Начнём с нуля и на каждую деталь будем вычитать единицу: 0 → 255 → 254 → … В восьми битах 255 — это и есть −1, 254 — это −2: прибавь к 255 единицу, и восьмибитный счётчик перейдёт в 0. Такую запись отрицательных чисел называют дополнительным кодом. Значит, счётчик «ушло», идущий вниз от нуля, сразу хранит −ушло.

УшлоСчётчик внизВошло, например 10Сумма (8 бит)
001010
125510265 → 9
325310263 → 7
счётчик «ушло» считает вниз от нуля00000000011111111255 = −111111110254 = −211111101253 = −3вошло + (−ушло)000010101011111101−31000001117девятый битвыпадаетв восьми битах 255 — это −1: прибавь единицу, и счётчик вернётся в 0
Дополнительный код: счётчик, идущий вниз от нуля, хранит «минус ушло», и вычитание становится сложением.

Девятый бит суммы (перенос из старшего 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.
R0…R7«выпущено», FL-01R4…R7R0…R3CD4008Q0…Q3CD4008Q4…Q7CO → CICD4029 ↓H0…H3CD4029 ↓H4…H7H0…H3H4…H7CO → CIOUTHИК после ХербиQ0…Q7 —на таблоQ = R + H = вошло − ушло
Счётчик буфера: два CD4029 считают вниз от ИК-пары после Херби (снизу), два CD4008 складывают их с «выпущено» из FL-01 (сверху).

Почему два CD4029 и два CD4008, а не по одному: при выпуске деталь в секунду перед Херби копится до 18 деталей, а четыре бита досчитают только до 15.

1.4. Сборка

  1. Импортируй микросхемы набора: файл drum-chips.json. В нём всё из FL-02 и ещё CD4585 и CD4008. Если редактор спросит про одинаковые микросхемы — они те же самые, можно оставить свои.
  2. Вставь урок через Cmd+I поверх FL-02 (текст — в конце урока). Появятся:
    • на площадке — ИК-пара поперёк ленты между станками 3 и 4, табло «буфер» справа вверху с подписью;
    • снаружи — два CD4029 и два CD4008.

1.5. Проверка

  1. Питание выкл и вкл → R → ПУСК (тумблер SLOW выключен).
  2. Смотри на табло «буфер».
Что смотришьЧто видно
буфер, первые 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)

Не получается? Что-то не работает →