Интерфейс сопроцессора
В данном разделе описывается интерфейс сопроцессора ядра ARM7TDMI в следующей последовательности:
1. Кратко о сопроцессорах
Набор инструкций ядра ARM7TDMI позволяет реализовать специальные дополнительные инструкции, поддерживающие сопроцессоры для расширения функциональных возможностей. Они являются отдельными блоками обработки информации и вплотную связаны с процессором ARM7TDMI. Типичный сопроцессор содержит:
- конвейер инструкций
- логику дешифрации инструкции
- логику подтверждения передачи
- банк регистров
- специальную логику обработки с собственным каскадом передачи данных.
Сопроцессор подключается к той же шине данных, к которой подключается процессор ARM7TDMI в системе, и отслеживает конвейер в процессоре ARM7TDMI. Это означает, что сопроцессор может дешифрировать инструкции в потоке инструкций и выполнять те из них, которые он поддерживает. Каждая инструкция продвигается по конвейеру одновременно, как в ядре ARM7TDMI, так и в сопроцессоре.
Выполнение инструкций распределяется между ядром ARM7TDMI и сопроцессором.
Процессор ARM7TDMI:
- Оценивает тип инструкции и коды условия для определения должна ли выполняться данная инструкция сопроцессором, а затем передает ее любому сопроцессору в системе с помощью nCPI.
- Генерирует адреса, которые требуются инструкцией, в т.ч. предварительная выборка следующей инструкции для заполнения конвейера.
- Выполнение последовательности неопределенной инструкции, если сопроцессор не принял инструкцию.
Сопроцессор:
- Дешифрирует инструкции для определения, может ли он принять инструкцию.
- Сигнализирует через CPA и CPB о том, принял ли он инструкцию.
- Выборка любых значений из собственного банка регистров.
- Выполнение операции, требуемой инструкцией.
Если сопроцессор не может выполнить инструкцию, то вызывается ситуация неопределенной инструкции. В этом случае можно либо сэмулировать сопроцессорные функции программно, либо разработать отдельный сопроцессор.
1.1 Доступные сопроцессоры
В системе может использоваться до 16 сопроцессоров, каждый из которых должен иметь свой единообразный идентификационный номер. Ядро ARM7TDMI содержит один внутренний сопроцессор:
- CP14 - сопроцессор отладочного коммуникационного канала.
Остальные сопроцессорные номера зарезервированы. В таблице 4.1 представлен перечень доступных сопроцессоров.
Таблица 4.1. Доступные сопроцессоры
Номер сопроцессора |
Назначение |
15 |
Зарезервирован для системного управления |
14 |
Контроллер отладки |
13:8 |
Зарезервировано |
7:4 |
Доступны для пользователя |
3:0 |
Зарезервировано |
Если вы разрабатываете сопроцессор, то отправьте email с указанием темы "coprocessor" по адресу info@arm.com и вы получите свежую информацию о назначении сопроцессорных номеров.
2. Сигналы интерфейса сопроцессора
Сигналы, которые используются для подключения ядра ARM7TDMI к сопроцессору, сгруппированы в четыре категории.
Сигналы синхронизации и управления синхронизацией:
Сигналы следования по конвейеру:
- nMREQ
- SEQ
- nTRANS
- nOPC
- TBIT.
Сигналы подтверждения передачи:
Сигналы данных:
- D[31:0]
- DIN[31:0]
- DOUT[31:0].
3. Сигналы следования по конвейеру
Каждый сопроцессор в системе должен содержать логику отслеживания инструкций на конвейере процессора ARM7TDMI. Сопроцессоры подключаются к сконфигурированной шине ввода данных ядра ARM7TDMI D[31:0] или DIN[31:0], через которые под управлением сигналов MCLK и nWAIT осуществляется выборка инструкции.
Важно, чтобы оба конвейера всегда работали синхронно. При разработке логики отслеживания инструкции на конвейере сопроцессора необходимо учесть следующие правила:
- Во время сброса, когда на вход nRESET подан низкий уровень, конвейер должен быть помечен, как недействительный или заполнен инструкциями, которые не могут быть дешифрированы в этом сопроцессоре как действительные инструкции.
- Состояние сопроцессора должно изменяться только когда nWAIT имеет высокий уровень. Исключением является состояние сброса.
- Инструкция должна загружаться в конвейер по падающему фронту MCLK и только когда в предыдущем шинном цикле все сигналы nOPC, nMREQ и TBIT имели низкий уровень. Данные условия сигнализируют, что данный цикл является выборкой инструкции ARM и новый код операции должен быть загружен в конвейер.
- Конвейер должен продвигаться по подающему фронту MCLK, когда в текущем шинном цикле nOPC, nMREQ и TBIT имеют низкий уровень.
Данные условия сигнализируют, что текущая инструкция близка к завершению исполнения, поэтому, первым действием любой инструкции, выполняющей выборку инструкции, является повторное заполнение конвейера.
Любая инструкция, загруженная из конвейера процессора ARM7TDMI:
- никогда не сигнализирует с помощью nCPI о инициации ее исполнения;
- автоматически заменяется в конвейере сопроцессора на предварительные выборки, требуемые для заполнения конвейера ядра.
В наборе инструкций Thumb нет сопроцессорных инструкций и, поэтому, сопроцессоры должны следить за состоянием выхода TBIT для гарантирования, что они не будут дешифрировать Thumb-инструкции, как ARM-инструкции.
4. Подтверждение передачи по интерфейсу сопроцессора
Подтверждение передачи по интерфейсу сопроцессора описывается в следующей последовательности:
- Сопроцессор
- Процессор ARM7TDMI
- Сигнализация сопроцессора
- Последовательности "занят - ожидание"
- Инструкции передачи регистра сопроцессора
- Операции с данными сопроцессора
- Операции чтения и записи сопроцессора.
Ядро ARM7TDMI и любые сопроцессоры в системе выполняют подтверждение передачи с помощью сигналов, представленных в таблице 4.2.
Таблица 4.2. Сигналы подтверждения передачи
Сигнал |
Направление |
Назначение |
nCPI |
От ядра ARM7TDMI к сопроцессору |
НЕТ сопроцессорной инструкции |
CPA |
Сопроцессор ядру ARM7TDMI |
Сопроцессор отсутствует |
CPB |
Сопроцессор ядру ARM7TDMI |
Сопроцессор занят |
Данные сигналы более детально обсуждаются в параграфе "Сигнализация сопроцессора".
4.1 Сопроцессор
Сопроцессор дешифрирует текущую инструкцию на ступени "Дешифрация" своего конвейера и проверяет, является ли эта инструкция сопроцессорной. Инструкция сопроцессора содержит номер сопроцессора, который должен совпадать с идентификационным номером сопроцессора.
Если текущая инструкция на ступени "Дешифрация" является сопроцессорной инструкцией, то:
- Сопроцессор пытается выполнить инструкцию.
- Сопроцессор формирует подтверждение ядру ARM7TDMI с помощью сигналов CPA и CPB.
Прим.: Сопроцессор может управлять CPA и CPB как только он дешифрирует инструкцию. Для этого не нужно ожидать установления низкого уровня на nCPI, но выполнять инструкцию до установления низкого уровня на nCPI нельзя.
4.2 Процессор ARM7TDMI
Инструкции сопроцессора продвигаются по конвейеру ядра ARM7TDMI синхронно с конвейером сопроцессора. Инструкция сопроцессора выполняется, если действительно следующее:
- Инструкция сопроцессора достигла ступени "Исполнение" конвейера. Это может не произойти, если инструкции предшествует переход.
- Процессор ARM7TDMI не может выполнить инструкцию, т.к. она является сопроцессорной или неопределенной.
- Инструкция прошла проверку на условие исполнения.
Если все данные требования выполняются, то ядро сигнализирует установкой низкого уровня nCPI, тем самым, передавая сопроцессору возможность исполнения сопроцессорной инструкции.
4.3 Сигнализация сопроцессора
Отклики сопроцессора представлены в таблице 4.3.
Таблица 4.3. Сигнализация сопроцессора
CPA |
CPB |
Отклик |
Примечание |
0 |
0 |
Сопроцессор присутствует |
Если сопроцессор может принять инструкцию и может сразу запустить эту инструкцию, то он должен сигнализировать об этом путем установки низких уровней на CPA и CPB. Процессор ARM7TDMI после этого игнорирует сопроцессорные инструкции, а следующую инструкцию выполняет обычным образом. |
0 |
1 |
Сопроцессор занят |
Если сопроцессор может принять инструкцию, но в текущий момент не способен обработать данный запрос, то он может сигнализировать процессору ARM7TDMI установкой состояния "занят - ожидание". Это выполняется путем установки низкого уровня на CPA и высокого на CPB. Когда сопроцессор готов к началу выполнения инструкции он устанавливает низкий уровень на CPB. Это демонстрируется на рисунке 4.1. |
1 |
0 |
Недействительный отклик |
- |
1 |
1 |
Сопроцессор отсутствует |
Если сопроцессор не может дешифрировать текущую инструкцию, то он должен оставить CPA и CPB в высоком состоянии. Процессор ARM7TDMI в этом случае инициирует последовательность неопределенной инструкции. |
Рисунок 4.1. Последовательность "занят - ожидание" сопроцессора
CPA и CPB игнорируются процессором ARM7TDMI, когда он не содержит неопределенных или сопроцессорных инструкций на ступени "Исполнение" конвейера.
Сводная информация по откликам сопроцессора представлена в таблице 4.3.
4.4 Последовательности "занят - ожидание"
Инструкция сопроцессора, который находится в состояние "занят - ожидание", может быть прервана. Если возникает действительное быстрое прерывание FIQ или прерывание IRQ, а также сброшен соответствующий бит в CSPR, то процессор ARM7TDMI отклоняет сопроцессорную инструкцию и сигнализирует об этом установкой высокого уровня на nCPI. Сопроцессор, который может переходить в состояние "занят - ожидание", должен контролировать состояние nCPI для определения данного условия. Если ядро ARM7TDMI отклоняет сопроцессорную инструкцию, то сопроцессор также отклоняет инструкцию и продолжает следить за конвейером процессора ARM7TDMI.
Замечание:
Важно, чтобы любое действие, выполняемое сопроцессором, когда он находится в состоянии "занят - ожидание" было идемпотентным. Это означает, что действия, выполняемые сопроцессором не должны нарушать состояние сопроцессора и должны быть повторяемыми с идентичными результатами. Сопроцессор может изменить свое состояние только сразу после завершения выполнения инструкции.
Процессор ARM7TDMI, как правило, повторно исполняет сопроцессорную инструкцию после возврата из процедуры обработки прерывания. Другие сопроцессорные инструкции могут выполняться перед повторным выполнением прерванной инструкции.
4.5 Инструкции передачи регистра сопроцессора
Инструкции передачи регистра сопроцессора, MCR и MRC, используются для передачи данных между регистром в регистровом банке процессора ARM7TDMI и регистром в регистровом банке сопроцессора. Пример последовательности при передаче регистра сопроцессора показан на рисунке 4.2.
Рисунок 4.2. Последовательность передачи регистра сопроцессора
4.6 Операции над данными сопроцессора
Инструкции операций над данными сопроцессора (CDP) выполняют обработку операций над данными, находящимися в регистровом банке сопроцессора. В результате данной операции не передается информация между процессором ARM7TDMI и сопроцессором. Пример последовательности показан на рисунке 4.3.
Рисунок 4.3. Последовательность операции над данными сопроцессора
4.7 Операции чтения и записи сопроцессора
Инструкции чтения и записи сопроцессора используются для передачи данных между сопроцессором и памятью. Они могут использоваться для передачи одного слова данных или нескольких сопроцессорных регистров. Не существует ограничений по количеству слов данных, которые могут передаваться с помощью одной инструкции LDC или STC, но по договоренности одна инструкция не должна передавать больше 16 слов. Пример последовательности показан на рисунке 4.4.
Прим.: при передаче более 16 слов данных за один цикл инструкции в худшем случае увеличится задержка прерывания процессора ARM7TDMI.
Рисунок 4.4. Последовательность чтения сопроцессора
5. Подключение сопроцессоров
Сопроцессор в составе системы с процессором ARM7TDMI должен иметь 32-разрядное подключение к:
- потоку инструкций из памяти
- данным, записываемых ядром, MCR
- данным, читаемых ядром, MRC.
Сопроцессор может иметь опциональное подключение к:
- данным, записанным из памяти, LDC
- данным, считанным в память, STC.
5.1 Подключение одного сопроцессора
Пример подключения:
- сопроцессора к процессору ARM7TDMI при использовании двунаправленной шины показан на рисунке 4.5.
- сопроцессора к процессору ARM7TDMI при использовании однонаправленной шины показан на рисунке 4.6.
Рисунок 4.5. Подключение сопроцессора к двунаправленное шине
Рисунок 4.6. Подключение сопроцессора к однонаправленной шине
На рисунке 4.6 используются следующая логика:
- по падающему фронту MCLK
- ASEL = ((nMREQ = 1 and SEQ = 1) and (not nRW))
- CSEL = ((nMREQ = 1 and SEQ = 1) and (nRW))
5.2 Подключение нескольких сопроцессоров
Если вы используете несколько сопроцессоров в системе, то необходимо подключить сигналы подтверждения связи, следующим образом:
nCPI - подключите данный сигнал ко всем сопроцессорам, присутствующим в системе.
CPA и CPB - индивидуальные выходы CPA и CPB из каждого сопроцессора необходимо логически умножить и подключить к входам CPA и CPB процессора ARM7TDMI.
Также необходимо мультиплексировать выходы данных сопроцессоров.
Подключение нескольких сопроцессоров показано на рисунке 4.7.
Рисунок 4.7. Подключение нескольких сопроцессоров
6. Действия в случае неиспользования внешнего сопроцессора
Если вы разрабатываете систему, в которую не входят внешние сопроцессоры, то необходимо на оба входа CPA и CPB подать высокие уровни. Этим сигнализируется об отсутствии сопроцессоров в системе. Если принимается инструкция какого-либо сопроцессора, то выполняется последовательность неопределенной инструкции и, при необходимости, она может быть проэмулирована программно. Внутренний сопроцессор CP14 можно оставить в работе.
Выходы сопроцессора из процессора ARM7TDMI обычно оставляют неподключенными, но они могут использоваться в других частях системы, как, например, следующие выходы:
7. Неопределенные инструкции
Неопределенные инструкции обрабатываются процессором ARM7TDMI как сопроцессорные инструкции. При появлении неопределенной инструкции все сопроцессоры должны ответить отсутствием путем установки высоких уровней на CPA и CPB. Процессор в этом случае инициирует последовательность неопределенной инструкции.
Для того, чтобы корректно обработать ситуацию неопределенной инструкции, все сопроцессоры в системе должны формировать отклик отсутствия (установка высоких уровней на CPA и CPB) на неопределенную инструкцию. Это позволяет ядру выполнить обработку исключительной ситуации неопределенной инструкции.
Сопроцессор должен проверить разряд 27 инструкции для того, чтобы различать следующие типы инструкций:
- неопределенные инструкции содержат 0 в разряде 27
- сопроцессорные инструкции содержат 1 в разряде 27.
Сопроцессорные инструкции не поддерживаются набором инструкций Thumb, а неопределенные инструкции - поддерживаются. Все сопроцессоры должны следить за состоянием выхода TBIT ядра ARM7TDMI. Когда ядро ARM7TDMI находится в состоянии Thumb, то сопроцессор должен установить высокие уровни на CPA и CPB, а инструкции, представленные на шине данных, должны игнорироваться. В этом случае сопроцессоры не выполнят ошибочно Thumb-инструкции и все неопределенные инструкции будут обработаны корректно.
8. Привилегированные инструкции
Выходной сигнал nTRANS позволяет реализовать сопроцессоры или сопроцессорные инструкции, таким образом, чтобы доступ предоставлялся только из привилегированных режимов. Назначение сигнала дано в таблице 4.4.
Таблица 4.4. Назначение сигнала идентификатора режима (nTRANS)
nTRANS |
Назначение |
0 |
Инструкция пользовательского режима |
1 |
Инструкция привилегированного режима |
Если сигнал nTRANS используется, то его необходимо считывать вместе с выборкой сопроцессорной инструкции и использовать на ступени "Дешифрация" конвейера сопроцессора.
Прим.: Если выполняется попытка доступа сопроцессорной инструкции, которая может выполняться только в привилегированном режиме, в режиме пользователя с nTRANS = 0, то сопроцессор отреагирует установкой высоких уровней на CPA и CPB. Этим в процессоре ARM7TDMI инициируется последовательность неопределенной инструкции.
|