Эта статья требует дополнительных ссылок для проверки . ( декабрь 2009 г. ) ( Узнайте, как и когда удалить этот шаблон сообщения ) |
КС8 микроконтроллер от National Semiconductor представляет собой 8-разрядный CISC ядро микроконтроллера , чьи основные функции:
- Большое количество контактов ввода / вывода
- До 32 КБ флэш-памяти / ПЗУ для кода и данных
- Очень низкий EMI (без известных ошибок)
- Множество интегрированных периферийных устройств (подразумевается однокристальная конструкция)
- Внутрисистемное программирование
- Бесплатный набор инструментов для ассемблера . Доступны коммерческие компиляторы C
- Бесплатная многозадачная ОС и стек TCP / IP
Он имеет машинный цикл до 2 миллионов циклов в секунду, но большинство версий, похоже, можно разогнать до 2,8 миллиона циклов в секунду (тактовая частота 28 МГц). [ необходима цитата ]
Регистры и карта памяти [ править ]
COP8 использует отдельные пространства для инструкций и данных ( гарвардская архитектура ). [1] : 2-1 [2] : 2-4 Адресное пространство команд - 15-битное (максимум 32 КиБ), а адреса данных - 8-битные (максимум 256 байт, расширяются посредством переключения банков).
Чтобы позволить обнаруживать программные ошибки, все недопустимые адреса инструкций читаются как ноль, что является инструкцией ловушки. Недействительное ОЗУ над стеком читается как все единицы, что является недопустимым адресом.
ЦП имеет 8-битный аккумулятор и 15-битный счетчик программ . 16 дополнительных 8-битных регистров (R0 – R15) и 8-битное слово состояния программы отображаются в памяти. Для доступа к ним есть специальные инструкции, но также можно использовать общие инструкции доступа к RAM.
Карта памяти разделена на половину RAM и половину регистров управления следующим образом:
Адреса | Использовать |
---|---|
0x00–6F | ОЗУ общего назначения, используется для стека |
0x70–7F | Не используется, читается как "все единицы" (0xFF) для перехвата недополнения стека |
0x80–8F | Не используется, читается как undefined |
0x90 – BF | Дополнительные регистры периферийного управления |
0xC0 – CF | Регистры периферийного управления. |
0xD0 – DF | Порты ввода-вывода общего назначения L, G, I, C и D |
0xE0 – E8 | Зарезервированный |
0xE9 | Регистр сдвига микропровода |
0xEA – ED | Регистры таймера 1 |
0xEE | Регистр CNTRL, управляющие биты для микропровода и таймера 1 |
0xEF | PSW, слово состояния программы CPU |
0xF0 – FB | R0 – R11, регистры общего назначения (дополнительная RAM) |
0xFC | R12, он же X, регистр вторичного косвенного указателя |
0xFD | R13, он же SP, регистр указателя стека |
0xFE | R14, он же B, регистр первичного косвенного указателя |
0xFF | R15, он же S, регистр расширения сегмента данных |
Если RAM не хранится в банке, то R15 (S) - это просто еще один регистр общего назначения. Если ОЗУ размещено в банке, то младшая половина адресного пространства данных (адреса 0x00–7F) направляется в банк ОЗУ, выбранный S. Специальные регистры в верхней половине адресного пространства данных всегда видны. Регистры данных в 0xF x могут использоваться для копирования данных между банками.
Банки RAM, отличные от банка 0, имеют все 128 байтов. Стек (адресуется через указатель стека) всегда находится в банке 0, независимо от того, как установлен регистр S.
Контрольные передачи [ править ]
В дополнение к 3-байта JMP
и JSR
инструкций , которые могут решить все адресное пространство, 2-байтовые версии этих инструкций может перейти в 4К страницы. Инструкция определяет младшие 12 бит, а старшие 3 бита ПК сохраняются. (Они предназначены в первую очередь для моделей с объемом ПЗУ до 4 КБ.)
Существуют также косвенные команды перехода и косвенные инструкции загрузки аккумулятора, которые используют содержимое аккумулятора как младшие 8 бит адреса; старшие 7 бит текущего ПК сохраняются.
Для ответвлений на короткие расстояния существует 63 однобайтовых инструкции, которые выполняют ответвления относительно ПК от ПК-32 к ПК + 31. Это 15-битное дополнение, и требования к границам страницы не применяются.
Условных переходов как таковых не существует, и процессор не предоставляет традиционные флаги состояния ZCVN , хотя слово состояния программы содержит флаги переноса и половинного переноса для многобайтовой арифметики. Скорее, есть несколько инструкций по сравнению и пропуску. Например, IFEQ
сравнивает два своих операнда и пропускает следующую инструкцию, если они не равны. Любую инструкцию можно пропустить; это не ограничивается филиалами.
Уникальной особенностью архитектуры COP8 является IFBNE
инструкция. Он сравнивает младшие 4 бита регистра B (указатель памяти) с 4-битной непосредственной константой и может использоваться для цикла до тех пор, пока B не достигнет конца небольшого (до 16 байт) буфера.
Интересным расширением этого механизма является RETSK
инструкция возврата и пропуска, которая позволяет любому вызову подпрограммы условно пропускать следующую инструкцию. Это обеспечивает очень компактный способ возврата логического значения из подпрограммы.
Набор инструкций [ править ]
Операнды COP8 перечислены в порядке назначения и источника. В большинстве инструкций в качестве одного из операндов используется аккумулятор A. Другой операнд обычно выбирается из 8-битного непосредственного значения, 8-битного адреса RAM или [B]
адреса RAM, выбранного регистром B. Некоторые команды также поддерживают оперативную память адресацию по X регистра ( [X]
) и пост-вкл / декремент варианты ( [B+]
, [B−]
, [X+]
, [X−]
).
Косвенная адресация через B выполняется особенно быстро и может выполняться в том же цикле, что и инструкция.
С другой стороны, абсолютная адресация RAM в большинстве случаев напрямую не кодируется. Напротив, специальный префиксный код операции «прямой адресации», за которым следует 1-байтовый адрес, может предшествовать любой инструкции с [B]
операндом и заменять его на прямой операнд памяти. Это добавляет к инструкции два байта и три цикла. (В инструкциях с условным пропуском префикс и следующая инструкция пропускаются как пара.)
Все инструкции «перемещения» вызываются LD
(загружаются), даже если местом назначения является адрес памяти. Что необычно, нет LD
инструкций с аккумулятором в качестве источника; Сохранение выполняется с помощью X
инструкции, которая обменивает аккумулятор с операндом памяти, сохраняя A и загружая предыдущее содержимое памяти. (Это не требует дополнительного времени; X A,[B]
это инструкция с одним циклом.)
Есть инструкции по извлечению из таблиц в ПЗУ. Они объединяют старшие 7 бит программного счетчика (PCU) с аккумулятором, извлекают байт из этого адреса и помещают его в аккумулятор ( LAID
инструкция) или младшие 8 битов программного счетчика PCL ( JID
инструкция). Поскольку следующая выполняемая инструкция должна находиться на той же 256-байтовой странице ПЗУ, что и сама таблица, таблица с 256 записями невозможна.
Код операции | Операнды | Мнемонический | Циклы | Описание | ||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | Би 2 | b3 | |||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - | - | INTR | 7 | Программное прерывание (push PC, PC ← 0x00ff) |
0 | 0 | 0 | компенсировать | - | - | JP + disp5 | 3 | ПК ← ПК + офсет ; переход на 1–31 байт вперед (смещение = 0 зарезервировано) | ||||
0 | 0 | 1 | 0 | адрес | addrlo | - | JMP addr12 | 3 | ПК [11: 0] ← адрес . Сохранены топ-3 части ПК. | |||
0 | 0 | 1 | 1 | адрес | addrlo | - | JSR addr12 | 5 | Перейти к подпрограмме: нажать ПК, продолжить как JMP. | |||
0 | 1 | 0 | 0 | k | - | - | IFBNE # imm4 | 1 | Выполнить следующую инструкцию, если (B & 15) ≠ k ; пропустить, если (B & 15) = k . | |||
0 | 1 | 0 | 1 | k | - | - | LD B, # imm4 | 1 | B ← 15 - k (нулевое удлинение) | |||
0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | k | - | ANDSZ A, # imm8 * | 2 | Пропустить, если A & k = 0 (= IFBIT # бит , A) |
0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | addrlo | - | Адрес JSRB 8 † | 5 | Нажмите ПК, перейдите к подпрограмме загрузочного ПЗУ по адресу [5] |
0 | 1 | 1 | 0 | 0 | 0 | 1 | - | - | - | (зарезервировано для загрузочного ПЗУ † ) [5] | ||
0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | - | - | CLR A | 1 | A ← 0 |
0 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | - | - | СВОП А | 1 | A ← A << 4 | A >> 4; поменять местами полубайты |
0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | - | - | DCOR A | 1 | Десятичный правильный после добавления BCD |
0 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | - | - | НАЖАТЬ А * | 3 | [SP] ← A, SP ← SP − 1 |
0 | 1 | 1 | 0 | 1 | кусочек | - | - | RBIT # бит , [B] | 1 | Сбросить (очистить до 0) заданный бит ОЗУ | ||
0 | 1 | 1 | 1 | 0 | кусочек | - | - | IFBIT # бит , [B] | 1 | Проверить данный бит ОЗУ, пропустить, если ноль | ||
0 | 1 | 1 | 1 | 1 | кусочек | - | - | SBIT # бит , [B] | 1 | Установить (в 1) данный бит ОЗУ | ||
1 | 0 | 0 | м | 0 | код операции | операнд | - | Операции ALU, A ← Операнд операции | ||||
1 | 0 | 0 | 0 | 0 | код операции | - | - | OP A, [B] | 1 | Работа ALU с A и [B] (с [ адресом ] с использованием префикса DIR) | ||
1 | 0 | 0 | 1 | 0 | код операции | k | - | OP A, # imm8 | 2 | Работа ALU с A и немедленным k | ||
1 | 0 | 0 | м | 0 | 0 | 0 | 0 | операнд | - | АЦП A, операнд | 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 | операнд | - | ADD A, операнд | 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 ← A | операнд | |
1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | - | - | IFC | 1 | Пропустить, если несёт ясно |
1 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | - | - | IFNC | 1 | Пропустить, если набор для переноски |
1 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | - | - | INC A | 1 | A ← A + 1 (перенос без изменений) |
1 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | - | - | ДЕКАБРЬ А | 1 | A ← A - 1 (перенос без изменений) |
1 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | - | - | POP A * | 3 | SP ← SP + 1, A ← [SP] |
1 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | - | - | РЕТСК | 5 | Поп-ПК, пропустите одну инструкцию |
1 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | - | - | RET | 5 | Поп-ПК высокий, поп-ПК низкий |
1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | - | - | РЕТИ | 5 | Вернуть и разрешить прерывания |
1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | k | - | LD A, # imm8 | 2 | A ← k |
1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | k | - | IFNE A, # imm8 * | 2 | Пропустить, если A = k |
1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | k | - | LD [B +], # imm8 | 3 | [B] ← k , B ← B + 1 |
1 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | k | - | LD [B -], # imm8 | 3 | [B] ← k , B ← B - 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 | k | - | LD [B], # imm8 | 2 | [B] ← k |
1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | k | - | LD B, # imm8 * | 2 | B ← k (= LD R14, # k , на один цикл быстрее) |
1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | - | - | RC | 1 | C ← 0; сбросить перенос до 0 |
1 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | - | - | SC | 1 | C ← 1; установить перенос на 1 |
1 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | - | - | XA, [B +] | 2 | A ↔ [B], B ← B + 1 |
1 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | - | - | XA, [B−] | 2 | A ↔ [B], B ← B − 1 |
1 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | - | - | ПРОЛОЖЕННЫЙ | 3 | A ← ROM [PCU: A]; загрузить из ПЗУ |
1 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | - | - | JID | 3 | PCL ← ROM [PCU: A]; переход по таблице ROM |
1 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | - | - | XA, [B] | 1 | A ↔ [B] |
1 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | - | - | (зарезервированный) | ||
1 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | - | - | RLC A * | 1 | C, A ← A, C; повернуть влево через перенос (= ADC A, A) |
1 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | адрес | k | IFEQ addr8 , # imm8 * | 3 | Пропустить, если [ адрес ] ≠ k |
1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | - | - | LD A, [B +] | 2 | A ← [B], B ← B + 1 |
1 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | - | - | LD A, [B−] | 2 | A ← [B], B ← B − 1 |
1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | адрес | addrlo | JMPL адрес15 | 4 | ПК ← адрес |
1 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | адрес | addrlo | JSRL, адрес 15 | 5 | Нажать ПК, ПК ← адрес |
1 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | - | - | LD A, [B] | 1 | A ← [B] |
1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | - | - | (зарезервированный) | ||
1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | - | - | RRC A | 1 | А, С ← С, А; вращать вправо через перенос |
1 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | - | - | (зарезервированный) | ||
1 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | - | - | XA, [X +] | 3 | A ↔ [X], X ← X + 1 |
1 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | - | - | XA, [X−] | 3 | A ↔ [X], X ← X − 1 |
1 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | - | - | ВИС * | 5 | ПК ← ROM [ таблица векторов ]; Выбор векторного прерывания |
1 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | - | - | RPND * | 1 | Сбросить флаг ожидающего прерывания |
1 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | - | - | XA, [X] | 3 | A ↔ [X] |
1 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | - | - | (зарезервированный) | ||
1 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | - | - | NOP | 1 | Нет операции |
1 | 0 | 1 | 1 | 1 | 0 | 0 | 1 | - | - | IFNE A, [B] * | 1 | Пропустить, если A = [B] |
1 | 0 | 1 | 1 | 1 | 0 | 1 | 0 | - | - | LD A, [X +] | 3 | A ← [X], X ← X + 1 |
1 | 0 | 1 | 1 | 1 | 0 | 1 | 1 | - | - | LD A, [X−] | 3 | A ← [X], X ← X − 1 |
1 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | адрес | k | LD адрес8 , # imm8 | 3 | [ адрес ] ← k |
1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | адрес | - | DIR addr8 | 3 | Измените операнд следующей инструкции с [B] на [ адрес ] |
1 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | - | - | LD A, [X] | 3 | A ← [X] |
1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | - | - | (зарезервированный) | ||
1 | 1 | 0 | 0 | регистр | - | - | DRSZ регистр | 3 | регистр ← регистр - 1, пропустить, если результат нулевой | |||
1 | 1 | 0 | 1 | регистр | k | - | Регистр LD , # imm8 | 3 | регистр ← k (= LD 0xf0 + регистр , # k , на один байт короче) | |||
1 | 1 | 1 | компенсировать | - | - | JP - disp5 | 3 | ПК ← ПК - 32 + офсет ; перейти на 1–32 байта назад | ||||
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | Би 2 | b3 | Мнемонический | Циклы | Описание |
*: Только для ядер "семейства функций" (COP888 / COP8SA); отсутствует в ядрах "базового семейства" (COP800).
†: Только на моделях "flash family" (COP8TA / COP8C) с загрузочным ПЗУ для внутрисистемного программирования
Ссылки [ править ]
- ^ a b Руководство пользователя основного семейства COP8 (PDF) . Редакция 002. National Semiconductor . Июнь 1996 г. Номер публикации 620895-002 . Проверено 2 января 2021 .
- ^ a b Aleaf, Абдул (июль 1996 г.). «Сравнение COP878x с расширенным семейством COP8SAx7 - аппаратные и программные аспекты» (PDF) . National Semiconductor . Примечание по применению 1043.
- ^ Руководство пользователя по семейству функций COP8 . Редакция 005. National Semiconductor . Март 1999 г. Номер публикации 620897-005. Извлечено из заархивированного ISO-образа 530094-003_COP8_Tools_Docs_Aug1999.zip , получено 07.01.2020.
- ^ "Руководство разработчика COP8SAx" (PDF) . National Semiconductor . Январь 1997 г. Номер публикации 620894-001.
- ^ a b «COP8SBR9 / COP8SCR9 / COP8SDR98-битный микроконтроллер на базе флэш-памяти CMOS с памятью 32 КБ, виртуальной EEPROM и отключением» (PDF) (лист данных). National Semiconductor . Апрель 2002 . Проверено 6 января 2021 .
Внешние ссылки [ править ]
- Встроенные микроконтроллеры National Semiconductor ( CR16 и COP8 )
- микроконтроллер-faq / COP8 , 1995
- "National Semiconductor COP8" . 25-е ежегодное издание EDN по микропроцессорам / микроконтроллерам. EDN . 24 сентября 1998 г.
Этот продукт, связанный с микрокомпьютером или микропроцессором, является незавершенным . Вы можете помочь Википедии, расширив ее . |