KR20090101939A - 컴퓨터의 교번하는 명령 및/또는 데이터 비트의 반전 - Google Patents

컴퓨터의 교번하는 명령 및/또는 데이터 비트의 반전

Info

Publication number
KR20090101939A
KR20090101939A KR1020097015064A KR20097015064A KR20090101939A KR 20090101939 A KR20090101939 A KR 20090101939A KR 1020097015064 A KR1020097015064 A KR 1020097015064A KR 20097015064 A KR20097015064 A KR 20097015064A KR 20090101939 A KR20090101939 A KR 20090101939A
Authority
KR
South Korea
Prior art keywords
bit
register
value
address
stack
Prior art date
Application number
KR1020097015064A
Other languages
English (en)
Inventor
찰스 에이치. 무어
Original Assignee
브이엔에스 포트폴리오 엘엘씨
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by 브이엔에스 포트폴리오 엘엘씨 filed Critical 브이엔에스 포트폴리오 엘엘씨
Publication of KR20090101939A publication Critical patent/KR20090101939A/ko

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F7/00Methods or arrangements for processing data by operating upon the order or content of the data handled
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F7/00Methods or arrangements for processing data by operating upon the order or content of the data handled
    • G06F7/38Methods or arrangements for performing computations using exclusively denominational number representation, e.g. using binary, ternary, decimal representation
    • G06F7/48Methods or arrangements for performing computations using exclusively denominational number representation, e.g. using binary, ternary, decimal representation using non-contact-making devices, e.g. tube, solid state device; using unspecified devices
    • G06F7/50Adding; Subtracting
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F7/00Methods or arrangements for processing data by operating upon the order or content of the data handled
    • G06F7/38Methods or arrangements for performing computations using exclusively denominational number representation, e.g. using binary, ternary, decimal representation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2207/00Indexing scheme relating to methods or arrangements for processing data by operating upon the order or content of the data handled
    • G06F2207/38Indexing scheme relating to groups G06F7/38 - G06F7/575
    • G06F2207/3804Details
    • G06F2207/386Special constructional features
    • G06F2207/3876Alternation of true and inverted stages

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Physics & Mathematics (AREA)
  • Mathematical Analysis (AREA)
  • Pure & Applied Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • Computational Mathematics (AREA)
  • Computing Systems (AREA)
  • Mathematical Optimization (AREA)
  • Software Systems (AREA)
  • Complex Calculations (AREA)
  • Logic Circuits (AREA)
  • Executing Machine-Instructions (AREA)

Abstract

교번하는 비트들이 반전되는 기본 컴퓨터 회로(30)가 제공된다. 2개의 18-비트 레지스터들(32, 34)이 ALU(36)에 연결되어, 리플-캐리 가산을 수행하는바, 홀수 비트 위치들에 대응하는 회로 부분들에서는 1-high 숫자 표현법이 적용되며, 짝수 비트 위치들에는 반전 표현법이 적용된다. 교번 비트 반전때문에, 1-비트 가산에 대한 캐리 계산이 오직 하나의 인터버 지연내에서 수행될 수 있다. 따라서 작은 다이 면적의 고속 18-비트 가산기가 가능하다. 교번하는 비트 위치들에서의 반전된 숫자 표현법은, 논리 레벨을 조절하기 위하여 추가 인터버 스테이지가 통상적으로 요구되는 또 다른 조합 회로들에서도 적용가능한바, 따라서 동작 지연을 감소시킬 수 있으며 다이 면적을 감소시킬 수 있다.

Description

컴퓨터의 교번하는 명령 및/또는 데이터 비트의 반전{INVERSION OF ALTERNATE INSTRUCTION AND/OR DATA BIT IN A COMPUTER}
관련 출원
본 출원은 동일한 발명자에 의해서 2006년 12월 21일자로 미국에 출원된 미국가특허출원(출원번호 60/876,379)의 우선권을 주장하며, 상기 미국가출원은 본 발명에 대한 참조로서 그 전체가 본 명세서에 통합된다.
본 발명은 산술 프로세싱 및 계산을 수행하는 컴퓨터 분야에 관한 것이며, 좀더 상세하게는 컴퓨터 회로에서 이진 숫자들을 물리적으로 표현하는 것에 관한 것이다.
통상적으로는 전기회로의 전위값(전압)인, 물리적 성질의 높고 낮은 값들의 시퀀스로 이진 숫자들(참/거짓 논리 상태 또는 불린 값(boolean values)이라 호칭되기도 함)을 조작함으로써, 디지털 컴퓨터가 동작된다. 일반적으로, 이진 1을 표현하기 위해서는 높은 전압값(혹은 전압 레벨)이 할당되고 이진 0에 대해서는 낮은 전압값이 할당되거나(이하에서는 1-high 표현법이라 한다) 또는, 그 반대의 표기법(이하에서는 1-low 표현법 또는 반전된 표현법이라 한다)이 이용되는바, 이들은 컴퓨터 회로에 대해서 일관되게(uniform) 이용된다. 비트 표현을 변화시키는 것(평균 신호를 밸런싱하고 RFI를 감소시키기 위하여)이 직렬 디지털 신호 전송과 메모리 칩들에서는 알려져 있지만, 컴퓨터 회로들에서는 그렇지 않다. 컴퓨터 또는 데이터 프로세서의 전기 회로들에서 일관된(uniform) 번호 표현은, 이들의 설계, 테스팅, 및 이들을 동작시키기 위한 명령 기입을 단순화시킨다. 현재의 해당 기술분야에서, 디바이스들의 전체 논리 회로 패밀리들은, 고정되고 일관된 표현법을 채용하고 있다. 예를 들어, 1.5볼트 CMOS는, 이진 1을 표현하기 위해서 약 1.5V의 전기회로 전위를 이용하며, 이진 0을 표현하기 위해서는 약 0V의 전위를 이용한다.
이러한 통상적인 이진 숫자 표현이 회로 요구조건들 및 회로 동작에 어떻게 관련되는지는, 복수-비트 가산(addition)과 같은 기본적인 컴퓨터 동작의 일례로부터 알 수 있는데, 특히 상기 복수-비트 가산은 컴퓨터 프로세서가 유용한 작업(task)을 얼마나 빨리 수행할 수 있는지를 결정한다. 해당 기술분야에 알려진 2-입력 리플-캐리 가산기(2-input ripple-carry adder)(10)가 도1에 도시되어 있다. 여기서, 각각의 블록(12)은, 더해지는 2개의 복수 비트 워드 A, B의 하나의 비트 위치에 대한 합산과, 인접한 하위 비트 위치로부터 수신한 캐리-인 값 C(carry-in value C)에 대한 합산을 수행하는 1-비트 전가산기(full adder : 이하에서는 '전가산기' 또는 '풀 애더' 라함)를 나타내는 조합 회로(combinatorial circuit)이다. 도3에는 최하위 비트(LSB)에서 시작하여 4개의 하위 비트 위치들(블록 0, 1, 2, 3)만이 도시되어 있다. 도면에서 A0, B0, A1, B1, A2, B2, A3, B3 는 더해지는 입력 비트값들이며, C0, C1, C2, C3 각각은 비트 위치들 0, 1, 2, 3에 대한 캐리-인 비트 값들이다. 각각의 블록(12)은, 합산 워드 S의 비트값들 S0, S1, S2, S3 을 계산하며, C4는 다음 상위 비트 위치(미도시)로 전달될 캐리-아웃 값이다. 한 블록의 캐리-아웃은 다음 블록의 캐리-인이 됨을 알 수 있으며, 따라서 비트 위치 합산들이 순차적으로(sequentially) 계산되며, 그리고 캐리 계산의 지연들이 더해진다. 반면에 캐리 값을 포함하고 있지 않은 계산들은, 더해지는 워드들이 회로에 인가되자마자 각각의 조합 회로 지연 내에서 병렬로 수행될 수 있다. 따라서, 비트들의 숫자(워드 사이즈)가 큰 경우에는 캐리 지연(carry delay)이 전체 지연(overall latency)을 좌우할 것이다. 병렬기법(parallelism)(및 비트 위치들의 그룹화)들이 다양한 방식으로 적용되는, 복수-비트 가산을 수행하기 위한 여러 개의 상이한 기법들이 알려져 있지만, 이들 모두는 모든 하위 비트 입력들에 따라, 임의의 비트 위치에서의 합산(또는 비트들의 그룹화)으로부터 기인하는 지연(latency)(지연 시간)을 경험하게 될 것이다. 즉, 달리 말하면 임의의 비트 위치에서의 1-비트 가산은, 인접한 하위 비트로부터의 캐리를 요구한다.
가산기(10)의 가산기 블록(12)의 일부(14)에 대한 블록도가 도2에 도시되어 있는바, 이는 3개의 1-비트 입력들 A1, B1, C1 에 응답하여, 비트-1 블록의 캐리-아웃 값인 C2 에 대한 계산을 수행하는 공지된 최적의 CMOS 조합 회로를 도시한 것이다. 이러한 회로에는, 출력에서 논리 레벨을 조절하기 위하여, 지연을 유발하는 인버터(16)가 포함될 필요가 있는바, 이는 각 블록의 캐리-인 및 캐리-아웃에 대한 일관된 이진 숫자 표현을 위해서이다. 일관된 숫자 표현을 위한 인버팅 회로부는, 가령, 공지된 또 다른 기법에 따라 다수-비트 가산을 수행하는 조합 회로들과 같은 또 다른 조합 회로에서 요구될 수 있다. 명백하게도, 숫자 표현을 조절하기 위한 이러한 인버팅 회로부를 포함하지 않는 기본 회로들을 제공하는 방법을 찾는 것이 바람직할 것이다. 따라서 이러한 기본 회로들은 감소된 지연을 가지며 그리고 고속 계산 및 고속 신호처리 관점에 있어서, 다이 면적 사용과 전력 절감에 있어서, 그리고 마이크로프로세서 어레이들 및 내장형 시스템 어플리케이션들에 적용가능한 관점에 있어서, 더 양호한 컴퓨터 성능을 가질 수 있다. 하지만, 본 발명자가 아는 한, 그 어떤 종래 기술도 만족할만한 해결책을 제시하지 못하였다.
도1은 일관된(uniform) 이진 숫자 표현을 이용하는 통상적인 리플-캐리 가산기에 대한 블록도이다.
도2는 통상적인 일관된 이진 숫자 표현을 이용하는 1-비트 가산기 블록의 캐리 계산부를 좀더 상세히 도시한 회로도이다.
도3은 일관되지 않은(non-uniform) 이진 숫자 표현을 이용하는 리플-캐리 가산기에 대한 블록도로서, 여기에서는 본 발명의 일실시예에 따라 교변 비트들이 반전된다.
도4는 본 발명의 교번 비트 반전을 이용하는, 1-비트 가산기 블록의 고속 캐리 계산부에 대한 회로도이다.
도5는 통상적인 방법으로 5-비트 이진 숫자들을 합산하는 것과 교번 비트 반전을 이용하여 5-비트 이진 숫자들을 합산하는 것을 비교한 도면이다.
도6은 산술 논리 유닛에 연결된 2개의 18-비트 레지스터들을 포함하는 기본 컴퓨터 회로에 대한 블록도로서, 여기서는 본 발명에 따라 교번 비트들이 반전된다.
도7은 본 발명에 따라 교번 비트 반전을 채용하는 도6의 기본 컴퓨터 회로의 2개의 인접한 레지스터 셀들에 대한 회로도이다.
도8은 도6의 컴퓨터 회로에서 동작하도록 적응된 고속 캐리 계산부에 대한 회로도로서, 본 발명의 대안적인 실시예에 따라 교번 비트 반전을 채용한 것이다.
따라서, 본 발명의 목적은 컴퓨터 회로들에서 이진 숫자들의 교번 비트 반전 표현을 위한 방법 및 장치를 제공하는 것으로서, 결과적으로, 복수-비트 이진 숫자들에 관련된 가산 동작 및 다른 조합 동작들을 더 빨리 수행할 수 있다.
본 발명의 또 다른 목적은, 더 적은 면적을 갖는 컴퓨터 회로들을 제공하기 위한 방법 및 장치를 제공하는 것이다.
본 발명의 또 다른 목적은, 캐리 계산을 위한 인버팅부를 필요로 하지 않는 가산기 회로를 제공하기 위한 방법 및 장치를 제공하는 것이다.
간단히 말하면, 본 발명은 지연을 유발하는 인버터들을 제거함으로써, 컴퓨터에서 지연을 감소시키기 위한 방법 및 장치에 관한 것이다. 이러한 것은, 몇몇 데이터 비트들이 반전되지 않은채로 남아있는 것을 허용하고 그리고 관련 회로들에서 이를 보상함으로써, 이루어진다.
본 발명의 이러저러한 목적들 및 장점들은, 본 명세서에서 서술되고 도면들에서 도시된 바와같은, 본 발명의 실시예들에 대한 설명부분들 및 산업상 이용가능성을 참고하면 해당 기술분야의 당업자들에게 명백해질 것이다. 본 명세서에서 설명된 목적들 및 장점들은 본 발명의 가능한 모든 목적들 및 장점들을 완벽하게 설명한 것은 아니다. 또한, 의도된 목적들 및/또는 장점들중 하나 이상이 부재인 경우 또는 이들을 어플리케이션에서 요구하지 않더라도 본 발명을 구현하는 것은 가능하다.
더 나아가, 본 발명의 다양한 실시예들은, 앞서 설명된 본 발명의 목적 및/또는 장점들을 하나 이상 성취할 수도 있지만 모든 목적들 및/또는 장점들을 성취할 필요는 없다는 것을 해당 기술분야의 당업자들은 능히 이해할 것이다. 따라서, 본 명세서에서 설명된 본 발명의 목적 및/또는 장점들은 본 발명의 본질적인 요소는 아니며, 제한으로써 해석되어서는 안된다.
이제, 도면들을 참조하여 본 발명이 설명되는바, 상기 도면들에서 유사한 도면부호들은 동일하거나 유사한 구성요소들을 나타낸다. 비록, 본 발명의 목적을 달성하기 위한 최적의 실시 모드에 대해서 본 발명이 서술되었지만, 권리범위로 청구된 본 발명의 기술적 사상의 범위를 벗어남이 없이도, 본 명세서의 가르침에 기초한 다양한 변형예들이 가능할 수도 있음은 해당 기술분야의 당업자들에게는 명백할 것이다.
본 명세서에서 기술되고 및/또는 도면들에서 도시된, 본 발명의 실시예들 및 변형예들은 단지 일례로서만 제공된 것이며, 본 발명의 범위를 이에 한정하고자 함이 아니다. 특별히 달리 언급되지 않는한, 본 발명의 개별 양상들 및 구성요소들은, 본 발명의 기술적 사상 및 청구된 권리범위 내에 남아 있으면서도, 다양한 응용예들을 위해서 생략 또는 변형될 수 있거나 또는 지금까지 알려진 등가물들, 혹은 미래에 개발될 수도 있거나 혹은 적용가능한 대체예들로 미래에 판명될 수도 있는 것들과 같은 아직 공지되지 않은 대체물들로 대체될 수도 있다. 또한, 본 발명은 권리범위로서 청구된 본 발명의 정신 및 범위를 벗어남이 없이도 다양한 응용예들을 위해서 변형될 수도 있는데, 이는 본 발명의 잠재적인 응용예의 범위가 매우 크기 때문이며, 또한 본 발명은 이러한 많은 변형예들에 적용가능하도록 의도되었기 때문이다.
본 발명을 실시하기 위한 공지 모드는, 기본적인 컴퓨터 회로로서, 예컨대, 교번 비트들이 반전되는, 복수-비트 2-입력 리플-캐리 가산기를 들 수 있다. 본 발명에 따른 컴퓨터 회로는 도3의 블록도에 도시되어 있으며 본 명세서에서는 참조번호 20으로 지칭된다. 상기 가산기(20)는 본 발명의 일실시예에 따라, 교번하는 비트 위치들(홀수 및 짝수)에서 반전된(inverted) 이진 숫자 표현을 갖는다. 본 발명의 발명자는, 디지털 회로에 대해서 이진 숫자 표현이 일관되어야만 한다는 통상적인 사례 및 가정(assumption)은 기본적으로 근거가 없는 것(unwarranted)이라는 점을 인식하였으며, 이러한 사례를 탈피하여 대안적인 표현법을 이용하게 되면 중요한 장점들이 얻어질 수 있다는 점을 인식하였다. 도면들에서, 반전된 이진 숫자(논리) 값들은 으로 표현되는바, 이는 통상적인 보수 표기법(complement notation)을 따른 것이다. 특히, 상기 실시예에서는 짝수 번호 블록(22)(0, 2, 4 ... 의 비트 위치들)에서 1-high 표현법이 이용될 수 있으며, 홀수 번호 블록(23)(1, 3, 5 ... 의 비트 위치들)에서는 1-low 표현법(반전된 표현법)이 이용될 수 있다. 그리고, 상기 가산기(20)는 도1을 참조하여 전술한 바와같은 통상적인 가산기(10)와 실질적으로 동일할 수 있다. 가산기(20)의 비트-2 블록의 캐리 계산부(24)에 대한 회로도가 도4에 도시되어 있는바, 이는 고전압(Vdd)과 저전압(Vss) 사이에 연결된 p-채널 및 n-채널 MOS 트랜지스터들을 포함하는 CMOS 회로 구현예를 이용한 것이다. 비트-2는 짝수 번호의 비트 위치이므로, 그 번호 표현법은 1-high 표현법인바, 이는 도2를 참조하여 앞서 설명된 종래기술의 예제의 그것과 일치한다.
하지만, 회로들을 비교하면, 출력에서 인버터가 없는 상기 회로는 입력에 대해 반전된 캐리-아웃을 제공하므로, 도4의 회로(24)가 하나 더 적은 인버터단(inverter stage)을 갖고있음을 알 수 있으며, 그리고 이는 도3에 도시된 바와 같이 모든 비트 위치들에서 캐리 전달(carry propagation)에 적합하다. 비트-2에 대해서, 캐리-인은 C2이며 캐리-아웃은 이다. 홀수 비트 위치들에서는 숫자 표현이 반전되므로, 비트-3에 대해서 더해지는 값들은 , 이고 캐리-인은 이며(이들은 A3, B3, C3 의 보수이다), 캐리-아웃은 C4 이다. 다음과 같은 사항이 명백한바, 본 발명의 일실시예에 따라 더해지는 워드들 A, B의 교번하는 비트들에서 숫자 표현이 반전되는 것은, 모든 비트 위치들에 대하여 인버터 스테이지에 대한 요구 및 그와 관련된 캐리 계산부에서의 동작 지연을 제거할 수 있으며, 따라서 복수 비트 리플 캐리 가산의 속도를 상당히 개선시킬 수 있다. 경우에 따라서는 속도를 2배로 향상시킬 수도 있다.
예컨대, 가산(addition)과 같은 논리 연산 또는 산술 연산을 수행함에 있어서 컴퓨터 회로의 기능(functionality)이, 이진 숫자 표현법의 선택에 의해서 영향을 받지않는다는 것은 해당 기술분야의 당업자들에게 자명할 것이다. 이러한 것은 도5에 도시된 바와같이, 통상적인 회로와 교번-비트-반전(alternate-bits-inverted) 회로를 이용하여 수행되는 2개의 예시적인 5비트 이진 숫자들의 가산들(즉, A = 11101 및 B = 10111 을 더하여 5비트(또는, 6비트)의 합계(sum)가 생성됨)을 비교함으로써 예시될 수 있다. 이러한 비교는, 1-비트 가산기 블록들의 물리적인 회로 전위 레벨에서 어떤 일이 일어나는지를 보여줄 것이다. 도5에서, 글자 1, 0 은 이진 숫자에 대한 비트 값들을 나타내며, 그리고 글자 H, L 은 전위와 같이 비트 값들을 표현하는데 이용되는 회로 속성의 "high" 및 "low" 값들을 나타낸다. 이러한 일례에 대해서는, 통상적이며 확립된(fixed) 표현법은 1-high 표현법이라고 가정될 것이며, 그리고 상기 1-high 표현법은 짝수 비트 위치들에 해당하는 회로 부분들에서 이용된다. 다음과 같은 점을 유의해야 하는바, 모든 비트 위치들에 대하여 숫자 표현이 일관되며 그리고 1-high 표현법으로 고정된 회로에서는, 비트값들 1, 0 은 어디에서든지 회로 전위 H, L에 각각 대응할 것이며, 따라서 심볼 1은 H를 대신하여 사용될 수 있고, 심볼 0은 L을 대신하여 사용될 수 있다. 그러므로, 도1에 도시된 바와같이 일관된 숫자 표현법의 경우, 가산 절차는 도5의 가산(26)에 도시된 것처럼 진행되는바, 여기서 S1-h 의 첨자 1-h는 상기 일례에서 1-high 표현법이 적용되었다는 점을 강조하기 위한 것이다. 본 발명에 따른 교번 비트 반전(도3에서와 같은)의 경우, 가산 절차는 도5의 가산(28)에 도시된 것처럼 진행된다. 이 경우, 짝수 비트 위치들(복수 비트 이진 숫자들의 일련의 연속적인 비트 위치들에서)에 대응하는 회로 부분은 1-high 표현법을 갖는다. 그리고 홀수 비트 위치들에 대응하는 제 2 회로 부분은 반전된 표현법 즉, 1-low 표현법을 갖는다. 반전된 회로 표현법을 갖는 비트들은 도5에서 굵은 글씨체로 도시되었다. 가산(addition)(28)의 합계(S)에서 H 및 L 값들은, 도5에서 S 바로 밑의 S1-h 에 의해 도시된 바와같이, 일관된 1-high 표현법으로 변환되는바, 상기 합계는 가산(26)의 합계와 동일함을 알 수 있다. 만일, 1-low 표현법이 확립된 표현법으로서 채용된다거나 또는 반전된 회로 부분이 짝수 비트 위치들에 대응하는 경우, 통상적인 케이스와 교번 비트 반전 케이스에 대해서 회로 동작을 비교하게 되면, 유사한 결론에 도달할 것이다라는 점은 해당 기술분야의 당업자에게 명백할 것이다. 또한, 하나의 또는 또 다른 숫자 표현법에 상관없이, 소정의 비트 위치 내에서, 소정 세트의 입력 값들에 대해서 1-비트 가산이 정상적으로 진행되며, 그리고 캐리를 제외하고, 더해지는 값들과 결과값(합계)은 둘다 비트 값들이거나 또는 각각의 이진 숫자들인 비트값들의 보수들(complements)이라는 점은 해당 기술분야의 당업자들에게 명백할 것이다. 본 발명에 따른 교번 비트 반전의 경우, 정상적으로 계산된 캐리 출력의 보수(즉, 반전된 값)가, 연속적인 각각의 비트 위치에 대한 캐리 입력으로서 요구되는바, 이는 도3에서 상보적인(complemented) 캐리 값 심볼과 스트레이트(straight) 캐리 값 심볼이 교변하는 것에 의해 표시된 바와 같으며, 그리고 도5에서 굵은 글씨체와 가는 글씨체의 비트값 심볼들이 교변하는 것에 의해 표시된 바와 같다.
도2의 회로는 입력값들의 특정한 조합 논리 기능에 대한 트랜지스터 레벨 CMOS 구현예로서 인식될 수 있다. 여기서에는 일관된 숫자 표현을 위해서 여분의(extra) 인버터 스테이지가 요구되는바, 상기 여분의 인버터 스테이지는 도3의 회로에서와 같이 교변 비트 위치들에서 반전된 숫자 표현법을 이용함으로써 제거될 수 있다. 따라서, 동작 지연을 감소시킬 수 있으며 그리고 회로 레이아웃에서 요구되는 다이 면적을 감소시킬 수 있다. 이러한 인버터 스테이지들은 또한, 일관된 숫자 표현법을 이용하는 컴퓨터들 및 신호 프로세서들의 다른 조합 논리 회로들에서도 요구되는 것으로 알려져 있다. 다음과 같은 사항이 해당 기술분야의 당업자들에게 명백할 것인바, 본 발명에 따라 컴퓨터 워드들의 교번 비트 위치들에서 반전된 숫자 표현법을 이용함으로써, 몇몇 케이스에서는 이러한 인버터 스테이지들이 유사한 방식으로 제거가능한 것으로 예상될 수 있다. 따라서, 컴퓨터의 동작속도를 증가시킬 수 있으며 다이 면적을 감소시킬 수 있다.
또 다른 기본적인 컴퓨터 회로에서 교번 비트 반전을 이용하는 일례가 도6 내지 도8을 참조하여 설명될 것이다. 도6에는 산술 논리 유닛(arithmetic logic unit : ALU)(36)에 연결된 2개의 18-비트 레지스터들(32, 34)을 포함하는 컴퓨터 회로(30)가 도시되어 있다. 회로(30)의 모든 구성요소들의 교번 비트 위치들에서 이진 숫자 표현이 반전된다. 1-high 숫자 표현법이 홀수 비트 위치들에서 이용될 수 있으며, 반전된 표현법(1-low 표현법)이 짝수 비트 위치들에서 이용될 수 있는바, 이는 도면에서 비트값들의 상보적인 표기법에 의해 도시된 바와 같다.
여기서, 상기 레지스터(32, 34)는 T-레지스터와 S-레지스터라고 지칭되며, 이들 각각은, 예컨대, 도7에 도시된 CMOS 정적 메모리 (비트) 셀들과 같은 18개의 저장 셀들(38)을 포함한다. 도7에는 T-레지스터(32)의 비트 위치 3 및 비트 위치 2에 각각 배치된 저장 셀(38)과 인접 저장 셀(38a)이 도시되어 있다. 각각의 셀(38)은, 고전압(Vdd)과 저전압(Vss) 사이에 연결되어 있으며 크로스 커플된 2개의 MOS 인버터들을 포함하여 구성되며, 그리고 2개의 상보적인 인버터 노드들(40, 42)에서의 고전위 및 저전위에 의해 정의되는 2개의 안정한 상태들을 갖는바, 따라서 해당 기술분야에 알려진 바와 같이 1-비트 이진 숫자를 저장할 수 있다. 하나의 노드, 예컨대 노드(40)는 모든 비트 셀들에 대해서 1-high를 나타낼 수 있으며, 그리고 다른 하나의 노드(42)는 결과적으로 상보적인 값을 가질 것이다. 비트 셀(38)은 싱글-엔디드(single-ended)될 수 있음을 유의해야 하는바, 이는 노드들중 하나로부터 그 상태를 판독하기 위한 하나의 (판독) 라인(44)과 기입 패스 게이트(46)를 통해 셀에 기입하기 위해 상보적인 노드에 연결된 다른 하나의 (기입) 라인(48)을 이용한다. 따라서, 이러한 실시예에서는, 판독 라인(44)은 홀수 비트 셀들의 노드(40)에 연결될 수 있으며 그리고 짝수 비트 셀들의 노드(42)에 연결될 수 있는데, 이는 레지스터들의 교번 비트 위치들에서 이진 숫자 표현의 반전을 구현하기 위함이다. 도7에 도시된 바와 같이, 짝수 비트-2 셀(38a)에 대해서, 판독 라인(44a)은 노드(42a)에 연결되며, 패스 게이트(46a)와 기입 라인(48a)은 노드(40a)에 연결된다. 따라서, 셀로부터 가 판독될 것이며, T2 가 셀에 기입될 것이다. 반면에 홀수 비트-3 셀로부터 T3가 판독될 것이며, 그리고 가 기입될 것이다. 도7에 도시된 회로는, 전술한 바와같은 동일한 방식으로 S-레지스터(34)에서도 구현될 수 있다.
ALU(36)는 18개의 1-비트 산술 논리 유닛들(ALU's)(50)을 포함하여 구성되며, 이들 각각은 도면에 도시된 바와같이 비트 위치에 따라 레지스터들의 각각의 비트 셀들에 연결된다. 제어, 데이터 및 명령들(instructions)의 전송, 전원 조절등을 위해서 예컨대, 메모리, 제어 시퀀서, 입/출력 포트, 다른 레지스터들, 및 파워 서플라이와 같은 컴퓨터의 다른 부분들로 연결되는 ALU, T-레지스터, S-레지스터의 다른 배선들은 설명의 간략화를 위해서 도면들에서 생략되어 있음을 유의해야 한다. 예컨대, 상기 회로(30)는, 리플 캐리 기법에 따라, S-레지스터 내의 18-비트 숫자를 T-레지스터 내의 18비트 숫자에 가산하고 그 합계를 T-레지스터에 넣어놓는다. 이를 위하여, 도6에 도시된 바와같이, S-레지스터(34)의 비트 셀들의 판독 라인들(54)은 대응 1-비트 ALU들(50)의 제 1 가산 입력에 연결되며, 그리고 T-레지스터의 판독 라인들(44)은 제 2 가산 입력에 연결된다. ALU의 합계 출력 라인들(sum output lines)(56)은 패스 게이트들(46)을 통해 T-레지스터의 기입 라인들(48)에 연결된다. 그리고 캐리 라인들(58)은 ALU들에 직렬로 연결된다. 이러한 회로에서, 각각의 18-비트 가산을 수행하는 동안에 캐리 값이 비트-0 위치로부터 비트-17 위치로 전달되며, 따라서 가산 지연은 18개의 캐리 계산 지연들의 합을 포함한다. 하지만, 교번 비트 반전때문에, 1-비트 가산에 대한 캐리 계산은 오직 하나의 인버터 지연에서 수행될 수 있는바, 예를 들면, 전술되었던 도4의 상기 회로(24)를 ALU(50)의 캐리 계산부에 대해 적용함으로써, 1-비트 가산에 대한 캐리 계산은 오직 하나의 인버터 지연에서 수행될 수 있다. 다음과 같은 점이 해당 기술분야의 당업자들에게 명백할 것인바, 상기 회로(24)는, 도6에 도시된 바와같이 T-레지스터 및 S-레지스터로부터 ALU에 더해지는 비트값들이 교번하는 것과 동일한 방식으로, 연속적인 비트 위치들로부터의 캐리 출력들을 캐리 값과 캐리 값의 보수 사이에서 교번하게 만들 수 있다. 이러한 것은, 더 적은 다이 면적을 가지는 고속의 18-비트 가산기가 리플-캐리 설계에 의해서 제공되게 한다.
대안적인 실시예에서는, 대략 하나의 인버터 지연내에서 캐리 계산을 수행하기 위해서, 도8에 도시된 또 다른 회로(60)가 ALU(50)의 캐리 계산부에 적용될 수 있다. 특히, 비트 3에 대한 연결들이 도면에 나타나 있다. 여기서, 는 라인(58) 상의 캐리 입력이고, C4는 비트-4 ALU의 캐리 입력에 연결되는 라인(58b) 상의 캐리 출력이며, 그리고 T3, S3는, 각각 라인들(44, 54) 상에서 (비트 3) ALU에 더해지는 2개의 입력들이다. 상기 회로(30)(도6)는, 비동기식으로 동작하도록 적응될 수도 있는데, 따라서 더해지는 값들이 ALU에 적용된 이후에, 하나의 낸드 게이트 지연과 하나의 노어 게이트 지연 내에서, 라인(62, 64) 상의 조합값들이 회로(60)에서 이용가능해진다. 이러한 것은 모든 비트 위치들에서, 실질적으로 동시에, 병렬로 일어날 수 있다. 회로(60)의 동작에 있어서, 캐리 출력 C4는, 캐리 입력 의 도달 시간에 MOS 트랜지스터(66 또는 68)의 게이트 지연 및 관련된 와이어 지연을 더한 이후에 이용가능해지는데, 상기 시간은 해당 기술분야에 알려진 바와같이 하나의 인버터 지연과 실질적으로 동일하다. 도6에 도시된 실시예에서, 더해지는 입력들은 레지스터 판독 라인들에 연결된채로 남아있으며, 그리고 새롭게 더해지는 값들은, 적절한 기입 패스 게이트들(T-레지스터의 경우, 기입 패스 게이트 46)을 인에이블링시킴으로써, 레지스터에 기입된 비트 값들의 새로운 세트에 응답하여, 레지스터 비트 셀들이 새로운 상태로 설정되자마자 이용가능해진다. 비록, 도6 및 도7에는 도시되어 있지 않지만, 또 다른 실시예에서는 18-비트 가산이외의 ALU 동작들을 선택하기 위하여, 패스 게이트들의 또 다른 세트들이 존재할 수 있다. 도8의 라인들(70, 72, 74)은, ALU의 합계 계산부(sum computation portion)(미도시)에 연결되는 내부 배선들을 나타낸다.
본 발명의 가치와 범위를 변경하지 않고도 다양한 수정예들이 본 발명에 가해질 수 있다. 예를 들어, 리플 캐리 가산기(20)와 기본 컴퓨터 회로(30)에 관하여 본 발명이 설명되었지만, 숫자 표현의 조절을 위해서 인버터 스테이지들이 통상적으로 이용되는 또 다른 기본 컴퓨터 회로들에도 동일한 효과를 갖게 본 발명이 적용될 수 있다.
컴퓨터 회로의 교번 비트 반전된 이진 숫자 표현법에 대한 특정한 일례들이 본 명세서에 설명되었지만, 아직 고려되지 않은 대단히 많은 적용예들이 존재할 것이라고 예측된다. 사실, 본 발명의 장점들 중 하나는 본 발명에 따른 방법 및 장치가 매우 다양한 용도들에 적용될 수 있다는 점이다.
상기의 모든 내용은 단지 본 발명의 이용가능한 실시예들의 몇몇 일례들일 뿐이다. 해당 기술분야의 당업자라면 본 발명의 범위 및 사상을 벗어나지 않고도 많은 수정안들 및 대안들이 이루어질 수 있음을 쉽게 파악할 수 있을 것이다. 따라서, 본 명세서의 개시사항은 본 발명의 범위를 제한할려는 것이 아니며, 첨부된 특허청구범위는 본 발명의 전체 범위를 포괄하는 것으로 해석되어야 한다.
본 발명에 따른 기본 컴퓨터 회로의 교번 비트 반전된 이진 숫자 표현법은 매우 다양한 응용예들에서 폭 넓게 이용되도록 의도된 것이다. 본 발명은 속도, 컴팩트한 회로 면적 및 낮은 전력소모가 중요한 고려사항인 조합 회로 응용예들에서 특히 유용할 것으로 예상된다.
앞서 언급된 바와 같이 기본 레벨(basic level)의 컴퓨터 회로들에 관계되는한, 본 발명의 응용성은 매우 범용적일 것이라고 예상된다. 본 발명은 용이하게 생산가능하고 그리고 컴퓨터 회로 등과 같은 기존의 기술에 용이하게 통합가능하며, 그리고 앞서 설명된 바와같은 장점들이 제공되므로, 본 발명은 산업계에서 용이하게 채택될 것이라고 예상된다. 이러한 이유들 및 또 다른 이유들 때문에, 본 발명의 유용성 및 산업상 이용가능성 둘다는 매우 넓은 범위와 상당히 오랜 지속기간을 갖게될 것이다. 본 명세서의 다음의 페이지들에서 서술되는 어플리케이션 가이드와 디바이스 데이터 시트는 본 명세서의 일부이다. 상기 어플리케이션 가이드와 데이터 시트는 종래기술에 비해 상당한 장점들을 제공하는 본 발명의 양상들을 개시한다.
제1장. 소개(Introduction)
본 문서는 캘리포니아 팔로 세드로의 IntellaSys A/V 시스템 사업부의 Forth 프로그래머인 깁슨 엘리엇(Gibson Elliot), 제이알 스토너(JR Stoner), 및 마이클 데니스(Michael Dennis)에 의해 발명되고, 수정되고, 영감을 받으며, 각고의 노력끝에 만들어진 기술들에 대한 편찬물이다.
이들의 오리지널 트레이닝에 대해서 제프 폭스(Jeff Fox) 그리고 존 리블(John Rible)에게 감사드리며, 문서 정리에 대해서 찰스 새덕(Charles Shattuck)에게 감사드린다. 그리고 무엇보다도 이 기술을 개발함에 있어 그 인내심에 대해 척 무어(Chuck Moore)에게 감사드린다.
아마도 여기에 제공된 정보들 중 일부는 자명할 것이지만, 어떤 위대한 사람이 과거에 나한테 이렇게 이이야기한바 있다. "어떻게 하는 것인지를 일단 알게되면 만사가 용이하다(Everything is easy once you know how)."
VentureForthTM과 함께 여행을 시작하는 당신에게 본 문서가 큰 도움이 되었으면 하는 것이 우리의 진실한 바램이다.
제2장. 컨벤션(Convention)
본문에서 니모닉들(Mnemonics)은 굵은 글씨체로 도시된다.
예제 : a dup dup xor 는 데이터 스택 상에 0(zero)을 생성할 것이다.
본문의 항목들 중 타이핑되어야 하는 것들은 따옴표와 함께 Courier 글씨체로 쓰여진다.
예제 : "12 { node" 를 타이핑하시고 엔터키를 누르세요.
우리의 스택 표기는 대부분의 Forth 구현예에서와 마찬가지로 괄호를 이용하지만, 데이터 스택과 리턴 스택을 분리하기 위해서 R 도 역시 이용한다.
데이터 스택(DS)의 탑이 "4"를 포함하고 DS 상의 두번째 항목이 "2" 였으며, 그리고 리턴 스택(RS)이 "9"를 포함하고 그리고 RS 상의 두번째 위치가 "7"을 포함하는 경우, 이러한 스택 표기는 다음과 같다.
RS 상에 중요한 데이터가 없는 경우, 스택 코멘트는 DS 값들만을 포함할 것이며 다음과 같이 보일 것이다:
우리가 찾고자하는 데이터를 RS 가 가지고 있지 않은 경우에도, 상기 R: 이 표기에 종종 남아있다. 때때로는 그렇지 않다.
주의 : DS의 2개의 탑 위치들은 최상부와 2번째에 대해서 T 레지스터와 S 레지스터라고 지칭된다. 이들은 굵은 글씨로 표기될 것이다.
완전히 비어있는 스택들은 코멘트될 필요는 없다. 하지만 몇몇 경우에는 "(---)" 로 도시된다.
우리는 이러한 일례에서 다음과 같이 ab 레지스터의 내용을 추적할 것이다.
제3장. 개발 환경(Development Environment)
SEAForth 개발 환경, 즉 적어도 본 문서에 설명된 하나는, SwiftForth 를 베이스로 이용한다. 상기 개발 환경은 SwiftForth와 Forth 소스 코드의 호스트, 및 VentureForthTM 코드로 구성된다. Gforth 가 또한 베이스로서 작용할 것이다.
선행조건(Prerequisite)
SwiftForth 또는 Gforth가 유효하게 설치되어 있어야 한다. 이들 각각은 ANS Forth 이다.
너는 너의 컴퓨터 상에 SEAforth 시뮬레이터 파일들을 갖고 있어야 한다. 이 폴더는 수 많은 폴더들을 포함할 것이다. 하지만, 다음의 것들은 항상 포함한다.
● apps
● t18
● bios
개관(Overview)
너의 선택에 따른 문서 편집기(text editor)로 apps 폴더에 "mytest.mf" 를 생성하자.
.Mytest.mf는 다음을 포함한다:
상기 "include" 라인은 어떤 VentureForthTM 파일들이 시뮬레이터에 로딩될 것인지를 제어한다. VentureForthTM 파일들은 ".mf" 확장자를 이용하며, 이는 machine forth 를 나타낸다. 당신의 어플리케이션 파일을 로딩하기 이전에, "seaforth.f" 라는 이름의 파일이 컴파일러/시뮬레이터를 실제로 로드한다.
당신의 모든 VentureForth 소스 코드 파일들이 apps 폴더에 있어야 한다. apps 폴더에서 "mytest.mf"이 당신의 나머지 어플리케이션 파일들(만약, 있다면)을 여기서 검색할 것이기 때문이다.
당신이 많은 수의 VentureForth 파일들을 전개하고 있는 중이라면, 이들에게 구별되는 이름들을 부여할 수 있으며, 이들을 apps 폴더내에 유지할 수 있으며, 그리고 위에 도시된 include line을 변경함으로써 어떤 것을 테스팅할지를 제어할 수 있다.
샘플 프로그램 실행(Executing a Sample Program)
이제 apps 폴더 내의 "mytest.mf" 파일을 열고, 당신의 선택에 따른 에디터를 이용하여 다음과 같은 코드를 기입하시오.
우리는 상기 코드를 노드 12에서 로딩 및 구동되도록 선택하였으며, 그리고 상기 코드가 메모리 어드레스 제로에 컴파일링을 개시하도록 하였다.
실제적으로, {node 는 노드의 메모리 어드레스 제로에서 디폴트로 컴파일링이 시작되도록 설정한다.
"runs init12" 는 부팅되었을 때 상기 노드가 init12로 점프하게 한다.
SwiftForth 를 구동하고 그리고 mytest.mf 파일을 로딩하자. 굉장히 긴 화면이 나타날 것이다. 반복되는 워드들에는 몇몇 사소한 에러가 존재할 수도 있다. 이런 것들은 무시해도 좋다.
로딩이 완료되면, "decimal"을 타이핑하고 엔터키를 눌러라. 이후 "12 node!" 를 타이핑하라. 대안적으로는, "hex" 를 타이핑하고 이후 "C node!" 를 타이핑할 수도 있다. 하지만, 나머지 사용자 인터페이스는 우리가 선택한 바에 따라 십진법(decimal) 또는 16진법(hex)로 숫자들을 반환할 것이다. 따라서, 결과를 해석하는 때에는 지금 십진법을 사용하는지 16진법을 사용하는지를, 다음의 경우와 같이 기억하고 있어야 한다.
"C."를 타이핑하고 엔터키를 쳐라. 아래의 것을 보게될 것이다:
위의 도면은 노드의 메인 레지스터들에 대한 스냅샷이다.
가장 주목해야 하는 것은 프로그램 카운터(PC), 명령(instruction), 그리고 데이터 및 리턴 스택들이다. 또한, AB 레지스터의 내용들도 여기에서는 유용하게 이용된다.
이제 "step step step .c" 를 타이핑하고 엔터키를 쳐라. 이는 PC에서의 옵코드(opcode)를 페치 및 실행할 것이다. 상기 페치를 실행하기 위해서는 3개의 싸이클이 소요된다. 따라서 step이 세번이다. 당신은 다음과 같은 것을 보게될 것이다.
앞선 2개의 도면들로부터, @p+ opcode가 어드레스 0에 있는 메모리로부터 페치되었음을 알 수 있을 것이며, PC가 1로 증가되었음을 알 수 있을 것이다.
축하한다! 당신은 지금 SEAforth 시뮬레이터에서 Machine Forth 를 구동하고 있다.
다시 한번 "step step step .c" 를 타이핑하고 엔터키를 쳐라.
이제, 당신은 T 레지스터에서 DS의 탑에 제로가 로딩되었음을 알 수 있을 것이다.
우리는 프로그램 카운터를 수동으로 제어할 수 있다. 예를 들어, 어드레스 $19에서의 코드가 다음번 "step"에서 실행되기를 원한다면, "19$ pc !"을 타이핑할 수 있다.
우리는 종종 다수의 코어들 상에서 한번에 코드 테스팅을 하게 될 것이기 때문에, 디버깅 중에 하나의 노드에서 다른 노드로 스위칭할 수 있는 방법이 필요하다. 노드 14로 스위칭하기 위해서는, 시뮬레이터가 그 당시 어떤 베이스로 설정되었는지에 따라 "14 node!" 또는 "e node" 를 타이핑하라.
비록, 우리 같은 프로그래머들은 대부분의 경우 16진법으로 작업하는데 익숙해져 있지만, 우리들은 노드 번호들을 거의 전적으로 십진 표기법으로 지칭하였다.
메모리 내용 검사(Examining the Contents of Memory)
".adrs" 워드는 메모리 내용을 디스플레이하는데와 디스어셈블리에 이용된다. 메모리의 처음 5 워드들의 내용을 보기로 하자. "0 5 ,adrs" 를 타이핑하고 엔터키를 누른다.
지명된(named) 빌트-인 메모리 위치들이 많이 존재하기 때문에, 이러한 정의들 중 몇몇은 무시할 필요가 있다. 여기에 동일한 메모리 디스플레이/디스어셈블리가 있는데, 이는 명확함을 위해서 편집된 것이다.
위의 도면에서 ": init12" 를 남겨놓았다. 왜나하면, 그것이 우리의 워드이기 때문이며, 바이오스 코드(bios code)로부터 온 것이 아니기 때문이다. 지금 이 시점에서 우리는 바이오스 코드를 이용하고 있지 않다.
메모리 어드레스 1에 0이 있음을 알 수 있다. 상기 0을 메모리에 로딩하는 @p+ 는 어드레스 0에 있다. 또한, 메모리 어드레스 3에 1이 있음을 알 수 있다. 그것의 @p+는 동일한 메모리 어드레스의 실제 가산 옵코드와 함께 슬롯 0에서 어드레스 2에 있으며, 슬롯 2이 아니다.
"hex 0 5 .adrs" 를 타이핑하고 엔터키를 누르시오.
개발 시스템(development system)은, 10진법 지시어(decimal directive)(또는 8진법)를 수신하기 전까지는 16진법 모드에 있을 것이다.
제4장. VentureForth TM 에 의해 제공되는 과제들
아마도, Machine Forth는 프로그래머가 경험할 수 있는 가장 제한된 명령어 세트(most restricted command set)를 갖는다. 본 장에서는 알기 쉬운 몇몇 과제들을 다룰 것이며, 우리의 해결책이 제공된다. C18이 옵코드의 볼륨이 부족하다고 하여도, 이것은 간단하다라는 효율성으로 이를 상쇄시키며, 그리고 각각의 코드가 매우 작기때문에 하나의 패키지안에 많은 코드들이 위치할 수 있다. SEAforth-24A는 24개의 프로세서를 포함한다.
또한, 최상의 속도와 가장 작은 메모리 면적을 차지하였던 유용한 방법들을 제공할 것이며, 그리고 현재의 문제점에 직접적으로 적용될 수 있거나 또는 SEAforth 프로세서 패밀리를 보다 잘 이해하기 위해서 귀하에게 유용하다고 생각되는 코드 클립들(code clips)과 기법들을 제공할 것이다.
뺄셈(subtraction)
뺄셈 옵코드는 없다. 부정(negation)은 비트에 관한 not 연산(bitwise not operation)에 의해서 거의 수행되며, 1의 보수(one's complement)가 된다. 결과값에 1을 더하는 것은 2의 보수(two's complement)를 생성할 것이며, 이는 우리가 원하는 것이다. 왜나하면, C18은 2의 보수 체계를 이용하여 부호화된 산술연산(signed arithmetic)을 수행하는데, 이는 대부분의 다른 ALU와 유사하다.
따라서, DS 상에 2개의 숫자들을 위치시킴으로써 뺄셈이 수행될 수 있는데, 뺄셈될 숫자는 가장 위에 위치시키고, not을 적용하고, 그 다름 가산(add)(+)하고, 마지막으로 상기 not을 바로잡기 위해 1을 더한다.
만일, 9에서 5를 뺄셈하고 싶다면,
뺄셈은 또한 다음의 방법을 이용하여 수행될 수도 있다. 아래 방법이 더 간결하며 그리고 실질적으로 더 적은 스페이스와 싸이클을 요구한다.
9에서 5를 뺄셈하기 위하여, 이번에는 다른 순서로 해보면,
시험 및 비교 값들(Testing and Comparing Values)
처음에는 2개의 기본 비교들 즉, if 및 -if 만을 다룰 것이다.
if는 비-제로(non-zero)를 체크하며, -if는 마이너스를 체크한다. 테스트가 통과되면, if/-if 바로 다음의 코드가 실행될 것이다. 테스트가 실패하면, then 바로다음 코드의 주소로 프로그램 카운터(PC)가 변경될 것이다.
자 그렇다면, 다른 조건들은 어떻게 체크할 수 있을까?
Less Than
전술한 "뺄셈하기"에서 이용되었던 기법을 이용하고 그리고 -if로 마이너스를 체크한다.
예제(이 예제에서 그리고 앞으로의 예제들에서, 시연되는 프로세스의 실제 부분이 아닌한, 스택을 로드하는 코드는 도시되지 않을 것이다.)
Greater Than
평범한 것이 치명적일 수도 있으니, 생명 보험 증권을 갱신하라(if the mundane can be lethal, update your life insurance policy). 다른 숫자를 뺄셈한다는 것만 제외하면, Greater Than은 Less Than과 동일하다. 예컨대, Less Than을 테스트하기 위해서 B에서 A를 뺄셈한다면, Greater Than을 테스트하기 위해서는 A에서 B를 빼기만 하면 된다.
Greater / Less Than or Equal To
전술한 바와같은 동일한 절차를 이용하지만, -if 전에 결과값에 1(one)을 더하는 것을 생략한다. 그러면 ">=" 또는 "<=" 를 수행할 수 있다 .
Testing fot Zero
"test for zero" 또는 "test for equality" 는 없다.
하지만 이를 해결할 여러가지 방법이 있다. 본 문서에는 2가지 방법이 언급된다. 방법1은 지금 설명된다. 방법2는, zero를 직접 체크하기 위해서 next 옵코드를 이용하기 때문에 나중에 설명될 것이다. 그리고 방법2는 next 옵코드의 다른 우수한 속성들과 함께 나중에 설명되는 편이 더 낳다.
방법 1 :
Test for non-zero to disqualify. 우리는 비-제로(non-zero)를 체크하기 위해서 if 연산을 이용할 수 있으며, 그리고 비-제로에 대한 상기 테스트가 통과된다면 "run-if-zero" 코드로부터 분기할 수 있다.
Testing for Equality
등식(equality)을 테스트하기 위하여, 우리는 두개의 인수(argument)를 뺄셈할 수 있으며, 그리고 zero에 대해 테스트할 수 있다. 하지만, 더 좋은 방법이 있다.
등식을 테스트하는 더 좋은 방법은, 2개의 테스트 값들을 xor 하는 것이다. 이들 2개의 값들이 같다면, 그 결과는 zero가 될 것이다. 이후, 우리는 zero에 대해 테스트한다.
제5장. 메모리 액세스
메모리 액세스를 위한 레지스터 옵코드들
우리는 2개의 포인터 레지스터들(a 및 b 레지스터)을 이용하여 C18의 메모리 공간을 액세스할 수 있다. 레지스터 a는 통상적인 레지스터처럼 기입 및 판독될 수 있다. 또한, 레지스터 a는 임의의 메모리 위치에 비간접적으로(indirectly) 판독 또는 기입하는데에 이용될 수도 있다. 즉, 우리는 a 레지스터의 내용을 판독 및 기입할 수 있으며 또는, 우리는 a 레지스터의 내용이 참조하는 메모리 어드레스 로/로부터 판독/기입할 수도 있다.
우리가 b 레지스터의 내용을 직접적으로 판독할 수 없다는 점을 제외하면, b 레지스터는 a 레지스터와 유사하게 동작한다. 우리는 오직 상기 레지스터에 기입할 수 있을 뿐이다. 하지만, 우리는 레지스터 b가 참조하는 메모리 위치에 판독 및 기입할 수 있다. 이런 이유로 인해, 레지스터 b는 메모리 액세스를 위해서 배타적으로(exclusively) 이용된다.
옵코드와의 혼동을 회피하기 위해서, 몇몇 구두점(punctuation)은 여기에서 생략되었다.
a! 을 이용하면 a 레지스터에 직접 기입할 수 있다.
b! 을 이용하면 b 레지스터에 직접 기입할 수 있다.
a@ 를 이용하면 a 레지스터로부터 직접 판독할 수 있다.
● b 레지스터로부터는 직접 판독할 수 없다.
@a를 이용하여, a 레지스터에 의해 특정된 메모리의 내용을 판독한다.
@b를 이용하여, b 레지스터에 의해 특정된 메모리의 내용을 판독한다.
!a를 이용하여, a 레지스터에 의해 특정된 메모리 내용을 기입한다.
!b를 이용하여, b 레지스터에 의해 특정된 메모리 내용을 기입한다.
$08 값을 메모리 어드레스 $A0에 기입하라.
자동-증분을 갖는 레지스터 옵코드(Register Opcode with Auto-Increment)
메모리 위치에 판독/기입하는 2개의 매우 유용한 레지스터 옵코드가 있으며, 그리고 레지스터 내의 값을 자동-증분시킴으로써, 기입 또는 판독될 다음 어드레스를 준비할 수 있다. 오직 a 레지스터만이 자동-증분 옵코드들을 갖는다. 이들 옵코드들은 특히 입력 및 출력 버퍼, 회로 등에 유용하다.
!a+ 는 a 레지스터에 의해 특정된 메모리 어드레스에 기입하며, 그리고 one(1)을 a 레지스터에 가산한다.
@a+ 는 a 레지스터에 의해 특정된 메모리 어드레스로부터 판독하며, 그리고 one(1)을 a 레지스터에 가산한다.
예제 5.2.1에 관한 주의사항들
자동-증분 판독 및 기입 옵코드들은 효율적인 순환(circular) 버퍼에 대해 매우 유용한바, 이들은 계속해서 실행될 수 있기 때문이며 그리고 소정 지점에서 메모리 공간의 개시(begining)로 단순히 롤-오버할 것이다.
현재, SEAforth-24A C18 코어들은 64 워드의 RAM으로 셋업된다. @a+ 에서 a가 증분되는 경우, 이것은 어드레스 63을 통과하는 때에 0 주위를 맴돈다(wraps around to 0). 전술한 Reader에서, 판독 루프는 마이크로-루프이며 이는 마이크로-넥스트(micro-next)의 원 워드 엔딩(one word ending)에 들어맞는다. 이는 메모리로부터 또 다른 명령어를 페치하는 일 없이 $40000번 루프할 것이며, 상기 RAM이 여러번 완전히 덮어쓰기되는 것을 허용한다. 상기 루프가 종료하는 때에, 상기 프로그램은 데이터로 덮어쓰여진 코드를 실행하려할 것이다. 따라서, 이는 바람직한 일례가 아니며, 단지 관심있는 것일 뿐이다. 그것이 실행되는 것을 관찰하면, 너는 0에서부터 63을 지나 다시 0으로 회귀하는 a 레지스터 싸이클을 여러번 볼 수 있을 것이다.
중요한 프로그램에서는, a 레지스터가 코드 메모리 공간으로부터 격리되도록 주의를 기울일 필요가 있다. 노드 내의 프로그램 코드가 무자비한(wanton) !a+ 공격의 희생자가 되지 않게 보장하는 것은 프로그래머의 책임이다.
물론, 우리는 자유(free) 메모리에 딱 들어맞는 임의 길이의 버퍼를 가질 수 있지만, a 레지스터의 값을 검출 및 규제하기 위해서 코드가 제공되어야만 한다.
제6장. 이웃 통신에 대한 소개(Introduction to Neighbor Communication)
이웃들(neighbors)은 메모리 위치들처럼 액세스된다. 소정의 노드에 대하여, 이웃 노드들에 액세스하기 위해서는 할당된 메모리 어드레스가 4개까지 존재한다. 이들 메모리 어드레스들을 기억하는 대신에, 명명된 상수들(named constants)을 기억하기로 하자.
이웃 통신에 있어서 명심해야할 가장 중요한 점은 다음과 같은 것이다. 이웃으로부터 판독하거나 또는 이웃에 기입하는 임의의 노드는 그 트랙(track)에 있어서 멈출 것이며(즉, 수면 모드로 진입할 것이다), 그리고 판독 또는 기입 요청이 이웃 노드에 의해 서비스되기를 기다린다. 우리는 이것을 통상적으로 "판독 방지" 또는 "기입 방지" 라고 부른다.
IOCS라고 호칭되는 특별한 메모리 어드레스가 있는데, 이는 이웃이 상기 노드로부터 판독 또는 기입을 요청하고 있는지를 판별하기 위해서, 노드를 스톱시키지 않고도 판독될 수 있다. 따라서, 예를 들면 노드가 기입하기를 대기하고 있는가를 단지 알아보기 위해서라면, 기입 방지를 실행할 필요는 없다.
노드 12는 $07의 값을 노드 13에 기입할 것이다.
제7장. Next 활용
Next의 성질
Next는 for-next 루프의 일부로서 통상적으로 이용된다.
ForDS로부터 탑 아이템을 이동시키며, 그리고 그것을 RS 상에 위치시킨다. Next를 조우하게 되면, RS의 탑 상의 아이템이 제로에 대해서 테스트된다. 만일 그것이 제로가 아니면, RS의 탑 상의 아이템은 감소되며, 그리고 Nextfor가 가리키는 어드레스로의 브랜치를 야기한다. RS의 탑이 0이라면, 실행은 next를 지나서 바로 직후의 워드에게로 진행한다. RS의 탑 상의 데이터(이 경우는 0)가 소비되는바, 그것이 0인 경우에만 그렇다.
RS 상의 for-next 카운터를 방해하지 않도록 주의가 요구된다. 정상적인 상황에서, 상기 next가 실행되는 때 우리는 리턴 스택의 꼭대기에 상기 카운터가 있기를 원할 것이다.
요약하면, RS가 0이 아니라면(non-zero), next는 분기를 야기하며 그리고 RS를 감소시킨다. RS가 0이라면, RS의 꼭대기에 있는 상기 0은 소모되며 그리고 프로그램 카운터가 증분된다.
컴파일러가 for 또는 begin 과 조우하면, next 연산의 주소가 메모되며 그리고 다음 next(또는 again)의 리턴 어드레스를 위해서 이용된다.
만일, 우리가 우리 next의 주소를 안다면, 우리는 컴파일 시간에 옵코드를 재-기입하여, 우리가 원하는 임의의 위치에 상기 next를 리다이렉트(redirect) 할 수 있다. 우리는 이것을 소프트 코딩이라 부른다. 이것은 약간의 계획과 약간의 추가적인 메인테넌스(maintenance)를 요구한다.
For-next 루프는 항상 적어도 한번 구동한다.
제8장. 스택 조작 vs. 페칭 리터럴(fetching literal)
페칭 리터럴의 실행 속도 및 스택 조작
Literals:
● 리터럴을 페치하고 그리고 스택에 위치시키는데에는 3 클록 싸이클이 소요된다. 리터럴은 또한 페치 옵코드(@p+)를 위한 또 다른 메모리 어드레스 하나의 슬롯에 더하여 완전한 18-비트 워드 메모리를 점유한다.
● 리터럴들이 이용되는 경우 소스 코드가 좀더 용이하게 판독된다.
스택 조작자(stack manipulator):
● 스택 조작자들은 일반적으로 하나의 싸이클, 그리고 한 워드의 하나의 슬롯을 차지한다.
● 소스 코드는 때때로 리터럴을 이용하는 유사한 코드만큼 판독가능하지 않을 수도 있다. 하지만, 연습을 통해, 더 많은 스택 조작 기법을 이용하면 코드 판독 및 기입 둘다가 점점 더 용이해질 것이다.
따라서, 당신의 DS를 플랜닝하고, 그리고 당신의 DS를 상기 값들과 "변수들(variables)"로 초기화함으로써, 당신의 루틴은 더 빨리 구동될 수 있으며, 더 적은 메모리를 점유할 수 있다. 하지만, 항상 그런 것은 아니다. 스택의 배치 및 저글링(juggling)에는 약간의 기술이 필요하다.
상당한 주의와 함께, DSRS 둘다는 데이터 저글링(data juggling)에 이용될 수 있다.
이것은 용이하게 판독할 수 있다. 하지만 1이 4개의 싸이클을 취한다. 상기 루틴은 약 4 워드들로 컴파일될 것인바, 이들 워드들 중 3개를 루프가 점유한다. 상기 루프는 매 11 싸이클마다 한번 실행될 것이다.
이것은 스택 조작에 의해 리터럴 방법처럼 판독가능한 코드가 생성된다는 것을 보여주는 훌륭한 예제이다.
상기 루틴은 스택 셋-업을 포함하여 5 워드들로 컴파일된다. 하지만, 루프는 2 워드들로 컴파일될 것이다. 그리고 상기 루프는 매 8 싸이클마다 한번 실행될 것이다. 이는 이전 방법에서 걸리는 시간의 약 2/3에 해당한다.
페칭 리터럴없이 공통 값들을 구성하기(Constructing Common Values Without Fetching Literals)
리터럴을 직접 컴파일링할 때나 또는 메모리로부터 페칭할 때에 요구되는 오버헤드(overhead)때문에, 스택 조작 및 ALU를 이용하여 필요한 값들을 합성(synthesize)하는 것이 종종 유용할 때가 있다.
당신이 보고 싶어하는 가장 통상적인 예제는 dup dup xor 인바, 이는 DS(T)의 탑에 0(zero)을 생성한다. 이것은 메모리의 전체 워드를 차지하지 않으며, 실행을 위해서 오직 3 싸이클만을 차지한다.
1(one)을 합성(synthesize)하는 방법이 존재하지만, 더 많은 공통 매크로들(macros)을 포함하는 후속 에디션에서 이를 다룰 것이다. 만일, 당신이 당신의 DS(또는, RS)내의 편리한 위치에 1을 위치시키기 위해 시간을 투자한다면, 이것을 여러번 레프트-쉬프팅시킴으로써, 1을 위해서 뿐만 아니라 2, 4, 또는 8(또는 그 이상)을 위해서도 이를 이용할 수 있을 것이다.
2의 자승(power of 2)만을 필요로 할 때가 종종 있기 때문에, 스택 상에 power-of-2-literal 을 위치시키는 것은 당신의 루틴을 위해 필요한 값들을 합성하기에 충분할 것이며, 리터럴들의 컴파일을 회피함으로서 시간을 절약할 수 있다.
DS 상에 위치한 4(four)는 0, 1, 2 또는 8, 16 또는 32로 빠르게 변환될 수 있는바, 비록, dup dup xor 을 이용하면 0 이 좀더 용이하게 구성되지만, 컴파일된 리터럴이 상기 값을 당신의 DS에 전달하는 것보다 더 빠르게 될 수 있다.
하지만, 이러한 기법들이 아무리 유용하다고 해도, 수확체감(diminishing return)이라는 매우 실제적인 포인트가 존재한다. 따라서, 리터럴들을 필요로 하는 경우에는 리터럴들을 직접 컴파일하는 편이 종종 더 낳다.
MSB as Boolean Flag
C18 프로세서는 불린 논리(boolean logic)에 대해서 MSB(17 비트)의 사용에 친숙하도록 설계되었다. 직렬 통신을 위해 설계된 코어들 상에서, SEAforth 핀들 중 하나는 비트 17(zero-based)에 연결될 것이며, 따라서 우리는 -if로 high-input state를 용이하게 체크할 수 있다.
또한, 임의의 양수(positive number)에 적용된 not은 음수(negative number)를 야기하기 때문에(그 반대의 경우도 마찬가지), not-if 는, 효율적인 참-거짓 시스템의 일부로서 쉽게 사용될 수 있다. 임의의 음수는 참으로 간주되며, 임의의 양수는 거짓으로 간주된다. not 은 참과 거짓사이에서 손쉽게 토글링된다. 나는 이것을 종종 이용한다.
하기의 것은 4장(Test for Equality)에 대한 확장 예제이다. 여기서, 우리는 ": ?Equal" 을 호출가능 워드(callable word)로 바꾸었는바, 이는 TS가 같다면 T에 음의 값(negative value)을 반환하며, 또는 TS가 같지 않다면 T에 음이 아닌 값(non-negative value)을 반환한다. 이제, 상기 워드를 호출하는 어떤 코드도 -if 결과를 테스트 할 수 있다.
제9장. 페이지 및 워드-정렬(Page and Word-Alignment)
분기 제한들에 대한 이해(Understanding Branch Limitations)
SEAforth 프로서세들의 현재 구현예는 512-워드 by 18-비트 메모리 공간을 이용한다. 상이한 제품들은 상이한 메모리 양을 가질 수도 있지만, 그 구조는 여전히 플랫(flat) 512-워드 메모리 맵이다. 이는 상기 PC가 9 비트 폭이기 때문이다. 모든 어드레스가 디코딩되는 것은 아니다. 24A는 $00-$3A에서 64 워드 RAM을 가지며, $80-$BF에서 64 워드 ROM을 가진다. 특정한 기능 레지스터들은 비트 8 세트를 가지며 따라서, 어드레스 $100 위에 존재한다.
페이지들은 8 워드 바운더리 상에 있다. 이것은, 분기 옵코드가 슬롯 2에 있으며 그리고 분기 어드레스에 대해서 오직 3 비트들만이 남은 때에, 활동을 시작한다. 분기가 어디로 가는지를 판별하기 위해서 3 비트 분기 어드레스가 PC의 상위 6비트에 더해지며, 8 비트들은 0으로 셋팅된다.
또한, SEAforth 프로세서는 각각의 워드에 다수의 옵코드를 팩킹한다. 4개까지의 옵코드들이 메모리의 하나의 워드를 점유할 수 있다. 옵코드들이 어떤 "slots" 을 점유할 수 있는지에 대한 제한이 있다. 또한, 몇몇 옵코드들은 그들이 컴파일되는 슬롯에 의존하여 상이하게 동작한다.
분기를 야기할 수 있는 옵코드들은 상기 구조에 가장 큰 영향을 받는다. 슬롯 번호가 낮으면 낮을수록, 더 많은 자유를 "분기" 옵코드들이 가질 수 있다. 하지만, 분기가 멀리 갈 수 있다하여도, 소정 워드의 슬롯 0으로 분기할 수 있을 뿐이다.
우리의 분기 옵코드들(if, -if, next, ;, -;)과 그들의 목적지 어드레스가 몇몇 규칙들을 어긴다면, 우리 코드는 컴파일되지 않을 것이며 또는 우리 코드는 놉(nops)(.)으로 패드될 것인바, 이는 워드-정렬을 개선하기 위함이다. 상기 구조가 어떻게 작용하는가에 대한 이해는, 불량 컴파일을 회피하는데 도움을 줄 것이며, 높은 성능의 코드를 작성하는데 도움을 줄 것이다.
놉의 롤링 아웃 - 컴팩팅 및 가속 코드(Rolling Out the Nops - Compacting and Accelerating Code)
놉들을 롤링 아웃한다는 것은(Rolling Out the Nops), VentureForthTM 코드의 속도와 사이즈를 최적화하기 위해서, 페이지 및 워드 정렬을 최적화하는 프로세스를 지칭한다.
놉들을 롤링 아웃하는 일반적인 규칙들은 다음과 같다:
가능하다면, 분기 옵코드와 그 목적지는 동일한 페이지에 있어야 한다. 이렇게 함으로써, 컴파일될 때, 컴파일러가 현재 워드의 나머지를 패드 아웃하고 그리고 새로운 워드를 시작할 필요 없이, 분기 옵코드가 현재 워드 내로 컴파일될 가능성을 증가시킬 수 있다.
몇몇 옵코드들은 소정 슬롯들에 제한되기 때문에, 전략적인 위치에 놉을 삽입하는 것은 다른 놉들의 호스트를 사라지게 만들 수 있다. 동일한 이유로, 동일한 결과를 획득하기 위해서 옵코드를 변경하는 방법 또는 옵코드들의 순서를 변경하는 방법을 찾아내는 것은, 더 적은 놉들, 더 적은 워드들을 갖는 코드를 야기할 수 있는바, 따라서 더욱 양호한 실행 시간을 얻을 수 있다.
우리는 코드의 정렬을 강제하기 위해서 org, 라벨들, nops 을 이용할 수 있다. 만일, 루틴의 초기화에서 적은 수의 nops이 루틴의 반복 부분(recursive part)에서 워드 및 페이지 정렬에 많은 도움을 준다면, 이러한 nops(또는 라벨) 을 이용하는 것은 일반적으로 권장할만 하다.
비-최적화된 워드 정렬을 검출 및 보정하기 위해서 디스어셈블리(disassembly)를 검색할 필요가 있을 것이다.
제1장. SEAforth-24A 어레이 프로세서에 대한 소개
SEAforth-24A는 최초의 스케일러블 임베디드 어레이(Scalable Embedded ArrayTM : SEA) 프로세서 칩이다. 이것은 온-칩 프로그램 스토어와 프로세서간(interprocessor) 통신 방법과 함께 24개의 매우 작은 고속의 프로세서 코어들을 결합한 것으로서, 달러당 MIPS 및 밀리와트당 MIPS 두개의 관점에서 고레벨의 프로세싱 능력을 제공할 수 있다. 이러한 점은 소비자 어플리케이션에 대해서 SEAforth-24A가 이상적인 임베디드 프로세서 솔루션이 되게 한다.
어레이 내의 각각의 CPU는 ROM, RAM, 및 강력한 I/O 기능 세트와 함께 초당 10억(billion)개 까지의 명령들을 실행할 수 있다. SPI 인터페이스 포트는 직렬 어플리케이션들을 지원하며 그리고 I2C, I2S, 또는 USB 2.0 보다 2배의 능력을 발휘할 수 있다. 직렬 포트들은 다수의 SEAforth-24A들을 연결하는데 이용될 수 있다.
도1은 상기 디바이스를 도시한 것이다. 디바이스는 24개의 CPU 코어들을 포함하여 이루어지며, 그 외에도 메모리와 I/O를 포함한다. 이러한 코어 아키텍처는 C18이라고 호칭되는바, 이는 이것이 18-비트 와이드 CPU이기 때문이다. 상기 24개의 프로세서는 N0 부터 N23 까지 넘버링되며, 이들은 명령들(instructions) 및 아키텍처에 관해서는 동일하지만, 상이한 I/O를 갖는다. 각각의 C18 프로세서는 64 워드의 로컬 RAM과 64워드의 로컬 ROM을 가지며, 웨이크/슬립(wake/sleep) 핸드쉐이크 회로와 함께 공유 통신 포트에 의해서 그 이웃들에 각각 연결된다.
24개의 코어들이 함께 작동하므로, 설계자들은 이들의 그룹들을 18-비트 FFT와 DFT, 무선 통신, 또는 USB 와 같은 특정한 작업(task)에 전용할 수 있다. SEAforth-24A는 특정 I/O 프로토콜에 전용 실리콘을 이용하지 않으며, 반면에 프로그래머로 하여금 소프트웨어적으로 고속의 직렬 I/O을 구현할 수 있게 한다. 그 결과, 밀접하게 커플링되며(tightly-coupled), 매우 다용도인, 특정 작업들에 할당된 전용 프로세서들의 사용자-정의(user-defined) 그룹을 만들 수 있다.
각각의 프로세서는 실리콘의 풀 네이티브 속도(full native speed of the silicon)에서 비동기식으로 동작한다. 프로세서간 통신은 자동적으로 이루어진다. 프로그래머는 동기화 방법을 고안해낼 필요가 없다. 인접한 이웃들 간의 통신은 전용 포트를 통해 이루어진다. 이웃으로부터 데이터를 기다리고 있는 프로세서는 슬립 모드로 진행하는바, 1 마이크로와트 이하를 소비한다. 마찬가지로, 데이터를 수신할 준비가 안 되어 있는 이웃에게 데이터를 전송하고 있는 프로세서는 그 이웃이 데이터를 받아들이기 전까지 수면 모드로 들어간다. I/O 핀 상의 외부 신호들은 또한, 수면중인 프로세서들을 깨울 것이다.
프로세서 코어 개관(Processor Core Overview)
도2에 블록도가 도시되어 있다. SEAforth-24A 내의 24개의 C18 코어들 각각은, 명령어(instructions) 및 아키텍처 관점에서 서로 동일하다(IO와 지원 ROM 코드들은 가변됨).
각각의 코어는 전통적인 Forth 스택 머신과 매우 유사한 네이티브(native) 18-비트 프로세서이다. 그 명령어 세트는, 데이터를 조작하기 위한 파라미터 스택과 플로우 네스팅(flow nesting)을 제어하기 위한 리턴 스택을 이용하여 베이직 Forth 명령어들을 실행하도록 맞춤화되어 있다. Forth에서 가장 빈번히 이용되는 연산들이 네이티브 C18 명령어 세트를 형성한다. 워드로 알려진, Forth 명령어들의 시퀀스들이 네이티브 C18 명령어들로부터 구성된다. 명령어 프리-페치(pre-fetch)와 함께, C18 Forth 프로세스는 복잡한 파이프라인 설계가 없이도 매우 고속으로 동작한다.
많은 명령어들(instructions)이 스택들로부터 직접 오퍼랜드(operand)를 획득하므로, 이들은 제로-오퍼랜드 명령어로 알려져 있다. 그 결과, 대부분의 명령어들은 단지 5비트 길이를 가지며, 이는 3개 혹은 4개의 명령어들이 팩킹될 수 있게 하며 그리고 하나의 18비트 명령어 워드로부터 실행될 수 있게한다. 8개의 5비트 명령어들이 워드내의 마지막 옵코드(opcode)로서 3-비트 슬롯에 위치할 수 있다.
리터럴 로드(loads), 콜(calls), 및 점프(jumps)는 오퍼랜드와 메모리(또는 포트) 싸이클을 필요로 한다. 하나의 점프 또는 콜은 3, 8, 또는 9-비트 어드레스 인수(argument)를 취할 수 있다. 리터럴 명령어는 스택에 로딩될 리터럴을 특정하기 위해서 5-비트 옵코드 및 18-비트 워드를 이용한다.
프로세서 메모리와 I/O
SEAforth-24A 디바이스의 각각의 C18 프로세서는 64 워드의 RAM과 64 워드의 ROM을 갖는다. 각각의 워드는 18비트 폭이며, 그리고 최대 4개까지의 팩킹된 명령어들을 보유할 수 있다.
64-워드 ROM은 부트(boot), 태스크 스위치(task switch), 및 프로세서간(inter-processor) 통신 코드를 포함한다. 몇몇 프로세서들은 I/O 핀들을 관리하기 위해 특정한 ROM 코드를 갖는다. 64-워드 RAM는 부트 디바이스로부터 다운로드된 코드를 포함한다.
디바이스의 모서리에 있는 프로세서들(N2-N5, N11, N12, N17, 및 N18-N23) 각각은 그들 자신의 IO 핀 세트에 연결된다(N1과 N6은 특별한 경우이며, 이에 대해서는 후술될 것이다). 다른 모든 프로세서들은 I/O를 갖고 있지 않다.
VentureForth Language
VentureForthTM 은, IntellaSys 패밀리의 각 프로세서에 의해 네이티브 명령어 세트로서 지원되는 Forth 워드들의 코어 세트이다.
Forth는, 대부분의 데이터를 스택 상에 간직한다는 사상에 기반하는, 매우 효율적인 언어이다. IntellaSys의 설립자 중의 한명인 Chuck Moore에 의해 1970년대에 개발된 Forth 프로그램들은 작은 코드 사이즈, 고속 실행 및 용이한 확장성을 특징으로 한다. 이러한 확장성은 Forth '워드'라는 개념에 기초한다. 워드들은 다른 워드들로부터 만들어지며, 이들 모두는 VentureForth 딕셔너리로부터 기원한다. VentureForth는 ROM의 Forth 워드에 의해 확장되는바, 이는 I/O 라이브러리로서 기능하며, 프로세서간 통신 루틴 및 I/O 기능을 추가한다. ROM의 디폴트 I/O 드라이버들이 이용될 수 있으며 또는 RAM의 코드로 대체될 수도 있다.
IntellaSys는 ForthletsTM에 대한 지원을 추가함으로써 Forth의 능력을 확장시켰으며, ForthletsTM은 특정한 프로세싱을 수행하기 위해서 코어에서 코어로 칩 주변을 이동할 수 있는 객체-지향 코드이다.
도2: SEAforth-24A C18 프로세서 코어 - 1 of 24
C18 레지스터 아키텍쳐 개관(C18 Register Architecture Overview)
Forth는 스택-지향 언어이다. 어드레스, 데이터 및 계산을 위해 이용되는 '보통(ordinary)' 레지스터들이 2개의 스택에 위치하는바, 이는 테이블 1에 요약된 바와같다.
C18 상의 프로그램 카운터와 B 레지스터는 각각 9비트 폭이다. B 및 18-비트 A 레지스터는 어드레싱을 위해 이용된다. B는 기입될 수 있지만 판독될 수는 없다. B 레지스터는 B 레지스터를 포인터로서 이용하는 페치 및 스토어 명령어에 의해서 지원된다. A 레지스터는 기입될 수 있으며 그리고 다시 판독될 수 있다. 따라서, A 레지스터는 어드레싱이나 또는 임시 저장을 위해 이용될 수 있다. A 레지스터는 페치, 스토어에 의해 지원되며 그리고 메모리 액세스 이후에 A 레지스터를 증분시키는 자동-증분(auto-increment) 페치 및 스토어 명령어에 의해 지원된다.
특수-목적 레지스터들은 인접한 프로세서와 대화하는 4개의 방향성(directional) 레지스터를 포함한다. 방향성 레지스터들 및 이들의 동작은 프로세서간 통신에 관한 챕터에서 상세히 후술될 것이다.
또한, I/O Control 및 Status 레지스터가 존재한다. I/O 핀 및 방향성 레지스터의 상태는 상기 레지스터에서 판독된다. IOCS 레지스터에 기입함으로써, Pin 모드와 출력 상태가 설정된다.
제2장. 스택 동작의 이해(Understanding Stack Operation)
스택 구조(Stack Structure)
C18 은 이중-스택(dual-stack) 프로세서이다. 이것은 ALU에 의해 조작되는 파라미터들에 대한 데이터 스택을 가지며 그리고 CALL 및 RETURN 명령어에 의해 이용되는 네스티드(nested) 리턴 어드레스를 위한 리턴 스택을 갖는다. 상기 리턴 스택은 또한 PUSH, POP, NEXT 명령어에 의해 이용된다.
10개의 데이터 스택 레지스터들과 9개의 리턴 스택 레지스터들은 모두 18 비트 폭이다. 프로그램 카운터는 9비트 폭이다. CALL 명령어는 리턴 스택 상에 PC를 푸쉬한다. RETURN 명령어는 18비트 모두를 팝(pop) 하지만, 상위 9비트는 버린다.
C18 스택들은 스택 포인터에 의해 액세스되는 메모리내의 어레이들이 아니며, 오히려 레지스터들의 어레이이다. 데이터 스택 상의 최상위 2개의 위치들은 T(Top)과 S(Second)로 명명된 전용 레지스터 이름을 갖는다. 이들 아래로는 8개의 스택 레지스터들의 순환 어레이가 존재한다. 상기 순환 어레이의 8개 레지스터들 중 하나는 S 아래의 레지스터로서 언제든지 선택될 수 있다.
리턴 스택의 최상위 위치는 R 이라고 명명된 전용 레지스터 이름을 갖는다. R 아래에는 8개의 리턴 스택 레지스터들의 순환 어레이가 존재한다. 상기 어레이의 8개의 레지스터들 중 하나는 R 아래의 레지스터로서 언제든지 선택될 수 있다.
스택 오버플로우와 언더플로우(Stack Overflow and Underflow)
스택 오버플로우 또는 언더플로우 상태에 대한 하드웨어 검출은 없다. 스택 상에 있는 아이템(item)의 갯수를 추적하는 것과 그리고 스택이 보유할 수 있는 것보다 더 많은 아이템을 넣지않게 하는 것은 소프트웨어의 책임이다. C18 스택들은 스택의 바닥에서 레지스터들의 순환 어레이를 갖기 때문에, 상기 스택들은 스택 영역을 넘어 오버플로우 또는 언더플로우할 수 없으며, 단지 8개 스택 레지스터들의 순환 어레이 둘레를 랩핑(wrapping)할 뿐이다. 스택들이 유한한 깊이(finite depth)를 갖기 때문에, 스택의 최상부에 어떤 것을 푸싱한다는 것은 바닥에 있는 무언가가 중첩기입(overwritten)됨을 의미한다.
스택을 팝핑(popping)하는 때에, 바닥 8개 아이템들이 반복된다. 2개의 파라미터 스택 판독들 이후에, T 와 S는 8 스택 레지스터의 순환 어레이로부터 아이템 2개의 복사본을 가지게 될 것이다. 8개의 판독들 이후에, T 와 S는 동일한 값으로 다시한번 리로드될 것이다. 상기 아이템들을 복사해야만 하거나 또는 이들을 스택에 다시 기입하지 않고서도, 이들 8개의 아이템들이 스택으로부터 차례로 몇번이나 판독될 수 있는지에 대해서는 제한이 없다. 데이터 스택 상의 8, 4 혹은 2 셀들(또는 리턴 스택 상의 8, 4 혹은 2 셀들) 에서 반복하는 파라미터들의 세트를 순환하는 알고리즘들은, 스택으로부터 이들을 반복적으로 판독할 수 있는바, 이는 바닥 레지스터들이 단지 랩핑(wrapping)할 것이기 때문이다.
스택 '트릭'(Stack 'Tricks')
소프트웨어는 스택의 바닥에서 순환 버퍼의 이득을 여러가지 방법으로 취할 수 있다. 소프트웨어는 임의의 시간에서 스택이 비었다고(empty) 단순히 가정할 수 있다. 오래된 아이템들을 스택으로부터 클리어할 필요는 없는바, 이는 스택이 채워지게됨에 따라 이들 오래된 아이템들이 푸시 다운될 것이며 그리고 겹쳐-쓰기(over-written)될 것이기 때문이다.
예를 들어, 직렬 프로세서들 상의 ROM 코드에서, 시작 비트를 기다리는 루프(loop)에서 이것이 이용된다. 상기 코드는 IOCS 레지스터로부터 입력 비트를 판독하며 그리고 상기 비트가 참이 될 때까지 -IF 명령어를 이용하여 루프한다. -IF 명령어는 스택 상에서 최상위 아이템을 제거하지 않기 때문에, 루프는 새로운 값을 T에 매번 남긴다. 10개의 루프 이후에, 스택의 바닥에 있는 오래된 값들은 겹쳐쓰기되며 그리고 상기 루프에서 수천개의 값들이 스택에 놓여질 수도 있지만, 최상위에 있는 하나가 프로그램이 그 시점에서 관심있어 하는 오직 하나의 값이다. 루프를 빠져나올때, 그것은 마치 스택이 비어있는 것처럼 행동한다. 이러한 점을 루프를 더 짧고, 더 작고 그리고 더 빠르게 만들며, 그리고 루프 및 루프 엑시트 사이에서의 비트 테스트에서 발생하는 것보다 지터의 양을 감소시킨다. 이는 또한, 루프의 말미에서 비워진 스택(empty stack)을 얻기 위하여 스택 포인터를 리셋하는데 필요한 추가 코드를 요구하지 않음을 의미한다.
제3장. 프로세서간 통신(Interprocessor Communications)
방향성에 대한 이해(Understanding Directions)
SEAforth 칩 패밀리는 개별 CPU 코어들이 통신하는 것을 용이하게 만들기 위하여 플렉서블한 매커니즘을 이용한다. 특별한 포트들은 인접한 CPU들 간의 일종의 메일박스처럼 행동한다. 이들 레지스터들은 공통(common) 어드레스 상의 메모리 스페이스내로 맵핑된다. 이것이 어떻게 동작하는지를 이해하기 위해서는, 먼저, 방향을 나타내기 위해서 SEAforth에서 이용되는 용어를 명확히 이해하는 것이 도움이 될 것이다.
통상적으로, 북(North), 남(South), 동(East) 및 서(West)는 글로벌 방향으로 이용된다. '북쪽' 방향은 항상, 더 높은 인덱스 번호를 지닌 코어를 향한 것이다. 예컨대, 코어 N0에서 북쪽으로 향한다는 것은 코어 N6으로 향하는 것이다. 이와 유사하게, '동쪽' 방향은 더 높은 인덱스 번호를 갖는 코어로 향하는 것이다.
로컬 코어들은 '업' , '다운' , '오른편' , '왼편'을 이용하여 방향을 나타내지만, 이들은 북, 남, 동, 서 와 항상 맵핑되는 것은 아니다. 소프트웨어 및 하드웨어 효율성 때문에, 인접한 코어들이 통신을 위해서 공통 I/O 포트 어드레스를 공유하는 것이 바람직하다. 따라서, 개별 코어들은 도3에 도시된 바와같이, 공통으로 넘버링된 포트들(commonly-numbered port)을 공유하도록 배향된다. 로컬 방향들 및 이들의 포트 어드레스들이 테이블 3에 요약된다.
테이블 3. 프로세서간 포트들
예를 들어, 코어 N0와 코어 N6는, 어드레스 $115 또는 $145를 이용할 것인가를 찾아내야만 하는 것보다, 공통 포트 $115 상에서 통신하는 것이 바람직하다. 이러한 설계를 구현하기 위하여, 몇몇 코어들은 R/L 및/또는 U/D 가 반전된다. 도3에 도시된 바와같이, 옅은 노란색 코어들은 왼쪽과 오른쪽이 반전되어다. 따라서, 예를 들어, 코어 N18 및 N19는 포트 $1D5를 통해 통신한다. 다른 코어들, 밝은 청색 코어들은 업, 다운이 반전된다. N18은 포트 $115를 통해 N12와 통신한다. 몇몇 코어들은 상하 좌우 모두가 반전된다. 이들은 옅은 녹색 코어들이다.
도3. SEAforth 방향성 정의
프로세서간 판독 및 기입(Interprocessor Read and Write)
각각의 코어들은 그 이웃과 기상/수면(wake/sleep) 데이터 포트들을 4개까지 공유한다. 이웃들은 하나의 공통 데이터 포트를 공유한다. 일반적으로, 프로세서간 통신은 블로킹 및 셀프-동기화되는바, 즉, 동작이 완료될 때까지 프로세서는 수면할 것이다.
각각의 프로세서간 통신 포트들은 그 이웃에 직접 연결된다. 레지스터 혹은 FIFO가 없다. 한 포트의 판독 와이어들은 인접 포트의 기입 와이어들에 직접 연결된다. 프로세서가 판독하는 경우, 그것은 인접 프로세서가 기입할 때까지 블록한다. 이와 반대로, 프로세서가 기입는 경우, 그것은 인접 프로세서가 판독할 때까지 블록한다.
프로세서간 통신을 제공하는 것 이외에도, 이것은 2개의 CPU들을 또한 동기화시킨다. 판독 또는 기입 동작을 실행하기 전에 상태 비트들을 테스트함으로써, 원한다면 블로킹이 회피될 수도 있는데, 이것은 효율을 매우 많이 저하시킬 수 있으며, 그리고 포트 통신이 매우 낮은 중요도를 갖고 그리고 매우 드물게(infrequently) 수행되는 경우에만 이용되어야 한다.
포트를 통해 전송되는 정보는 데이터 또는 명령어가 될 수 있다. 상기 코어는, 점프하거나 또는 포트 어드레스 또는 다중-포트 어드레스를 호출함으로써, 메모리 맵핑된 데이터 포트로부터 명령어들을 직접 실행할 수 있는 능력을 갖는다.
다중 판독 및 기입(Multiple Reads and Writes)
프로세서간 통신 포트들이 I/O 스페이스에 위치하고 있기 때문에, 각각의 코어는 하나의 명령어를 이용하여, 하나, 둘, 셋 또는 네개 모두의 데이터 포트들을 판독(또는 기입)할 수 있는 능력을 갖는다. 상기 코어는 펜딩 판독들 또는 기입들 중 임의의 것이 만족되자마자 재-기상(re-awaken)할 것이다. 상기 재-기상된 코어가 다음 명령어로 진행함에 따라 다른 펜딩 판독들/기입들은 취소된다. 이러한 기술은 다중 프로세서들의 클러스터들 사이에서 데이터와 콘트롤을 분산시키는데 이용될 수 있다.
몇몇 응용예들에서, 프로세서는 4개의 포트들 모두로부터 판독을 수행할 것이며 그리고 필요할 때까지 수면할 것이다. 이는 매우 유용한 프로그래밍 기법이다. 그 하나의 예제가 아래에 도시된다. 하지만, 프로그래머는, 2개의 프로세서들이 동일한 공통 데이터 포트 상에 판독 또는 기입 모두를 동시에 수행하지 않도록 주의를 기울어야 한다. 2개의 프로세서들은 수면상태로 남아있을 것인바, 하드웨어 리셋 말고는 이들을 깨울 다른 매커니즘은 이용가능하지 않을 것이다.
만일, 프로세서가 여러개의 프로세서간 통신 포트들에 대한 판독을 동시에 수행한다면, 프로그래머는 그 이웃들 중 오직 하나만이 판독 요청을 실제적으로 만족시킨다는 것을 보장해야만 한다. 하나 이상의 이웃들로부터 기입들(writes)을 동시에 수신한다는 것은, 데이터 충돌(data collision)을 야기할 것인바, 이는 원하는 결과가 아니다.
다음의 코드 프레그먼트(fragment)는 다중-포트 판독에 대한 예제를 보여준다. 부트시에 대부분의 코어들은 기상하며 그리고 코드에 의해 초기화되기를 기다리면서 수면 상태로 진입한다. 이러한 일례에서, 노드 7(안쪽 노드)는 기상하며 그리고 4-way 판독을 수행하는바, 이는 이것이 수면 상태가 되게 한다.
프로세서간 통신을 위한 IO 포트 맵의 더 완벽한 버전이 테이블 4에 도시된다. 4개의 방향들은, 어드레스 버스의 싱글 비트에 의해서 각각 선택되는바, 이는 상기 테이블 4의 컬럼 3에 도시된다. 다중 비트를 셋팅하는 것은 판독 또는 기입을 위해서 다중 포트들을 선택한다.
테이블 4. 프로세서간 통신 포트들-멀티-포트 어드레스 맵
원하는 비트들을 세팅하고, 그리고 $155로 exclusive-or를 수행하여 이진 값들을 만들어냄으로써, 임의의 조합에 대한 포트 어드레스가 계산될 수 있다. 따라서, $090을 $155로 exclusive-or 하면, $1C5가 나온다(exclusive-or 단계에 대한 이유는 어펜딕스2에 설명된다).
만일 프로세서가 판독한다면, 이것은, 조합된 판독(또는 기입)에 의해 타겟팅된 요청된 포트들 중 임의의 것에 데이터가 기입될 때까지 수면상태(asleep)로 남는다. 그 시점에서 포스팅된 모든 판독(또는 기입) 요청들은, 완료될 제 1 단일 기입(first single write)(또는 제 1 단일 판독)에 의해서 클리어될 것이다.
제4장. 메모리와 I/O
메모리와 I/O에 대한 개관
SEAforth 패밀리에서 외부 메모리와 IO를 처리함에 있어서, 실제적인 차이점은 없다. 디바이스의 모서리 인근의 프로세서 코어들은 외부 세계와 통신하기 위하여 그들의 IO 로직의 일부를 이용하지만, 중앙에 있는 코어들은 그러하지 않다(일반적으로). 메모리는, 특히 I/O 포트의 쌍으로 간주되는바, 하나는 어드레스에 관한 것이고 두번째는 메모리 로/로부터의 데이터에 관한 것이다.
코어들에 대한 I/O 할당(Assignments of I/O to Cores)
아래에 설명되는 바와같이, 많은 코어들이 소정의 I/O 기능들에 연결된다. 디바이스의 모든 모서리 코어들 또는 코너 코어들은 그 자신만의 속성들을 갖는다. 각각의 코어는 I/O 핀들의 특정 세트에 대한 배타적인 액세스를 제공한다. 예를 들어, SPI 인터페이스들은 4개의 I/O 핀들을 갖는 노드들에 제공된다. 아날로그 입력 및 출력은 N18 및N23을 통해 액세스 된다.
테이블 5. I/O 리소스
SPI 플래쉬 부트(SPI Flash Boot)
코어 N5는 부트 목적으로 직렬 플래시를 지원한다. 이것은 직렬 주변장치 인터페이스(Serial Peripheral Interface : SPI)를 구현하는 4개의 핀을 갖는다. ROM 코드는 직렬 메모리 플래시 디바이스로부터 선택적으로 부팅할 수 있는 능력을 제공한다. 일반적으로, 상기 디바이스는 여기에 연결된 플래시로부터 부팅을 시도할 것이다. N5의 SPI Data-In 핀 상의 고전압이 디폴트 부팅을 방지할 것이다.
전형적으로, 이러한 인터페이스는, 직렬 EEPROM 또는 플래시 디바이스와 같은 부트 디바이스와 통신할 것이다. 선택적으로, SPI 인터페이스는 소형의 저렴한 직렬 디바이스로부터 부팅을 허용하도록 250Kbps로 클록킹하여, 칩을 부팅할 것이다. 부팅 이후에, 인터페이스 상의 타이밍은 ~20Mbps까지의 속도로 클록킹될 수 있다. 부팅 이후에 RAM-기반의 코드가 다른 SPI 기능들을 지원할 수 있다.
외부 메모리(External Memory)
코어 N0는 플래시, SRAM 또는 유사한 디바이스들로의 메모리 확장을 제공하기 위해서, 외부 메모리와 인터페이스한다.N0는, 외부 메모리와 다른 프로세서들 간의 메모리 액세스들을 라우팅하도록 프로그래밍될 수 있다.
어드레스 버스는 18비트를 가지며, 그리고 메모리를 18-비트 워드로 간주한다. 3개의 메모리 제어 핀이 포함된다. 고속 18-비트 SRAM 디바이스들을 지원하는 ROM의 소프트웨어가 제공된다. ROM 소프트웨어는, 프로세서 N0 상의 메모리 서버에 대한 입력 및 출력 지원을 위해서 프로세서 N1 및 N6를 이용한다. N0로의 입력은 N6 상에서 버퍼링되며, 그리고 출력은 N1을 통한다. N1 및 N6는, N0의 외부 RAM 서버를 지원하는데 이용되는 경우에는 핀을 필요로 하지 않는다. 어드레스 라인들은 기입-온리(write-only)이다. 데이터 버스는 IO 레지스터 내의 비트 12를 통해 삼상(tri-stated)이 될 수도 있다.
소프트웨어는 외부 어드레스 버스, 외부 데이터 버스 및 제어 핀들이 이용되는 방식을 결정한다. 이러한 외부 인터페이스에 연결된 상기 디바이스는 SRAM, DRAM, 병렬 버스 EEPROM 또는 플래시가 될 수 있다. 실제의 버스 타이밍 및 기능들은 소프트웨어에 의해 제어된다. DDR2와 같은 복잡한 메모리 버스들은 원하는대로 코딩된다.
만일, 상기 인터페이스가 외부 메모리로서 이용되지 않는다면, 외부 어드레스, 데이터 및 제어 버스 핀들은 범용 I/O로 이용될 수 있다.
아날로그 IO
코어 N18과 N23은 아날로그-디지털 및 디지털-아날로그 변환 디바이스로서 행동하며 그리고 아날로그 입력 핀과 아날로그 출력 핀을 갖는다. 그 외에도 각각의 코어는, 4로 나뉘어진 그것의 전압 제어 발진기(VCO)의 디지털 출력을 위한 핀을 갖는다. 소프트웨어가 변환율(conversion rate)과 해상도를 제어한다.
아날로그 입력 핀 상의 전압은 전압 제어 발진기를 구동하며, VCO는 카운터를 구동한다. zero 볼트들이 약 2GHz에서 카운터를 구동하며 그리고 약 1GHz에서 1.4 볼트가 카운터를 구동한다. 레지스터 $171로부터 하위 비트들(lower bits)을 판독함으로써, 아날로그-디지털 변환이 수행된다. 아날로그 입력의 값에 대응하는 것은 VCO의 카운터 출력이다. 이것은 반전된 패턴이며, 값을 얻기 위해서는 $15555로 exclusive-or 되어야 한다. 차이 판독(difference reading)을 얻기 위하여 2개의 숫자 값들이 뺄셈될 수 있다. 차이 계산(difference calculation) 및 임의의 선형화(linearization)가 이웃 프로세서에 의해서 최대 속도로 수행될 수도 있다. 알려진 시간 주기에 대한 2개의 카운트 값들의 차이는, VCO 출력 커브 상의 일 지점을 나타낸다.
IOCS 레지스터의 하위 비트들에 9-비트 값을 기입함으로써, 디지털-아날로그 변환이 수행된다. IOCS 레지스터에 비트들 15, 14, 및 13을 기입하는 것은, 전압 제어 발진기를 턴온 또는 턴오프하게 하며, 그리고 주파수 함수(frequency function)에 대한 VCO 전압을 결정하는 P 트랜지스터 및 N 트랜지스터를 제어한다.
테이블 6. ADC 및 DAC 동작을 위한 제어 비트들
직렬 I/O(Serial I/O)
몇몇 코어들은 2개의 IO 핀들을 가지며 그리고 콘솔, 직렬 I/O 디바이스 또는 또 다른 SEAforth-24A 디바이스를 연결하기 위한 비동기 직렬 인터페이스(UART)와 같은 기능들을 구현할 수 있다. 특히, N3, N12, N17 및 N21 상의 ROM 코드는 그들의 비동기 직렬 포트를 통해 부팅할 수 있다. N3 및 N21 상의 I/O 핀들 그리고 N12 및 N17 상의 I/O 핀들은 집적회로(IC)의 반대되는 사이드에서 정렬되는바, 따라서 한 프로세서의 직렬 출력 핀이 다른 프로세서의 직렬 입력 핀과 정렬될 수 있으므로, 연결 거리를 최소화할 수 있다.
직렬 인터페이스는 SEAforth-24A 디바이스가 PC, 콘솔, 직렬 I/O 디바이스, 또는 또 다른 SEAforth-24A 디바이스와 통신하는 것을 허용한다. 더 강력한 프로세싱 파워를 위해서, 이러한 직렬 인터페이스를 이용하여 다수의 SEAforth-24A 디바이스들이 함께 연결될 수 있다. SEAforth-24A는, 임의의 ROM 기반의 직렬 인터페이스로부터 부팅될 수 있으므로, 함께 연결된 다수의 SEAforth-24A들은 모든 SEAforth-24A 디바이스를 부팅시키기 위하여 SPI 인터페이스를 이용할 필요가 없을 수도 있다.
N3, N12, N17, 및 N21의 ROM 코드는, 비동기 직렬 인터페이스들 중 하나의 인커밍 시작 비트에 의해서, 상기 프로세서가 수면에서 깨어나게 한다.
GPIO
코어 N2, N4, N11, N19, N20, N21 및 N22는 GPIO를 위한 하나의 양-방향성(bi-directional) 핀을 갖는다.
대부분의 코어들은 어드레스들로부터의 판독들을 통해서 수면에서 깨어날 수 있는바, 이는 사용되지 않는 com 포트를 IO의 비트-17에서 입력 핀 판독 상의 하이(high)에 의해서 선택하기 위함이다. 상기 코어들은 N2, N3, N4, N5, N11, N12, N17, N18, N19, N20, N21, N22 및 N23 이다.
이러한 프로세서들 상에서, 핀으로부터의 입력은 핸드세이크(handshake) 회로에 연결되는바, 이는 이웃을 갖지않는 포트에 존재한다. 이들 핀들 중 하나에서의 하이(high)는, 이웃에 연결되지 않은 포트를 포함하는 포트 판독 상에서 프로세서가 수면 모드로 진행하였다면, 상기 프로세서를 수면에서 깨운다. ROM은 노드들이 그들의 입력 핀에서 고전압을 보게되는 때에, 비동기 직렬 모드로 기상시키는 노드들 상의 상기 피처를 이용한다. 기상시킨 다음에, 이들 노드들 상의 상기 ROM은, 이웃의 작업 요청에 의해서 상기 노드가 기상했는가 또는 웨이크-업(wake-up) 입력 핀을 판독함으로써 상기 노드가 기상했는가를 판별한다. 핀 상의 고전압은 상기 노드가 직렬 입력에 의해서 기상했음을 보여준다. 이후, ROM 코드는 보드 레이트(baud rate)를 결정하기 위해서 타이밍 비트의 시간을 조절하며 그리고 비동기 직렬 입력으로부터 부팅을 진행한다. ROM 코드 내의 웨이크업(wakeup)에서 핀에 낮은 전압이 있다는 것은, 이것이 이웃에 의해서 깨워졌다는 것을 의미하며 그리고 프로세서는 기입되었던 공유 통신 포트들 각각을 실행한다.
제5장. I/O 레지스터 세부 설명(I/O Register Detail Description)
각각의 코어 프로세서는 정확히 하나의 I/O 상태 & 핀 제어 레지스터를 갖는바, 이는 $15D 위치에서 어드레스된다. 상기 레지스터는 2가지 기능을 수행한다. 이것은 모든 코어들에게 그들의 공유 기상/수면(wake/sleep) 통신 포트 레지스터의 현재 상태를 제공한다. I/O 핀에 와이어된 이들 코어들의 경우, 이것은 설정 및 판독 또는 기입 핀의 방법을 제공한다.
코어 N0는 다른 코어들이 갖고 있지 않은 2개의 레지스터를 갖는다. 이들은 포트 어드레스 $171에서 메모리 어드레스 레지스터이며 그리고 포트 어드레스 $141에서 데이터 어드레스이다.
테이블 7. IO 레지스터 비트 할당에서 이용되는 약어
테이블 8은 '일반적인(generic)' 코어 I/O 레지스터를 예시한다. 코어는 최대 4개까지의 프로세서간 통신 레지스터 상태 비트들을 가질 수 있으며, 이것은 외부 세계와의 '실제(real)' I/O를 가질 수 있다. 전형적으로, 모든 코어들이 모든 옵션을 갖는 것은 아니다. 특히, 모서리 상의 코어들은 모든 프로세서간 통신 레지스터 상태 비트들을 이용하지 않는다. 이와 유사하게, 중앙의 코어들은 I/O를 갖지 않는다.
다음 페이지들에서 후술되는 개별 레지스터들에 대한 설명에서, 포트 어드레스 값들(예를 들면, 1D5)은 그 포트가 연결되는 코어의 이름으로 대체된다. 예를 들면, 코어 N0에서, 상기 1D5 포트는 N1에 연결되며, 따라서 비트 위치들 16 및 15는 각각 Rd N1 및 Wr N1으로 명명된다. RR 은 Read Register 이고, WR 은 Write Register 이다.
테이블 8. 전형적인 코어 I/O 레지스터에 대한 개관
후술될 레지스터 설명들에 있어서, 다른 출력 핀들의 상태를 제어하는 출력 비트들의 쌍들이 존재한다. 모든 경우에 있어서, 비트들의 기능은 테이블 9에 도시된 바와 같다.
테이블 9. IO 핀 구성 제어 비트들
테이블 34. 코어 N0 메모리 어드레스 레지스터 $171
메모리 어드레스 레지스터는 기입-전용(write-only)이다. 판독들(reads)은 랜덤한 결과를 생성한다. 상기 레지스터에 기입하는 것은 블록킹되지 않는다. 두번째 기입은, 이들 신호들에 연결된 외부 로직의 행동에 상관없이, 이전 값을 겹쳐쓰기 할 것이다.
테이블 35. 코어 N0 메모리 데이터 레지스터 $141
데이터 레지스터는 판독/기입용 이다. 이 레지스터에 대한 판독들 및 기입들은 블록킹되지 않는다. 두번째 기입은, 이들 신호들에 연결된 외부 로직의 행동에 상관없이, 이전 값을 겹쳐쓰기 할 것이다.
제6장. 프로세서 옵코드 설명(Processor Opcode description)
옵코드 팩킹(Opcode Packing)
C18 프로세서는 옵코드를 정의하기 위해서 5 비트를 이용한다. 18-비트 명령어 워드는 4개의 명령어 슬롯들을 포함한다. 모든 명령어들은 3개의 가장 왼쪽(leftmost) 슬롯들인 슬롯0, 슬롯1, 슬롯2 로부터 실행할 수 있다. 슬롯3는 특별하다. 이것은 오직 3비트만으로 구성되며 그리고 하위(low order) 2비트가 이진 00인 이들 명령어들만을 포함하는 것이 보통이다.
IF 와 NEXT Testing
IF 또는 NEXT 명령어는 레지스터 T 또는 R 각각이 0(zero)을 포함하고 있는지를 신속히 결정해야만 한다. 이러한 결정은, T 또는 R을 변경하는 임의의 명령어에 대한 실행의 일부로서 자동적으로 수행된다. IF 또는 NEXT가 실행을 개시하는 때에, 이들은 래치된 테스트 결과를 이용하여 다음 명령어의 적절한 어드레스를 선택하는바, 이는 제 때에 페치를 즉각 개시하기 위함이다.
옵코드당 클럭 싸이클들(Clock Cycles per Opcode)
대부분의 옵코드들은 하나의 클럭 싸이클에서 실행되지만, 몇몇은 시간이 더 걸린다.
● IO 레지스터에 액세스하는 것은 2 싸이클이 소요된다.
● 그 이웃 노드가 이미 대기하고 있는 핸드세이크 포트에 액세스하는 공칭 시간(nominal time)은 2 싸이클이다.
ROM 또는 RAM에 액세스하는 시간은 3 싸이클이다.
ALU-기반 명령어들에 대한 타이밍(Timing for ALU-based Instruction)
도2에 도시된 바와같이, ALU는 T 및 S 레지스터로부터 공급받으며 그리고 그 결과를 T 레지스터에 리턴한다. 상기 ALU는 순수하게 조합적이다(purely combinatorial). ALU를 통과하는 몇몇 로직 경로들은 다른 경로들에 비해 더 길다. 특히, 가산 명령어들(플러스 및 플러스-스타)(Plus and Plus-star)은 캐리 비트가 전달(propagation)되는 시간을 필요로 한다. ALU는 이것이 발생하기 위해서는 2개의 명령어 주기들을 요구한다. 이는 다음과 같은 중요성을 갖는다.
스택-영향(stack-affecting) 명령어 직후에 가산(add)이 후속된다면, 적당한 전달(propagation) 시간을 확보하기 위해서 NOP 이 삽입되어야만 하는바, 예를 들면, POP, NOP, PLUS 과 같다.
T 및 S 레지스터가 적어도 하나의 명령어에 대해서 안정적(stable)이었다면, NOP 이 필요치 않다. T 또는 S에 영향을 주지 않는 명령어들, 따라서 가산(add) 명령어의 전달 시간에 '도움'을 줄 수 있는 명령어들은 "Aid +" 로 호칭되는바, 이는 Plus 의 실행시간에 도움을 주기 때문이다. 이러한 것을 수행하는 명령어들은, "Aid +" 컬럼에서 "yes" 라고 도시된다.
분기 명령(Branch Instruction)
분기 옵코드는 CALL, JUMP, IF, -IF, 및 NEXT(micro-next는 아님) 이다.
슬롯0 으로부터 분기가 실행되는 경우, PC는 13-비트 명령어 어드레스 필드로부터의 모든 9 LSB의 증분된 값으로 업데이트된다.
분기 옵코드가 슬롯1 또는 2에 있을 때마다, 프로그램 카운터의 비트 8(9번째 비트)은 강제로 0이 될 것이다. 따라서, 슬롯1 및 2 분기들은 I/O 스페이스에 도달할 수 없다(또는 남아있을 수 없다). 이들은 RAM 또는 ROM 목적지(destination)로 제한된다.
분기가 슬롯1에 있는 경우, 어드레스의 하위 8 비트들은 어드레스 필드로부터 온다. 따라서, 이들은 분기 명령이 실행되는 때에, PC와 동일한 256-워드 페이지 상의 어드레스들을 판독할수만 있다. 비트 8은 제로이다.
분기가 슬롯2에 있는 경우, 어드레스의 0에서 2까지의 비트들(하위 3 비트들)은 어드레스 필드로부터 온다. 3에서 7까지의 비트들은 방금-증분된 프로그램 카운터(just-incremented PC)로부터 온다. 비트 8은 제로이다. 따라서, 슬롯2 분기는 동일한 8-워드 페이지 상에 남아있는다.
어드레스 증분 규칙들(Address Increment Rules)
명령어들이 실행되는 동안에는, 많은 경우의 어드레스-증분이 존재한다. 이들은 PC를 증분시키는 통상적인 명령어 페치(fetch)를 포함하며, 뿐만 아니라 리터럴 페치(literal fetch), "리터럴 스토어(literal store)" 그리고 A-레지스터 페치 및 증분이 있는 스토어(store)도 포함한다. 어드레스 증분 기능에 구비된 특별한 로직이 존재하는바, 이는 모든 사용 케이스들(usage case)에 영향을 미친다. 내부 어드레스 버스가 단지 9 비트 폭이므로, 증분은 임의 레지스터의 하위 9 비트들에게만 영향을 미친다. PC는 이미 9비트로 제한되어 있다. 따라서 이러한 제한은 오직 A 레지스터에게만 유효하다.
어드레스가 ROM 또는 RAM 어드레스 스페이스들 중 어느 하나를 선택할 때마다 제 1 특별 케이스가 발생한다. 증분 동안에, 캐리(carry)는 오직 하위 7비트 내에서만 전달된다. 상기 어드레스 스페이스의 모든 128 워드 바운더리들에서, 상기 증분된 어드레스는 페이지의 시작부분으로 다시 되돌아갈 것이다(wrap back to the begining of the page). 상기 메모리가 어드레스 비트 6을 디코드하지 않으므로, 각각의 64 워드 바운더리에서 유효한 랩(wrap)이 존재한다.
제 2 특별 케이스는 어드레스가 내부 I/O 레지스터 스페이스를 선택할 때마다 발생한다. 이러한 영역에서의 어드레스-증분은 전체적으로 억제된다. 이는, 포트 스페이스로부터 실행하는 때에, PC의 값에 영향을 미치지 않고서, 명령어 페치, 리터럴 페치, 및 "리터럴 스토어"가 이용될 수 있음을 의미한다. 포트로부터의 콜(call)은 다시 포트로 리턴할 것이다.
테이블 36. SEAforth 명령어 세트의 요약
CALL Opcode
R을 리턴 스택으로 푸시하고 그리고 R의 하위 9 비트 내에 현재 PC를 위치시킨다. 라벨의(label's) 어드레스로부터 다음 명령어 워드를 페치한다. "증분된" 어드레스가 PC 내에 로드된다.
RETURN Opcode
R의 하위 9 비트에 의해 주어지는 어드레스로부터 다음 명령어 워드를 페치한다. R의 모든 18 비트들을 다음 값 다운(next value down)으로 대체하여 리턴 스택을 팝(pop) 한다. "증분된" 어드레스가 PC 내에 로드된다. RWETURN을 포함하고 있는 명령어 워드내의 임의의 비사용 슬롯들은 스킵되며 그리고 새로운 명령어 워드의 슬롯0으로부터 실행이 재개된다.
JUMP Opcode
라벨의 어드레스로부터 다음 명령어 워드를 페치한다. "증분된" 어드레스가 PC 내에 로드된다.
COROUTINE Opcode
R의 하위 9 비트 내의 어드레스로부터 다음 명령어 워드를 페치한다. R의 하위 9 비트 내에 현재 PC를 로드한다. 증분된 어드레스는 PC 내에 로드된다. COROUTINE 을 포함하고 있는 워드내의 임의의 비사용 슬롯들은 스킵되며 그리고 새로운 명령어 워드의 슬롯0에서 실행이 재개된다. 다음 명령어 워드를 페치하고 그리고 새로운 PC를 증분하기 전에 PC가 R의 하위 9 비트로 스왑된 것과 그 효과가 동일하다. 상기 옵코드의 이용은 계산된(claculated) 또는 벡터화된(vectored) call 또는 jump 로서 간주될 수 있으며 또는 coroutine 으로서 간주될 수 있다. 즉, 2개의 함수들이 다른 하나의 마지막 exit/call 포인트에서 각각 call/continue 실행할 수 있다. 이는, 또한 프리미티브 태스크 스위치(primitive task switch)로 간주될 수 있다.
IF Opcode
만일, T 레지스터가 제로라면, 분기 어드레스 필드로부터 다음 명령어 워드의 어드레스가 계산된다. 그렇지 않다면, 현재 PC 어드레스가 이용된다. 다음 명령어 워드는 상기 어드레스로부터 페치된다. "증분된" 어드레스가 PC 내에 로드된다.
T 레지스터가 비-제로(non-zero)인 때에, if 와 then mnemonic 사이에 존재하는 코드가 실행된다. T 레지스터가 제로인 경우, 프로그램 콘트롤은 then mnemonic 에 후속하는 명령어에 벡터화된다(vector)(if 와 then mnemonic 사이의 그 어떤 명령어들도 실행되지 않는다). 또한, IF 옵코드는 UNTIL 에 의해 컴파일 될 수도 있다. 이 경우, 프로그램은 T가 제로라면 뒤쪽으로(backward) 분기할 것이며 그렇지 않다면 루프를 빠져나갈 것이다.
노트: IF는 옵코드를 컴파일하며 그리고 ELSE 와 THEN은 분기의 어드레스를 분석하며 그리고 컴파일된 분기 옵코드의 어드레스 필드를 채운다. UNTIL은 IF 옵코드를 컴파일하며 그리고 이전의 BEGIN에 의해 컴파일러의 스택에 남아있는 어드레스를 이용하여 분기 어드레스를 분석한다.
MINUS IF Opcode
만일, T의 최상위 비트(MSB)가 제로라면, 다음 명령어 워드의 어드레스가 분기 어드레스 필드로부터 계산된다. 그렇지 않다면, 현재 PC 어드레스가 이용된다. 다음 명령어 워드가 상기 어드레스로부터 페치된다. "증분된" 어드레스가 PC 내로 로드된다.
T 레지스터의 최상위 비트(highest order bit)가 세팅되는 때에, -if 와 then mnemonic 사이에 존재하는 코드가 실행된다. 상기 최상위 비트가 리셋되는 때에, 프로그램 콘트롤은 then mnemonic 에 후속하는 명령어에 벡터화된다(-if 와 then mnemonic 사이의 그 어떤 명령어도 실행되지 않는다). 또한, Minus IF는 -until에 의해 컴파일될 수 있다.
노트: -IF는 옵코드를 컴파일하며 그리고 ELSE 와 THEN은 분기의 어드레스를 분석하며 그리고 컴파일된 분기 옵코드의 어드레스 필드를 채운다. -UNTIL은 -IF 옵코드를 컴파일하며 그리고 이전의 BEGIN에 의해 컴파일러의 스택에 남아있는 어드레스를 이용하여 분기 어드레스를 분석한다.
NEXT Opcode
만일, R 레지스터가 제로가 아니라면, 다음 명령어 워드의 어드레스가 분기 어드레스 필드로부터 계산되며, 그렇지 않다면, 현재 PC 어드레스가 이용된다. 다음 명령어 워드는 이 어드레스로부터 페치된다. "증분된" 어드레스가 PC 내에 로드된다. R이 제로가 아니었던 경우, 모든 18 비트들이 감소되며(decrement) 그리고 새로운 값이 R 내에 로드된다. 실행 초기에 R이 제로인 경우, 리턴 스택은 팝(pop) 되며 그리고 R은 다음 아이템 다운(next item down)으로 대체된다.
R 내의 현재 숫자는 NEXT가 루프의 탑(top)으로 분기할 수 있는 잔여 횟수를 나타내거나 또는 루프 보디(loop body)가 실행될 횟수보다 하나 적은 수를 나타낸다. 루프 카운트는, 루프 바깥의 FOR 또는 명시적인(explicit) PUSH 옵코드에 의해서 리턴 스택으로 푸시되었다고 가정하였다.
루프 카운트는 루프 바깥의 리턴 스택 상으로 푸시되어야함을 기억하라. 하지만, 이것은 루프가 완료되는 때에 자동적으로 제거될 것이다. 또한, 다음(next)을 실행하는 동안에 루프 카운트가 항상 올바른 위치에 있도록, 다음 루프 내의 리턴 스택의 임의의 다른 용도를 균형잡아야 한다는 점을 유의해야 한다.
UNEXT Opcode
마이크로-넥스트(micro-next)로 발음되는 UNEXT 는, 어드레스 필드를 포함하고 있지 않다. R이 제로가 아닌 경우에, 마이크로-넥스트는 다른 명령어 워드를 페치하지 않을 것이지만, 슬롯0에서 시작하는 현재 캐시된 워드에 대한 실행은 계속할 것이다. R이 제로에 도달한 때, 마이크로-넥스트는 그 시점에서 PC가 가리키는 곳으로부터 다음 명령어를 페치할 것이다. 이것은 명령어 페치를 수행할 필요가 없기 때문에, 4개의 고속 명령어 루프를 허용한다. 오직 하나의 클럭만이 이용되어 상기 루프를 반복한다.
만일, 루프가 완료되는 때에 포트 어드레스의 슬롯3으로부터 UNEXT가 실행된다면, 이것은 동일 포트로부터 다음 명령어를 페치할 것인바, 이는 어드레스 증분 규칙이 포트 어드레스가 변화되는 것을 금지하기 때문이다. 만일, 상기 포트의 이웃이 새로운 명령어 워드를 아직 기입하지 않았다면, 프로세서는 이웃이 그것을 기입할 때까지 중지될 것이다. 만일, 상기 이웃이 마이크로-넥스트에 후속하여 옵코드를 이미 기입하였다면, 상기 프로세서는 그 옵코드를 로드 및 실행할 것이며, 상기 이웃은 재개할 것이다.
루프 카운트는 루프 바깥의 리턴 스택 상으로 푸시되어야함을 기억하라. 하지만, 이것은 루프가 완료되는 때에 자동적으로 제거될 것이다. 또한, 다음(next)을 실행하는 동안에 루프 카운트가 항상 올바른 위치에 있도록, 다음 루프 내의 리턴 스택의 임의의 다른 용도를 균형잡아야 한다는 점을 유의해야 한다.
LITERAL Opcode
현재 PC 어드레스로부터 프로그램 메모리의 다음 워드를 페치한다. 18-비트 값이 데이터 스택 상에 푸시된다. "증분된" 어드레스가 PC 내에 로드된다.
컴파일러가 소스 코드에서 리터럴 넘버 또는 등호(equate symbol)와 조우하는 경우, 이것은 필요하다면 새로운 명령어 워드를 개시하는 이용가능한 다음 슬롯 내에 @p+ 옵코드를 자동적으로 컴파일하며 그리고 프로그램 메모리의 이용가능한 다음 워드 내에 리터럴 값을 저장한다. 이것은 암시적인(implicit) 리터럴 컴파일이라고 호칭된다. 만일, 누군가가 이름에 의해서 리터럴 페치 옵코드를 명시적으로 컴파일한다면, @p+ 가 실행되는 때에 현재의 PC 값에 의해서 페치되게 하기 위하여, 프로그램 메모리 내의 올바른 후속 위치에 리터럴 값을 위치시키는 것은, 프로그래머의 책임이다. 상기 리터럴 값은 ,(comma)와 함께 위치된 계산된 숫자가 될 수도 있으며, 또는 포트 스토어를 통해 또 다른 프로세서에게로 전달되도록 의도된 다른 명령어 워드일 수도 있다. 이 기법을 이용하는 경우, 슬롯 번호들과 명령어 워드 바운더리들이 적절히 카운트되는 것을 보장하도록 각별한 주의가 요구된다.
PUSH Opcode
데이터 스택의 최상부의 엘리먼트가 상기 스택으로부터 팝(pop) 되며 그리고 리턴 스택 상으로 푸시된다.
POP Opcode
리턴 스택의 최상부의 엘리먼트가 상기 스택으로부터 팝(pop) 되며, 그리고 데이터 스택 상으로 푸시된다.
DUP Opcode
데이터 스택(T 레지스터)의 최상부의 엘리먼트가 복사되며(replicated) 그리고 다시 데이터 스택으로 푸시된다. 이후 S 레지스터와 T 레지스터는 동일한 값을 포함할 것이다.
DROP Opcode
팝(pop) 동작이 데이터 스택 상에서 수행되며 그리고 상기 데이터 스택(T 레지스터)의 최상부로부터 제거된 엘리먼트가 폐기(discard) 된다.
OVER Opcode
데이터 스택(S 레지스터)의 두번째 엘리먼트가 복사되며 그리고 상기 스택 상으로 푸시된다.
B STORE Opcode
데이터 스택으로부터 팝된 숫자로 9-비트 B 레지스터가 로드된다.
A STORE Opcode
데이터 스택으로부터 팝된 숫자로 18-비트 A 레지스터가 로드된다.
A FETCH Opcode
18-비트 A 레지스터의 내용들이 데이터 스택 상으로 푸시된다. A 레지스터는 수정되지 않고 남아있는다.
STORE B Opcode
엘리먼트가 데이터 스택으로부터 팝되며 그리고 B 레지스터에 의해 특정되는 위치에 기입된다. B 레지스터는 변화되지 않고 남아있는다.
STORE A Opcode
엘리먼트가 데이터 스택으로부터 팝되며 그리고 A 레지스터에 의해 특정되는 위치에 기입된다. A 레지스터는 변화되지 않고 남아있는다.
STORE P+ Opcode
엘리먼트가 데이터 스택으로부터 팝되며 그리고 프로그램 카운터에 의해 특정되는 위치에 기입된다. 어드레스가 레지스터 스페이스에 없었다면, 프로그램 카운터는 증분될 것이다.
STORE A+ Opcode
엘리먼트가 데이터 스택으로부터 팝되며 그리고 A 레지스터에 의해 특정되는 위치에 기입된다. 어드레스가 레지스터 스페이스에 없다면, A 레지스터는 증분된다.
FETCH B Opcode
B 레지스터에 의해 특정된 위치의 내용들이 판독되며 그리고 데이터 스택 상에 푸시된다. 상기 B 레지스터는 변화되지 않는다.
FETCH A Opcode
A 레지스터에 의해 특정된 위치의 내용들이 판독되며 그리고 데이터 스택 상에 푸시된다. 상기 A 레지스터는 변화되지 않는다.
FETCH A+ Opcode
A 레지스터에 의해 특정된 위치의 내용들이 판독되며 그리고 데이터 스택 상에 푸시된다. 어드레스가 레지스터 스페이스에 없다면, A 레지스터는 증분된다.
AND Opcode
데이터 스택(T 레지스터 및 S 레지스터)의 최상위 2개의 값들이 데이터 스택으로부터 팝 되며, 논리적으로 AND 되며, 그 결과는 상기 스택으로 다시 푸시된다.
XOR Opcode
데이터 스택(T 레지스터 및 S 레지스터)의 최상위 2개의 값들이 데이터 스택으로부터 팝 되며, 논리적으로 XOR 되며, 그 결과는 상기 스택으로 다시 푸시된다.
NOT Opcode
데이터 스택(T 레지스터)의 최상위 값이 보수화된다(complemented).
RSHIFT Opcode
상기 명령은 니모닉(mnemonic) 다음의 '투 슬래시(two slash)" 라고 종종 지칭된다. 데이터 스택(T 레지스터)의 최상위 값이 오른쪽으로 1비트 위치만큼 시프트된다. 최상위 비트는 변화되지 않는다.
LSHIFT Opcode
상기 명령은 니모닉(mnemonic) 다음의 '투 스타(two star)" 라고 종종 지칭된다. 데이터 스택(T 레지스터)의 최상위 값이 왼쪽으로 1비트 위치만큼 시프트된다. 하위 비트 위치로 제로가 시프트된다.
NOP Opcode
시간을 벌기(buy) 위해서 또는 명령어 슬롯을 채우기 위해서 "no op" 옵코드가 이용된다.
PLUS Opcode
S 와 T의 산술 합계가 T로 로드되며, 그리고 S 아래의 데이터 스택으로부터 팝업된 다음 값으로 S 가 로드된다. 상기 옵코드는 또한 가산(add)으로 호칭된다.
내부 캐리가 데이터 워드의 대략 절반 길이를 통과하는데에는 하나의 명령어 클록만으로도 충분하다. 몇몇 경우들에서, 상기 캐리는 더욱 양호하게 행동할 수 있지만, 이들 경우들은 스택의 2개의 숫자들의 상대적인 위치에 관련되는바, 이들이 어디로부터 오는지 그리고 이들을 거기에 위치시키는데 어떤 명령어들이 사용되었는지에 관련된다. 임의의 최적 케이스들을 시도 및 예측할만한 가치는 없다. 일반적으로, 매우 적은 수의 비트들을 가진 숫자들만이 하나의 클럭에서 임의의 확실성을 갖게 가산될 수 있다.
S 와 T의 값들은 PLUS 이외의 명령어들을 실행하는 동안에 ALU에서 이용가능하다. S 및 T가 변화하지 않을 때마다, 상기 ALU는 합산 계산을 완료하기 위한 여분의 시간을 갖는다. PLUS는 마지막에 어떤 ALU 출력이 T 내에 래치되는지를 선택한다. 본 문서에서, S 또는 T를 변화시키지 않는 명령어들(예컨대, NOP)은, Aids + 컬럼에서 속성 yes 를 갖는 것으로 도시되었다. 이들 명령어들 중 임의의 하나보다 선행하는 PLUS(또는 PLUS STAR)는, 임의의 입력 조합에 대해서 올바른 18 비트 결과를 보장할 것이다.
만일, PLUS(또는 PLUS STAR)가 명령어 프리페치에 의해 스트레치된 슬롯3 위치에서 실행한다거나 또는 "슬롯4 페치"에 의해 선행되는 슬롯0 위치에서 실행한다면, 어떤 명시적 명령어가 상기 PLUS(또는 PLUS STAR)를 선행하는지에 상관없이, 올바른 결과를 생성하는데에는 충분한 시간이 경과할 것이다.
PLUS STAR Opcode
PLUS STAR는 2개의 숫자들을 곱하는데 이용되며, 그리고 일련의 부분적들(partial products)을 계산함으로써 작용한다.
PLUS STAR 명령어는, T 레지스터의 최하위 비트(LSB)가 승수(multiplier)를 포함하고 있다고 가정하며 그리고 S 레지스터의 최상위 비트(MSB)가 피승수(multiplicand)를 포함하고 있다고 가정하며, 그리고 이들 2개의 비트 필드들이 중첩되지 않는다고 가정한다. T 및 S 레지스터의 부분들은 길이상으로 다를 수 있지만, T 및 S에서 이용되는 비트들의 합계는 18 비트 또는 그 이하이어야 한다.
승수(multiplier)(T)는 부호가 없는 숫자(unsigned number) 처럼 취급된다. S 는 부호가 있는 숫자(signed number) 처럼 취급된다.
PLUS STAR가 실행되는 경우, 만일, T 레지스터의 최하위 비트가 제로라면, TT 레지스터는 단순히 오른쪽으로 1비트 위치만큼 시프트되며, 부호가 없다. 아무것도 수행되지 않는다.
하지만, T 레지스터의 최하위 비트가 1 이라면, S 레지스터가 TT 레지스터에 가산되며, 2개의 18 비트 부호(signed) 값들의 19비트 합계값(아마도)이 생성된다. 상기 합계는 1 비트 위치만큼 오른쪽으로 시프트되며 그리고 T에 로드된다. S 는 상기 명령에 의해서 변화하지 않고 남아 있는다.
PLUS STAR를 반복적으로 사용하여 2개의 레지스터들을 곱할 수 있다. 당신은 승수 내의 각각의 비트 위치들에 대해서 PLUS STAR를 실행해야만 한다. 예를 들어, 승수가 9 비트라면, 곱셈을 완료하기 위해서는 당신은 9번의 PLUS STAR 명령어들을 실행해야 한다. 이것이 완료되면, 그 결과는 오른쪽 자리맞춤되어(right-justified) T에 있다. 다른 모든 승수 비트들은 시프트되었다. S 는 변화하지 않는다.
동일한 내용이 리플 캐리에 적용되며 그리고 PLUS에 적용되는 지연에 관한 잠재적인 필요성이 또한 PLUS STAR에도 적용된다. T의 하위 비트가 제로이면, 설정-시간 지연이 필요치 않다. 이와 유사하게, S의 피승수가 9 비트 또는 미만(왼쪽 자리맞춤되어)인 경우, 리플-캐리 지연을 허용할 필요가 없다.
제7장. 핀아웃과 패키지
SEAforth-24A 는 100 핀 QFP 패키지로 패키징된다. 신호들 및 이들의 기능들은 테이블 37에 도시된다. 패키지 사이즈, 핀아웃 및 다른 기계적인 특성들에 대한 좀더 상세한 내용을 알고 싶다면 회사로 연락하기 바란다.
테이블 37. 신호 리스트(알파벳순)
제8장. 전기적 특성들(Electrical Specifications)
테이블 38. 최대 정격(Absolute Maximun Ratings)
테이블 39. 전압 및 온도 동작 조건들
테이블 40. 디바이스 특성
부록 1. SEAforth-24A Boot Process
시스템 부트
리셋되는 때에, 각각의 C18 프로세서는 어드레스 AAh에서 ROM 코드의 실행을 개시한다. 모든 프로세싱 노드들이 부트시에 동일한 작업을 수행하는 것은 아니다.
SEAforth-24A는 노드 N5 상에서 SPI 인터페이스로부터 부팅할 수 있다. 또한, SEAforth-24A는 노드 N0 상에서 외부 RAM 인터페이스로부터 부팅할 수 있으며, 또는 4개의 ROM-구동 직렬 부트 프로세서 노드들인 N3, N12, N17, 및 N21 중 어느 것에서 부팅할 수도 있다. 전형적인 시스템은 SPI 기반 부트 디바이스에 대한 N5 프로세서 인터페이스로부터 부팅할 것이다. 일반적으로 부트 디바이스는 EEPROM 또는 플래시 저장 디바이스 중 어느 하나가 될 것이다.
N5 상의 ROM 부트 코드는 SPI 디바이스를 초기화할 수 있으며 그리고 250Kbps 속도에서 SPI 어드레스 0으로부터 판독을 개시하라는 명령(command)을 전송할 수 있다. SPI 부트 로더(loader)는 SPI 인터페이스로부터 144 바이트를 판독함으로써, 64개의 18-비트 코드 워드들을 내부 RAM에 로드한다. SPI에서, 최상위 비트(MSB)들이 먼저 판독된다. 64개의 워드들을 로딩한 다음, 상기 코드는 어드레스 0의 그 코드로 점프할 것이다.
첫번째 64개의 코드 워드가 로딩된 이후, 디바이스가 하는 일은, 상기 디바이스가 로딩한 코드에 의해 결정된다. 일반적으로, 상기 디바이스는 64-워드 블록들을 SPI로부터 계속해서 로드하거나 또는 다른 코어들에게 부트 코드를 분배하기 시작할 것이다. 다른 모든 코어들은 판독 동작을 기다리면서 '수면' 중이다. 이들 코어들은 필요하다면 적절한 때에 초기화될 수 있다. 각 코어의 RAM으로 판독되는 코드는, 추가 SPI 피처들을 지원할 수 있으며 또는 이들 핀들의 다른 용도를 지원할 수 있다.
N5가 SPI 핀들로부터 부팅되는 것은 방지될 수 있다. 만일, 리셋 시간에서 SPI 데이터 인(SPI Data In)이 하이라면, SPI 프로세서는 SPI로부터 부팅하지 않을 것이며 그리고 이웃으로부터의 기입(write)을 기다리면서 수면상태로 진행할 것이다. 만일, 상기 비트가 로우라면, 이것은 칩 선택 핀을 변경할 것이며 그리고 "어드레스 0으로부터 판독" 명령을 SPI 디바이스에게 전송하고자 SPI 클럭 핀에 대한 토글링을 개시할 것이다.
N2, N12, N17 및 N21은 비동기식 직렬 부트를 지원하는 ROM 코드를 갖는다. 이들 프로세서들은 그들의 IOCS 레지스터의 비트-17을 판독하는 소정 핀을 갖는바, 이는 직렬 입력 및/또는 수면으로부터 기상하는데 이용된다. RAM-기반의 소프트웨어는 상기 핀을 이용할 수 있으며 또는 상기 핀 입력 피쳐의 수면으로부터 기상을 다른 용도를 위해 이용할 수도 있다.
직렬로부터 부팅되는 경우라면, 상기 코어들은 수면할 것이며 그리고 그들의 입력 핀 상에서 논리 하이를 기다릴 것인바, 이는 직렬 시작 비트로 해석될 것이다. 이후 이들 프로세서들은 판독된 제 1 바이트의 헤더에 있는 타이밍 비트의 시간을 조절하고자 시도하여 보드 레이트(baud rate)를 결정한다. 만일 상기 보드 레이트가 너무 낮다면, 타이밍 비트에 대한 상기 시간조절 시도는 실패할 것이며 그리고 ROM 코드는 프로세서가 이웃의 기입을 대기하면서 수면하게 할 것이다. 1200 보드보다 아래인 보드율은 직렬 입력에는 소용이 없을 것이다. 비동기 직렬 입력에 대한 상한은 ~20Mhz가 되어야 하며, 또는 2개의 스톱 비트들이 이용된다면 더 높을 수도 있다.
시작 비트를 찾아낸 다음, ROM 코드는 6-비트 헤더내의 2배 폭의 타이밍 비트(double wide timing bit)을 타이밍할 것이며, 그리고 첫번째 8-비트 바이트(first 8-bit byte) 내의 2개의 실제 데이터 비트들을 판독할 것이다. 다음으로, 그것은 2개의 8-비트 바이트들을 더 판독할 것이며 그리고 직전의 18-데이터 비트 판독으로부터의 18-비트 숫자를 누적할 것이다. 표준적인 비동기 직렬에서는, 최하위 비트가 먼저 판독된다. 64개의 18-비트 C18 명령어들 각각은, 하나의 시작비트와 하나 또는 2개의 스톱 비트를 갖는 3개의 8-비트 바이트들로서 판독된다. 판독된 3 바이트 워드들 각각의 처음에 있는 2배 폭 타이밍 비트가 타이밍되는바, 따라서 다음 워드의 시작 비트가 타이밍되기 전에 판독되는 비트들은 매우 적다. 이때, 적절한 타이밍을 놓치고 그리고 심지어 매우 높은 비트 속도에서도 잘못된 비트를 판독할 정도로 속도가 변동될 확률은 매우 낮다.
64개의 18-비트 워드들을 판독하고 그리고 이들을 RAM에 저장한 다음, 상기 직렬 프로세서들은 어드레스 0에서의 그 코드로 점프한다. SPI 부트와 유사하게, 이들 프로세서들은 직렬 또는 다양한 사이즈의 로드 패킷들로부터 64 워드 패킷들을 계속해서 로드할 수 있다. 직렬 출력 드라이버가 로딩되어, 직렬 프로세서의 제 2 핀 상에서 직렬 출력이 허용될 수 있다.
또한, RAM 서버인 N0는, 선택적으로 칩을 부팅시킬 수 있다. 이것이 리셋되는 때, 상기 ROM 은 Memory_Present 핀을 판독하여, 외부 메모리 인터페이스로부터 상기 칩을 부팅시켜야만 하는지를 알아낸다. 만일, 리셋시에 Memory_Present 가 하이라면, 외부 메모리 인터페이스로부터 부팅될 것이다. 만일 비-휘발성 RAM, 플래시, 또는 에뮬레이트된 디바이스가 외부 메모리 인터페이스에 연결되어 있다면, 칩을 부팅하는데 이들이 이용될 수도 있다.
N0가 리셋되는 때에 Memory_Present 핀이 로우라면, 이것은 외부 메모리를 조용한 상태(quite state)로 두기 위해 _Write_Enable and _Select 핀을 상승시킬 것이다. 만일, 이때 Memory_Present 핀이 하이라면, 이것은 0의 어드레스를 출력할 것이며 그리고 판독될 예정이며 그리고 외부 메모리로부터 부팅하는데 이용되는 워드들의 카운트 숫자를 판독할 것이다. 이를 위해서, 어드레스 0을 먼저 출력할 것이며 그리고 판독, 지연, 데이터 버스 판독, 그리고 제어 신호를 출력하기 위한 제어 신호를 출력할 것이다. 외부 메모리의 위치 0(location 0)에서의 코드 및 카운트는 부트 Forthlet 으로 호칭된다.
부팅하기 위한 18-비트 워드들의 카운트 숫자를 판독한 다음, ROM 코드는 증가하는 외부 어드레스로부터 18-비트 숫자들의 많은 플러스 원 판독들(plus one reads)을 수행할 것이다. 이것은 18-비트 숫자들을 로컬 메모리의 어드레스 0에 저장하며 그리고 부팅하기 위해 어드레스 0으로 점프한다. ROM 코드는, RAM을 통해 벡터화되는 외부 데이터 버스 상에 18-비트 숫자들을 판독 또는 기입하는 루틴들을 가짐으로써, 다양한 외부 메모리 디바이스들을 지원하도록 설계된다.
부록 2. A Note on Internal Data Representations and Levels
참(true) 및 거짓(false)의 불린(Boolean) 값을 표현하는데 어떤 종류의 물리적 조건들이 이용되는지는 불린 로직의 원리와는 상관이 없다. 참과 거짓은 편의를 위해 종종, 0과 1로서 사용되지만 이는 단지 관례일 뿐이다. 지난 세월동안 많은 컴퓨터 시스템들은 참 및 거짓을 표현하기 위해서 상이한 전압 레벨들을 채택하여 왔다. 실제로도 많은 시스템들은 머신의 상이한 부분들에서 상이한 레벨들을 이용한다. 메모리 칩들은 0 및 1에 대한 내부 전기적 표현들을 변경함으로써 상기 관습을 계속해서 이용한다. 나머지 절반에 정확히 반대되는 비트들의 절반을 전기적 상태에 의해서 찾아내는 일은 통상적인 것이다.
작은 게이트 카운트와 낮은 전력소비로 성능을 최적화하도록, SEAforth 프로세서 패밀리가 설계되어 왔다. 설계자들은 0과 1을 표현하기 위해 다양한 내부 전기적 레벨의 사용을 선택하였다. 대부분의 경우에 있어서, 이러한 것은 프로그래머들에게는 효과적으로 감춰져있지만, 몇몇 경우에 있어서 내부적으로 어떤 일이 수행되고 있는지를 이해한다면, 이는 당신에게 설계, 전력(power), 및 능력에 대한 더 큰 통찰력을 주게될 것이다.
그 하나의 일례는, 프로세서간 통신 레지스터를 위한 어드레스 비트의 조작에 관한 것이다. 일반적인 용어로 말하면, 클래식 8-4-2-1 시퀀스의 싱글 비트에 의해서 각각의 레지스터가 선택된다. 다수의 레지스터들을 선택하기 위해서 비트들이 조합될 수도 있다. 하지만, 내부 어드레스 버스는, 짝수 비트로부터 "반전"된 방식으로 홀수-비트를 표현한다. 따라서, Vss 근처의 전압은 0을 나타내고 그리고 Vdd 근처의 전압은 1을 나타내는 관례를 당신이 만일 따르고 있다면, 논리적으로 0 0000 0000 인 어드레스 값은 1 0101 0101 처럼 보일 것이다.

Claims (15)

  1. 다수의 비트 위치들을 갖는 복수-비트 이진 숫자들을 처리하기 위한 디지털 논리 회로로서,
    물리적 성질의 2개의 상이한 값들이 이진 숫자의 비트 값들을 나타내고;
    짝수 비트 위치들에서, 상기 2개의 상이한 값들 중 제 1 값은 이진 1(binary 1)을 나타내고, 그리고 상기 2개의 상이한 값들 중 제 2 값은 이진 0을 나타내며; 그리고
    홀수 비트 위치들에서, 상기 2개의 상이한 값들 중 상기 제 1 값은 이진 0을 나타내고, 그리고 상기 2개의 상이한 값들 중 상기 제 2 값은 이진 1을 나타내는 것을 특징으로 하는 복수-비트 이진 숫자들을 처리하기 위한 디지털 논리 회로.
  2. 제1항에 있어서,
    상기 디지털 논리 회로의 다수의 제 1 부분들은 상기 짝수 비트 위치들에 대응하며; 그리고
    상기 디지털 논리 회로의 다수의 제 2 부분들은 상기 홀수 비트 위치들에 대응하는 것을 특징으로 하는 복수-비트 이진 숫자들을 처리하기 위한 디지털 논리 회로.
  3. 제1항에 있어서,
    상기 물리적 성질은 전기 전위인 것을 특징으로 하는 복수-비트 이진 숫자들을 처리하기 위한 디지털 논리 회로.
  4. 제3항에 있어서,
    상기 제 1 값은 고전위이며 그리고 상기 제 2 값은 저전위인 것을 특징으로 하는 복수-비트 이진 숫자들을 처리하기 위한 디지털 논리 회로.
  5. 제3항에 있어서,
    상기 제 1 값은 저전위이며 그리고 상기 제 2 값은 고전위인 것을 특징으로 하는 복수-비트 이진 숫자들을 처리하기 위한 디지털 논리 회로.
  6. 제1항에 있어서,
    상기 디지털 논리 회로는 복수-비트 이진 숫자들의 리플-캐리 가산기인 것을 특징으로 하는 복수-비트 이진 숫자들을 처리하기 위한 디지털 논리 회로.
  7. 제6항에 있어서,
    상기 복수-비트 이진 숫자들은 18-비트 이진 숫자들인 것을 특징으로 하는 복수-비트 이진 숫자들을 처리하기 위한 디지털 논리 회로.
  8. 제1항에 있어서,
    상기 디지털 논리 회로는 2개의 복수 비트 레지스터들과 하나의 복수-비트 산술 논리 유닛을 포함하여 구성되고,
    상기 2개의 복수 비트 레지스터들과 하나의 복수-비트 산술 논리 유닛은, 상기 복수 비트 레지스터들에 배치된 2개의 숫자들에 대한 리플-캐리 가산을 수행하고 그리고 그 합을 상기 레지스터들 중 하나에 놓아두도록 연결되는 것을 특징으로 하는 복수-비트 이진 숫자들을 처리하기 위한 디지털 논리 회로.
  9. 제1항에 있어서,
    상기 디지털 논리 회로는 비동기식 논리 회로인 것을 특징으로 하는 복수-비트 이진 숫자들을 처리하기 위한 디지털 논리 회로.
  10. 제8항에 있어서,
    상기 복수-비트 산술 논리 유닛은 18-비트 산술 논리 유닛인 것을 특징으로 하는 복수-비트 이진 숫자들을 처리하기 위한 디지털 논리 회로.
  11. 디지털 논리 회로에서 복수-비트 이진 숫자들을 조작하는 방법으로서,
    상기 숫자들은 다수의 비트 위치들을 가지며;
    상기 디지털 논리 회로의 물리적 성질의 2개의 상이한 값들이 이진 숫자의 비트 값들을 나타내고;
    짝수 비트 위치들에서, 상기 2개의 상이한 값들 중 제 1 값은 이진 1(binary 1)을 나타내고, 그리고 상기 2개의 상이한 값들 중 제 2 값은 이진 0을 나타내며; 그리고
    홀수 비트 위치들에서, 상기 2개의 상이한 값들 중 상기 제 1 값은 이진 0을 나타내고, 그리고 상기 2개의 상이한 값들 중 상기 제 2 값은 이진 1을 나타내는 것을 특징으로 하는 디지털 논리 회로에서 복수-비트 이진 숫자들을 조작하는 방법.
  12. 제11항에 있어서,
    상기 디지털 논리 회로의 다수의 제 1 부분들은 상기 짝수 비트 위치들에 대응하며; 그리고
    상기 디지털 논리 회로의 다수의 제 2 부분들은 상기 홀수 비트 위치들에 대응하는 것을 특징으로 하는 디지털 논리 회로에서 복수-비트 이진 숫자들을 조작하는 방법.
  13. 제11항에 있어서,
    상기 물리적 성질은 전기 전위인 것을 특징으로 하는 디지털 논리 회로에서 복수-비트 이진 숫자들을 조작하는 방법.
  14. 제13항에 있어서,
    상기 제 1 값은 고전위이며 상기 제 2 값은 저전위인 것을 특징으로 하는 디지털 논리 회로에서 복수-비트 이진 숫자들을 조작하는 방법.
  15. 제13항에 있어서,
    상기 제 1 값은 저전위이며 상기 제 2 값은 고전위인 것을 특징으로 하는 디지털 논리 회로에서 복수-비트 이진 숫자들을 조작하는 방법.
KR1020097015064A 2006-12-21 2007-12-21 컴퓨터의 교번하는 명령 및/또는 데이터 비트의 반전 KR20090101939A (ko)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US87637906P 2006-12-21 2006-12-21
US60/876,379 2006-12-21

Publications (1)

Publication Number Publication Date
KR20090101939A true KR20090101939A (ko) 2009-09-29

Family

ID=39563102

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020097015064A KR20090101939A (ko) 2006-12-21 2007-12-21 컴퓨터의 교번하는 명령 및/또는 데이터 비트의 반전

Country Status (6)

Country Link
US (1) US20080177817A1 (ko)
EP (1) EP2109815A2 (ko)
JP (1) JP2010514058A (ko)
KR (1) KR20090101939A (ko)
CN (1) CN101681250A (ko)
WO (1) WO2008079336A2 (ko)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP7200507B2 (ja) * 2018-06-06 2023-01-10 富士通株式会社 半導体装置及び演算器の制御方法

Family Cites Families (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4338676A (en) * 1980-07-14 1982-07-06 Bell Telephone Laboratories, Incorporated Asynchronous adder circuit
US4523292A (en) * 1982-09-30 1985-06-11 Rca Corporation Complementary FET ripple carry binary adder circuit
US5825824A (en) * 1995-10-05 1998-10-20 Silicon Image, Inc. DC-balanced and transition-controlled encoding method and apparatus
US5978826A (en) * 1995-12-01 1999-11-02 Lucent Techologies Inc. Adder with even/odd 1-bit adder cells
US5719802A (en) * 1995-12-22 1998-02-17 Chromatic Research, Inc. Adder circuit incorporating byte boundaries
KR100186342B1 (ko) * 1996-09-06 1999-05-15 문정환 병렬 가산기
US6567834B1 (en) * 1997-12-17 2003-05-20 Elixent Limited Implementation of multipliers in programmable arrays
US6747580B1 (en) * 2003-06-12 2004-06-08 Silicon Image, Inc. Method and apparatus for encoding or decoding data in accordance with an NB/(N+1)B block code, and method for determining such a block code

Also Published As

Publication number Publication date
CN101681250A (zh) 2010-03-24
JP2010514058A (ja) 2010-04-30
WO2008079336A2 (en) 2008-07-03
WO2008079336A3 (en) 2008-08-14
US20080177817A1 (en) 2008-07-24
EP2109815A2 (en) 2009-10-21

Similar Documents

Publication Publication Date Title
US5748950A (en) Method and apparatus for providing an optimized compare-and-branch instruction
US6829696B1 (en) Data processing system with register store/load utilizing data packing/unpacking
KR100464406B1 (ko) 가변길이 vliw 명령어를 위한 디스패치 장치 및 방법
US9329866B2 (en) Methods and apparatus for adapting pipeline stage latency based on instruction type
US20020069375A1 (en) System, method, and article of manufacture for data transfer across clock domains
US8612726B2 (en) Multi-cycle programmable processor with FSM implemented controller selectively altering functional units datapaths based on instruction type
US5604878A (en) Method and apparatus for avoiding writeback conflicts between execution units sharing a common writeback path
US6839831B2 (en) Data processing apparatus with register file bypass
JP2008530642A (ja) 低レイテンシーの大量並列データ処理装置
KR100462951B1 (ko) Risc 구조를 갖는 8 비트 마이크로콘트롤러
JP2007257549A (ja) 半導体装置
EP1866804A2 (en) Speculative load of look up table entries based upon coarse index calculation in parallel with index calculation
WO2013101132A1 (en) Processors having fully-connected interconnects shared by vector conflict instructions and permute instructions
US5832258A (en) Digital signal processor and associated method for conditional data operation with no condition code update
KR100465388B1 (ko) Risc 구조의 8비트 마이크로 제어기
US6292845B1 (en) Processing unit having independent execution units for parallel execution of instructions of different category with instructions having specific bits indicating instruction size and category respectively
US6728741B2 (en) Hardware assist for data block diagonal mirror image transformation
KR20090101939A (ko) 컴퓨터의 교번하는 명령 및/또는 데이터 비트의 반전
US6957319B1 (en) Integrated circuit with multiple microcode ROMs
US11775310B2 (en) Data processing system having distrubuted registers
Subhashini et al. FPGA-Based 128-Bit RISC Processor Using Pipelining
JP3532026B2 (ja) 演算装置
JPH05173778A (ja) データ処理装置
JP2007234065A (ja) データ処理装置
JP2001216154A (ja) むき出しのパイプラインを具備するコードのサイズを、nop演算を命令オペランドとしてコード化することで削減するための方法並びに装置

Legal Events

Date Code Title Description
WITN Application deemed withdrawn, e.g. because no request for examination was filed or no examination fee was paid