Смекни!
smekni.com

Счетное устройство видеоимпульсов на ПЛИС (стр. 6 из 7)

Рис 3.2.2 Схема антидребезгового устройства

Счетчик реализован с посредством макрофункции Lpm_counter. Встроенная в среду макрофункция Lpm_counter, есть ни что иное, как счетчик с задаваемыми пределами и параметрами, созданная для облегчения процесса разработки подобных устройств.

3.2.1,1 Встроенная макрофункция – счетчик 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 Счет в обратном направл.

3.2.2 Двоичо-десятичный счетчик (counter10)

При написании программы возникла проблема поразрядного десятичного счета. Двоично-десятичный счетчик реализован помощью макрофункции lpm_counter. Сброс одного десятичного разряда двоично-десятичного счетчика производиться при достижении величины 10. Если один разряд счетчика досчитал до десяти, в двоичном коде B”1010”, то на вход aclr (асинхронный сброс счетчика) этого же счетчика и на счетчик отвечающего за следующий разряд на вход clock выставляется логическая единица. т.е. следующий счетчик считает десятки предыдущего, со следующим счетчиком также и так далее, таким образом есть 6, соединенных последовательно, счетчиков каждый из которых отвечает за разряд рис 3.2.1.

Рис 3.2.1 Схема десятично-двоичного счетчика

Следовательно, счетное устройство пока может считать до 999999, далее обнуляется, но добавить разрядность не составляет особого труда, просто добавляем счетчик lpm_counter отвечающий за следующий разряд программно и перепрашиваем ПЛИС. Увеличивать возможности данного устройства можно на столько, на сколько хватает ресурсов ПЛИС (т.е. число триггеров внутри неё ) и фантазии создателя.

3.2.3Устройство управлением индикатора (wh1602LCD)

Основан на машине конечных автоматов. Как уже говорилось в пункте 2.4.2, для того чтобы на индикаторе появилось изображение, после подачи на него питания, нужно выполнить с ним ряд действий. К описанию, которых я и приступаю, но прежде нужно заметить, что для подключение индикатора использовалась 8 разрядная шина.

Машина конечных автоматов используется в устройстве управления индикаторам для его инициализации, а за тем и вывод на экран цифр обозначающих число импульсов.

3.2.3,1 Машина конечных автоматов

Машина конечных автоматов или Машина состояний в 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