Я искал способ вычислить квадратный корень данного 8-битного числа, используя только цифровую комбинацию или последовательную логику. Это возможно?
Одним из способов может быть использование таблицы поиска, поскольку я вообще не рассматриваю дробные части (поэтому ), но должен быть лучший способ, чем этот. Кто-то может указать мне на это?
digital-logic
Rick_2047
источник
источник
Ответы:
Таблицы поиска были упомянуты в комментариях. Есть два подхода.
Быстрое
создание таблицы длиной 256 байт, с каждым следующим значением квадратный корень из соответствующего индекса. Это быстро, поскольку вы используете аргумент в качестве индекса для прямого доступа к нужному значению. Недостаток в том, что ему нужна длинная таблица с множеством повторяющихся значений.
Compact
Как уже говорилось, 8-разрядное целое число может иметь значения только от 0 до 255, а соответствующие квадратные корни - от 0 до 16 (округлены). Построить таблицу из 16 записей (начиная с нуля) с n-й записью - максимальное значение для аргумента, для которого квадратный корень равен n. Таблица будет выглядеть так:
Вы проходите через таблицу и останавливаетесь, когда встречаете значение, большее или равное вашему аргументу. Пример: квадратный корень из 18
В то время как таблица быстрого просмотра имеет фиксированное время выполнения (только один поиск), здесь время выполнения больше для аргументов с более высокими значениями.
Для обоих методов следует, что, выбирая разные значения для таблицы, вы можете выбрать округленное или усеченное значение для квадратного корня.
источник
Работая в 8 битах, вы в основном ограничены целочисленными решениями. Если вам нужен квадратный корень из X, самое близкое, что вы можете получить, это наибольшее целое число, квадрат которого меньше или равен X. Например, для sqrt (50) вы получите 7, так как 8 * 8 будет больше, чем 50.
Итак, вот хитрость для этого: посчитайте, сколько нечетных чисел, начиная с 1, вы можете вычесть из X. Вы можете сделать это с помощью логики следующим образом: 8-битный регистр R1 содержит рабочее значение, 7-битный счетчик R2 содержит (большую часть) нечетное число, а 4-битный счетчик R3 содержит результат. При сбросе R1 загружается со значением X, R2 сбрасывается в ноль, а R3 сбрасывается в ноль. 8-разрядная схема вычитания подается на R1 для входа «A», а значение R2 в сочетании с LSB фиксируется на «1» (через подтягивание) для входа «B». Вычитатель выдает 8-разрядную разность AB и бит заимствования. На каждом такте, если бит заимствования сброшен, R1 загружается с выходом вычитателя, R2 увеличивается, а R3 увеличивается. Если бит заимствования установлен, R1 не загружается, а R2, R3 не увеличиваются, b / c результат теперь готов в R3.
АЛЬТЕРНАТИВЫ
Есть только 16 возможных выходных значений, поэтому ответом является четырехбитное число. По сути, у вас есть четыре однобитных функции из 8 входных битов. Теперь я не могу нарисовать 8-мерную карту Карно, но в принципе вы можете просто создать комбинаторную схему для каждого бита ответа. Возьмите выходы этих четырех комбинаторных схем вместе и интерпретируйте их как четырехбитный ответ. Вуаля. Нет часов, нет регистров, достаточно просто NAND и NOR.
источник
case
заявлению и позволить инструменту синтеза сделать всю работу. С одной стороны, это похоже на создание большой справочной таблицы в распределенном ОЗУ (используется как ПЗУ); с другой стороны, инструмент должен найти оптимизации, которые вы упомянули в своем комментарии.Я не знаю, поможет ли это, но есть гениально простой способ вычислить квадратный корень:
Я не знаю много о том, что можно и что нельзя делать в последовательной логике, но, поскольку этот алгоритм завершается всего за 4 цикла, вы можете реализовать его в 4 этапа.
источник
источник