clk - тактовый сигнал.
2. Разработка основных функциональных узлов
.1 Устройство ввода значений
Значение сотен и десяток делимого в двоично-десятичном коде (BCD) с помощью ключей sw[7..0] фиксируется в регистр делимого vvod1 [11..4]
По нажатию кнопки «bt_clk», начинает записываться значение единиц делимого в регистр делимого vvod1[3..0] и единиц делителя в регистр делителя vvod2[3..0] с помощью тех же ключей sw[7..0].
Для индикации значений на экран, по отдельности, преобразуются в ASCII код сотни делимого ascii_hun[7..0], десятки делимого ascii_dec[7..0], единицы делимого ascii_one[7..0], единицы делителя ascii_one_del[7..0].
Преобразование происходит по условию: если значение, заданное ключами больше 9, то на экран выводить 0
На рисунке 2 описание на языке AHDL условия.
Рисунок 2 - Условие вывода на экран
2.2 Устройство преобразования BCD=>BIN
Преобразование реализуется путём сложения в сумматоре единиц делимого, десяток делимого умноженных на 10 и соток делимого умноженных на 100.
Рисунок 3 - Сумматор
На рисунке 4 представлено преобразование BCD=>BIN на языке AHDL.
Рисунок 4 - Преобразование
2.3 Устройство деления
Деление реализовано методом вычитания из делимого делителя со сдвигом влево.
На рисунке 5 представлен блок деления трехзначного числа на однозначное.
Рисунок 5 - Блок деления
сигнал время индикация код
Где bin[9..0] - трехзначное число делимого;
vvod2[3..0] - однозначное число делителя;
result[9..0] - результат деления;
mods[3..0] - остаток от деления.
Для вывода на экран результата его необходимо перевести из двоичного кода в двоично-десятичный.
2.4 Преобразование кода
Перевод двоичного числа в двоично-десятичное происходит путём выделения декад делимого делением на 10.
В программе преобразование реализовано по условию: если результат трёхзначный, то на 10 делить 2 раза; если результат двухзначный, то делить 1 раз; если результат однозначный, то сразу выводить на экран.
На рисунке 6 представлено описание преобразования на языке AHDL.
Рисунок 6 - Описание на языке AHDL
Как известно, деление на нуль запрещено. Поэтому было реализовано, что при делении на нуль в строке результата выведется слово «ZERRO», в остатке будут нули и загорится предупреждающий светодиод.
Описание на языке AHDL представлено на рисунке 7.
Рисунок 7 - Условия деления на нуль
2.6 Блок интервалов времени
Блок интервалов (рисунок 8) нам нужен для синхронизации LCD - индикатора, а также схемы устранения дребезга кнопки.
Рисунок 8 - Блок интервалов времени
На вход схемы подается глобальный синхросигнал clk частотой 40 МГц, на выходах схемы формируются импульсные последовательности:
-f_10kHz c частотой 10 кГц, длительность импульса 0,1 мс;
-F_200Hz частотой 200 Гц, длительность импульса 5 мс;
-res_b частотой 12,5 Гц, длительность импульса 80 мс.
При использовании этих импульсных последовательностей обязательно необходимо учитывать их длительность, иначе это может привести к неправильному функционированию стробируемых узлов.
Опишем генератор эталонных интервалов времени на языке AHDL (рисунок 9).
Основные сигналы генератора эталонных интервалов времени и память делителей частоты:
Рисунок 9 - Описание на языке AHDL
Элементы памяти делителей частоты объявлены как DFF (D-триггер) и DFFE (D- триггер с сигналом разрешения). Делителем частоты является счетчик с модулем счета, равным коэффициенту деления, и цепями формирования сигнала переноса:
Рисунок 10 - Счётчик делителя на 4000
Первое булево уравнение соединяет вход clk с портами clk триггеров div_4000[]. Во втором уравнении использован оператор if … then … else для задания условия, при котором будет происходить сброс всех триггеров div_4000[].d=0 и формирование сигнала переноса F_10kHz=vcc. Если данное условие не выполняется, то выполняется инкремент счетчика div_4000[].d=div_4000[].q+1. Данное описание определяет алгоритм работы делителя частоты и способ его включения в схему генератора эталонных интервалов времени на рисунке 11. Аналогичным образом можно описать работу остальных делителей частоты, особенность этих описаний заключается в указании групповых переносов, поступающих на входы разрешения триггеров ena в соответствии со схемой (рисунок 11):
Рисунок 11 - Счётчики деления частоты на 50 и на 16
2.7 Антидребезговый модуль
Для подавления «дребезга» контактов кнопки управления используем IP-модуль debounce (рисунок 12). При нажатии на кнопку формируется низкий уровень сигнала ctrl_bt, при этом на выходе модуля debounce формируется одиночный импульс bt_clk.
На рисунке 13 представлено описание на языке AHDL.
Рисунок 13 - Описание на языке AHDL
2.8 Блок индикации
Значение делимого, делителя, знака деления, результата и остатка должно отображаться на LCD индикаторе.
Значение делимого, делителя и знака деления отображается в первой строке индикатора, а результат деления и остаток выводятся во вторую строку.
Для отображения значений, двоичные десятиразрядные числа преобразуются в три тетрады в двоично-десятичном коде. Затем каждую тетраду в ASCII код.
Для преобразователя одного знака в код ASCII старшим 4 битам присваивается двоичное число «0011», а младшим соответствует значение тетрады результата.
Приложение А
описание проекта