Сучасні цифрові логічні пристрої, як правило, (*) розроблені з "синхронною практикою проектування": глобальний синхронний стиль проектування реєстру-передачі регістра (RTL): всі послідовні схеми розбиті на реєстрові регістри, підключені до глобального тактового сигналу CLK і чиста комбінаційна логіка.
Цей стиль дизайну дозволяє людям швидко розробляти цифрові логічні системи без огляду на терміни. Їх система буде "просто працювати" до тих пір, поки буде достатньо часу від одного краю годинника до другого, щоб внутрішній стан встояв.
У такому стилі дизайну, перекос годинника та інші проблеми, пов’язані з тимчасовим обмеженням, не мають значення, за винятком з'ясування "Яка максимальна тактова частота для цієї системи?".
Що саме таке перекос годинника?
Наприклад:
...
R1 - register 1 R3
+-+
->| |------>( combinational ) +-+
...->| |------>( logic )->| |--...
->|^|------>( )->|^|
+-+ ( ) +-+
| +--->( ) |
CLK | +->( ) CLK
| |
R2: | |
+-+ | |
...->| |->+ |
->|^|->--+
+-+
|
CLK
У реальному технічному забезпеченні сигнал "CLK" ніколи насправді не перемикається рівно одночасно при кожному реєстрі. Годинники перекіс Tskew є затримка вниз по течії годин по відношенню до потоку годин ( ):
Tskew (джерело, призначення) = призначення_час - джерело_часу
де source_time - час активного краю тактового сигналу в реєстрі вихідного джерела (у цьому випадку R1 або R2), а призначення_час - час "того ж" активного краю тактового сигналу в деякому реєстрі нижнього течії (у цьому випадку R3) .
- негативний перекіс годинника: CLK на R3 перемикається перед тактовою частотою на R1.
- позитивний перекос годинника: CLK на R3 перемикається після тактової частоти на R1.
Який ефект перекосу годинника?
(можливо, діаграма часу тут зробить це зрозумілішим)
Щоб робота працювала належним чином, навіть у гіршому випадку, вхідні дані R3 не повинні змінюватися під час налаштування R3 або часу утримування. Інакше гірше, щоб речі працювали належним чином, ми повинні розробити такі речі, щоб:
Tskew (R1, R3) <Tco - Th.
Tclk_min = Tco + Tcalc + Tsu - Tskew (R1, R3).
де:
- Tcalc - це максимально можливий час узгодження будь-якого блоку комбінаційної логіки в будь-якій точці системи. (Іноді ми можемо переробити блок комбінаційної логіки, що знаходиться на критичному шляху, просуваючи деталі вгору або вниз за течією, або вставляючи інший етап конвеєру, тому нова конструкція має менший Tcalc, що дозволяє нам збільшувати тактову частоту) .
- Tclk_min - мінімальний проміжок часу від одного активного краю годинника до наступного краю активного годинника. Обчислюємо це з наведеного рівняння.
- Tsu - час налаштування реєстру. Виробник реєстру очікує, що ми будемо використовувати годинник досить повільно, щоб завжди відповідати цій вимозі.
- Th - час утримування регістра. Виробник реєстру розраховує, що ми будемо контролювати перекос годинника досить, щоб завжди відповідати цій вимозі.
- Tco - затримка від часу до виходу (час розповсюдження). Після кожного активного краю тактового сигналу R1 і R2 протягом короткого часу продовжують приводити старі значення до комбінаційної логіки перед переключенням на нові значення. Це встановлено апаратним забезпеченням і гарантується виробником, але лише до тих пір, поки ми відповідаємо Tsu і Th та іншим вимогам, які виробник визначає для нормальної роботи.
Занадто багато позитивного перекосу - це незручне лихо. Занадто багато позитивного перекосу може (з деякими комбінаціями даних) спричинити "проникнення доріжок" таким чином, що замість того, щоб R3 зав'язував "правильні дані" в тактовому режимі N + 1 (детермінована функція даних, попередньо зафіксованих у R1 та R2, під час годин N) , нові дані, зафіксовані на R1 та R2, на годиннику N + 1, можуть просочуватися, порушувати комбінаційну логіку та спричиняти неправильне введення даних у R3 у "той самий" край годинника N + 1.
Будь-яку кількість негативного перекосу можна "виправити", уповільнивши тактову частоту. Це лише "погано" в тому сенсі, що це змушує нас запускати систему з меншою тактовою частотою, щоб дати входам R3 час для врегулювання після R1 і R2 зафіксувати нові дані на тактовому краю N, а потім пізніше R3 фіксує результат на "наступному" краю годинника N + 1.
Багато систем використовують тактову розподільну мережу, яка намагається зменшити перекос до нуля. Протиінтуїтивно, шляхом ретельного додавання затримок по тактовій траєкторії - шлях від тактового генератора до входу CLK кожного реєстру - можна збільшити уявну швидкість, яку хвилевий фронт годинникової стрілки фізично пересуває від входу CLK одного регістра до наступний реєстр CLK вхід швидше, ніж швидкість світла.
У документації про Altera згадується
"Уникайте використання комбінаційної логіки в тактових доріжках, оскільки це сприяє перекосу годинника."
Це посилається на той факт, що багато людей записують HDL, який збирається на FPGA таким чином, що якимось чином викликає щось, крім глобального сигналу CLK, для керування локальним входом CLK деяких регістрів. (Це може бути логіка "встановлення тактової частоти", щоб нові значення завантажувались у регістр лише при дотриманні певних умов; або логіка "подільник тактових частот", яка випускає лише 1 з N годин та ін.). Цей локальний CLK зазвичай походить від глобального CLK якось - глобальний CLK тикає, а потім або локальний CLK не змінюється, або (невелика затримка після глобального CLK, щоб сигнал поширювався через те "щось інше") локальний CLK змінюється один раз.
Коли це "щось інше" приводить CLK нижнього регістра (R3), це робить перекос більш позитивним. Коли це "щось інше" приводить CLK регістра вгору (R1 або R2), це робить перекос більш негативним. Іноді, те, що приводить CLK регістра вгорі і що б не приводило CLK регістра нижче, має практично однакову затримку, що робить перекос між ними практично нульовим.
Мережа розподілу тактових сигналів всередині деяких ASIC навмисно розроблена з невеликою кількістю позитивного нахилу тактової частоти в деяких регістрах, що надає комбінованій логіці трохи більше часу для врегулювання, і тому вся система може працювати з більш швидкою тактовою частотою. Це називається "оптимізація перекосу годинника" або "планування перекосу годинника" і пов'язане з " переосмисленням ".
Я все ще містифікований set_clock_uncertainty
командою - навіщо мені взагалі хотіти "вручну вказати" перекос?
(*) Один виняток:
асинхронні системи .