Рис 3.2.2 Схема антидребезгового устройства
Счетчик реализован с посредством макрофункции Lpm_counter. Встроенная в среду макрофункция Lpm_counter, есть ни что иное, как счетчик с задаваемыми пределами и параметрами, созданная для облегчения процесса разработки подобных устройств.
Двоичный счетчик с возможностью прямого и обратного счета и синхронного и асинхронного сброса. Lpm_counter описывается как переменная в разделе VARIABLE. Форма описания счетчика следующая:
Имя_счетчика : lpm_counter WITH STATES (Параметры счетчика);
Например
COUNTER : lpm_counter WITH (lpm_width=4);
Таблица 3.2.1 Параметры счетчика
Параметры счетчика | Тип | Обязательный | Описание |
LPM_WIDTH | Целочисленный | Да | Ширина счетчика(число битов на выходе) |
LPM_DIRECTION | Строковый | Нет | Устанавливается в прямом “UP” или обратном “DOWN” направлении идет счет, по умолчанию стоит прямой. |
LPM_MODULUS | Целочисленный | Нет | Установка максимума счета, если параметр не усыновлен то счет не ограничен. |
LPM_AVALUE | Целочисленный/Строковый | Нет | Ограничивает максимум счета 32 битами во избежания перегрузки счетчика, когда поведение счетчика не определено при переполнении |
LPM_SVALUE | Целочисленный/Строковый | Нет | Постоянное значение означает что нагрузка включается по переднему фронту clock когда sset или sconst в “1”. Этот параметр должен быть использован если sconst используется |
LPM_HINT | Строковый | Нет | Позволяет с большой точностью перевести текстовый файл из AHDL в VHDL. По умолчанию не используется. |
LPM_TYPE | Строковый | Нет | Связывает LPM_имя с VHDL графическим файлом |
CARRY_CNT_EN | Строковый | Нет | Принимает значения “SMART”, “ON”, “OFF”. При включении lpm_counter функция cnt_en передает сигнал через несущую цепочку. В некоторых случаях, этот параметр используется как параметр установки появления изменения в скорости, но при желании это можно выключить. По умолчанию стоит “SMART”, который сохраняет лучшие отношение между скоростью и размером. |
LABWIDE_SCLR | Строковый | Нет | Принимает значения “ON”,”OFF” или не используется. По умолчанию стоит “NO”. Он позволяет выключить использование LAB-ширины sclr особенно при использовании устройств на базе FLEX 6000. Уменьшает использование случайных библиотек, и таким образом даёт возможность использовать высшей логики плотнее, когда SCLR не используется в LAB. |
Таблица 3.2.2 Таблица истинности lpm_counter
Входы | Выходы | Функции | |||||||||
aclr | aset | aload | clk_en | clock | Sclr | sset | sload | cnt_en | updoun | q[] | |
1 | x | x | x | x | x | x | x | x | x | 000… | |
0 | 1 | x | x | x | x | x | x | x | x | 111… | |
0 | 1 | x | x | x | x | x | x | x | x | LPM_AVALUE | Асинхр. установка значений |
0 | 0 | 1 | x | x | x | x | x | x | x | data[] | Асинхр. загрузка данных |
0 | 0 | 0 | 0 | x | x | x | x | x | x | q[] | Текущее значение |
0 | 0 | 0 | 1 | ò | 1 | x | x | x | x | 000… | Синхронный сброс |
0 | 0 | 0 | 1 | ò | 0 | 1 | x | x | x | 111… | Синхронная установка |
0 | 0 | 0 | 1 | ò | 0 | 1 | x | x | x | LPM_SVALUE | Синхронная установка значении для LPM_SVALUE |
0 | 0 | 0 | 1 | ò | 0 | 0 | 0 | 0 | 0 | q[] | Текущее значение |
0 | 0 | 0 | 1 | ò | 0 | 0 | 1 | x | x | data[] | Синхронная загрузка данных |
0 | 0 | 0 | 1 | ò | 0 | 0 | 0 | 1 | 1 | q[]+1 | Счет в прямом направл. |
0 | 0 | 0 | 1 | ò | 0 | 0 | 0 | 1 | 0 | q[]-1 | Счет в обратном направл. |
При написании программы возникла проблема поразрядного десятичного счета. Двоично-десятичный счетчик реализован помощью макрофункции lpm_counter. Сброс одного десятичного разряда двоично-десятичного счетчика производиться при достижении величины 10. Если один разряд счетчика досчитал до десяти, в двоичном коде B”1010”, то на вход aclr (асинхронный сброс счетчика) этого же счетчика и на счетчик отвечающего за следующий разряд на вход clock выставляется логическая единица. т.е. следующий счетчик считает десятки предыдущего, со следующим счетчиком также и так далее, таким образом есть 6, соединенных последовательно, счетчиков каждый из которых отвечает за разряд рис 3.2.1.
Следовательно, счетное устройство пока может считать до 999999, далее обнуляется, но добавить разрядность не составляет особого труда, просто добавляем счетчик lpm_counter отвечающий за следующий разряд программно и перепрашиваем ПЛИС. Увеличивать возможности данного устройства можно на столько, на сколько хватает ресурсов ПЛИС (т.е. число триггеров внутри неё ) и фантазии создателя.
Основан на машине конечных автоматов. Как уже говорилось в пункте 2.4.2, для того чтобы на индикаторе появилось изображение, после подачи на него питания, нужно выполнить с ним ряд действий. К описанию, которых я и приступаю, но прежде нужно заметить, что для подключение индикатора использовалась 8 разрядная шина.
Машина конечных автоматов используется в устройстве управления индикаторам для его инициализации, а за тем и вывод на экран цифр обозначающих число импульсов.
Машина конечных автоматов или Машина состояний в AHDL – это структура, позволяющая описывать конечный автомат в виде множества внутренних состояний проекта. Переходы между состояниями синхронизируется тактовым сигналом. Условие и направление перехода определяется для каждого состояния индивидуально. Каждому состоянию можно поставить в соответствие один или несколько входных управляющих сигналов.
Машина состояний описывается как переменная в разделе VARIABLE. Поведение машины описывается в разделе логики после ключевого слова BEGIN. Форма описания машины состояний следующая:
Имя_переменной : MACHINE [ OFBITS <список битов> ]
WITHSTATES (состояние1, состояние2,……);
где
состояние ::=<имя> [= значение ],
<значение> ::= <число>ê<имя>.
Например.
ss: MACHINEOFBITS (q1,q2,q3)
WITH STATES ( s1 = B”000”,
s2 = B”001”)
s3 =B”010”);
или
ss: MACHINE WITH STATES(s0,s1);
Обязательным является перечисление списка состояний (s0,s1). Если не обязательна конструкция OFBITS, то объявление имени состояния равносильно объявлению переменной типа NODE.
Если объявлена конструкция OFBITS, то перечисленные биты должны существовать физически. В этом случае рассматриваются комбинация значений выходов этих битов (логических ячеек), аналогично константам. Кроме того, количество возможных состояний в этом случае равно 2 в степени “количества битов”, поэтому желательно явно описать все состояния, включая ложные. Первое по списку состояние является состоянием после сигнала сброса.
Машина состояний имеет следующие порты.
.clk – входной тактовый сигнал;
.reset– сигнал сброса, активный уровень – “1”;
.ena– разрешение перехода, активный уровень – “1”.
Поведение машины можно описать с помощью конструкции CASE
SUBDESIGN StateMachine
(
clk, reset, d: INPUT; -- входныепорты
q: OUTPUT; -- выходнойпорт
)
VARIABLE
ss: MACHINE WITH STATES(s0,s1); --переменная ss –машинасс-ми s0, s1
BEGIN
ss.clk = clk; --соединим входной сигнал clk с тактовым входом машины
ss.reset = reset; --соединим входной сигнал reset с входом сброс
--Далее рассматриваем каждое состояние и анализируем условие переходов
CASE ss IS
WHEN s0 => -- всостоянии s0
q = GND; -- устанавливаем выход q в 0
IFdTHEN --если на входе d высокий уровень,
ss = s1; --то следующее состояние будет s1,
ENDIF; -- иначе ss останется прежнем
WHENs1=> --в состоянии s1
q = VCC; --устанавливаем выход q в 1
IF !dTHEN --если на входе d низкий уровень,
ss = s0; --следующее состояние будет s0, иначе ss останется ENDIF; --прежним;
ENDCASE;
END;
Итак, для работы нужно сначала выставить нужные режимы и флаги через регистр IR(регистр команд) обращение к нему ведется через линию RS выставлением на неё логического нуля. В состоянии Z0 обнуляются все переменные. С состояния P1 по состояние P4 выдерживается четыре паузы 21 мс, 4.1 мс, 0.1 мс и 0.1мс по причине указанной в пункте 2.4.4 до полной готовности индикатора и загружается управляющее слово Н ”38”, что означает: 8 разрядная шина данных, режим развертки одной строки и символы с матрицей 5х8. Далее в состоянии b4, c4 загружается управляющее слово Н”3C” что означает точно тоже самое, но матрица 5х10 точек, чтобы по крупнее показывал. С состояния r5 выбирается режим отображения управляющим словом Н”0C” что означает: включение изображения, курсор в виде почерка . С состояния r6 выбирается направление сдвига курсора вправо без сдвига изображения управляющим словом Н”06”. В состоянии r7 сбрасываются сдвиги, и начало строки адресуется в начало видео памяти DDRAM. В состоянии r8 идет очистка экрана, и счетчик адреса AC адресуется на видео память DDRAM.
На этом этапе все флаги необходимые для формирования изображения загружены. Само формирование изображения начинается с состояния dz0. В состояниях ..z0 значения с счетчика поступают и перекодируются согласно табл3.2.10 дальше записываются в регистр данных. В состоянии ..z1 идет считывание из регистра данных в регистр знакогенератора CGRAM и выводится на экран. И все это начиная с ds циклически, повторяется через заданный интервал времени. Смотри рисунок 3.2.3.1