Двоичо-десятичный счетчик (counter10)
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

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

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

 

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

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

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

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

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

Машина конечных автоматов или Машина состояний в AHDL – это структура, позволяющая описывать конечный автомат в виде множества внутренних состояний проекта. Переходы между состояниями синхронизируется тактовым сигналом. Условие и направление перехода определяется для каждого состояния индивидуально. Каждому состоянию можно поставить в соответствие один или несколько входных управляющих сигналов.

Машина состояний описывается как переменная в разделе VARIABLE. Поведение машины описывается в разделе логики после ключевого слова BEGIN. Форма описания машины состояний следующая:

Имя_переменной : MACHINE [ OF BITS <список битов> ]

                                 WITH STATES (состояние1, состояние2,……);

где

    состояние ::=<имя> [= значение ],

<значение> ::= <число>ê<имя>.

Например.

ss: MACHINE OF BITS (q1,q2,q3)

              WITH STATES ( s1 = B”000”,

s2 = B”001”)

s3 =B”010”);

или

ss: MACHINE WITH STATES(s0,s1);

Обязательным является перечисление списка состояний (s0,s1). Если не обязательна конструкция OF BITS, то объявление имени состояния равносильно объявлению переменной типа NODE.

Если объявлена конструкция OF BITS, то перечисленные биты должны существовать физически. В этом случае рассматриваются комбинация значений выходов этих битов (логических ячеек), аналогично константам. Кроме того, количество возможных состояний в этом случае равно 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

              IF d THEN    --если на входе d высокий уровень,

              ss = s1;  --то следующее состояние будет s1,

END IF; -- иначе ss останется прежнем

WHEN s1=>            --в состоянии s1

              q = VCC; --устанавливаем выход q в 1

IF !d THEN              --если на входе d низкий уровень,

ss = s0;  --следующее состояние будет s0, иначе ss останется END IF;     --прежним;

END CASE;

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

В данном описании программы я опускал состояния, в которых выдерживались необходимые паузы для общения ПЛИС и микроконтроллера индикатора. Также нужно заметить, что данные в этот модуль программы поступают в параллельном виде, название этой шины Line[].

Рис 3.2.3.1 Блок-схема устройства управления индикатором



Дата: 2019-12-22, просмотров: 240.