Интерфейс в стандарте PCI с встроенным процессором
для крейт-контроллеров КАМАК KK009, KK012 и К106.


Семенов Ю. Б., Жучко В. Е.

Разработанная в стандарте PCI карта обеспечивает возможность работы с Крейт-контроллерами КАМАК КК009, КК012 и К106.

Карта имеет встроенный процессор, разработанный специально для работы с крейтом КАМАК, и встроенную память FIFO (первый пришел первый ушел ) объемом 1024 32 битных слов для считываемых с КАМАК данных. При работе встроенного процессора компьютер освобожден от рутинной работы по обслуживанию крейтов. Тактовая частота встроенного процессора – 33 мГц, поэтому время обслуживания крейтов определяется только скоростью КАМАК. Программа самого компьютера берет данные с буферной памяти FIFO, поэтому возможна работа под операционной системой Windows.

Также карта может работать в режиме аналогичном работе карте прототипа при минимальной переделке старого программного обеспечения. Необходимость переделки связана с тем что стандарт PCI не позволяет пользователю задать ”базовый адрес” устройства – его устанавливает BIOS, поэтому программа должна использовать именно это значение. Что касается прерывания то программа должна использовать считанный из конфигурационного пространства номер прерывания (адрес 3СH конфигурационного пространства - IntLine) – при этом некоторые BIOS позволяют пользователю задать в SETUP номер прерывания для конкретного слота PCI. Следует отметить, что при использовании Win32 драйвера TvicPci необходимость в знании номера прерывания отпадает, так как детали обслуживания прерываний драйвер берет на себя.

Конфигурационное пространство карты

Первые 64 строки (3Сh..00h) конфигурационного пространства имеют жестко заданный формат.

31……………………………………....16 15……………………………………………0
00H U N I T (1270 H) Manufactured ID(1093 H)
04H Status Command
08h Class (05H)       Code(80H) Revision(01H
0CH BIST Header Latency CLS
10H Базовый адрес контроллера КАМАК
... Base Address Register
24H Reserved
28H Reserved
2CH Expansion ROM Base Address
30H Reserved
34H Reserved
3CH MaxLat MinGNT IntPin IntLine
Оставшиеся строки могут быть использованы пользователем по собственному усмотрению.
40H
31……………………………………….…………1 0

Enable card
бит разрешения работы - Пока он ноль карта реагирует только на команды чтения/записи конфигурационного пространства, поэтому первое действие программы должно быть - установка этого бита в 1.

Пространство памяти занимаемое в компьютере

Со стороны компьютера карта представляет область памяти обьемом FFFFh.

Base_adr + 0000


---------------

Base_adr + 7FFF
Пространство памяти контроллера К106 --- 0000….1FFF
Или
Пространство памяти контроллера КК009 --- 0000….7FFF

Работа в данном пространстве аналогично работе с
Контроллером – прототипом
Данное пространство всегда доступно, однако при работе встроенного процессора программист должен предусмотреть невозможность одновременного заказа цикла КАМАК из 2-х программ.
Base_adr + 8000
--------------------
Base_adr + 82FF
Память программы встроенного процессора, 768 слов, RW

Перед работой необходимо установить Reset встроенного процессора
-------------
Base_adr + A000 Данные с FIFO, RO
Base_adr + A004
31…………………………………12 11……………………0

Кол-во слов хранящихся в FIFO
Base_adr + A008
31…………………………………12 11……………………0

Граница FIFO
Количество слов в FIFO превышение которого вызывает прерывание 0 – хотя-бы 1 слово вызывает прерывание, 1024 – прерывания нет никогда
Base_adr + A00C                                                Регистр прерываний
31……3 2 1 0

INT от встроенного процессора INT FIFO INT LAM
Base_adr + A010                                                Регистр масок прерываний
31……3 2 1 0

Маска прер от встр. Процессора Маска FIFO Маска LAM
Base_adr + A014
31…………………………………1 0

Bit Enable встроенного процессора
  0 – Reset встроенного процессора,          1 – Reset снят, Работа
Base_adr + A018
31………………………………16 15…………………………………0

Регистр совместного доступа
16 разрядный регистр доступный для записи со стороны компьютера и для чтения со стороны внутреннего процессора
Base_adr + A01C
31………………………………16 15…………………………………0
Адрес предпоследней команды Адрес последней команды
2 12 разрядных регистра содержащих адреса команд встроенного процессора, выполняемых в данный момент, полезно для отладки.
Base_adr + A100+RxN*4
31………………………………16 15…………………………………0

Содержимое регистра RxN
По этим адресам можно прочитать текущее значение внутреннего 16 битового регистра с номером N, где N в диапазоне 0..15


Встроенный процессор

Встроенный процессор разработан специально для обслуживания крейтов КАМАК. Он содержит программную память объемом 768 строк, шестнадцать 16-разрядных регистров общего назначения (номера 0 - 15). Считанные с крейтов данные записываются процессором в буферную память FIFO для последующего чтения программой компьютера. Тактовая частота процессора 33 мГц, поэтому все его действия практически мгновенны в сравнении с циклом КАМАК. Все команды (естественно за исключением цикла КАМАК) выполняются за один такт.

Список и формат ассемблерных команд процессора

31..24 Мнемоника команды и её краткое описание 23..20 19..16 15 14..0

00
NOP - Нет операции, процессор перейдёт к следующей команде через 33 нсек
Команды работы с КАМАКом
01 w_ CNAF Rx, admov Rx, [ad] Запись в КАМАК адрес из регистра Rx
Номер регистра Адрес команды КАМАК
02 r_ CNAF Rx, admov [ad], Rx Чтение из КАМАК адреса в регистр Rx
Номер регистра Адрес команды КАМАК
03 out_CNAF lv, adfifo lv, [ad] Чтение из КАМАК адреса в память FIFO, Метка будет записана в старшие 16 бит Метка, 8 бит Адрес команды КАМАК
04 rout_CNAF Rx, adfifo Rx, [ad] Чтение из КАМАК адреса в память FIFO, Содержимое регистра будет записано в старшие 16 бит
Номер регистра Адрес команды КАМАК
Команды переходов
10 Jmp adr Безусловный переход по адресу/смещению

Адрес/Смещение
12 jnr Rx, Rx, adrjz Rx, Rx, adr Переход по адресу/смещению если логическое произведение регистров равно 0 Номер регистра Номер регистра Адрес/Смещение
13 jr Rx, Rx, adrjnz Rx, Rx, adr Переход по адресу/смещению если логическое произведение регистров не равно 0 Номер регистра Номер регистра Адрес/Смещение
14 jnb nb, Rx, adr Переход по адресу/смещению если бит nb в регистре равен 0 Номер регистра Номер регистра Адрес/Смещение
15 jb nb,Rx,adr Переход по адресу/смещению если бит nb в регистре не равен 0 Номер регистра Номер регистра Адрес/Смещение
16 jnd adr Переход по адресу/смещению если таймер задержки равен 0

Адрес/Смещение
17 jd adr Переход по адресу/смещению если таймер задержки не равен 0

Адрес/Смещение
18 jnl adr Переход по адресу/смещению если нет LAM в крейте

Адрес/Смещение
19 jL adr Переход по адресу/смещению если есть LAM в крейте

Адрес/Смещение
Команды вызова подпрограмм
20 сall adr Безусловный переход по адресу/смещению

Адрес/Смещение
22 call _nr Rx, Rx, adrcz Rx, Rx, adr Вызов по адресу/смещению если логическое произведение регистров равно 0 Номер регистра Номер регистра Адрес/Смещение
23 call _r Rx, Rx, adrcnz Rx, Rx, adr Вызов по адресу/смещению если логическое произведение регистров не равно 0 Номер регистра Номер регистра Адрес/Смещение
24 call _nb nb, Rx, adrcb Rx, Rx, adr Вызов по адресу/смещению если бит в регистре равен 0 Номер бита Номер регистра Адрес/Смещение
25 call _b nb, Rx, adrcnb Rx, Rx, adr Вызов по адресу/смещению если бит в регистре не равен 0 Номер бита Номер регистра Адрес/Смещение
26 call _nd adrcnd adr Вызов по адресу/смещению если таймер задержки равен 0

Адрес/Смещение
27 call _d adrcd adr Вызов по адресу/смещению если таймер задержки не равен 0

Адрес/Смещение
28 call _ nl adrcnl adr Вызов по адресу/смещению если нет LAM в крейте

Адрес/Смещение
29 call _ l adrcl adr Вызов по адресу/смещению если есть LAM в крейте

Адрес/Смещение
Команды работы с регистрами
30 set_reg Rx, lvmov lv, Rx Ввести данные lv в регистр Rx
Номер регистра
Данные
31 Incr Rx Rx++ Увеличить значение регистра на 1
Номер регистра
32 Decr Rx Rx-- Уменьшить значение регистра на 1
Номер регистра
33 Andr Rx, lv Логическое произведение регистра с данными lv, результат в регистре
Номер регистра Данные
34 Or Rx, lv Логическое или регистра с данными, результат в регистре
Номер регистра Данные
35 ex_reg Rx Записать в регистр содержимое регистра совместного доступа
Номер регистра

Команды для работы с памятью FIFO
40 out_metka fifo Rx, lv Записать в FIFO метки и регистра
Номер регистра
Метка, 8 разрядов
41 out_regs fifo rx, rx Записать в FIFO содержимое регистров Номер регистра
Номер регистра
42 out_time fifo_t Записать в FIFO значение внутреннего таймера
43 out_stime fifo_st Записать в FIFO значение внутреннего таймера, сохранённое командой save_time
44 out_adr fifo_pc Записать в FIFO текущее значение программного счётчика
60 RET Команда возврата из подпрограммы
70 save_time Сохранить во внутреннем регистре текущее значение таймера
80 Delay Val Установить значение таймера задержки для соответствующих команд перехода/вызова Val - 24 разряда данных для задержки, мксек.
90 set_INT Intr Установить флаг прерывания от внутреннего процессора

KK009(n, a, f) Макрокоманда для формирования КАМАК адреса, n – номер станции, a – субадрес команды, f – функция. Параметры могут быть заданы как в виде hex или dec чисел так и ранее описанными символьными константами.
End. Обозначение конца компилируемого кода, начиная с этой строки текст программы будет игнорироваться.
Stop Остановить выполнение программы на данной команде, эквивалентно команде jmp $, полезно при отладке программ

Все команды записи в память FIFO будут работать, если FIFO не заполнено полностью, в противном случае процессор остановится и будет ждать освобождения хотя бы одной ячейки.

КОМПИЛЯТОР ДЛЯ ВНУТРЕННЕГО ПРОЦЕССОРА

Вышеописанные команды имеют более удобную мнемонику при работе с компилятором. Каждая строка программы может содержать только один оператор и комментарий к программе. Комментарий может начинаться с символов ; или //, всё что написано в строке после этих знаков будет игнорироваться. Если требуется закомментировать несколько строк, можно использовать пару скобок /*… */, аналогично языку СИ. Операторы программы могут быть записаны заглавными или прописными символами, значение это не имеет. Синтаксис компилятора позволяет использовать символьные константы для обозначения данных и относительные или абсолютные адреса/метки в командах перехода или вызова подпрограмм. Присвоение значения константе аналогично СИ. Константы могут быть заданы в десятичном или шестнадцатеричном виде 0x234. Символьная переменная – по обычным правилам для любого языка программирования, состоит из букв английского алфавита и цифр, должна начинаться с буквы:
Пример:
A12=5 // Это комментарий
ABC45=98 ; Это комментарий
N=0x4004 /* Это комментарий
на две строки */

Внутренние регистры процессора имеют обозначения Rn, Rx, где n или x – номер регистра в диапазоне от 0 до 15.
  • Метки для команд перехода записываются аналогично символьным константам и должны содержать в конце символ : (двоеточие), после метки может стоять оператор языка, комментарий или пустая строка:
    Metka1: set_reg r1,15
                  Jmp metka1
  • Команды перехода могут содержать абсолютные адреса в виде констант, меток, описанных до или после команды перехода или в виде относительного адреса, содержащего символ $
    Пример:
    Jmp $-5 // перейти на команду с адресом PC-5, где PC – адрес этой команды
    Jmp $+2 // перейти на команду с адресом PC+2, где PC – адрес этой команды
  • Присвоение значений регистрам возможно разными операторами, lvalue - константа:
    1. set_reg r2, lvalue // r2 - lvalue
    2. R2=lvalue // r2 - lvalue
    3. mov lvalue, r2 // r2 - lvalue
Для удобства работы с КАМАК адресами можно использовать макрокоманду КК009(n, a, f), где параметры n, a и f – символьные константы для номера станции, субадреса и функции соответственно. Параметры могут быть заданы непосредственно в макрокоманде или быть заданы ранее в виде символьных констант:
N=6
F=26
Naf26=KK009(N, 0, F) // команда F26 для станции номер N (9 в данном примере)
R_cnaf r0, Naf26 // выполнение КАМАК цикла
  • Команда Mov. Эта команда возможна в следующих вариантах:
    1. mov lvalue, r2 // запись значения в регистр
    2. mov r1, [address] // запись содержимого регистра R1 в КАМАК по адресу address, где address может быть в виде константы или макрокоманды, например: mov r1, [KK009(1,0,16)]
  • Команда Fifo для работы с памятью FIFO, в правой колонке - синоним:
    1. fifo lv, [adr]    out_cnaf lv, adr
    2. fifo R1, [adr]  rout_cnaf R1, adr
    3. fifo R1, R2     out_regs R1, R2
    4. fifo R1, Data  out_metka R1, Data
    5. fifo_t              out_time
    6. fifo_st            out_stime
    7. fifo_pc           out_adr
  • Команды для работы с регистрами
    1. R1++                              incr r1
    2. R1--                               decr r1
    3. R1=data                         mov data, r1 или set_reg r1, data
    4. r1=KK009(4, 0, 0)         mov [KK009(4, 0, 0)],r1 или r_cnaf r1,KK009(4, 0, 0)
  • Для использования в командах символьных констант, они должны быть описаны до этого момента, после этого в любом месте программы допустимы некоторые операции над ними, data=67 – предварительно задано:
    1. data++ // data=68
    2. data— // data=66
    3. data+=5 // data=72
    4. data-=4 // data=63
  • Команда Stop – синоним команды jmp $
  • Команда end. – служит для обозначения конца транслируемого текста, текст программы после этой строки игнорируется и не транслируется.
Пример программы проверки блока АЦП стоящего в станции №6:

N=6
A=0
F=0


    Call         Init


Loop: Mov [KK009(N, A, 8)], R0 // проверка наличия Q от АЦП

Jnb 1, r0, Loop // если нет бита 1 то переход на метку Loop

Mov [KK009(N, A, F)], r1 // читаем в регистр r1 данные из АЦП

Fifo 0, R1 // посылаем прочитанное в FIFO

Jmp Loop // продолжаем опрос

Init: r0=1

mov r0, [4] // init crate

delay 10

jd $ // wait 10 mksec

mov r0, [9] // Z

mov r0, [11] // C

mov r0, [0] // Choice

delay 10

jd $ // wait 10 mksec

mov r0, [15] // inhibit off

ret

Программа PciTest

Программа PciTest предназначена для работы с вышеописанным интеллектуальным PCI КАМАК-контроллером, состоящим из интерфейсной PCI платы и КАМАК модуля КК009 или КК012, соединённых соответствующим кабелем.
На снимке показана первая страница программы:



На этой странице находятся органы управления для режима полной совместимости с контроллерами КК009-КК012. Используя функциональные кнопки, находящиеся слева, можно послать в крейт команды управления Z, C, Init, Choice и снять Inhibit с крейта №1. Описание и назначение этих команд смотри в [1]. Две кнопки с надписями CNAF и CNAF2 позволяют исполнить любые КАМАК команды, параметры которых необходимо предварительно занести при помощи управляющих элементов, находящихся под соответствующей кнопкой. Результат выполнения команд чтения будет показан в окне Рез. для соответствующей кнопки. Справа будут представлены Q и X ответы для выполненных команд. Если модуль КАМАК может выставить LAM на магистраль (например АЦП), то имеется возможность проверить работу системы в режиме прерываний от этого блока, для этого необходимо выставить параметры команды для считывания информации из этого блока, если необходима вторая команда для сброса LAM после команды чтения, то её параметры заносятся в CNAF2, после этого необходимо нажать переключатель Прерывания, считываемые данные будут представлены на графике в нижней части программы. Для очистки графика служит кнопка Erase Plot.
Для работы с внутренним процессором контроллера необходимо перейти на страницу Внутренний процессор программы.



Нижняя часть страницы поделена на две половины: слева находится окно редактора, служащее для написания текста программы внутреннего процессора, справа – результат транслирования этой программы после нажатия кнопки Compile. Кнопки Load и Save To служат для загрузки/спасения программы из/в текстового файла. Клавиша Start Processor запускает в работу созданную программу. Элемент FIFO Length позволяет установить длину буфера FIFO контроллера, по достижению которой будет выставлено прерывание. Для его использования необходимо выставить маску на INT_FIFO, как показано на снимке, а также в тексте программы должны быть команды записи в данных в буфер. Программа PciTest будет обрабатывать прерывания и записывать в текстовой файл считываемые из буфера данные. Затем эти данные можно будет обработать любой другой программой.
Естественно, представленная программа предназначена для проверки режимов работы контроллера и обучению программирования внутреннего процессора.
Программа PciTest написана и отлажена с использованием Борланд С++ билдера, версии 6.0. Для этой цели также создана компонента KK009Pci, содержащая в себе всё необходимое для работы с контроллером (компилятор, редактор, функции для работы с контроллером). По всем вопросам, связанным с приобретением контроллеров и программного обеспечения обращайтесь к авторам.