Таблица 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 [ 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 Блок-схема устройства
управления индикатором
3.2.4 Делитель тактовой частоты для работы индикатора(divFreq)
Обыкновенный двоичный счетчик выступает в роли
делителя тактовой частоты для работы индикатора т.к. индикатору нужна частота
меньше чем, выдает кварцевый генератор. Коэффициент деления определяется расчетным
и опытным путем (подбором).
3.2.5 Общая структура
программы
Структуру проекта можно увидеть, используя специальное
приложение Max+plus/ Hierarhy Display. Откроется окно, в котором проект представлен в виде дерева, указаны
имя каждого файла и исходный тип, а также иконка. Двойной щелчок по иконке
открывает исходный файл нижнего уровня с помощью соответствующего редактора.
Слева от каждой ветви указаны файлы с такими же именами, но другими
расширениями, которые созданы в процессе обработки исходного файла.
Рис 3.2.5.1 Дерево проекта конфигурации
Тексты каждого модуля можно увидеть в Приложении 3.
Заключение
Подводя итог выше проведенной работы, хочу заметить,
что получившееся устройство оказалось вполне удачным. Работа устройства была
проверена с помощью генератора прямоугольных импульсов. Плата устройства
показана на рисунке 4.1.
Данное устройство можно подключать не только к СС с
ФЭУ, но и к другим детекторам радиоактивных излучений, например счетчик
Гейгера. Для этого необходимо пересчитать делитель, который установлен до
компаратора.
На этапе разработки в схему счетного устройства была
добавлена АЦП Analog Device, AD7715с
последовательным интерфейсом SPI. АЦП планируется
использовать для измерения напряжения подаваемого на детектор.
Литература
1.
Корсунский М.И.,«Атомное ядро» - М.: Гостехиздат,
1957.
2.
Бродин В.Б., Калинин А.В., «Системы на микроконтролерах
и БИС программируемой логики» - М.: Эконом, 2002.
3.
Вицын Н. «Современные тенденции развития систем
автоматизированного проектирования в области электроники» // Chip News, № 1,
1997. С. 12–15.
4.
Губанов Д. А., Стешенко В. Б., Храпов В. Ю.,
Шипулин С. Н. «Перспективы реализации алгоритмов цифровой фильтрации на основе
ПЛИС фирмы ALTERA» // Chip News, № 9–10, 1997, с. 26–33.
5.
Тех. Док. «One Technology Way,
P.O. Box9106, Norwood, MA 02062-9106, U.S.A.», #"_Toc137749732">Приложение
1 (Принципиальная схема устройства)
--Антидребезговая система
INCLUDE
"LPM_COUNTER";
CONSTANT DELAY = 6;
SUBDESIGN ANTIBOUNCE
(
IN :
INPUT;
CLK :
INPUT;
OUT :
OUTPUT;
)
VARIABLE
CT :
LPM_COUNTER WITH(LPM_WIDTH=DELAY);
TRIG : DFF;
BEGIN
TRIG.D = !IN;
CT.ACLR = !(!IN $
TRIG.Q);
CT.CLOCK = CLK;
TRIG.CLK=CT.Q[DELAY-1];
OUT = !TRIG.Q;
END;
--Десятичнодвоичный счетчик
CONSTANT DIGITS = 6;
INCLUDE "LPM_COUNTER";
SUBDESIGN COUNTER10
(
-- входные данные
CLOCK :
INPUT;
ACLR :
INPUT;
COUNT_ENA :
INPUT;
-- выход
Q[DIGITS-1..0][3..0] :
OUTPUT;
)
VARIABLE
RESET[DIGITS-1..0] :
NODE;
COUNTER[DIGITS-1..0] :
LPM_COUNTER WITH (LPM_WIDTH=4);
BEGIN
IF
COUNTER[0].Q[3..0]==B"1010" THEN RESET[0]=vcc; ELSE RESET[0]=gnd; END
IF;
IF
COUNTER[1].Q[3..0]==B"1010" THEN RESET[1]=vcc; ELSE RESET[1]=gnd; END
IF;
IF
COUNTER[2].Q[3..0]==B"1010" THEN RESET[2]=vcc; ELSE RESET[2]=gnd; END
IF;
IF
COUNTER[3].Q[3..0]==B"1010" THEN RESET[3]=vcc; ELSE RESET[3]=gnd; END
IF;
IF
COUNTER[4].Q[3..0]==B"1010" THEN RESET[4]=vcc; ELSE RESET[4]=gnd; END
IF;
IF
COUNTER[5].Q[3..0]==B"1010" THEN RESET[5]=vcc; ELSE RESET[5]=gnd; END
IF;
COUNTER[0].clock=clock;
COUNTER[DIGITS-1..1].clock=RESET[DIGITS-2..0];
Q[DIGITS-1..0][3..0]=COUNTER[DIGITS-1..0].Q[3..0];
COUNTER[DIGITS-1..0].aclr=RESET[DIGITS-1..0]#aclr;
COUNTER[0].cnt_en=COUNT_ENA;
END;
--Устройство управления
индикатором
CONSTANT DATA_WITH = 8;
INCLUDE "LPM_COUNTER";
SUBDESIGN WH1602
(
CLK :
INPUT;
IN[5..0][DATA_WITH-1..0] :
INPUT;
D[DATA_WITH-1..0] :
BIDIR;
E :
OUTPUT;
RW :
OUTPUT;
RS :
OUTPUT;
)
VARIABLE
clk_a :
NODE;
Ddff[DATA_WITH-1..0] :
dff;
Din[DATA_WITH-1..0] :
dff;
Dmsh[DATA_WITH-1..0] :
NODE;
_RW :
NODE;
_RS :
NODE;
Eena :
NODE;
Pause :
LPM_COUNTER WITH (LPM_WIDTH=9);
STR :
LPM_COUNTER WITH (LPM_WIDTH=4);
LINE[DATA_WITH-1..0] :
NODE;
ST :
MACHINE
WITH STATES ( z0,
p1, r1, p2, r2, p3, r3, p4,
r4,
b4, c4, r5, b5, c5, r6, b6, c6, r7, b7, c7, r8, b8, c8,
ds,
bs, cs, dz0, bz0, cz0, dz1, bz1, cz1 );
Dtri[DATA_WITH-1..0] :
TRI;
OE :
NODE;
INC[3..0] :
NODE;
INBUF[5..0][DATA_WITH-1..0] :
DFF;
READ :
DFF;
BEGIN
clk_a = dff(!clk_a, clk,
vcc, vcc);
Pause.clock = clk_a;
-- outputs
Ddff[DATA_WITH-1..0].d =
Dmsh[DATA_WITH-1..0];
Ddff[DATA_WITH-1..0].clk =
!clk_a;
Dtri[DATA_WITH-1..0].in =
Ddff[DATA_WITH-1..0].q;
D[DATA_WITH-1..0] =
Dtri[DATA_WITH-1..0].out;
Din[DATA_WITH-1..0].d =
D[DATA_WITH-1..0];
Din[DATA_WITH-1..0].clk =
!dff (clk_a & Eena , clk, vcc, vcc);
Dtri[DATA_WITH-1..0].oe =
dff (OE, !clk_a, vcc, vcc);
RW = dff (_RW, !clk_a, vcc,
vcc);
RS = dff (_RS, !clk_a, vcc,
vcc);
E = dff (clk_a & Eena ,
clk, vcc, vcc);
-- machine
ST.clk = clk_a;
CASE ST IS
WHEN z0 =>
Dmsh[DATA_WITH-1..0]
= H"FF"; OE = vcc;
Eena =
gnd; _RW = gnd; _RS = gnd; Pause.aclr =
vcc;
ST = p1;
-- загрузка
индикатора после включения питания
-- пауза
перед включением 21мс
WHEN p1
=>
Dmsh[DATA_WITH-1..0] = H"38"; OE = vcc;
Eena =
gnd; _RW = gnd; _RS = gnd; Pause.aclr = gnd;
IF
Pause.q[]==200 THEN ST = r1; ELSE ST = p1; END IF;
-- INITIAL SETTING
ONCE 00111000
WHEN r1 =>
Dmsh[DATA_WITH-1..0]
= H"38"; OE = vcc;
Eena =
vcc; _RW = gnd; _RS = gnd; Pause.aclr = vcc;
ST = p2;
-- пауза 7 мс >
4.1 мс
WHEN p2 =>
Dmsh[DATA_WITH-1..0]
= H"38"; OE = vcc;
Eena =
gnd; _RW = gnd; _RS = gnd; Pause.aclr = gnd;
IF
Pause.q[]==100 THEN ST = r2; ELSE ST = p2; END IF;
-- INITIAL SETTING
TWICE 00111000
WHEN r2 =>
Dmsh[DATA_WITH-1..0]
= H"38"; OE = vcc;
Eena =
vcc; _RW = gnd; _RS = gnd; Pause.aclr = vcc;
ST = p3;
-- пауза
0.7 мс > 0.1 мс
WHEN p3 =>
Dmsh[DATA_WITH-1..0]
= H"38"; OE = vcc;
Eena =
gnd; _RW = gnd; _RS = gnd; Pause.aclr = gnd;
IF
Pause.q[]==10 THEN ST = r3; ELSE ST = p3; END IF;
-- INITIAL SETTING
THIRD 00111000
WHEN r3 =>
Dmsh[DATA_WITH-1..0]
= H"38"; OE = vcc;
Eena =
vcc; _RW = gnd; _RS = gnd; Pause.aclr = vcc;
ST = p4;
-- пауза
0.7 мс > 0.1 мс
WHEN p4 =>
Dmsh[DATA_WITH-1..0]
= H"38"; OE = vcc;
Eena =
gnd; _RW = gnd; _RS = gnd; Pause.aclr = gnd;
IF Pause.q[]==10
THEN ST = r4; ELSE ST = p4; END IF;
-- Function Set
0011NF**
WHEN r4 =>
Dmsh[DATA_WITH-1..0]
= H"3C"; OE = vcc;
Eena =
vcc; _RW = gnd; _RS = gnd; Pause.aclr = vcc;
ST = b4;
WHEN b4 =>
Dmsh[DATA_WITH-1..0]
= H"00"; OE = gnd;
Eena =
vcc; _RW = vcc; _RS = gnd; Pause.aclr = vcc;
ST = c4;
WHEN c4 =>
Dmsh[DATA_WITH-1..0]
= H"00"; OE = gnd;
Eena =
gnd; _RW = vcc; _RS = gnd; Pause.aclr = gnd;
IF
Din[DATA_WITH-1].q==0 THEN ST = r5; ELSE ST = b4; END IF;
-- Display ON/OFF
= 00001DCB, Display ON,Cursor&Blink OFF
WHEN r5 =>
Dmsh[DATA_WITH-1..0]
= H"0C"; OE = vcc;
Eena =
vcc; _RW = gnd; _RS = gnd; Pause.aclr = vcc;
ST = b5;
WHEN b5 =>
Dmsh[DATA_WITH-1..0]
= H"00"; OE = gnd;
Eena =
vcc; _RW = vcc; _RS = gnd; Pause.aclr = vcc;
ST = c5;
WHEN c5 =>
Dmsh[DATA_WITH-1..0]
= H"00"; OE = gnd;
Eena =
gnd; _RW = vcc; _RS = gnd; Pause.aclr = gnd;
IF
Din[DATA_WITH-1].q==0 THEN ST = r6; ELSE ST = b5; END IF;
-- Entry Mode Set
= 000001IS, Increment & Shift OFF
WHEN r6 =>
Dmsh[DATA_WITH-1..0]
= H"06"; OE = vcc;
Eena =
vcc; _RW = gnd; _RS = gnd; Pause.aclr = vcc;
ST = b6;
WHEN b6 =>
Dmsh[DATA_WITH-1..0]
= H"00"; OE = gnd;
Eena =
vcc; _RW = vcc; _RS = gnd; Pause.aclr = vcc;
ST = c6;
WHEN c6 =>
Dmsh[DATA_WITH-1..0]
= H"00"; OE = gnd;
Eena =
gnd; _RW = vcc; _RS = gnd; Pause.aclr = gnd;
IF
Din[DATA_WITH-1].q==0 THEN ST = r7; ELSE ST = b6; END IF;
-- Return Home
WHEN r7 =>
Dmsh[DATA_WITH-1..0]
= H"02"; OE = vcc;
Eena =
vcc; _RW = gnd; _RS = gnd; Pause.aclr = vcc;
ST = b7;
WHEN b7 =>
Dmsh[DATA_WITH-1..0]
= H"00"; OE = gnd;
Eena =
vcc; _RW = vcc; _RS = gnd; Pause.aclr = vcc;
ST = c7;
WHEN c7 =>
Dmsh[DATA_WITH-1..0]
= H"00"; OE = gnd;
Eena =
gnd; _RW = vcc; _RS = gnd; Pause.aclr = gnd;
IF
Din[DATA_WITH-1].q==0 THEN ST = r8; ELSE ST = b7; END IF;
-- Clear Display
WHEN r8 =>
Dmsh[DATA_WITH-1..0]
= H"01"; OE = vcc;
Eena =
vcc; _RW = gnd; _RS = gnd; Pause.aclr = vcc;
ST = b8;
WHEN b8 =>
Dmsh[DATA_WITH-1..0]
= H"00"; OE = gnd;
Eena =
vcc; _RW = vcc; _RS = gnd; Pause.aclr = vcc;
ST = c8;
WHEN c8 =>
Dmsh[DATA_WITH-1..0]
= H"00"; OE = gnd;
Eena =
gnd; _RW = vcc; _RS = gnd; Pause.aclr = gnd;
IF
Din[DATA_WITH-1].q==0 THEN ST = ds; ELSE ST = b8; END IF;
--формирование изображения
WHEN ds =>
Dmsh[DATA_WITH-1..0]
= LINE[]; OE = vcc;
Eena =
vcc; RW = gnd; _RS = vcc; Pause.aclr = vcc;
ST = bs;
WHEN bs =>
Dmsh[DATA_WITH-1..0]
= H"00"; OE = gnd;
Eena =
vcc; _RW = vcc; _RS = gnd; Pause.aclr = vcc;
ST = cs;
WHEN cs =>
Dmsh[DATA_WITH-1..0]
= H"00"; OE = gnd;
Eena =
gnd; _RW = vcc; _RS = gnd; Pause.aclr = gnd;
IF
STR.q==H"F" THEN ST=dz0;
ELSIF
Din[DATA_WITH-1].q==0 THEN ST = ds; ELSE ST = bs; END IF;
--перемещение в начало
WHEN dz0
=>
Dmsh[DATA_WITH-1..0] = H"40"; OE = vcc;
Eena =
gnd; _RW = gnd; _RS = gnd; Pause.aclr = vcc;
ST = bz0;
WHEN bz0
=>
Dmsh[DATA_WITH-1..0] = H"00"; OE = gnd;
Eena =
vcc; _RW = vcc; _RS = gnd; Pause.aclr = vcc;
ST = cz0;
WHEN cz0 =>
Dmsh[DATA_WITH-1..0]
= H"00"; OE = gnd;
Eena =
gnd; _RW = vcc; _RS = gnd; Pause.aclr = gnd;
IF
Din[DATA_WITH-1].q==0 THEN ST = dz1; ELSE ST = bz0; END IF;
WHEN dz1 =>
Dmsh[DATA_WITH-1..0]
= H"80"; OE = vcc;
Eena =
vcc; _RW = gnd; _RS = gnd; Pause.aclr = vcc;
ST = bz1;
WHEN bz1 =>
Dmsh[DATA_WITH-1..0]
= H"00"; OE = gnd;
Eena =
vcc; _RW = vcc; _RS = gnd; Pause.aclr = vcc;
ST = cz1;
WHEN cz1 =>
Dmsh[DATA_WITH-1..0]
= H"00"; OE = gnd;
Eena =
gnd; _RW = vcc; _RS = gnd; Pause.aclr = gnd;
IF
Din[DATA_WITH-1].q==0 THEN ST = ds; ELSE ST = bz1; END IF;
END CASE;
INBUF[5..0][DATA_WITH-1..0].clk=READ.q;
INBUF[5..0][DATA_WITH-1..0].d=IN[5..0][DATA_WITH-1..0];
IF ST==dz1 THEN READ.d=vcc;
ELSE READ.d=gnd; END IF;
READ.clk=clk;
IF ST==ds THEN
STR.clock=vcc; ELSE STR.clock=gnd; END IF;
STR.aclr=READ.q;
CASE STR.q[] IS
WHEN
H"1" => LINE[]=INBUF[5][DATA_WITH-1..0];
WHEN
H"2" => LINE[]=INBUF[4][DATA_WITH-1..0];
WHEN
H"3" => LINE[]=INBUF[3][DATA_WITH-1..0];
WHEN
H"4" => LINE[]=INBUF[2][DATA_WITH-1..0];
WHEN
H"5" => LINE[]=INBUF[1][DATA_WITH-1..0];
WHEN
H"6" => LINE[]=INBUF[0][DATA_WITH-1..0];
WHEN
H"7" => LINE[]=H"20";
WHEN
H"8" => LINE[]=H"43";
WHEN
H"9" => LINE[]=H"44";
WHEN
H"A" => LINE[]=H"45";
WHEN
H"B" => LINE[]=H"46";
WHEN
H"C" => LINE[]=H"47";
WHEN
H"D" => LINE[]=H"48";
WHEN
H"E" => LINE[]=H"49";
WHEN
H"F" => LINE[]=H"4A";
END CASE;
END;
* промиль
(миллионная часть, 10-6). Стабильность частоты
Допустимое отклонение частоты от номинального значения. Измеряется в процентах
или в "ppm"
Страницы: 1, 2, 3, 4, 5
|