Общая информация | |
---|---|
Запущен | 1988 ( 1988 ) |
Обычный производитель | |
Производительность | |
Макс. тактовая частота ЦП | 0 Гц – 2 МГц |
Ширина данных | 8 (ОЗУ), 8 (ПЗУ) |
Ширина адреса | 8 (ОЗУ), 15 (ПЗУ) |
Архитектура и классификация | |
Приложение | Встроенный |
Набор инструкций | КС8 |
Количество инструкций | 69 |
Физические характеристики | |
Упаковка | |
История | |
Предшественник | КС400 |
Преемник | никто |
National Semiconductor COP8 — это 8-битный микроконтроллер с ядром CISC . COP8 — это усовершенствование более раннего семейства 4-битных микроконтроллеров COP400 . Основные характеристики COP8:
COP8 имеет базовое время цикла инструкций 1/10 от тактовой частоты; максимальная тактовая частота 10 МГц приведет к максимальной скорости выполнения инструкций 1 МГц. (Тактовая частота 10 МГц используется непосредственно некоторыми периферийными устройствами таймера.) Максимальная скорость выполнения инструкций составляет 1 цикл на байт, и большинство 1-байтовых инструкций выполняются за один цикл инструкций. Некоторые, особенно инструкции ветвления, занимают на один или два цикла больше. Некоторые модели включают удвоитель тактовой частоты, и хотя они по-прежнему принимают максимальную входную тактовую частоту 10 МГц, они внутренне удваивают ее до главной тактовой частоты 20 МГц, что затем приводит к скорости выполнения инструкций 2 МГц. [1] : 7,32
Чип представляет собой статическую логическую конструкцию, которая может выдерживать произвольно медленные часы; [1] : 10 большинство моделей включают в себя второй Кварцевый генератор с частотой 32 768 Гц может использоваться для тактовой частоты процессора, в то время как высокоскоростная тактовая частота отключена для экономии энергии.
|
COP8 использует отдельные пространства инструкций и данных ( архитектура Гарварда ). [2] : 2-1 [3] : 2-4 Адресное пространство инструкций составляет 15 бит (максимум 32 КиБ), а адреса данных — 8 бит (максимум 256 байт, расширяются за счет переключения банков).
Чтобы можно было обнаружить ошибки в программном обеспечении, все недействительные адреса инструкций считываются как ноль, что является инструкцией-ловушкой. Недействительная RAM выше стека считывается как все единицы, что является недействительным адресом.
Процессор имеет 8-битный аккумулятор и 15-битный счетчик программ . 16 дополнительных 8-битных регистров (R0–R15) и 8-битное слово состояния программы отображены в память. Для доступа к ним существуют специальные инструкции, но также могут использоваться общие инструкции доступа к ОЗУ.
Карта памяти разделена на половину ОЗУ и половину регистров управления следующим образом:
Адреса | Использовать |
---|---|
0x00–6F | ОЗУ общего назначения, используемое для стека |
0x70–7F | Не используется, читается как «все единицы» (0xFF) для отлова переполнения стека |
0x80–8F | Не используется, читается как неопределенный |
0x90–БФ | Дополнительные периферийные регистры управления |
0xC0–CF | Регистры управления периферийными устройствами. |
0xD0–DF | Порты ввода-вывода общего назначения L, G, I, C и D |
0xE0–E8 | Сдержанный |
0xE9 | Микропроводной сдвиговый регистр |
0xEA–ED | Регистры таймера 1 |
0xEE | Регистр CNTRL, биты управления для Microwire и таймера 1 |
0xEF | PSW, слово состояния программы ЦП |
0xF0–ФБ | R0–R11, встроенная оперативная память, отображаемая как регистры |
0xFC | R12, он же X, вторичный косвенный указательный регистр |
0xФД | R13, он же SP, регистр указателя стека |
0xFE | R14, он же B, первичный косвенный указательный регистр |
0xFF | R15, он же S, регистр расширения сегмента данных |
Если RAM не банкируется, то R15 (S) — это просто еще один регистр общего назначения. Если RAM банкируется, то нижняя половина адресного пространства данных (адреса 0x00–7F) направляется в банк RAM, выбранный S. Регистры специального назначения в верхней половине адресного пространства данных всегда видны. Регистры данных в 0xF x могут использоваться для копирования данных между банками.
Банки RAM, кроме банка 0, имеют все 128 байтов. Стек (адресуемый через указатель стека) всегда находится в банке 0, независимо от того, как установлен регистр S.
В дополнение к 3-байтовым JMPL
и JSRL
инструкциям, которые могут адресовать все адресное пространство, 2-байтовые версии этих инструкций, JMP
и JSR
, могут переходить в пределах страницы 4 КБ. Инструкция определяет нижние 12 бит, а верхние 3 бита PC сохраняются. (Они предназначены в первую очередь для моделей с объемом ПЗУ до 4 КБ.) Для ветвей на короткие расстояния существует 63 1-байтовых инструкции, , JP
которые выполняют PC-относительные ветви от PC−32 до PC+31. Это 15-битное сложение, и требования к границам страницы не применяются.
Существуют также косвенные команды перехода и загрузки аккумулятора, которые используют содержимое аккумулятора в качестве младших 8 бит адреса; старшие 7 бит текущего PC сохраняются.
Условные переходы как таковые не существуют, и процессор не предоставляет традиционные флаги состояния ZCVN , хотя слово состояния программы содержит флаги переноса и полупереноса для многобайтовой арифметики. Вместо этого есть ряд инструкций сравнения и пропуска. Например, IFEQ
сравнивает два своих операнда и пропускает следующую инструкцию, если они не равны. Любая инструкция может быть пропущена; это не ограничивается переходами.
Интересным расширением этого механизма является RETSK
инструкция return-and-skip, которая позволяет любой подпрограмме условно пропускать инструкцию, следующую за вызовом. Это обеспечивает очень компактный способ возврата логического значения из подпрограммы.
Еще одной уникальной особенностью архитектуры COP8 является IFBNE
инструкция. Эта однобайтовая инструкция сравнивает нижние 4 бита регистра B (указатель памяти) с 4-битовой непосредственной константой и может использоваться для цикла, пока B не достигнет конца небольшого (до 16 байт) буфера. Также есть однобайтовая LD B,#imm4
инструкция.
Операнды COP8 перечислены в порядке назначения, источника. Большинство инструкций имеют аккумулятор A в качестве одного из операндов. Другой операнд обычно выбирается из 8-битного непосредственного значения, 8-битного адреса RAM или [B]
, адреса RAM, выбранного регистром B. Инструкции LD
and X
(обмен с аккумулятором) также поддерживают адресацию RAM с помощью регистра X ( [X]
) и варианты post-inc/decrement ( [B+]
, [B−]
, [X+]
, [X−]
).
Косвенная адресация через B выполняется особенно быстро и может быть выполнена в том же цикле, в котором выполняется инструкция; даже X A,[B]
является одноцикловой инструкцией.
С другой стороны, абсолютная адресация RAM напрямую кодируется только для пяти инструкций: , , , и DIR addr8. Последняя представляет собой префиксный код операции «прямой адресации», который может быть добавлен к любой инструкции с операндом и изменяет операнд на указанное место в памяти. (Инструкции условного пропуска пропускают префикс и следующую инструкцию как пару.) Использование с инструкциями , и не документировано, поскольку выделенные инструкции более эффективны.LD A,addr8
X A,addr8
IFEQ addr8,#imm8
LD addr8,#imm8
[B]
DIR
LD A,[B]
X A,[B]
LD [B],#imm8
Все инструкции «перемещения» вызываются LD
(load), даже если пунктом назначения является адрес памяти ( ). Необычно то, что нет инструкций с аккумулятором в качестве источника; сохранение должно выполняться с помощью инструкции, которая обменивает аккумулятор с операндом памяти, сохраняя A и загружая предыдущее содержимое памяти. LD addr8,#imm8
LD
X
Есть инструкции для выборки из таблиц в ПЗУ. Они объединяют верхние 7 бит счетчика программ (PCU) с аккумулятором, извлекают байт из этого адреса и помещают его в аккумулятор ( LAID
инструкция) или нижние 8 бит счетчика программ PCL ( JID
инструкция). Поскольку следующая выполняемая инструкция должна находиться на той же 256-байтовой странице ПЗУ, что и сама таблица, таблица из 256 записей невозможна.
Код операции | Операнды | Мнемонический | Циклы | Описание | ||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | б2 | б3 | |||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | — | — | ИНТР | 7 | Программное прерывание (нажмите PC, PC ← 0x00ff) |
0 | 0 | 0 | компенсировать | — | — | JP + disp5 | 3 | PC ← PC + смещение ; переход на 1–31 байт вперед (смещение ≠ 0) | ||||
0 | 0 | 1 | 0 | высокий | низкий | — | JMP адрес12 | 3 | PC[11:0] ← addr . Сохранены верхние 3 бита PC. | |||
0 | 0 | 1 | 1 | высокий | низкий | — | JSR адрес12 | 5 | Переход к подпрограмме: нажмите PC, продолжите как JMP. | |||
0 | 1 | 0 | 0 | к | — | — | IFBNE # imm4 | 1 | Пропустить следующую инструкцию, если (B & 15) = k . | |||
0 | 1 | 0 | 1 | к | — | — | ЛД Б,# imm4 | 1 | B ← 15 − k (нуль-расширенный) | |||
0 | 1 | 1 | 0 | 0 | код операции | — | Разные инструкции | |||||
0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | к | — | ANDSZ A,# imm8 [a] | 2 | Пропустить, если A & k = 0 (=IFBIT # бит ,A) |
0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | адрес | — | JSRB адрес8 [б] | 5 | Нажмите ПК, перейдите к подпрограмме загрузки ПЗУ по адресу [1] |
0 | 1 | 1 | 0 | 0 | 0 | 1 | – | — | — | (зарезервировано для загрузочного ПЗУ) [b] [1] | ||
0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | — | — | КЛР А | 1 | А ← 0 |
0 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | — | — | ОБМЕН А | 1 | A ← A<<4 | A>>4; поменять местами полубайты |
0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | — | — | ДКОР А | 1 | Десятичная дробь верна после сложения BCD |
0 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | — | — | НАЖМИ А [а] | 3 | [СП] ← А, СП ← СП−1 |
0 | 1 | 1 | ОПЦ | кусочек | — | — | Битовые операции над [B] [c] | |||||
0 | 1 | 1 | 0 | 1 | кусочек | — | — | RBIT # бит ,[B] [c] | 1 | Сбросить (очистить до 0) заданный бит ОЗУ | ||
0 | 1 | 1 | 1 | 0 | кусочек | — | — | IFBIT # бит ,[B] [c] | 1 | Тестирование заданного бита ОЗУ, пропуск, если ноль | ||
0 | 1 | 1 | 1 | 1 | кусочек | — | — | SBIT # бит ,[B] [c] | 1 | Установить (в 1) указанный бит ОЗУ | ||
1 | 0 | 0 | м | 0 | код операции | к? | — | Бинарные операции, A ← A операнд | ||||
1 | 0 | 0 | 0 | 0 | код операции | — | — | ОП А,[Б] [c] | 1 | А ← А оп [Б] | ||
1 | 0 | 0 | 1 | 0 | код операции | к | — | ОП А,# imm8 | 2 | А ← А оп к | ||
1 | 0 | 0 | м | 0 | 0 | 0 | 0 | к? | — | АЦП А, операнд | C,A ← A + операнд + C; сложение с переносом | |
1 | 0 | 0 | м | 0 | 0 | 0 | 1 | к? | — | SUBC A, операнд | C,A ← A + ~ операнд + C (A − операнд − ~C) | |
1 | 0 | 0 | м | 0 | 0 | 1 | 0 | к? | — | IFEQ A, операнд | Пропустить, если A ≠ операнд | |
1 | 0 | 0 | м | 0 | 0 | 1 | 1 | к? | — | IFGT A, операнд | Пропустить, если A ≤ операнд | |
1 | 0 | 0 | м | 0 | 1 | 0 | 0 | к? | — | ДОБАВИТЬ А, операнд | A ← A + операнд (перенос не изменяется!) | |
1 | 0 | 0 | м | 0 | 1 | 0 | 1 | к? | — | И А, операнд | A ← A & операнд | |
1 | 0 | 0 | м | 0 | 1 | 1 | 0 | к? | — | XOR A, операнд | A ← A ^ операнд | |
1 | 0 | 0 | м | 0 | 1 | 1 | 1 | к? | — | ИЛИ А, операнд | A ← A | операнд | |
1 | 0 | 0 | 0 | 1 | код операции | — | — | Инструкции с нулевым операндом | ||||
1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | — | — | МФК | 1 | Пропустить, если перенос свободен |
1 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | — | — | ИФНК | 1 | Пропустить, если набор для переноски |
1 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | — | — | ИНК А | 1 | A ← A + 1 (перенос без изменений) |
1 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | — | — | ДЕК А | 1 | A ← A − 1 (перенести без изменений) |
1 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | — | — | ПОП А [а] | 3 | СП ← СП+1, А ← [СП] |
1 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | — | — | РЕТСК | 5 | Вставьте ПК, пропустите одну инструкцию |
1 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | — | — | РЕТ | 5 | Поп ПК высокий, поп ПК низкий |
1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | — | — | РЕТИ | 5 | Возврат и включение прерываний |
1 | 0 | 0 | 1 | 1 | код операции | к | — | Инструкции с непосредственным операндом | ||||
1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | к | — | ЛД А,# imm8 | 2 | А ← к |
1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | к | — | IFNE A,# imm8 [a] | 2 | Пропустить, если A = k |
1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | к | — | ЛД [B+],# imm8 | 3 | [Б] ← к , Б ← Б + 1 |
1 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | к | — | ЛД [Б−],# imm8 | 3 | [Б] ← к , Б ← Б − 1 |
1 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | адрес | — | XA, адрес8 | 3 | A ↔ [ адрес ], обмен |
1 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | адрес | — | LD A, адрес8 | 3 | A ← [ адрес ] |
1 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | к | — | ЛД [Б],# imm8 | 2 | [Б] ← к |
1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | к | — | ЛД Б,# imm8 [а] | 2 | B ← k (=LD R14,# k , на один цикл быстрее) |
1 | 0 | 1 | код операции | 0 | с | Разные инструкции | ||||||
1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | — | — | РК | 1 | C ← 0; сбросить перенос на 0 |
1 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | — | — | СК | 1 | C ← 1; установить перенос на 1 |
1 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | — | — | ПРОЛОЖЕННЫЙ | 3 | A ← ROM[PCU:A]; загрузка из ROM |
1 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | — | — | JID | 3 | PCL ← ROM[PCU:A]; переход по таблице ROM |
1 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | — | — | РЛК А [а] | 1 | C,A ← A,C; поворот влево через перенос (=ADC A,A) |
1 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | адрес | к | IFEQ addr8 ,# imm8 [a] | 3 | Пропустить, если [ addr ] ≠ k |
1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | высокий | низкий | JMPL адрес15 | 4 | ПК ← адрес |
1 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | высокий | низкий | JSRL адрес15 | 5 | Нажмите ПК, ПК ← адрес |
1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | — | — | РРЦ А | 1 | A,C ← C,A; поворот вправо через перенос |
1 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | — | — | (сдержанный) | ||
1 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | — | — | ВИС [а] | 5 | ПК ← ПЗУ[ таблица векторов ]; Выбор векторного прерывания |
1 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | — | — | РПНД [а] | 1 | Сбросить флаг ожидающего прерывания |
1 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | — | — | НОП | 1 | Нет операции |
1 | 0 | 1 | 1 | 1 | 0 | 0 | 1 | — | — | IFNE А,[Б] [а] [с] | 1 | Пропустить, если A = [B] |
1 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | адрес | к | LD addr8 ,# imm8 | 3 | [ адрес ] ← к |
1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | адрес | — | DIR адрес8 | 3 | Изменить операнд следующей инструкции с [B] на [ addr ] |
1 | 0 | 1 | Р | Л | = | 1 | ± | — | — | Операции по загрузке/обмену | ||
1 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | — | — | ХА,[B+] | 2 | А ↔ [Б], Б ← Б+1 |
1 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | — | — | XA,[B−] | 2 | А ↔ [Б], Б ← Б−1 |
1 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | — | — | ХА,[Б] | 1 | А ↔ [Б] |
1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | — | — | ЛД А,[B+] | 2 | А ← [Б], Б ← Б+1 |
1 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | — | — | ЛД А,[Б−] | 2 | А ← [Б], Б ← Б−1 |
1 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | — | — | ЛД А,[Б] | 1 | А ← [Б] |
1 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | — | — | ХА,[Х+] | 3 | А ↔ [X], X ← X+1 |
1 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | — | — | ХА,[Х−] | 3 | А ↔ [X], X ← X−1 |
1 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | — | — | ХА,[Х] | 3 | А ↔ [Х] |
1 | 0 | 1 | 1 | 1 | 0 | 1 | 0 | — | — | ЛД А,[X+] | 3 | А ← [X], X ← X+1 |
1 | 0 | 1 | 1 | 1 | 0 | 1 | 1 | — | — | ЛД А,[X−] | 3 | А ← [X], X ← X−1 |
1 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | — | — | ЛД А,[X] | 3 | А ← [X] |
1 | 0 | 1 | — | 1 | 1 | 1 | — | — | (сдержанный) | |||
1 | 1 | 0 | 0 | зарегистрироваться | — | — | Регистр ДРСЗ | 3 | регистр ← регистр − 1, пропустить, если результат равен нулю | |||
1 | 1 | 0 | 1 | зарегистрироваться | к | — | Регистр LD , # imm8 | 3 | регистр ← k (=LD 0xf0+ регистр ,# k , на один байт короче) | |||
1 | 1 | 1 | компенсировать | — | — | JP − disp5 | 3 | PC ← PC − 32 + смещение ; прыжок на 1–32 байта назад | ||||
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | б2 | б3 | Мнемонический | Циклы | Описание |
[B]
на 8-битный абсолютный адрес с префиксом DIR (+2 байта, +3 цикла).