COP8
COP8National Semiconductor의 COP8 마이크로컨트롤러는 8비트 CISC 코어 마이크로컨트롤러로 주요 특징은 다음과 같습니다.
- 대량의 I/O 핀
- 코드 및 데이터용 최대 32KB의 플래시 메모리/ROM
- 매우 낮은 EMI(불명한 버그 없음)
- 다수의 내장 주변기기 (단일 칩 설계와 동일)
- 시스템 내 프로그래밍
- 프리 어셈블러 툴 체인.상용 C 컴파일러 이용 가능
- 무료 멀티태스킹 OS 및 TCP/IP 스택
1초에 최대 200만 사이클의 머신 사이클을 가지고 있지만, 대부분의 버전은 최대 2까지 오버클럭이 가능한 것 같습니다.초당 8M 사이클(28MHz 클럭)[citation needed]COP8은 이전의 COP400 4비트 마이크로컨트롤러 패밀리의 확장판입니다.
레지스터 및 메모리 맵
COP8은 별도의 명령 및 데이터 공간(Harvard 아키텍처)[1]: 2-1 [2]: 2-4 을 사용합니다.명령 주소 공간은 15비트(최대 32KiB)이며, 데이터 주소는 8비트(최대 256바이트, 뱅크 스위칭을 통해 확장)입니다.
소프트웨어 버그를 검출하기 위해서, 무효인 명령 주소는 모두 제로(트랩 명령)로 읽힙니다.스택 위의 잘못된 RAM이 모두 하나로 읽힙니다. 이는 잘못된 주소입니다.
CPU에는 8비트 어큐뮬레이터와 15비트 프로그램 카운터가 있습니다.16개의 추가 8비트 레지스터(R0~R15)와 8비트 프로그램 상태 워드가 메모리 매핑됩니다.액세스하기 위한 특별한 지침이 있지만 일반적인 RAM 액세스 지침을 사용할 수도 있습니다.
메모리 맵은 다음과 같이 절반의 RAM 레지스터와 절반의 제어 레지스터로 나뉩니다.
| 주소 | 사용하다 |
|---|---|
| 0x00~6F | 범용 RAM, 스택에 사용 |
| 0x70~7F | 미사용, 스택 언더플로우를 트랩하기 위해 모두1(0xFF)로 읽습니다. |
| 0x80~8F | 사용되지 않음, 읽기 정의되지 않음 |
| 0x90 – BF | 기타 주변기기 제어 레지스터 |
| 0xC0–CF | 주변기기 컨트롤 레지스터 |
| 0xD0 – DF | 범용 I/O포트 L, G, I, C 및 D |
| 0xE0~E8 | 예약필 |
| 0xE9 | 마이크로파 시프트 레지스터 |
| 0xEA – ED | 타이머 1 레지스터 |
| 0xEE | CNTRL 레지스터, 마이크로파용 제어 비트 및 타이머 1 |
| 0xEF | PSW, CPU 프로그램 상태 단어 |
| 0xF0~FB | R0~R11, 범용 레지스터(추가 RAM) |
| 0xFC | R12, a.k.a. X, 보조 간접 포인터 레지스터 |
| 0xFD | R13, a.k.a. SP, 스택 포인터 레지스터 |
| 0xFE | R14, a.k.a. B, 1차 간접 포인터 레지스터 |
| 0xFF | R15, a.k.a.S, 데이터 세그먼트 확장 레지스터 |
RAM이 뱅킹되지 않은 경우 R15(S)는 다른 범용 레지스터일 뿐입니다.RAM이 뱅크되어 있는 경우, 데이터 주소 공간의 하위 절반(주소 0x00~7F)은 S에 의해 선택된 RAM 뱅크로 보내집니다.데이터 주소 공간의 상위 절반에 있는 특수 용도 레지스터는 항상 볼 수 있습니다.0xFx의 데이터 레지스터를 사용하여 뱅크 간에 데이터를 복사할 수 있습니다.
뱅크 0 이외의 RAM 뱅크는 128바이트를 모두 사용할 수 있습니다.스택(스택 포인터를 통해 주소 지정됨)은 S 레지스터의 설정에 관계없이 항상 뱅크0 에 있습니다.
제어 전송
3바이트와 더불어JMP그리고.JSR주소 공간 전체를 다룰 수 있는 명령, 이러한 명령의 2바이트 버전은 4K 페이지 내에서 점프할 수 있습니다.이 명령어는 하위 12비트를 지정하며 PC의 상위3비트는 유지됩니다.(주로 최대 4K의 ROM을 탑재한 모델용입니다).
또한 어큐뮬레이터 내용을 주소의 하위 8비트로 사용하는 점프 간접 및 로드 어큐뮬레이터 간접 명령도 있습니다. 현재 PC의 상위 7비트는 유지됩니다.
단거리 브랜치의 경우 PC-32에서 PC+31까지 PC 상대 브랜치를 실행하는 63개의 1바이트 명령이 있습니다.이는 15비트가 추가된 것으로 페이지 경계 요건은 적용되지 않습니다.
프로그램 상태 워드에 멀티바이트 산술용 캐리어 및 하프캐리 플래그가 포함되어 있지만 조건부 브랜치 자체는 존재하지 않으며 프로세서는 기존의 ZCVN 상태 플래그를 제공하지 않습니다.대신 비교 및 건너뛰기 명령이 많이 있습니다.예를들면,IFEQ는 2개의 오퍼랜드를 비교하여 동일하지 않은 경우 다음 명령을 건너뜁니다.어떤 명령도 건너뛸 수 있습니다.브런치에 한정되지 않습니다.
COP8 아키텍처 고유의 기능은IFBNE설명.이것은 B(메모리 포인터) 레지스터의 하위4비트를 4비트의 즉시 상수와 비교하여 B가 작은(최대 16바이트) 버퍼의 끝에 도달할 때까지 루프에 사용할 수 있습니다.
이 메커니즘의 흥미로운 확장은RETSK반환 및 수신 명령.서브루틴 콜은 조건부로 다음 명령을 건너뛸 수 있습니다.이를 통해 서브루틴에서 부울값을 반환하는 매우 콤팩트한 방법이 제공됩니다.
명령 집합
COP8 오퍼랜드는 수신처, 소스 순서로 나열되어 있습니다.대부분의 명령어에는 어큐뮬레이터 A가 오퍼랜드 중 하나로 포함되어 있습니다.다른 피연산자는 일반적으로 8비트 즉시값, 8비트 RAM 주소 또는[B], B 레지스터에 의해 선택된 RAM 주소.일부 명령에서는 X 레지스터에 의한 RAM 주소 지정도 지원합니다.[X], 및 사고/사고 후 변형 모델([B+],[B−],[X+],[X−]).
B를 경유하는 간접 어드레싱은 특히 고속으로, 명령이 실행되는 사이클과 같은 사이클로 실행할 수 있습니다.
한편, 대부분의 경우, 절대 RAM 어드레싱은 직접 부호화되지 않습니다.대신, 특별한 "다이렉트어드레싱" 프리픽스 opcode와 그 뒤에1 바이트의 주소가 부가되어 있는 명령 앞에 있는 경우가 있습니다.[B]오퍼랜드를 메모리 다이렉트 오퍼랜드로 변경합니다.그러면 명령에 2바이트와 3사이클이 추가됩니다(조건부 건너뛰기 명령은 접두사와 다음 명령을 쌍으로 건너뜁니다).
모든 "이동" 명령이 호출됩니다.LD(로드) 행선지가 메모리주소인 경우에서도,특이하게, 없습니다.LD축전지를 소스로 하는 지침, 저장소는XA를 저장하고 이전 메모리 내용을 로드하는 메모리 오퍼랜드와 어큐뮬레이터를 교환하는 명령입니다.(이 작업에는 추가 시간이 걸리지 않습니다.X A,[B]는 1사이클의 명령입니다).
ROM에는 테이블에서 가져오는 순서가 있습니다.프로그램 카운터(PCU)의 상위 7비트를 어큐뮬레이터와 결합하여 해당 주소에서 바이트를 가져와 어큐뮬레이터에 배치합니다.LAID명령) 또는 프로그램 카운터 PCL의 하위 8비트(JID명령)을 참조해 주세요.다음에 실행되는 명령은 테이블 자체와 동일한 256바이트의 ROM 페이지에 있어야 하므로 256엔트리 테이블은 불가능합니다.
| 오퍼코드 | 오퍼랜드 | 니모닉 | 사이클 | 묘사 | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | b2 | b3 | |||
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | — | — | 인트라 | 7 | 소프트웨어 인터럽트(PC 제외, PC ← 0x00ff) |
| 0 | 0 | 0 | 오프셋 | — | — | JP + disp 5 | 3 | PC ← PC + 오프셋, 1~31바이트 앞으로 점프(예약 완료=0) | ||||
| 0 | 0 | 1 | 0 | 주소 | 주소 | — | JMP 주소 12 | 3 | PC [11:0] ← 주소입니다.PC의 상위 3비트가 유지됩니다. | |||
| 0 | 0 | 1 | 1 | 주소 | 주소 | — | JSR 주소 12 | 5 | 서브루틴으로 이동: PC를 푸시하고 JMP로 진행합니다. | |||
| 0 | 1 | 0 | 0 | k | — | — | IFBNE #im4 | 1 | (B & 15) ≠ k; skip (B & 15) = k이면 다음 명령을 실행합니다. | |||
| 0 | 1 | 0 | 1 | k | — | — | LD B, #imm4 | 1 | B ← 15 - k ( 0 ~16 。 | |||
| 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | k | — | ANDZ A, #imm8* | 2 | A & k = 0이면 건너뜁니다(=IFB).IT#비트,A) |
| 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 주소 | — | JSRB 주소† 8 | 5 | PC를 푸시하여 주소에서[5] 부팅 ROM 서브루틴으로 이동 |
| 0 | 1 | 1 | 0 | 0 | 0 | 1 | – | — | — | (부팅† ROM용으로 예약)[5] | ||
| 0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | — | — | CLR A | 1 | A ← 0 |
| 0 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | — | — | 스왑 A | 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 | — | — | 푸시* A | 3 | [SP] ← A, SP ← SP-1 |
| 0 | 1 | 1 | 0 | 1 | 조금 | — | — | RBIT #bit, [B] | 1 | 지정된 RAM 비트를 리셋(0으로 클리어) | ||
| 0 | 1 | 1 | 1 | 0 | 조금 | — | — | IFBIT #bit, [B] | 1 | 지정된 RAM 비트를 테스트합니다. 0이면 건너뜁니다. | ||
| 0 | 1 | 1 | 1 | 1 | 조금 | — | — | SBIT #bit, [B] | 1 | 지정된 RAM 비트를 (1로) 설정 | ||
| 1 | 0 | 0 | m | 0 | 동작 코드 | 오퍼랜드 | — | ALU 연산, A ← 연산자 | ||||
| 1 | 0 | 0 | 0 | 0 | 동작 코드 | — | — | OP A, [B] | 1 | A 및 [B]에서의 ALU 동작(DIR 프레픽스를 사용한[address]의 경우) | ||
| 1 | 0 | 0 | 1 | 0 | 동작 코드 | k | — | OP A, #imm8 | 2 | A 및 즉시 k를 사용한 ALU 조작 | ||
| 1 | 0 | 0 | m | 0 | 0 | 0 | 0 | 오퍼랜드 | — | ADC A, 오퍼랜드 | C,A ← A + 피연산자 + C. 캐리 포함 | |
| 1 | 0 | 0 | m | 0 | 0 | 0 | 1 | 오퍼랜드 | — | SUBC A, 오퍼랜드 | C,A ← A + ~연산자 + C (A - 피연산자 - ~C) | |
| 1 | 0 | 0 | m | 0 | 0 | 1 | 0 | 오퍼랜드 | — | IFEQ A, 오퍼랜드 | A and 오퍼랜드일 경우 건너뛰기 | |
| 1 | 0 | 0 | m | 0 | 0 | 1 | 1 | 오퍼랜드 | — | IFGT A, 오퍼랜드 | A and 오퍼랜드일 경우 건너뛰기 | |
| 1 | 0 | 0 | m | 0 | 1 | 0 | 0 | 오퍼랜드 | — | ADD A, 오퍼랜드 | A ← A + 피연산자(변화되지 않음!) | |
| 1 | 0 | 0 | m | 0 | 1 | 0 | 1 | 오퍼랜드 | — | AND, 오퍼랜드 | A ← A 및 오퍼랜드 | |
| 1 | 0 | 0 | m | 0 | 1 | 1 | 0 | 오퍼랜드 | — | XOR A, 오퍼랜드 | A ← A ^ 오퍼랜드 | |
| 1 | 0 | 0 | m | 0 | 1 | 1 | 1 | 오퍼랜드 | — | 또는 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 | — | — | DEC A | 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 | Pop PC, 1개의 명령 건너뛰기 |
| 1 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | — | — | 리트 | 5 | Pop PC High, Pop PC Low |
| 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 | 주소. | — | X A, 주소 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사이클 더 빠름) |
| 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 | — | — | X A, [B+] | 2 | A ↔ [B], B ← B+1 |
| 1 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | — | — | X A, [B-] | 2 | A ↔ [B], B ← B-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 | 0 | 1 | 1 | 0 | — | — | A, [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 주소 8, #imm8* | 3 | [ address ] k 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 | 주소 | 주소 | JMPL 주소 15 | 4 | PC ← 주소 |
| 1 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 주소 | 주소 | JSRL 주소 15 | 5 | PC, PC ← 주소 푸시 |
| 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 | A,C ← C,A, 캐리 우측 회전 |
| 1 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | — | — | (표준) | ||
| 1 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | — | — | X A, [X+] | 3 | A ↔ [X], X ← X+1 |
| 1 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | — | — | A, [X-] | 3 | A ↔ [X], X ← X-1 |
| 1 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | — | — | 표시* | 5 | PC ← ROM[벡터 테이블];벡터 인터럽트 선택 |
| 1 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | — | — | RPND* | 1 | 보류 중인 인터럽트 플래그 재설정 |
| 1 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | — | — | A, [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 | [address] ← k |
| 1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 주소. | — | DIR 주소 8 | 3 | 다음 명령의 피연산자를 [B]에서 [address]로 변경 |
| 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 | register ← register - 1, 결과가 0이면 건너뜁니다. | |||
| 1 | 1 | 0 | 1 | 등록하세요 | k | — | LD 레지스터, #imm8 | 3 | register ← k(=LD 0µ0+register,#k,1바이트 단축) | |||
| 1 | 1 | 1 | 오프셋 | — | — | JP - disp5 | 3 | PC ← PC - 32 + 오프셋, 1~32바이트 뒤로 점프 | ||||
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | b2 | b3 | 니모닉 | 사이클 | 묘사 |
*: "기능 패밀리" (COP888/COP8SA) 코어에만 해당되며, "기본 패밀리" (COP800) 코어에는 포함되지 않습니다.
§: 시스템 내 프로그래밍용 부트 ROM을 탑재한 '플래시 패밀리'(COP8TA/COP8C) 모델에서만 사용 가능
레퍼런스
- ^ a b COP8 Basic Family User's Manual (PDF). Revision 002. National Semiconductor. June 1996. Literature Number 620895-002. Retrieved 2021-01-02.
- ^ a b Aleaf, Abdul (July 1996). "Comparison of COP878x to the Enhanced COP8SAx7 Family - Hardware/Software Considerations" (PDF). National Semiconductor. Application Note 1043.
- ^ COP8 Feature Family User's Manual. Revision 005. National Semiconductor. March 1999. Literature Number 620897-005. 압축된 ISO 이미지 530094-003_COP8_Tools_Docs_Aug1999.zip에서 추출하여 2020-01-07을 취득했습니다.
- ^ "COP8SAx Designer's Guide" (PDF). National Semiconductor. January 1997. Literature Number 620894-001.
- ^ a b "COP8SBR9/COP8SCR9/COP8SDR98-Bit CMOS Flash Based Microcontroller with 32k Memory, Virtual EEPROM and Brownout" (PDF) (data sheet). National Semiconductor. April 2002. Retrieved 2021-01-06.
외부 링크
- National Semiconductor Embedded Micro Controller(CR16 및 COP8)
- 마이크로컨트롤러-faq/COP8, 1995
- "National Semiconductor COP8". EDN’s 25th Annual Microprocessor/Microcontroller Directory. EDN. 24 September 1998.