Рис 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.
Рис 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