Питання інтерв'ю VHDL - виявлення, чи можна число поділити на 5 без залишку


24

Я побачив приємне запитання інтерв'ю для VHDL - побудувати систему, яка отримує число і визначає, чи можна її розділити на 5 без залишку. Я намагався вирішити це за допомогою державної машини (я вважаю, що вони не хочуть, щоб ви використовували mod або rem ), і в той час я мав початковий успіх (такі цифри, як 5, 10, 15 і такі цифри, як 20, 40, 80, працювали ), інші цифри, такі як 130, 75 тощо, для мене не вдалися.

Я б показав свою державну машину, але це повний безлад (це не код, це малюнок), і, як я вже сказав, навіть не працює.

В основному те, що я намагався зробити, це записати у двійкові числа, які поділяються на 5, і створити державну машину, яка працюватиме на них.

Буду радий, якби ви могли мені показати, як вирішити цю проблему та як думати, стикаючись із чимось подібним.

Дякую!


Ви маєте на увазі (синтезуємую) апаратну реалізацію, а не просто код для перевірки, якщо ціле число буквене ділення на 5 (наприклад, для testbench).
smci

@smci Я насправді просив схему / креслення державної машини, але код цієї машини не зашкодив. Dave Tweed відповів на це питання ідеально.
Еран


Відповідь тут на egreg math.stackexchange.com/a/2569882/213607 може дати певну натхнення для більш паралельного підходу.
mathreadler

Відповіді:


37

Отримати операцію, що залишилася послідовно, насправді досить просто. Ключовим припущенням є те, що дані надходять у MSB-перше, якщо вони є послідовними. Вам потрібно лише N станів, щоб обчислити залишок модуля N. Почніть в стані "0", і якщо ви опинитеся в стані "0" після останнього біта (неважливо, скільки бітів є), решта - нуль.

схематичний

імітувати цю схему - Схематично створено за допомогою CircuitLab

Подумайте, як би ви зробили тривалий поділ, якщо єдине, що вам потрібно було слідкувати, - це залишок:

process (clk)
begin
  if rising_edge(clk) then
    if reset = 1 then
      state <= 0;
    else
      if (state & din) >= N then
        state <= (state & din) - N;
      else
        state <= state & din;
      end if;
    end if;
  end if;
end process;

6
О, я бачу, що це працює, але ви могли б пояснити, як ви придумали державну машину? Що було вихідним? Я ніколи не бачив цього робити раніше, мені просто цікаво, у чому полягає логіка, як його придумати?
zoder

7
Діаграма стану - це саме те, що ви отримуєте від коду VHDL для конкретного випадку N = 5. Іншими словами, якщо стан представляє поточний залишок, наступний стан - це те, що ви отримуєте, коли зміщуєте стан на один біт, додайте до нього вхідний біт, а потім віднімайте 5, якщо потрібно.
Трейд Дейва

3
Це якби красиво, я був би справді вражений, якби хтось придумав це сам в інтерв'ю. І тоді я б із задоволенням попросив їх прокоментувати, як результати синтезу будуть відрізнятися порівняно з просто використанням оператора rem для обробки повного вектора кожного тактового циклу.
Casperrw

8
@zoder Стани є залишками mod 5; стрілка 0 вказує на 2n mod 5, а 1 стрілка вказує на (2n + 1) mod 5.
панно

2
Чи не могли б ви додати заяви state, dinі Nваш код?
mkrieger1

15

Ви також можете розробити стан машини, якщо дані надходять LSB-першими:

Графічне зображення DFA, як описано в кінці цієї відповіді в додатку.

Наявність такого детермінованого кінцевого автомата (DFA) безпосередньо випливає з іншої відповіді , яка описує DFA для MSB-першої. Оскільки мови, прийняті DFA, є звичайними, а звичайні мови, як відомо, закриваються під час зміни сторони (наприклад, дивіться тут ), має бути DFA, який приймає наступну мову:

L={ш{0,1}| реверс(ш)10 ділиться на 5}

Будівництво

  1. Скопіюйте MSB-перший DFA з відповіді Дейва Твіда . Для цього я використовував автоматичний інструмент JFLAP .

  2. Застосуйте явний алгоритм перетворення для відміни DFA, наприклад, як описано на CS.SE: Проектування DFA та реверс його .
    Ви можете бачити (немінімізований) результат цього кроку в старій редакції цієї відповіді.




  3. q0q1

Дійсно, отриманий автомат дає правильні відповіді:

Таблиця з двома стовпцями "Введення" та "Результат" із зазначенням того, чи є різними цифрами результати "Прийняти" або "Відхилити".


Аrеv5=(Q,Σ,δ,q0,Ж)Q={q0,q1,q2,q3,q4}Σ={0,1}Ж={q0}δ

δ(q0,0)=q0,δ(q0,1)=q1δ(q1,0)=q4,δ(q1,1)=q3δ(q2,0)=q1,δ(q2,1)=q2δ(q3,0)=q2,δ(q3,1)=q4δ(q4,0)=q3,δ(q4,1)=q0


Якщо у вас виникнуть труднощі з поверненням DFA, ви також можете просто змінити рівняння: Замість new_state = state * 2 + input, ви можете використовувати (new_state - введення) / 2 = state, а потім поміняти стан і new_state. DFA для нового рівняння повинен вирішити проблему LSB.
Eyal

Чому q3 і q4 позначені так & не навпаки? Поміняйте мітки q3 & q4, і машина реалізує algo "половина (мод 5) і додайте вхідний біт".
Rosie F

2
@RosieF: Фраза "половина (мод 5)", можливо, може використати ще одне пояснення для тих, хто не знайомий з дискретною математикою. Розділення в цьому контексті тягне за собою додавання будь-якого кратного на базу, яка буде потрібна для рівномірного поділу числа, тому 3/2 (mod 5) буде (3 + 5) / 2, тобто 4.
supercat

7

Один із способів створити державну машину (MSB) - це:

  1. Наразі отримане число є N. Припустимо, ви знаєте решту M = N mod 5.

  2. Наближається новий біт, і тепер з'являється нова цінність N' = N*2 + b.

  3. Новий залишок - то M' = (N*2 + b) mod 5 = (M*2 + b) mod 5.

Це досить просто для підрахунку вручну:

    М б | М '
------------------
    0 0 | 0
    1 0 | 2
    2 0 | 4
    3 0 | 1
    4 0 | 3
    0 1 | 1
    1 1 | 3
    2 1 | 0
    3 1 | 2
    4 1 | 4

Що відповідає державній машині у відповіді Дейва Твіда.


5

Можна сподіватися, що питання інтерв'ю стосувався того, як ви вирішите проблему, а не про входи та виходи VHDL чи Verilog. Деталі мови зрозумілі, коли у вас є алгоритм.

S=0S(2S+г) мод 5 SS,гS=0,,4

S=0,к=0S(S+2кг) мод 5,кк+1к24=1 мод 5S(S+2кг) мод 5,к(к+1) мод 4S,к,г(S,к)S=0,,4к=0,,3


3

Залежно від того, для чого пишеться VHDL, ви можете скористатися підходом, який описує його як прямий, комбінаційний розрахунок. Отримання номера може означати, що весь номер буде в регістрі за один тактовий цикл.

Наприклад, ви можете записати mod 5 значення, яке представляє кожен з бітів, додати їх разом, а потім повторювати процес, поки у вас не залишиться щось менше 5. Або реалізуйте це комбінаційно для всіх етапів зменшення, або повторно використовувати логіку для деякої невеликої кількості циклів.

Але якщо ви використовуєте оператор VHDL rem, це може бути правильною відповіддю. Якщо припустити, що компанія має пристойні інструменти синтезу, це дасть вам досить ефективну реалізацію - можливо, трохи більше сфери, ніж рішення, що стосуються державних машин, але повну пропускну спроможність, а отже, ймовірно, хорошу енергію на розрахунок. Це варіант, який би коштував найменше часу на реалізацію, а отже, ймовірно, найменше грошей для роботодавця!

Справедливості, напевно, це не відповідь, яку вони шукають, з таким питанням - але це також можливість показати будь-який реальний досвід дизайну.


3

Якщо число представлено шматками, більшими за один біт, може бути корисним використання деяких паралельних обчислень для обчислення залишку mod 15, за умови, що обчислення може вийти 15 саме в тому випадку, якщо залишок дорівнює нулю. Простий спосіб обчислення залишку mod-15 полягає в тому, щоб спостерігати, що при будь-якому значенні N> = 1 додавання крайніх лівих бітів 4N до частини числа, що перевищує це, дасть значення, що відповідає вихідному моду 15. Це дозволяє проблему підрозділяти різними способами залежно від наявних ресурсів.

Наприклад, якщо починається з 32-бітного значення, це може розглядатися як вісім 4-бітних значень. Вони можуть бути додані парами для отримання чотирьох 5-бітних значень, які, в свою чергу, можуть бути об'єднані в два 6-бітних значення або одне 7-бітове значення. Додавання трьох верхніх бітів цього 7-бітного значення до нижніх 4-розрядних дасть 5-бітове значення, яке становить щонайбільше 21. Можна таким чином визначити, чи є початкове значення кратним 5, спостерігаючи, чи є кінцевим значенням один із 0, 5, 10, 15 або 20.


... або ви можете використовувати 4-розрядні додавачі протягом усього часу, і просто переконайтесь, що кожен випуск стає внесенням для додавача пізніше в ланцюзі. Після трьох шарів додавання у вас є один 4-розрядний результат і чотири ще не використані носії. Додайте три носії разом паралельно останнім 4-бітовим додаванням і додайте їх суму в результат із останнім перенесенням як перенесення. Це дає максимум 19, тому вам не потрібно буде порівнювати 20 після цього.
Геннінг Макгольм

@HenningMakholm: Існує багато способів упорядкування добавок, щоб отримати бажаний результат. Який підхід є кращим у даній ситуації, ймовірно, залежатиме від конкретних проблем маршрутизації або використання ресурсів. Ще одна хитрість полягає у використанні суммозахисних сум, але скористайтеся тим, що верхній біт зміщеного виходу може бути переміщений до нижнього. Таким чином, один шар може перетворити 8 входів на 6, потім 6 на 4, потім 4 на 3 і 3 на 2. Один вихід кожного шару просто буде воротами AND, а інший - воротами XOR, так що час розповсюдження зводиться до рівня a пара 4-розрядних значень для ...
supercat

... однією і єдиною ланцюжком для перевезення буде чотири ворота Xor. Що стосується того, чи краще отримати вихід нижче 19, чи краще перевірити на 20 як можливий залишок, це, ймовірно, залежить від доступності та використання ресурсів. Враховуючи число, яке не більше 30, додавання верхнього та нижнього ніблів дасть значення, яке становить не більше 15 (або 16 + 14-> 1 + 14, або 0 + 15-> 0 + 15), але додавання явного чеки на деякі або всі (20, 25, 30) можуть бути дешевшими.
supercat

2

Я не можу згадати свій VHDL, але ось ескіз ідеї, яка вперше прийшла в голову:

Останні цифри (в базі 10) перших потужностей двох - 1, 2, 4, 8, 6, 2, ... і цикл повторюється. Отже, залишки mod 5 потужностей двох складають 1, 2, 4, 3, ....

Використовуючи це, ми могли переміщувати біти з LSB і накопичувати залишки mod 5, відповідні позиції, кожного разу, коли 1бачиться трохи. Зробіть також модуль накопичення 5, і досить перевірити, чи сума в кінці дорівнює нулю.


1

Ми можемо використати ідею з відповіді тут , що в базі 4 ми можемо отримати, що число ділиться на 5, лише якщо дорівнює змінна цифра. Тому ми

  1. згрупуйте цифри 2 на 2,
  2. підсумовуйте непарні і віднімайте парні 2 бітні блоки.
  3. Якщо результат знаходиться в двох комплементах з декількох бітів, наприклад [-4,3] (легко перевірити, якщо використовувати два доповнення), то ми закінчили і можемо розділити початкове число на 5, лише якщо результат підсумовування 0, що перевірити дуже простий логічний вираз (в основному це просто великий ні на всіх отриманих бітах, ні?)
  4. інакше ми повторюємо нове (значно коротше число).

Спробуємо на число 166 = (10) (10) (01) (10): 2,2,1,2

2-2 + 1-2 = -1

що становить <3 в абсолютній величині, а не 0, чому ми можемо зробити висновок лише за одну ітерацію, що 166 не ділиться рівномірно на 5.

Можливо, невелика пам’ять може бути дешевшою / кращою з точки зору швидкості / nr воріт, ніж ітерація. Звичайно, можна заздалегідь підрахувати найгірший (найбільший можливий результат з урахуванням дозволених входів) та спланувати проект відповідно.


1

Підхід MSB, безумовно, простіше, але мені вдалося зробити діаграму стану LSB, не потребуючи генерації рішення MSB ... це зайняло мені лише пару годин. Виявляється, це рівнозначно тому, який показав @ComFreek, просто зазначається по-різному.

Ми будемо відстежувати два числа. По-перше, ми будемо відстежувати поточну суму, модуль 5 ("SUM"). По-друге, ми відстежимо значення наступної потужності 2, яку слід змістити, за модулем 5 ("НАСТУПНО"). Я представляю кожен стан з можливими значеннями для "SUM" у верхній частині та відповідними їм значеннями "NEXT" під ними.

Почнемо з випадку, коли модуль 5 "SUM" дорівнює 0:

Початкові

Зауважте, що стан виглядає так:
3,2,4,1
1,4,3,2

еквівалентно:
1,3,4,2
2,1,3,4

Оскільки обидва стани представляють, що:
SUM = 1 і NEXT = 4 АБО
SUM = 2 і NEXT = 3 АБО
SUM = 3 і NEXT = 2 АБО
SUM = 4 і NEXT = 1.

Гаразд, тому нам зараз потрібно розробити додаткові стани, оскільки більшість інтерв'юерів не будуть вражені діаграмою стану лише з одним станом. Ми закінчили, коли кожна держава має два переходи.

Кожен раз, коли ви переходите до нового стану, кожне число у "НАДАЛЬНОМУ" подвоюється, то modulo'd 5. Для "SUM" дотримуйтесь цих правил:

  • Якщо ви перейшли на 0, верхній рядок зберігає свої значення.
  • Якщо ви переходили вздовж 1, кожен стовпець - це модуль 5 старого стану "SUM" + "NEXT".

Отже, почнемо із заповнення переходів, коли вхідний біт дорівнює 1.

Усі 1

Гаразд, тепер заповнюємо нулі. Додано лише один стан, тож ми продовжимо також заповнити його переходи.

Повна

І вуаля! У нас є державна машина, яка спочатку приймає LSB, не потребуючи генерації рішення MSB.


1

Все вищесказане здається настільки складним! Існує простий математичний спосіб виявити, чи двійкове ціле число ділиться на п'ять. Для початку ви пам’ятаєте, як зробити «викидання дев'яток» у звичайну десяткову арифметику? Модуль залишку 9 з десятковим цілим числом такий самий, як і модуль 9 залишку суми його цифр. Це працює, тому що 9 на один менше, ніж база чисел.

Існує аналогічний процес "викидання одинадцяти", де знаки альтернативних цифр встановлюються негативними. Це працює, тому що одинадцять на один більший, ніж база чисел.

Отже, якщо ми хочемо «викинути п'ять», ми можемо представляти наше ціле число в базовій кількості чотири. Потім ми починаємо з найнижчої пари цифр як початкову суму, і віднімаємо її від наступної пари цифр, щоб отримати наступну суму. Перебравши таким чином ціле число нашого кандидата, остаточна сума буде нульовою або дільною на 5, якщо наше вихідне ціле число ділиться на 5.

Приклад 70: 01 00 01 10 -> 01 00 -1 -> 01 01 -> 00, ділиться на 5 Приклад 49: 11 00 01 -> 11 -1 -> 1 00 -> 1, НЕ ділиться на 5

Зверніть увагу, що ви повинні мати додатковий біт для знака накопиченої різниці та для випадків, коли є перенесення.

Ще один шлях - це просто додати шістнадцяткові цифри, щоб отримати модуль залишку 15. Звичайно, для визначення трьох прийнятних результатів нуля, п'яти та десяти потрібен останній логічний крок.

Приклад 70: 4 6 -> А, тому 70 ділиться на 5 (але не на 15). Приклад 49: 3 1 -> 4, тому 70 НЕ ділиться на 5.

Зауважте, що ви можете використовувати різні бази чисел для побудови безлічі тестів на роздільність, хоча в комп'ютерній логіці найпростішим є реалізація для потужностей 2 +/- 1.

У десятковій арифметиці одним із моїх улюблених є мій тест на залишок моди 7. Зауважте, що 100 на два більше, ніж кратне 7, тому згрупуйте цифри в пари (працюйте в базі чисел 100) і додайте сотні ДВАХ з одиниць. Тут ми працюємо зліва направо ...

Приклад: 98 76 -> 2 72 -> 76, тому 9876 не ділиться на 7. Це 6 мод 7. Приклад: 03 45 67 -> 51 67 -> 1 69 -> 71, так це 1 мод 7.

Звичайно, у двійковій формі просто візьміть суму восьмеричних цифр (групи по 3 біти).

Вибачте, я хотів би бути гуру Верилога, але арифметика - це все, що я можу запропонувати на цьому етапі життя. Дивіться у "Мертвому рахунку" Рона Доерфлера про багато подібних хитрощів.


Цікаво, чи можуть у наших канадських двоюрідних братів існувати якісь спеціальні алгоритми. Оскільки вони заборонили канадську копійку, усі ціни округлюються до найближчих 0,05 долара.
richard1941

1

Питання інтерв'ю VHDL повинно призвести до деякого коду VHDL.

У мене був привід знайти помилку ghdl llvm з реалізацією таблиці переходу стану Дейва Твіда, де автор ghdl перегнав реалізацію у функцію до 17 рядків:

type remains is (r0, r1, r2, r3, r4); -- remainder values

    function mod5 (dividend: bit_vector) return boolean is
        type remain_array is array (NBITS downto 0) of remains;
        type branch is array (remains, bit) of remains;
        constant br_table:  branch := ( r0 => ('0' => r0, '1' => r1),
                                        r1 => ('0' => r2, '1' => r3),
                                        r2 => ('0' => r4, '1' => r0),
                                        r3 => ('0' => r1, '1' => r2),
                                        r4 => ('0' => r3, '1' => r4)
                                      );
        variable  remaind:    remains := r0;
        variable tbit:        bit_vector (NBITS - 1 downto 0) := dividend;
    begin
        for i in dividend'length - 1 downto 0 loop
            remaind := br_table(remaind,tbit(i));
        end loop;
        return remaind = r0;
end function;

Асоційований тестовий випадок досить невеликий, що дозволяє простіше налагоджувати і використовує імена стану, сумісні з VHDL в перерахованому типі:

dave_tweed.png (створено разом із Dia)

Ідея тут полягає в тому, що функція (або навіть приклад програми VHDL з 27 рядків) є достатньо короткою, щоб написати відповідь VHDL під час інтерв'ю. Не потрібно турбуватися про те, щоб зіпсувати питання про співбесіду, що вимагає продемонструвати як знання, так і вміння, очікується, що респондент захищатиме впровадження, коли його допитують.

(Попередня помилка llvm була виправлена ​​в команді 1f5df6e раніше сьогодні.)

Однією із речей, що зазначила, є таблиця переходу стану, яка також говорить нам про те, де коефіцієнт-біт був би "1", показаний переходом у стан із меншим залишковим значенням (або обома переходами для r4) при відніманні 5 від дивіденду. Це можна закодувати в окрему таблицю (або таблицю типу запису, яка здається громіздкою). Це ми робимо історично в графічному обладнанні, яке має горизонтальну роздільну здатність екрана, кратна 5 пікселів.

Це дає нам div / mod5, що дає коефіцієнт і залишок:

library ieee;
use ieee.std_logic_1164.all;

entity divmod5 is
    generic (
        NBITS:  natural := 13 
    );
    port (
        clk:        in  std_logic;
        dividend:   in  std_logic_vector (NBITS - 1 downto 0);
        load:       in  std_logic;
        quotient:   out std_logic_vector (NBITS - 3 downto 0);
        remainder:  out std_logic_vector (2 downto 0);
        remzero:    out std_logic
    );
end entity;

architecture foo of divmod5 is
    type remains is (r0, r1, r2, r3, r4); -- remainder values
    type remain_array is array (NBITS downto 0) of remains;
    signal remaindr:    remain_array := (others => r0);
    signal dividendreg: std_logic_vector (NBITS - 1 downto 0);
    signal quot:        std_logic_vector (NBITS - 3 downto 0);
begin

parallel:
    for i in NBITS - 1 downto 0 generate
        type branch is array (remains, bit) of remains;
        -- Dave Tweeds state transition table:
        constant br_table:  branch := ( r0 => ('0' => r0, '1' => r1),
                                        r1 => ('0' => r2, '1' => r3),
                                        r2 => ('0' => r4, '1' => r0),
                                        r3 => ('0' => r1, '1' => r2),
                                        r4 => ('0' => r3, '1' => r4)
                                      );

        type qt is array (remains, bit) of std_ulogic;
    -- Generate quotient bits from Dave Tweeds state machine using q_table.
    -- A '1' when a remainder goes to a lower remainder or for both branches
    -- of r4. A '0' for all other branches.

        constant q_table:   qt :=     ( r0 => (others => '0'),
                                        r1 => (others => '0'),
                                        r2 => ('0' => '0', '1' => '1'),
                                        r3 => (others => '1'),
                                        r4 => (others => '1')
                                      );
        signal tbit:    bit;
    begin
        tbit <= to_bit(dividendreg(i));
        remaindr(i) <= br_table(remaindr(i + 1),tbit);
do_quotient:
        if i < quot'length generate   
            quot(i) <= q_table(remaindr(i + 1),tbit);
        end generate;
    end generate;

dividend_reg:
    process (clk)
    begin
        if rising_edge(clk) then
            if load = '1' then
                dividendreg <= dividend;
            end if;
        end if;
    end process;

quotient_reg:
    process (clk)
    begin
        if rising_edge (clk) then
            quotient <=  quot;
        end if;
    end process;

remainders:
    process (clk)
    begin
        if rising_edge(clk) then 
            remzero <= '0';
            case remaindr(0) is
                when r0 =>
                    remainder <= "000";
                    remzero <= '1';
                when r1 =>
                    remainder <= "001";
                when r2 =>
                    remainder <= "010";
                when r3 =>
                    remainder <= "011";
                when r4 =>
                    remainder <= "100";
            end case;
        end if;
    end process;

end architecture;

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity divmod5_tb is
end entity;

architecture foo of divmod5_tb is
    constant NBITS:    integer range 0 to 13 := 8;
    signal clk:        std_logic := '0';
    signal dividend:   std_logic_vector (NBITS - 1 downto 0);
    signal load:       std_logic := '0';

    signal quotient:   std_logic_vector (NBITS - 3 downto 0);
    signal remainder:  std_logic_vector (2 downto 0);
    signal remzero:    std_logic;
    signal psample:    std_ulogic;
    signal sample:     std_ulogic;
    signal done:       boolean;
begin
DUT:
    entity work.divmod5
        generic map  (NBITS)
        port map (
            clk => clk,
            dividend => dividend,
            load => load,
            quotient => quotient,
            remainder => remainder,
            remzero => remzero
        );
CLOCK:
    process
    begin
        wait for 5 ns;
        clk <= not clk;
        if done'delayed(30 ns) then
            wait;
        end if;
    end process;
STIMULI:
    process
    begin
        for i in 0 to 2 ** NBITS - 1 loop
            wait for 10 ns;
            dividend <= std_logic_vector(to_unsigned(i,NBITS));
            wait for 10 ns;
            load <= '1';
            wait for 10 ns;
            load <= '0';
        end loop;
        wait for 15 ns;
        done <= true;
        wait;
    end process;

SAMPLER:
    process (clk)
    begin
        if rising_edge(clk) then
            psample <= load;
            sample <= psample after 4 ns;
        end if;
    end process;

MONITOR:
    process (sample)
        variable i:     integer;
        variable div5:  integer;
        variable rem5:  integer;
    begin
        if rising_edge (sample) then
            i := to_integer(unsigned(dividend));
            div5 := i / 5;
            assert div5 = unsigned(quotient)
                report LF & HT &
                    "i = " & integer'image(i) &
                    " div 5 expected " & integer'image(div5) & 
                    " got " & integer'image(to_integer(unsigned(quotient)))
                SEVERITY ERROR;
            rem5 := i mod 5;
            assert rem5 = unsigned(remainder)
                report LF & HT &
                    "i = " & integer'image(i) &
                    " rem 5 expected " & integer'image(rem5) & 
                    " got " & integer'image(to_integer(unsigned(remainder)))
                SEVERITY ERROR;
        end if;
    end process;

end architecture;

Тут реалізовано оператор генерації, внутрішній оператор генерації, що створює бітні коефіцієнти. Масив remaindr забезпечує слід переходу стану:

divmod5_tb.png

Все без арифметичної операції.

Можливо також реалізувати в процедурі без використання всіх регістрів, які користуються параметрами з вимкненим режимом. Це підійде до мінімальної кількості рядків для співбесіди.

Послідовна послідовна реалізація вимагає трохи лічильника і контролю потоку (JK-відкидний флоп і пара воріт).

Існує відключення часу / складності залежно від розміру дивідендів, які ви, ймовірно, повинні будете захистити в інтерв'ю.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.