По теме прерываний

Микропроцессоры и микроконтроллеры от фирмы Zilog, а также компьютеры на них построенные

Moderator: Shaos

User avatar
Vasil Ivanov
Doomed
Posts: 413
Joined: 11 Dec 2003 14:34

По теме прерываний

Post by Vasil Ivanov »

Привет всем!

Периферийные микрухи Zilog-а имеют всего одну линию прохождения прерываний, см. рисунок:

Code: Select all

+---------+      1             2               N
|         |  +--------+   +--------+       +--------+
|Z80 CPU| <--|IEO  IEI|---|IEO  IEI|--... -|IEO  IEI|--
|         |  +--------+   +--------+       +--------+
+---------+
Ессно самая ближняя к процессору микруха имеет самый высокий приоритет прерывания. Почему Zilog выбрал такую схему ?, ведь в ней будут происходить потери более младших по старшинству прерываний, когда они придут и не смогут дойти до процессора, если в это время уже пришло более старшее прерывание. Т.е. если микруха "1" получила прерывание, то прерывание от микрухи "2" она уже не пропустит (которое пришло чуть позже прерывания 1-й м/с). В итоге теряем прерывание N2.
Vasil Ivanov
vasil-i@yandex.ru
Mixa64
Doomed
Posts: 478
Joined: 25 Aug 2009 07:02
Location: Москва

Post by Mixa64 »

Сам это дело не паял, но сейчас, паяя прерывания на базе 1818ВН19, параллельно разбирался с прерываниями вообще. Есть команда RETI, которую слушает вся периферия и в ответ старшая из обслуженных сбрасывает свой запрос. Ближняя это младшая. Ничего не теряется. Прерывания уровнями идут, не фронтами.
User avatar
HardWareMan
Banned
Posts: 2139
Joined: 20 Mar 2005 13:41
Location: От туда

Post by HardWareMan »

Mixa64 wrote:Сам это дело не паял, но сейчас, паяя прерывания на базе 1818ВН19, параллельно разбирался с прерываниями вообще. Есть команда RETI, которую слушает вся периферия и в ответ старшая из обслуженных сбрасывает свой запрос. Ближняя это младшая. Ничего не теряется. Прерывания уровнями идут, не фронтами.
Наверное речь идет об К(Р)580ВН59/К(Р)1816ВН59? Прерывание может быть как по фронту (защелкивается в контроллере), так и по уровню. Прерывание по фронту потеряться не может, оно хранится, а по уровню, если не дождаться ответа можно потерять. NMI у Z80 как раз по заднему фронту (по спаду, т.е. перепад 1=>0), а вот INT как раз по уровню. Так же, Z80 очень неплохо стыкуется с ВН59м контроллером в нативном режиме IM 0. При этом, мы получаем и настраиваемые приоритеты, и настраиваемые вектора и т.д. Причем, 1816ВН59 имеет бОльший сервис, по сравнению с 580ВН59, т.к. предназначался для 1816ВМ86 (ну типо i8086), но программно и аппаратно совместим со старым 580ВН59. Т.е., имеет все те же функции + свое.
Mixa64
Doomed
Posts: 478
Joined: 25 Aug 2009 07:02
Location: Москва

Post by Mixa64 »

HardWareMan wrote: Наверное речь идет об К(Р)580ВН59/К(Р)1816ВН59?
Извините, поправлю, 1810. Но 1818ВН19 это аналог AMD Am9519. По разводке полностью совпадает с интеловскими 59/59A :) Но принцип каскадирования другой. А фишка его в том, что он поистине универсальный, для каждого уровня IRQ можно запрограммировать от 1 до 4 байт ответа по INTA. Я свой запрограммировал на одно байтный ответ, а Z80 перевожу в im2 и тащусь от прерываний по таблице безо всяких call как в 59 и с одним INTA в отличие от 59A в режиме 86-го 8)
User avatar
HardWareMan
Banned
Posts: 2139
Joined: 20 Mar 2005 13:41
Location: От туда

Post by HardWareMan »

Mixa64 wrote:
HardWareMan wrote: Наверное речь идет об К(Р)580ВН59/К(Р)1816ВН59?
Извините, поправлю, 1810. Но 1818ВН19 это аналог AMD Am9519. По разводке полностью совпадает с интеловскими 59/59A :) Но принцип каскадирования другой.
Точно. Слишком много провел времени на 1816ВЕ31 %)
Mixa64 wrote:А фишка его в том, что он поистине универсальный, для каждого уровня IRQ можно запрограммировать от 1 до 4 байт ответа по INTA. Я свой запрограммировал на одно байтный ответ, а Z80 перевожу в im2 и тащусь от прерываний по таблице безо всяких call как в 59 и с одним INTA в отличие от 59A в режиме 86-го 8)
Только 59й выдает RST n, что накладывает жуткие ограничения, которые чуть-чуть снимаются 59А за счет подсовывания JMP. А вот фишка ВН19 с программируемым ответом - это интересно. Тогда получается возможно использование IM 2 режима с векторами (по идее до 256 разных прерываний). Занятный чипик, надо почитать о нем.
User avatar
Vasil Ivanov
Doomed
Posts: 413
Joined: 11 Dec 2003 14:34

Post by Vasil Ivanov »

HardWareMan wrote:
Mixa64 wrote:Сам это дело не паял, но сейчас, паяя прерывания на базе 1818ВН19, параллельно разбирался с прерываниями вообще. Есть команда RETI, которую слушает вся периферия и в ответ старшая из обслуженных сбрасывает свой запрос. Ближняя это младшая. Ничего не теряется. Прерывания уровнями идут, не фронтами.
Наверное речь идет об К(Р)580ВН59/К(Р)1816ВН59? Прерывание может быть как по фронту (защелкивается в контроллере), так и по уровню. Прерывание по фронту потеряться не может, оно хранится, а по уровню, если не дождаться ответа можно потерять. NMI у Z80 как раз по заднему фронту (по спаду, т.е. перепад 1=>0), а вот INT как раз по уровню.
Едем дальше. 8259A контроллер запоминает входящие запросы прерываний в массиве D-триггеров. Схема:

Code: Select all

              +-+---+
1-й запрос | | T |
       >------|D|  Q|------>  на блок
           +--|C|   |
           |  | |   |
           |  +-+---+
           |
           |
           |  +-+---+
2-й запрос | | T |
       >---|--|D|  Q|------>  выбора
           o--|C|   |
           |  | |   |
           |  +-+---+
           |
           |
           |  +-+---+
N-й запрос | | T |
       >---|--|D|  Q|------>  приоритетов
           o--|C|   |
           |  | |   |
           |  +-+---+
           |
      синхронизация
Я правильно думаю, что синхронизация блока этих триггеров идет от тактовой процессора, чтобы синхронизировать входящие запросы прерываний (которые по-сути асинхронны) ?.

Отсюда вопрос. D-триггер запоминает входной сигнал "D" на положительном фронте сигнала входа "C". Но если на "C" будет тактовая частота и положительный фронт этого сигнала будет появляться каждый период (а значит и возможность изменения запомненных данных), то как в таком случает удержать запомненным ранее пришедший запрос прерывания ?.

Это для случая, когда более старший запрос прерывания пришел и находится в обработке, и приходят более младшие запросы на прерывание, которые надо сохранить, пока обрабатывается этот старший запрос (возможно "длительное" время, скажем чтение/запись блока в режиме прямого доступа к памяти).

P.S. Сорри за качество рисунка.
Vasil Ivanov
vasil-i@yandex.ru
User avatar
Vasil Ivanov
Doomed
Posts: 413
Joined: 11 Dec 2003 14:34

Post by Vasil Ivanov »

Mixa64 wrote:
HardWareMan wrote: Наверное речь идет об К(Р)580ВН59/К(Р)1816ВН59?
Извините, поправлю, 1810. Но 1818ВН19 это аналог AMD Am9519. По разводке полностью совпадает с интеловскими 59/59A :) Но принцип каскадирования другой. А фишка его в том, что он поистине универсальный, для каждого уровня IRQ можно запрограммировать от 1 до 4 байт ответа по INTA. Я свой запрограммировал на одно байтный ответ, а Z80 перевожу в im2 и тащусь от прерываний по таблице безо всяких call как в 59 и с одним INTA в отличие от 59A в режиме 86-го 8)
8259A хорошо юзать, но у него только 8 входов на прерывания. Для системной платы одной микрухой не обойтись, нужно каскадировать. Хотелось бы засунуть контроллер прерываний (непрограммируемый и входов на 16) в ПЛИС и иметь свой чипсет, а не быть привязанным к доставаемости конкретных микрух и куче корпусов на плате. У меня есть 8259A в VHDL варианте, но при этом занимается 41 пин в ПЛИС, в то время как физическая м/с 8259A имеет 28 пинов. Жалко ноги ПЛИС-а.
Vasil Ivanov
vasil-i@yandex.ru
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Vasil Ivanov wrote:У меня есть 8259A в VHDL варианте, но при этом занимается 41 пин в ПЛИС, в то время как физическая м/с 8259A имеет 28 пинов. Жалко ноги ПЛИС-а.
а о какой плисине речь? палка-галка?

если кусок на VHDL не очень большой - можешь прям сюда запостить в теге code? :roll:
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Vasil Ivanov
Doomed
Posts: 413
Joined: 11 Dec 2003 14:34

Post by Vasil Ivanov »

Shaos wrote:
Vasil Ivanov wrote:У меня есть 8259A в VHDL варианте, но при этом занимается 41 пин в ПЛИС, в то время как физическая м/с 8259A имеет 28 пинов. Жалко ноги ПЛИС-а.
а о какой плисине речь? палка-галка?

если кусок на VHDL не очень большой - можешь прям сюда запостить в теге code? :roll:
В Квартусе ставил, для примера, большую ПЛИС Спринтера.
Сорцы 8259A кинул тебе на е-мыло.
Vasil Ivanov
vasil-i@yandex.ru
Mixa64
Doomed
Posts: 478
Joined: 25 Aug 2009 07:02
Location: Москва

Post by Mixa64 »

Везде пишут, что в режиме IM2 младший бит младшего байта указателя на вход в обработчик должен быть равен 0, потому де как процессор считывает _два_ соседних байта и формирует адрес обработчика, поэтому, мол младший 0 и все тут. Но что-то в этой логике не то, логичнее было бы просто взять байт от ВУ, состыковать его с содержимым регистра I и прочитать адрес по этому адресу. Собственно, так и происходит, я проверил. Не важно, с каким младшим битом ВУ выдает свой байт. Более того, не важно вообще, чтобы вектор адресов обработчиков был в памяти машины компактной структурой. Важно лишь, чтобы адреса не перекрывались. ВУ даже 0FFh может отдать, процессор прочитает ячейки [FF] и [I+1][0]
Mac Buster
Retired
Posts: 1474
Joined: 03 Aug 2003 22:37
Location: Moscow

Post by Mac Buster »

Собственно, вы совершенно правы. А про 0, наверное, пишут спектрумисты.
Extreme Entertainment
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Vasil Ivanov wrote:Сорцы 8259A кинул тебе на е-мыло.
Обнаружил, что это у меня уже было :)

Code: Select all

-rw-r--r-- 1 shaos users 207611 2007-03-06 00:22 8237_OSED.zip
-rw-r--r-- 1 shaos users 361500 2007-03-06 00:22 8251_OSED.zip
-rw-r--r-- 1 shaos users 225953 2007-03-06 00:22 8255_OSED.zip
-rw-r--r-- 1 shaos users 149086 2007-03-06 00:22 8259_OSED.zip
Последняя строчка - по внутренностям отличие от твоего архива только в отсутствии файла www.pudn.com.txt
Я тут за главного - если что шлите мыло на me собака shaos точка net