예를 들면, 명령의 오퍼랜드에 2차원의 소스 레지스터와 데스티네이션 레지스터를 지정하는 수단을 설치하고, 복수 사이클에서, 복수의 소스 레지스터를 사용한 연산을 실행하며, 복수의 데스티네이션을 얻는 수단을 갖는다. 또한, 복수 소스 레지스터를 이용하여, 복수 사이클 소비하여 데스티네이션을 얻는 명령에서, 데이터 사사오입 연산기를 파이프라인의 최종단에 접속한다.
또한, 복수의 CPU를 직렬 접속하고, 공유형의 명령 메모리를 공유하여 사용한다. 이 때, 각 CPU의 명령 오퍼랜드에, 인접하는 CPU간의 동기를 제어하기 위한 필드를 갖고, 동기화 제어를 행하는 수단을 설치한다.
이들 구성에 의해 예를 들면, 명령 메모리의 액세스 횟수를 삭감함으로써, 명령 메모리 읽어내기 시에 소비하는 전력을 삭감한다. 또한, 명령수의 삭감과, 명령 메모리의 공유화에 의해, 명령 메모리의 총 용량을 삭감함으로써, 트랜지스터의 충방전 개수를 삭감하여, 저소비 전력화를 실현한다.
<실시예>
이하에, 본 발명의 실시예를 도면을 이용하여 설명한다.
(제1 실시예)
본 발명의 제1 실시예에 대하여, 도면을 참조하여 상세하게 설명한다. 도 1은, 본 실시예에서의 내장 시스템의 블록도이다. 본 내장 시스템은, 시스템의 제어와 범용적인 처리를 행하는 CPU(1)와, MPEG 등의 화상 코덱의 1처리인 스트림 처리를 행하는 스트림 처리부(2)와, 스트림 처리부(2)와 제휴하여 화상 코덱의 부호 화나 복호화를 행하는 영상 처리부(6)와, AAC나 MP-3 등의 음성 코덱의 부호화나 복호화를 행하는 음성 처리부(3)와, SDRAM 등으로 구성하는 외부 메모리(20)의 액세스를 제어하는 외부 메모리 제어부(4)와, 표준 버스인 PCI 버스(22)와 접속하기 위한 PCI 인터페이스(5)와, 화상 표시를 제어하는 표시 제어부(8)와, 다양한 IO 디바이스에 대하여, 다이렉트 메모리 액세스를 행하는 DMA 컨트롤러(7)가, 내부 버스(9)에 서로 접속된다.
DMA 컨트롤러(7)에는, DMA 버스(10)를 통하여, 다양한 IO 디바이스가 접속된다. IO 디바이스에는, 카메라나 NTSC 신호 등의 영상 입력을 행하는 영상 입력부(11), NTSC 등 영상을 출력하는 영상 출력부(12), 마이크 등 음성의 입력을 행하는 음성 입력부(13)와, 스피커나 광 출력 등의 음성 출력을 행하는 음성 출력부(14), 리모콘 등의 시리얼 전송을 행하는 시리얼 입력부(15), 시리얼 출력부(16), PCI 버스 등의 스트림을 입력하기 위한 스트림 입력부(17), 하드디스크 등 스트림을 출력하기 위한 스트림 출력부(18) 및 다양한 IO 디바이스(19)가 접속된다. PCI 버스(22)에는, 하드디스크나 플래시 메모리 등의 다양한 PCI 디바이스(23)가 접속된다.
표시 제어부(8)에는, 표시 디바이스인 디스플레이(21)가 접속된다. 영상 처리부(6)는, 화상 코덱이나 화상의 확대 축소, 또한 화상의 필터링 등, 2차원 화상에 대하여 처리를 실시하는 처리부이다. 이와 같이, 본 내장 시스템은, 영상이나 음성의 입출력을 갖고, 영상이나 음성 처리를 행하는 시스템이다. 예를 들면, 휴대 전화나, HDD 레코더, 감시 장치, 차량 탑재용 화상 처리 장치 등을 들 수 있다.
도 2는, 본 실시예에서의 영상 처리부(6)의 블록도이다. 영상 처리부(6)는, 내부 버스 브릿지(60)를 통하여 내부 버스(9)에 접속된다. 내부 버스 브릿지(60)는, 패스(63)를 통하여 내부 버스 마스터 제어부(61)와, 패스(64)를 통하여 내부 버스 슬레이브 제어부(62)에 접속된다. 내부 버스 마스터 제어부(61)는, 영상 처리부(6)가 내부 버스(9)에 대하여 버스 마스터로 되어, 리드 액세스나 라이트 액세스의 리퀘스트를 생성하고, 내부 버스 브릿지(60)에 리퀘스트를 출력하는 블록이다. 내부 버스(9)에 대한 라이트 액세스 시에는, 리퀘스트, 어드레스, 데이터를 출력한다. 내부 버스(9)에 대한 리드 액세스 시에는, 리퀘스트와 어드레스를 출력하고, 수사이클 후, 리드 데이터가 반송된다. 내부 버스 슬레이브 제어부(62)는, 내부 버스(9)로부터 입력되며, 내부 버스 브릿지(60)를 경유하여 입력되는 리드 요구나 라이트 요구를 접수하여, 대응하여 처리를 행하는 블록이다. 내부 버스 브릿지(60)는, 내부 버스(9)와 내부 버스 마스터 제어부(61) 사이, 및 내부 버스(9)와 내부 버스 슬레이브 제어부(62) 사이에서 주고 받는 리퀘스트나 데이터의 조정을 행하는 블록이다. 시프트형 버스(50)는, 영상 처리부(6) 내의 블록간 데이터 전송을 행하는 버스이다. 각 블록과 시프트형 버스(50)는, 3종류의 신호선군으로 접속된다. 우선, 도 3과 도 4를 사용하여, 시프트형 버스(50)의 설명을 행한다.
도 3은, 시프트형 버스(50)의 블록도이다. 시프트형 버스(50)에는, 각 블록과의 인터페이스로서 3종의 신호선군으로 접속된다. 따라서, 신호선군(50a, 50b, 50c)이 1개의 블록에 접속되고, 신호선군(51a, 51b, 51c)이 다른 1개의 블록에 접속되며, 신호선군(55a, 55b, 55c)이 다른 1개의 블록에 접속된다. 신호선군(50a, 50b, 50c)은, 시프트 레지스터 슬롯(500)에 접속되고, 신호선군(51a, 51b, 51c)은, 시프트 레지스터 슬롯(501)에 접속되고, 신호선군(55a, 55b, 55c)은, 시프트 레지스터 슬롯(505)에 접속된다. 각 시프트 레지스터 슬롯(500, 501, 505)은, 직렬로 접속된다. 예를 들면, 시프트 레지스터 슬롯(500)의 출력(50e)은, 시프트 레지스터 슬롯(501)의 51d에 입력되고, 시프트 레지스터 슬롯(501)의 출력(51f)은, 시프트 레지스터 슬롯(500)의 50g에 입력된다. 마찬가지로, 시프트 레지스터 슬롯(505)의 출력(55e)은, 시프트 레지스터 슬롯(500)의 50d에 입력되고, 시프트 레지스터 슬롯(500)의 출력(50f)은, 시프트 레지스터 슬롯(505)의 55g에 입력된다. 신호선(500p)은, 시프트 레지스터 슬롯마다 공급되는 클럭 정지 신호(500p)로서, 50p 단자, 51p 단자, 55p 단자에 입력된다. 클럭 정지 신호(500p)에 관해서는 후술한다. 시프트 레지스터 슬롯(500, 501, 505)은, 후술하는 자신 블록 ID를 제외하면, 동일한 구성이다. 따라서, 대표하여, 시프트 레지스터 슬롯(500)에 대하여, 상세하게 설명한다.
도 4는, 시프트 레지스터 슬롯(500)의 블록도이다. 시프트 레지스터 슬롯(500)에는, 각 블록과의 인터페이스인 신호선군(50a, 50b, 50c)과, 블록간 인터페이스의 신호선군인 50d, 50e, 50f, 50g가 접속된다. 이들 신호선군(50a, 50b, 50c, 50d, 50e, 50f, 50g)에 대하여, 표 1 내지 표 7에 신호의 의미를 정리한다. 여기서, 신호선군(50b, 50d, 50g)은 입력 신호이고, 참조 부호 50a, 50c, 50e, 50f는 출력 신호이다. 또한, 각 신호선군(50a, 50b, 50c, 50d, 50e, 50f, 50g)은, 동일 사이클에서 유효한 값이다.
신호선군(50a)
신호명 |
신호의 의미 |
R_WE_IN |
우회전 시프트형 버스로부터의 라이트 인에이블 |
R_CMD_IN |
우회전 시프트형 버스로부터의 전송 커맨드 |
R_LAST_IN |
우회전 시프트형 버스로부터의 전송 종료 플래그 |
R_TRID_IN[3:0] |
우회전 시프트형 버스로부터의 트랜잭션 ID |
R_ADDR_IN[12:0] |
우회전 시프트형 버스로부터의 전송 어드레스 |
R_DATA_IN[63:0] |
우회전 시프트형 버스로부터의 전송 데이터 |
신호선군(50b)
신호명 |
신호의 의미 |
SBR_OUT_REQ |
우회전 시프트형 버스에의 출력 리퀘스트 신호 |
SBL_OUT_REQ |
좌회전 시프트형 버스에의 출력 리퀘스트 신호 |
SB_BID_OUT[3:0] |
전송처 블록 ID |
SB_EID_MSK_OUT[3:0] |
블록 ID 마스크 |
SB_CMD_OUT |
전송 커맨드 |
SB_LAST_OUT |
전송 종료 플래그 |
SB_TRID_OUT[3:0] |
트랜잭션 ID |
SB_ADDR_OUT[12:0] |
전송 어드레스 |
SB_DATA_OUT[63:0] |
전송 데이터 |
신호선군(50c)
신호명 |
신호의 의미 |
L_WE_IN |
좌회전 시프트형 버스로부터의 라이트 인에이블 |
L_CMD_IN |
좌회전 시프트형 버스로부터의 전송 커맨드 |
L_LAST_IN |
좌회전 시프트형 버스로부터의 전송 종료 플래그 |
L_TRID_IN[3:0] |
좌회전 시프트형 버스로부터의 트랜잭션 ID |
L_ADDR_IN[12:0] |
좌회전 시프트형 버스로부터의 전송 어드레스 |
L_DATA_IN[63:0] |
좌회전 시프트형 버스로부터의 전송 데이터 |
신호선군(50d)
신호명 |
신호의 의미 |
SBR_WE_IN |
우회전 시프트형 버스의 라이트 인에이블 |
SBR_BID_IN[4:0] |
전송처 블록 ID |
SBR_EID_MSK_IN[4:0] |
블록 ID 마스크 |
SBR_CMD_IN |
전송 커맨드 |
SBR_LAST_IN |
전송 종료 플래그 |
SBR_TRID_IN[3:0] |
트랜잭션 ID |
SBR_ADDR_IN[12:0] |
전송 어드레스 |
SBR_DATA_IN[63:0] |
전송 데이터 |
신호선군(50e)
신호명 |
신호의 의미 |
SBR_WE_OUT |
우회전 시프트형 버스의 라이트 인에이블 |
SBR_BID_OUT[4:0] |
전송처 블록 ID |
SBR_EID_MSK_OUT[4:0] |
블록 ID 마스크 |
SBR_CMD_OUT |
전송 커맨드 |
SBR_LAST_OUT |
전송 종료 플래그 |
SBR_TRID_OUT[3:0] |
트랜잭션 ID |
SBR_ADDR_OUT[12:0] |
전송 어드레스 |
SBR_DATA_OUT[63:0] |
전송 데이터 |
신호선군(50f)
신호명 |
신호의 의미 |
SBL_WE_OUT |
좌회전 시프트형 버스의 라이트 인에이블 |
SBL_BID_OUT[4:0] |
전송처 블록 ID |
SBL_EID_MSK_OUT[4:0] |
블록 ID 마스크 |
SBL_CMD_OUT |
전송 커맨드 |
SBL_LAST_OUT |
전송 종료 플래그 |
SBL_TRID_OUT[3:0] |
트랜잭션 ID |
SBL_ADDR_OUT[12:0] |
전송 어드레스 |
SBL_DATA_OUT[63:0] |
전송 데이터 |
신호선군(50f)
신호명 |
신호의 의미 |
SBL_WE_IN |
좌회전 시프트형 버스의 라이트 인에이블 |
SBL_BID_IN[4:0] |
전송처 블록 ID |
SBL_EID_MSK_IN[4:0] |
블록 ID 마스크 |
SBL_CMD_IN |
전송 커맨드 |
SBL_LAST_IN |
전송 종료 플래그 |
SBL_TRID_IN[3:0] |
트랜잭션 ID |
SBL_ADDR_IN[12:0] |
전송 어드레스 |
SBL_DATA_IN[63:0] |
전송 데이터 |
신호선군(50d)은 입력 신호로서, 레지스터(510)에 저장된다. 레지스터(510)의 출력인, 1 사이클 딜레이한 우회전 입력 신호군(511)은 BID 디코더(512)와 셀렉터(513), 및 신호선군(50a)에 입력된다. BID 디코더(512)에는, 입력 신호군(511) 중, 적어도, WE, BID가 입력된다. BID 디코더(512)는, 자신의 블록 번호를 인지하기 위한 블록 ID[4:0]을 갖는다.
도 5에, 우회전 시프트형 버스의 타이밍차트에 대하여 도시한다. 본 타이밍차트와, 도 4의 시프트 레지스터 슬롯(500)의 신호선군을 이용하여, 우회전 시프트형 버스의 버스 프로토콜을 설명한다. 또한, 본 타이밍차트에서의, 자신의 블록 ID는 "B"이다. 입력된 EID와 블록 ID가 동일하지 않고, 또한, WE가 1인 경우, 셀렉터(513)에는, 신호선군(511)을 선택하고, 신호선군(50e)에는, 신호선군(511)이 출력된다. 그 결과, 신호선군(50d)이 1 사이클 지연되어, 신호선군(50e)에 출력되고, 다음단의 시프트 레지스터 슬롯에 투입되어, 유효한 데이터 라이트 트랜잭션으로서 인계된다. 본 프로토콜은, 도 5에서의 데이터 시프트 출력이다. 다음으로, 입력된 EID와 블록 ID가 동일하며, 또한, WE가 1인 경우, 자신의 블록에의 입력으로서 인지하고, 신호선군(50a)의 R_WE_IN 신호를 1로 한다. 본 R_WE_IN 신호가 1인 경우, 각 블록은, 우회전 시프트형 버스로부터의 입력이 데이터 라이트 트랜잭션이라고 인식하고, 데이터 라이트 처리를 실행한다. 본 프로토콜은, 도 5에서의 데이터 라이트이다.
또한, 데이터 라이트 조건이 성립한 경우, 셀렉터(513)를 입력 신호선군(50b) 측에 선택하고, 신호선군(50e)에는, 입력 신호선군(50b)이 출력된다. 이 때, 입력 신호선군(50e)의 SBR_WE_OUT에 입력 신호선군(50b)의 SBR_OUT_REQ를 출력한다. SBR_OUT_REQ가 0인 경우에는, 다음단 시프트 레지스터 슬롯에는, 무효한 트랜잭션으로서 입력된다. 본 프로토콜은, 도 5에서의 데이터 라이트와 마찬가지이다. SBR_OUT_REQ가 1인 경우에는, 다음단 시프트 레지스터 슬롯에는, 유효한 트랜잭션으로서 입력된다. 이것은, 도 5에서의 데이터 라이트&데이터 출력이다. 또한, 입력된 WE가 0인 경우, 무효한 트랜잭션이 입력되었다고 인지하고, 셀렉터(513)를 입력 신호선군(50b) 측에 선택하고, 자신 블록으로부터의 데이터 라이트가 가능하다.
이들 BID 디코더(512)의 동작에 의해, 신호선군(50d)으로부터의 입력을, 데이터 라이트 트랜잭션으로서 수탁하는 동작과, 신호선군(50b)을 다음단 시프트 레지스터 슬롯에 데이터 라이트 트랜잭션으로서 출력하는 동작과, 자신의 블록에 대한 데이터 라이트 트랜잭션이 아닌 경우에도, 그 트랜잭션을 다음단에 인계하는 것이 가능하게 된다. 이에 의해, 좌측의 블록으로부터 우측의 블록에의 우회전의 데이터 전송을 실현한다.
마찬가지로, 앞의 설명에 대하여, 신호선군(50d)을 신호선군(50g)으로 치환하고, 신호선군(50e)을 신호선군(50f)으로 치환하고, 신호선군(50a)을 신호선군(50c)으로 치환하고, 레지스터(510)를 레지스터(514)로 치환하고, BID 디코더(512)를 BID 디코더(516)로 치환하고, 셀렉터(513)를 셀렉터(517)로 치환하고, SBR_OUT_REQ 신호를 SBL_OUT_REQ 신호로 치환함으로써, 우측의 블록으로부터 좌측의 블록으로의 좌회전의 데이터 전송을 실현한다.
또한, 메모리 등, 1포트 메모리를 사용한 메모리에 대하여, 신호선군(50a)과 신호선군(50c)으로부터 동시에 데이터 라이트 트랜잭션이 발생한 경우, 메모리 라이트 포트의 경합이 발생한다. 이것을 회피하기 위해, 몇가지의 방식이 있다. 하나는, 한쪽의 시프트형 버스를 스톨시키고, 한쪽으로부터의 데이터 라이트를 우선하는 것이다. 이 경우, 경합 신호를 전체 블록에 브로드캐스트하여 정지한다. 또한, 신호선군(50a)과 신호선군(50c)을 FIFO에 투입함으로써, 경합의 빈도를 삭감할 수 있다. 또한, 이와 같은 메모리를 사용하는 경우에는, 인터리브형 메모리 구성을 취하여, 우회전 시프트형 버스와 좌회전 시프트형 버스로부터의 기입을 별도 뱅크 메모리로 함으로써 경합을 회피할 수 있다. 단, 데이터 플로우가 심플하고, 블록간의 데이터 전달은 우회전 시프트형 버스를 사용하고, 외부 메모리로부터의 읽어들여, 즉 내부 버스 브릿지(60)를 통한 데이터 라이트 트랜잭션은 좌회전 시프트형 버스를 사용함으로써, 경합을 회피할 수 있다. 또한, 하나의 메모리에 대하여, 우회전 시프트형 버스와 좌회전 시프트형 버스로부터 동일 사이클에서, 데이터 라이트 트랜잭션이 발생하여 경합할 확률은 매우 작다. 이 때문에, 성능 저하의 비율은 작다고 할 수 있다.
본 방식에 의해, 일반적으로 타이밍 크리티컬로 되는 글로벌한 버스 조정 회로를 갖지 않고, 버스 전송을 실현할 수 있다. 또한, 시프트 레지스터 슬롯(500) 내의 레지스터(510, 514)에 의해, 블록 단위로 레지스터를 통함으로써, 실제의 LSI의 플로어플랜에서, 긴 배선과 타이밍 크리티컬 패스를 삭감할 수 있다. 일반적으로, 트라이 스테이트 버스 방식이나, 크로스바 스위치형 버스에서는, 블록수가 증가한 경우, 타이밍 크리티컬이나, 배선물량이 증가하지만, 본 방식에 따르면, 버스에 접속하는 블록수를 증가시킨 경우에도, 타이밍 크리티컬과 배선량 증가를 억지하는 것이 가능하다.
또한, 복수의 블록간에서, 동일 사이클에서, 병렬로 데이터 전송을 행하는 것이 가능하여, 높은 데이터 전송 성능을 얻을 수 있다. 특히, 인접하는 블록에 대해서만 데이터 전송하는 경우, 블록수에 비례한 데이터 밴드 폭을 얻는 것이 가능하다. 이와 같이, 시프트형 버스(50)의 버스 프로토콜은, 데이터의 라이트뿐이다. 데이터 라이트의 버스 프로토콜에서는, 리퀘스트 신호(WE_OUT)와 동일 사이클에서, 어드레스(ADDR_OUT)나 데이터(DATA_OUT)를 출력하는 것이 가능하며, FIFO나 큐를 이용하여, 상태를 유지하면서 실행하는 버스 구조와 비교하여, 보다 심플한 버스를 구성할 수 있다.
클럭 정지 신호(500p)는 50p 단자에 입력된다. 본 클럭 정지 신호(50p) 신호가 액티브인 경우, 셀렉터(513)와 셀렉터(517)는, 모두 신호선군(50d)과 신호선군(50g)이 선택된다. 이에 의해, 입력으로부터 출력까지, 레지스터를 통하지 않고 스루로 전파한다. 본 방식에 의해, 예를 들면, 1개의 블록의 클럭을 정지한 경우에도, 데이터 전송을 가능하게 한다. 본 시프트형 버스(50)는, 글로벌한 버스 조정 회로를 갖지 않기 때문에, 적어도 동작할 블록에만 클럭을 공급함으로써, 블록간의 데이터 전송을 가능하게 하고, 동작하는 레지스터수의 삭감에 의해, 소비 전력을 저감 가능하다. 또한, 시프트형 버스(50) 전체에는 클럭을 공급하고, 각 블록에는 클럭을 공급하지 않음으로써, 레지스터(510, 514, 518)분의 전력 증가로, 각 블록을 정지시키는 것도 가능하다.
이와 같이 시프트형 버스(50)는, 인접하는 블록간을 심플한 인터페이스로 접속할 수 있다. 따라서, 블록 ID 필드를 늘림으로써, 복수의 블록을 접속 가능하다. 본 실시예의 설명에서는, 영상 처리부(6) 내의 공통 버스로서 설명하고 있지만, 이것에 한정되지 않는다. 예를 들면, LSI의 핀에 시프트형 버스 인터페이스를 이용함으로써, 복수의 LSI를 직렬 접속 가능하게 되고, 인접하는 LSI뿐만 아니라, 배치적으로 떨어진 LSI와의 통신을 가능하게 한다. 또한, LSI간 접속에서는, 고속 시리얼 인터페이스 등을 사용하여, 핀수 삭감도 실현할 수 있다.
또한, 시프트형 버스(50)에서는, Last 신호를 갖는다. 데이터 전송과 동시에, 본 신호선이 "1"인 경우, 후술하는 동기 제어부(473) 내의 데이터 메모리 레디 카운터 DMRC를 카운트업한다. 이에 의해, 명령 레벨로 블록간의 동기화를 실현한다. 상세에 대해서는 후술한다. 또한, 시프트형 버스에서는, 리드 트랜잭션도 갖는다. 본 리드 트랜잭션에 대해서도 후술한다.
다시, 도 2를 이용하여, 영상 처리부(6)의 설명을 행한다. 시프트형 버스(50)에는, 복수의 블록이 접속된다. 앞에 나타낸 내부 버스 마스터 제어부(61), 내부 버스 슬레이브 제어부(62) 외에, 영상 처리부(6) 전체에서 공유 가능한 메모리를 갖는 공유 로컬 메모리(65), 소프트웨어에 의해 동작하는, 영상 코덱이나 화상의 회전, 확대 축소 등, 2차원의 화상에 대하여 처리를 행하는 복수의 영상 처리 엔진(66, 67), 화상 처리의 일부의 처리를 실행하는 전용 하드웨어(68) 등이 접속된다. 전용 하드웨어(68)의 일례로서는, MPEG-2나 H.264 부호화 규격에서의, 인코드 시의 움직임 예측 등을 처리하는 블록이다. 단, 전용 하드웨어(68)의 처리 내용은, 본 발명의 본질에 관계를 갖지 않기 때문에, 설명을 생략한다. 영상 처리 엔진(66, 67)은, 프로세서형의 블록으로, 시프트형 버스 상에 복수 접속할 수 있다. 공유 로컬 메모리(65), 영상 처리 엔진(66, 67), 전용 하드웨어(68), 내부 마스터 제어부(61), 내부 버스 슬레이브 제어부(62)는, 각각 독자적인 블록 ID를 갖고, 시프트형 버스(50)의 공유 버스 프로토콜로, 서로 접속된다.
다음으로, 도 6을 이용하여, 제1 실시예에서의, 영상 처리 엔진(66)의 보다 상세한 설명을 행한다. 도 6은 영상 처리 엔진(66)의 블록도이다. 영상 처리 엔진(66)의 인터페이스는, 시프트형 버스(50)와의 인터페이스뿐이며, 우회전 시프트형 버스의 입력 신호(51a), 좌회전 시프트형 버스의 입력 신호(51c), 및, 시프트형 버스(50)에의 출력 신호(51b)이다. 이들 3종의 신호는, 데이터 패스부(36)에 접속된다. 데이터 패스부(36)에는, 신호선(44)을 통하여, 시프트형 버스(50)에 대하여 데이터 출력 처리를 행하는 로컬 DMAC(34)가 접속된다.
또한, 영상 처리 엔진(66)은, 시프트형 버스(50)로부터 데이터 라이트를 행하는 것이 가능한 명령 메모리(31)와 데이터 메모리(35)를 갖고, 데이터 패스부(36)에는, 패스(42)를 통하여, 명령 메모리(31)의 제어를 행하는 명령 메모리 제어부(32)와 접속되고, 패스(43)를 통하여, 데이터 메모리 제어부(33)가 접속된다. 명령 메모리 제어부(32)는, 시프트형 버스(50)로부터의 명령 메모리(31)에의 데이터 라이트와, CPU부(30)에의 명령 공급을 제어하는 블록으로, 패스(40)를 통하여 명령 메모리(31)와, 패스(37)를 통하여 CPU부(30)와, 패스(42)를 통하여 데이터 패스부(36)에 접속된다. 데이터 메모리 제어부(33)는, 시프트형 버스(50)로부터의 데이터 메모리(35)에의 데이터 라이트와, 로컬 DMAC(34)가 제어하는, 데이터 메모리(35)로부터 시프트형 버스(50)에의 데이터 출력의 제어와, CPU(30)로부터 데이터 메모리(35)에의 액세스의 제어를 행하는 블록이다. 데이터 메모리(35)의 제어는, 패스(41)를 사용하여 행한다.
시프트형 버스(50)로부터의 데이터 메모리(35)에의 데이터 라이트와, 데이터 메모리(35)로부터 시프트형 버스(50)에의 데이터 출력은, 패스(43)를 통하여, 데이터 패스부(36)와 강조하여 제어한다. CPU부(30)와의 접속은, 2개의 패스에서 제어된다. 데이터 메모리(35)로부터 CPU부(30)에의 데이터 읽어내기 처리는, 패스(38)에 의해 제어되고, CPU부(30)로부터, 데이터 메모리(35)에의 데이터 기입은 패스(39)에 의해 제어된다. 모두, 데이터 메모리(35)의 액세스 어드레스는 패스(45)로 공급된다.
또한, 본 실시예의 설명에서는, 설명을 용이하게 하기 위해, 데이터 메모리(35)의 개수를 1개로 하지만, 복수의 데이터 메모리를 사용한 인터리브 구성도 가능하다. 인터리브 구성에 의해, 복수의 데이터 메모리(35)의 액세스를 병렬로 행하는 것이 가능하다. 본 발명을 설명함에 있어서, CPU(30)에 의한 연산 내용을 정의한다. 단, 본 연산 내용은, 본 발명의 본질을 설명하기 위한 것으로서, 연산 내용의 종류에 대해서는 한정을 갖지 않는다.
도 7에, 연산 내용의 개요를 도시한다. 도 7이 나타내는 바와 같이, 연산 내용은, 2차원의 화상 A와 2차원 화상 B의 화소마다 가산을 행하고, 메모리에 기입을 행하는 것이다. 특허 문헌 1에 나타낸 SIMD형 연산기를 사용한 경우, 필요 사이클은, 행렬 A의 읽어내기에 4 사이클, 행렬 B의 읽어내기에 4 사이클, 가산에 4 사이클, 감산에 4 사이클 소비하여, 합계 16 사이클 필요로 된다. 또한, SIMD형 연산기의 병렬수를 8로 한 경우, 가산에 필요한 사이클수는 2로 되지만, 본 설명에서는, 4병렬의 SIMD형 연산기로서 설명한다. 이 때, SIMD형 연산기가 필요한 총 명령수는, 필요 사이클수와 동일한 16명령이다. 본 연산 내용을 사용하여, 본 발명의 실현 방식에 대하여 설명한다.
CPU부(30)는, 2차원 화상에 대한 연산 등을 행하는 CPU이다. 본 실시예에서는, 설명을 용이하게 하기 위해, CPU부(30)는, 다음에 설명하는 4명령을 갖는 것으로 한다. 단, 본 명령의 종류는, 설명을 용이하게 하기 위한 것으로, 명령 종류에 대한 제한은 갖지 않는다. 단, 후술하는, 레지스터 포인터와 높이 방향을 지정하는 수단에 대해서는, 필요한 요소이다. 4명령은, 분기 명령, 리드 명령, 라이트 명령, 가산 명령으로 한다. 각 명령의 명령 포맷에서, 필요한 비트 필드를 표 8 내지 표 11에 나타낸다.
분기 명령의 명령 포맷
필드 |
필드의 의미 |
분기 명령 오피코드 |
본 명령이 분기 명령이라고 나타낸다 |
ADDR |
분기처 어드레스 |
CBR_IDX |
분기 조건 레지스터의 읽어내기 인덱스 |
리드 명령의 명령 포맷
필드 |
필드의 의미 |
리드 명령 오피코드 |
본 명령이 리드 명령이라고 나타낸다 |
ADDR |
데이터 메모리(35)의 읽어내기 어드레스. 본 설명에서는, 설명을 용이하게 하기 위해, 명령 자신에 나타내는 즉치로 어드레스를 지정한다. |
DestReg |
리드 데이터를 저장하는 레지스터 번호 포인터. 지정 가능한 레지스터는, 레지스터 파일 공간과 마스터 S/D 레지스터이다. 마스터 S/D 레지스터는, 로컬 DMAC(34) 내에 배치된다. |
Width |
리드하는 데이터의 폭 |
Count |
리드하는 데이터의 높이(카운트 수) |
Pitch |
2차원 데이터를 읽어들일 때의 데이터 간격 |
라이트 명령의 명령 포맷
필드 |
필드의 의미 |
라이트 명령 오피코드 |
본 명령이 라이트 명령이라고 나타낸다 |
ADDR |
데이터 메모리(35)의 기입 어드레스. 본 설명에서는, 설명을 용이하게 하기 위해, 명령 자신에 나타내는 즉치로 어드레스를 지정한다. |
SrcReg |
라이트 데이터가 저장되어 있는 레지스터 번호 포인터 |
Width |
라이트하는 데이터의 폭 |
Count |
라이트하는 데이터의 높이(카운트 수) |
Pitch |
2차원 데이터를 기입할 때의 데이터 간격 |
분할 가산 명령 포맷
필드 |
필드의 의미 |
분할 가산 명령 오피코드 |
본 명령이 분할 가산 명령이라고 나타낸다 |
Src1Reg |
소스 데이터가 저장되어 있는 제1 레지스터 번호 포인터 |
Src2Reg |
소스 데이터가 저장되어 있는 제2 레지스터 번호 포인터 |
DestReg |
연산 결과를 저장하는 레지스터 번호 포인터 |
Width |
분할 가산 연산하는 데이터의 폭(바이트수로 함) |
Count |
분할 가산 연산하는 데이터의 높이(카운트 수) |
도 8은 CPU부(30)의 블록도이다. 명령 메모리 제어부(32)와의 인터페이스(37)는, 2종의 신호로 나뉘며, 1개는, 명령 디코드부(303)가 명령 메모리 제어부(32)에 대하여 출력하는 명령 페치 요구(37r)와, 명령 메모리 제어부(32)가 출력하고, CPU부(30)에 입력되는 명령(37i)이다. 명령 디코드부(303)는, 1개의 명령 처리가 종료한 시점에서, 명령 페치 요구(37r)를 출력한다. 대응하여, 명령(37i)과 명령 레디 신호(37d)가 입력되고, 명령 레지스터(301)에 저장된다. 여기에서의 설명에서는, 명령 레지스터(301)의 세트수를 1로서 설명한다. 단, 명령의 읽어내기 레이턴시는 1 사이클보다도 크기 때문에, 복수 세트의 명령 레지스터(301)를 갖는 것도 가능하다. 명령 레지스터(301)의 값은, 명령 디코드부(303)에 공급되어, 명령을 디코드한다. 명령 디코드부(303)에서는, 레지스터 파일(범용 레지스터)(304)의 읽어내기 포트와 기입 포트를 제어하는 제어선(308)과, 연산기(313)를 제어하기 위한 명령 디코드 신호(309)와, 명령의 종류에 의해, 셀렉터(311)를 제어하기 위한 제어선(310)을 생성한다. 또한, 1개의 명령 처리가 종료한 시점에서, 명령 페치 요구(37r)를 출력한다.
본 설명에서는, 분기 명령을 제외하고, 리드 명령, 라이트 명령, 분할 가산 명령을 갖는 CPU부(30)로서 설명한다. 따라서, 제어선(308)은, 리드 명령 시에는, 리드 데이터(38)가 반송된 시점에서, 리드 데이터를 저장하는 레지스터 번호 포인터값을 저장처 레지스터 번호 포인터로서 사용한다. 라이트 명령 시에는, 레지스터 파일(304)의 읽어내기가 필요하기 때문에, 라이트 데이터 레지스터 번호를 사용한다. 분할 가산 명령 시에는, 레지스터 파일(304)의 읽어내기와 기입 모두 필요하여, 이것을 제어한다. 명령 디코드 신호(309)는, 본 설명에서는, 분할 가산 명령 시에만 액티브로 되지만, 다른 명령을 갖는 경우, 명령 종류에 따라, 연산기를 제어하기 위한 신호를 출력한다. 제어선(310)은, 리드 명령 시에는, 리드 데이터(38)를 선택하고, 분할 가산 명령 시에는 연산기(313)의 연산 결과(314)를 선택한다. 선택된 연산 데이터(315)는, 레지스터 파일(304)에 저장된다. 또한, 명령 디코드부(303)는, 리드 명령 시와 라이트 명령 시, 연산부(313)를 제어하고, 데이터 메모리(35)의 액세스 어드레스(45)를 생성한다.
또한, 연산기(303)는, 특허 문헌 1과 마찬가지로 8병렬의 SIMD형의 연산기로 구성되며, 8비트폭의 가산을 병렬로 8개 연산 가능한 구성으로 한다. 즉, 분할 가산을 8개 병렬로 연산할 수 있다. 또한, CPU(30)의 데이터폭을 8바이트로 한다. 따라서, 리드 명령, 라이트 명령, 분할 가산 명령에는 8바이트 단위로 실행할 수 있는 구성이다. 또한, 리드 명령, 라이트 명령, 분할 가산 명령의 Width 필드에는, 8, 16, 32를 정의할 수 있는 것으로 하고, 카운트 필드에는, 1 내지 16까지, 1간격으로 지정할 수 있는 것으로 한다.
도 9를 이용하여 명령 디코드부(303) 및 연산부(313)의 액세스 어드레스(45)의 생성 동작을 설명한다. 도 9는, 명령 디코드부(303)가 생성하는 레지스터 파일(304)의 읽어내기 포트와 기입 포트를 제어하는 제어선(308)과, 데이터 메모리(35)의 액세스 어드레스(45)를 생성하는 플로우차트이다.
명령 디코드부(303)는, Wc 카운터를 갖고, 명령 기동 시에 0으로 클리어된다(스텝 90). 다음으로, 스텝 91에서, Src와 Dest, (Addr+Wc)를 사용하여, 리드 명령, 라이트 명령, 분할 가산 명령을 실행한다. 다음으로 스텝 92에서, Src와 Dest에 1을 가산하고, Wc에 8을 가산한다. 스텝 93에서, 명령 필드에서 지정된 Width 필드와 Wc의 비교를 행한다. Width가 Wc보다 큰 경우, 재차 스텝 91로 되돌아가서, 명령 실행을 반복한다. Width가 Wc와 동일하거나, 혹은 작은 경우, 스텝 94로 천이하여, 명령 필드에 나타낸 Count값이 0인지를 판정한다. Count값이 0이 아닌 경우, 스텝 95로 천이하여, Count값으로부터 1을 감산하고, Addr에 Pitch를 가산하고, 재차, 스텝 90으로 천이하여, 명령 실행을 반복한다. Count값이 0인 경우, 명령 실행을 종료한다. 이 때, 명령 디코드부(303)는 명령 페치 요구(37r)를 출력한다.
도 9의 타이밍 차트의 동작에 의해, 1개의 명령으로, 2차원 직사각형에 대한 연산을 가능하게 한다. 특히 리드 명령에서는, Pitch를 지정함으로써, 데이터 메모리(35) 상에 분산적으로 배치된 2차원 직사각형을, 레지스터 파일(304)에 연속 데이터로서 저장할 수 있다. 또한, 라이트 명령에서는, 마찬가지로 Pitch를 지정함으로써, 레지스터 파일 상에 배치된 연속 데이터를, 데이터 메모리(35) 상의 분산적으로 배치된 2차원 직사각형 영역에 라이트하는 것이 가능하다.
도 7에서 설명한 연산 내용에서는, 2개의 리드 명령, 1개의 분할 가산 명령, 1개의 라이트 명령이라고 하는, 합계 3명령만으로 연산을 종료할 수 있다. 즉, 명령 메모리(31)로부터는, 4명령만을 페치하면 된다. 단, 특허 문헌 1에 나타낸 SIMD형의 명령 길이에 대하여, 본 발명의 명령은, Width, Count, Picth 등의 오퍼랜드가 부가되어, 명령 길이가 길어진다. 특허 문헌 1의 명령폭을 32비트로 한 경우, 본 발명에서의 명령 길이는 64비트 정도이다. 1회의 명령 메모리 액세스에서 소비하는 전력은 2배로 되지만, 액세스 횟수를 16으로부터 4로 삭감 가능하며, 명령 메모리가 소비하는 총 소비 전력은 2×4÷6으로 표현되어, 전력을 절반으로 삭감할 수 있다. 또한, 1개의 명령으로 2차원의 데이터에 대하여 처리를 행하는 것은, 실질적으로 프로그램의 동일 명령에 의한 루프의 횟수를 삭감한다. 이것은, 명령 메모리(31)의 용량을 삭감할 수 있는 것을 의미한다.
또한, 도 8에서, 입력 데이터(30i)는, 레지스터 파일(304)에 입력되고, 레지스터 파일(304)의 데이터를 갱신 가능하다. 또한, 연산 데이터(315)는, 연산 데이터(30wb)로서 출력된다. 이 입력 데이터(30i)와 연산 데이터(30wb)에 대해서는, 제2 실시예의 설명에서 행한다.
도 10을 이용하여, 제1 실시예에서의 명령 메모리 제어부(32)의 설명을 행한다. 도 10은 명령 메모리 제어부(32)의 블록도이다. 명령 메모리 제어부(32)는, 명령 메모리(31)의 메모리 액세스를 제어하는 블록이다. 명령 메모리(31)에는, CPU부(30)로부터의 명령 페치 액세스와, 시프트형 버스(50)로부터의 액세스가 있으며, 명령 메모리 제어부(32)는 이들 액세스를 조정하여, 명령 메모리(31)를 액세스하는 것이다. 액세스 조정은 조정부(320)에서 행한다. 메모리 액세스 요구는, CPU부(30)로부터 입력되는 명령 페치 요구(37r)와, 데이터 패스부(36)로부터 입력되는 패스(42)이다. 조정 결과에 의해, 셀렉터(323)를 제어하고, 명령 메모리(31)를 액세스하기 위한 어드레스 등의 제어선(40c)을 산력한다.
명령 페치 액세스의 경우, 조정부(320)는, 셀렉터(323)에 명령의 프로그램 카운터(322)의 출력을 선택하고, 명령 메모리(31)를 읽어내기와 함께, 제어선(321)을 출력하고, 프로그램 카운터(322)를 인크리먼트한다. 명령 메모리(31)로부터 반송된 명령(40d)은 명령 레지스터(324)에 저장되고, 명령(37i)으로서, CPU부(30)에 반송한다. 동시에, 명령의 오피코드 필드는 분기 제어부(325)에 입력되고, 분기 명령인지 판단하여, 분기 명령 시에 1로 되는 신호(326)를 조정부(320)에 입력한다. 또한, 분기 조건 레지스터의 읽어내기 인덱스 필드는, 분기 조건 레지스터(327)에 입력된다. 분기 조건 레지스터(327)란 1비트폭의 복수 워드로 구성하는 레지스터군으로, 분기 조건 레지스터의 읽어내기 인덱스 필드에서 워드를 지정하고, 1비트폭의 신호(328)를 조정부(320)에 입력한다.
실제의 분기는, 신호(326)가 1 또는, 신호(328)가 1일 때에 분기된다. 본 조합 이외에는, 분기 명령 이외의 명령으로서 인식한다. 조정부(320)는, 분기 명령 이외의 명령 시에만, 명령 레디 신호(37d)를 반송한다. 분기 명령 시에는, 명령 레디 신호(37d)를 반송하지 않고, 셀렉터(323)를 명령 레지스터(324) 내에 저장된 즉치를 선택한다. 이 때, 본 즉치를 인크리먼트한 값으로 프로그램 카운터(322)를 갱신한다.
본 방식에 따르면, CPU의 명령 페치 요구(37r)의 발행 간격이 수 사이클 필요한 경우, 분기 명령에 의한 명령의 재읽어내기에 필요로 하는 사이클을 완전히 은폐하는 것이 가능하게 되며, 분기에 의한 성능 저하를 억지 가능하게 된다. 본 발명에서의 CPU부(30)에서는, 2차원의 오퍼랜드를 지정함으로써, 명령 페치 요구(37r)의 발행 피치는 크고, 본 효과는 크다.
도 11을 이용하여, 제1 실시예에서의 데이터 메모리 제어부(33)의 설명을 행한다. 도 11은 데이터 메모리 제어부(33)의 블록도이다. 데이터 메모리(35)는, CPU부(30)로부터의 리드 및 라이트 액세스와, 시프트형 버스(50)로부터의 라이트 처리와, 로컬 DMAC(34)로부터의 리드 액세스가 가능하며, 데이터 메모리 제어부(33)는, 이들 액세스의 조정을 행하는 블록이다. 이들 조정은, 조정부(330)에서 행하고, 어드레스 셀렉터(331)와 데이터 셀렉터(332)의 제어를 행한다. 또한, 데이터 메모리(35)와의 신호선(41)은, 41a, 41d, 41w의 3개의 신호선으로 분류된다. 또한 데이터 패스부(36)와의 신호선(43)은, 신호선(43a, 43d, 41l, 43r)의 4개의 신호선으로 분류된다.
우선, CPU부(30)와의 접속에 대하여 설명한다. 리드 명령 시 및 라이트 명령 시의 데이터 메모리 어드레스(45)는, 어드레스 셀렉터(331)를 통과하여, 데이터 메모리 어드레스(41a)로서, 데이터 메모리(35)에 입력된다. 라이트 명령 시에는, 라이트 데이터(39)가 데이터 셀렉터(332)를 경유하여, 라이트 데이터(41w)로서 데이터 메모리(35)에 입력된다. 리드 명령 시에는, 데이터 메모리 어드레스(41a)에 따라, 리드 데이터(41d)가 읽어내어져, 데이터 레지스터(333)에 저장된다. 저장된 리드 데이터는, 리드 데이터(38)로서 CPU부(30)에 반송된다. 또한, 리드 명령의 DestReg에, 마스터 S/D 레지스터의 값을 지정한 경우, 리드 데이터(43r)에 리드 데이터는 출력된다. 다음으로 시프트형 버스(50)로부터의 라이트 처리에서는, 어드레스선(43a)이 어드레스 셀렉터(331)를 통과하여, 데이터 메모리 어드레스(41a)로서, 데이터 메모리(35)에 입력된다. 동시에 데이터 선(43d)이 데이터 셀렉터(332)를 경유하여, 라이트 데이터(41w)로서 데이터 메모리(35)에 입력된다.
마지막으로, 로컬 DMAC(34)로부터의 액세스 시에는, 어드레스(43p)가 어드레스 셀렉터(331)를 통과하여, 데이터 메모리 어드레스(41a)로서, 데이터 메모리(35)에 입력된다. 대응하여 읽어내어진 리드 데이터(41d)는 데이터 레지스터(333)에 저장되고, 리드 데이터(43r)로서 반송된다.
도 12를 이용하여, 제1 실시예에서의 로컬 DMAC(34)의 설명을 행한다. 도 12는 로컬 DMAC(34)의 블록도이다. 로컬 DMAC(34)는, 시프트형 버스(50)에 대하여 데이터 출력하는 처리에서의, 데이터 메모리 어드레스(44da)와, 시프트형 버스(50)로부터 입력되는 데이터 메모리(35)로부터의 리드 액세스에 대응하여, 리드 처리를 행하기 위한 데이터 메모리 어드레스(44da)를 생성하는 기능과, 시프트형 버스(50)에 대하여 데이터 출력할 때의, 시프트형 버스 어드레스(44sa)를 생성하는 기능과, 시프트형 버스(50)에 대하여, 리드 커맨드를 발생시키기 위한 기능을 갖는다. 로컬 DMAC(34)는, 신호선(44)으로 데이터 패스부(36)만이 접속된다. 여기서, 신호선(44)은, 신호선(44pw, 44swb, 44da, 44sa, 44dw)의 5종의 신호선으로 분류할 수 있다.
로컬 DMAC(34) 내에는, 리드 명령에 의해 재기입 가능한 마스터 D 레지스터(340) 및 마스터 S 레지스터(341)와, 시프트형 버스(50)로부터 기입하는 것이 가능한 슬레이브 D 레지스터(342) 및 슬레이브 S 레지스터(343)의 4세트의 레지스터군을 갖는다. 각 레지스터의 포맷을 표 12 내지 표 15에 나타낸다.
마스터 D 레지스터(340)의 포맷
필드 |
필드의 의미 |
Mode |
마스터 D 레지스터와 마스터 S 레지스터의 페어에서의 동작 모드를 지정한다. 값0: 데이터 라이트 모드 값1:리드 커맨드 모드 |
MDIR |
데이터 출력, 혹은 데이터 리드 시에서의 데이터 전송에서, 우회전 시프트형 버스를 사용할지 좌회전 시프트형 버스를 사용할지 지정한다. 값0: 좌회전 시프트형 버스를 사용함 값1: 우회전 시프트형 버스를 사용함 |
MBID |
리드하는 영상 처리 엔진의 블록 ID를 지정한다. 라이트 모드 시에는, 본 값을 사용하지 않는다. |
MADDR |
리드하는 데이터 메모리(35)의 액세스 어드레스를 지정한다. |
MWidth |
리드하는 데이터의 횡폭을 지정한다. |
MCount |
리드하는 데이터의 높이를 지정한다. |
MPitch |
리드하는 데이터의 간격을 지정한다. |
Last |
최종 데이터 전송 시에, 시프트형 버스 인터페이스의 Last 신호를 세트할지 하지 않을지를 지정한다. |
마스터 S 레지스터(341)의 포맷
필드 |
필드의 의미 |
SBID |
라이트하는 영상 처리 엔진의 블록 ID를 지정한다. 라이트 모드 시에는, 자신의 블록 ID를 지정한다. 리드 커맨드 시에는, 리드 데이터의 반송처 블록의 블록 ID를 지정한다. |
SBIDMsk |
라이트하는 영상 처리 엔진의 블록 ID의 비교 마스크를 지정한다. 본 값이 "0"인 필드만, 블록 ID의 비교를 행한다. 단, 리드 시에는, 본 값은 모두 "0"으로 지정한다. |
SDIR |
데이터 리드 커맨드 모드에서, 우회전 시프트형 버스를 사용할지 좌회전 시프트형 버스를 사용할지 지정한다. 값0: 좌회전 시프트형 버스를 사용함 값1: 우회전 시프트형 버스를 사용함 |
SADDR |
라이트하는 데이터 메모리(35)의 액세스 어드레스를 지정한다. |
SWidth |
라이트하는 데이터의 횡폭을 지정한다. |
SCount |
라이트하는 데이터의 높이를 지정한다. |
SPitch |
라이트하는 데이터의 간격을 지정한다. |
마스터 D 레지스터(342)의 포맷
필드 |
필드의 의미 |
VALID |
데이터 리드를 실행 중인지를 나타낸다. 값0: 무효 값1; 유효 |
MDIR |
데이터 리드 시에서의 데이터 전송에서, 우회전 시프트형 버스를 사용할지 좌회전 시프트형 버스를 사용할지 지정한다. 값0: 좌회전 시프트형 버스를 사용함 값1: 우회전 시프트형 버스를 사용함 |
MADDR |
리드하는 데이터 메모리(35)의 액세스 어드레스를 지정한다. |
MWidth |
리드하는 데이터의 횡폭을 지정한다. |
MCount |
리드하는 데이터의 높이를 지정한다. |
MPitch |
리드하는 데이터의 간격을 지정한다. |
Last |
최종 데이터 전송 시에, 시프트형 버스 인터페이스의 Last 신호를 세트할지 하지 않을지를 지정한다. |
슬레이브 S 레지스터(343)의 포맷
필드 |
필드의 의미 |
SBID |
라이트하는 영상 처리 엔진의 블록 ID를 지정한다. 통상, 데이터 리드 시에 사용하는 본 필드는, 데이터 리드 커맨드를 발행한 영상 처리 엔진의 블록 ID로 된다. 단, 서로 다른 블록 ID가 지정되어 있는 경우, 그 블록 ID를 갖는 영상 처리 엔진 등에 데이터가 반송된다. |
SADDR |
라이트하는 데이터 메모리(35)의 액세스 어드레스를 지정한다. |
SWidth |
라이트하는 데이터의 횡폭을 지정한다. |
SCount |
라이트하는 데이터의 높이를 지정한다. |
SPitch |
라이트하는 데이터의 간격을 지정한다. |
로컬 DMAC(34)를 사용한 데이터 전송은, 3종의 동작 모드를 갖는다.
1개째는, 데이터 라이트 모드이다. 데이터 라이트 모드에서는, 마스터 D 레지스터(340)의 파라미터를 이용하여, 자신의 데이터 메모리(35)를 읽어내고, 마스터 S 레지스터(341)의 파라미터를 이용하여, 다른 영상 처리 엔진 등의 블록에 데이터를 전송하고, 데이터 메모리(35) 등의 어드레스 맵핑된 영역에 데이터를 라이트하는 모드이다.
2개째는, 리드 커맨드 모드이다. 리드 커맨드 모드에서는, 마스터 D 레지스터와 마스터 S 레지스터의 값 그 자체를 데이터로 하여, 다른 영상 처리 엔진 등의 블록에 데이터를 전송하고, 그 외 블록 내의 슬레이브 D 레지스터와 슬레이브 S 레지스터에 값을 저장하는 처리이다. 이것은, 다른 블록에의 리드 요구로서 동작한다. 또한, 리드 커맨드 모드 시에는, 시프트형 버스(50)의 인터페이스로서, CMD 신호를 1로서 전송한다. 리드 커맨드를 수탁하는 블록은, CMD 신호에 의해, 그 시프트형 버스 전송이 리드 커맨드인지를 인식한다.
3개째는, 리드 모드이다. 앞의 리드 커맨드 모드에서 수탁한 리드 요구에 대하여, 슬레이브 D 레지스터(342)의 파라미터를 이용하여, 데이터 메모리(35)를 읽어내고, 슬레이브 S 레지스터(343)의 파라미터를 이용하여, 다른 영상 처리 엔진 등의 블록에 데이터를 전송하고, 데이터 메모리(35) 등의 어드레스 맵핑된 영역에 데이터를 저장하는 모드이다. 이들 3개의 모드의 조합에 의해, 영상 처리 엔진 등의 블록간에서, 데이터 전송을 실현한다.
마스터 D 레지스터(340)와 마스터 S 레지스터(341)는, CPU부(30)가 발행하는 리드 명령에 의해 갱신 가능하며, 이 때, 신호선(44pw)으로부터 데이터가 입력되고, 2개의 레지스터가 갱신된다. 즉, 미리, 데이터 전송 내용을 기술한 기술자를 데이터 메모리(35)에 저장하고, 그 내용을 마스터 D 레지스터(340)와 마스크 S 레지스터(341)에 카피함으로써, 데이터 전송을 개시한다.
2개의 레지스터가 갱신된 시점에서, 마스터 D 레지스터(340)의 Mode 필드에 의해 2개의 상태로 천이한다. Mode 필드가 데이터 라이트 모드를 나타내고 있는 경우, 어드레스 셀렉터(344)를 통하여, 마스터 D 레지스터(340)의 MADDR, MWidth, MCount, MPitch는 데이터 메모리 어드레스 생성기(346)에 전송된다. 데이터 메모리 어드레스 생성기(346)는, 데이터 메모리(35)를 읽어내기 위한 어드레스 생성을 행하고, 어드레스(44da)를 출력한다. 어드레스 생성의 방식은, CPU부(30) 내의 명령 디코드부(303)가 생성하는 액세스 어드레스(45)와 동일한 방식으로 생성된다. 따라서, 데이터 메모리 어드레스 생성기(346)에는 Wc 카운터를 갖고, MWidth, MCount, MPitch를 각각 Width, Count, Pitch와 치환한 어드레스 생성에 의해, 2차원 직사각형의 어드레스를 생성한다.
마찬가지로, 마스터 S 레지스터(341)의 SADDR, SWidth, SCount, SPitch는 어드레스 셀렉터(345)를 경유하여, 시프트형 버스 어드레스 생성기(347)에 입력되고, 시프트형 버스(50)에 출력하는 어드레스를 생성하고, 어드레스(44sa)를 출력한다. 이 시프트형 버스 어드레스 생성기(347)에 의한 어드레스 생성도, 데이터 메모리 어드레스 생성기(346)의 어드레스 생성과 마찬가지로, 2차원 직사각형을 표현한다. 이들 2개의 어드레스에 의해, 데이터 메모리(35)로부터 순차적으로 리드 데이터(43r)가 읽어내어지고, 그 결과, 신호선군(50b)으로서, 영상 처리 엔진(66)으로부터 시프트형 버스(50)에 대하여 데이터 라이트 처리를 실현한다. 이 때, 전송처 블록은, 마스터 S 레지스터(341)의 SBID가 나타내는 필드이다. 이 때, MDIR 플래그에 따라, 우회전의 시프트형 버스를 사용할지, 좌회전의 시프트형 버스를 사용할지 결정된다.
또한, 본 방식에서는, MWidth, MCount, MPitch와 SWidth, SCount, SPitch 각각을 사용하여, 데이터 메모리(35)의 어드레스(44da)와 시프트형 버스에 출력하기 위한 어드레스(44sa)를 생성한다. 이와 같이, 2개의 레지스터 세트에서, 각각 어드레스 생성을 행함으로써, 2차원 직사각형의 형을 변환하여 데이터 전송을 가능하게 하고 있다. 단, 동일 직사각형으로서 전송하는 경우에는, 한쪽만의 파라미터로 어드레스 생성 가능하다.
한편, Mode 필드가 리드 커맨드 모드라고 나타내고 있는 경우, 마스터 D 레지스터(340)와 마스터 S 레지스터(341)의 값은, 직접 출력 신호(44swb)로서 출력되고, 리드 커맨드를 다른 블록에 전송한다. 이 때, 전송처 블록은, 마스터 D 레지스터(340)의 MBID 필드가 나타내는 블록이다. 전송처 블록이 본 리드 커맨드를 수탁한 경우, 슬레이브 D 레지스터(342)와 슬레이브 S 레지스터(343)를 갱신하고, 리드 모드로서 처리를 개시한다. 리드 커맨드는, 패스(44sw)를 통하여, 슬레이브 D 레지스터(342)와 슬레이브 S 레지스터(343)에 갱신된다. 전송처 블록이 리드 커맨드를 수탁 후, 앞의 데이터 라이트 처리와 거의 마찬가지의 동작으로, 리드 데이터를 읽어내고, 시프트형 버스(50)에 대하여 출력한다. 슬레이브 D 레지스터(342)의 MADDR, MWidth, MCount, MPitch는, 어드레스 셀렉터(344)를 경유하여, 데이터 메모리 어드레스 발생기(346)에 입력되며, 어드레스(44cd)로서 데이터 메모리(35)를 액세스한다. 그 후의 동작은, 데이터 라이트 시와 마찬가지이다. 마찬가지로, 슬레이브 S 레지스터(343)의 SADDR, SWidth, SCount, SPitch는, 셀렉터(345)를 경유하여, 시프트형 버스 어드레스 생성기(347)에 입력되고, 어드레스(44sa)가 생성된다. 그 후의 동작은, 데이터 라이트 시와 마찬가지이다. 이들 3개의 로컬 DMAC(34)의 동작에 의해, 시프트형 버스(50)에서는, 어드레스와 데이터가 동일 사이클에서 출력 가능한 라이트 트랜잭션만으로 데이터 전송을 실현한다. 일반적으로, 버스의 성능을 향상하기 위해서, 어드레스와 데이터를 분리한 스플리트형의 버스가 사용된다. 스플리트형 버스란, 어드레스와 데이터를 동일한 트랜잭션 ID 등의 ID로 관리하고, 리퀘스트 슬레이브 측은, 어드레스를 FIFO 등에 큐잉하여, 데이터 수신까지 대기한다. 따라서, 큐나 FIFO의 단수에 의해, 버스 성능이 제한된다. 한편, 본 방식에서는, 모든 버스 전송에서, 동일 사이클에서 어드레스와 데이터를 전송 가능하며, FIFO 단수 등에 의한 성능의 포화가 발생하지 않는다.
또한, 로컬 DMAC(34)의 동작은, 리드 명령에 의해 기동되고, 기동된 시점에서, CPU부(30)는 다음의 명령을 실행 가능하게 된다. 단, 로컬 DMAC(34)를 사용한 전송이 실행 중에만, 다음의 로컬 DMAC(34)의 사용은 금지 상태로 되고 스톨한다. 단, 로컬 DMAC(34) 기동의 발행 피치를 크게 함으로써, 경합에 의한 성능 저하는 발생하지 않는다. 그 동안, CPU부(30)는 다른 처리 시퀀스를 실행함으로써, CPU부(30)의 처리와 블록간 전송을 병렬로 실행 가능하며, 필요한 처리 사이클수를 삭감할 수 있다. 또한, 리드 전송에 관해서는, 1세트의 슬레이브 D 레지스터(342)와 슬레이브 S 레지스터(343)만 갖기 때문에, 리드 처리 실행 중에는, 다음의 리드 커맨드 수탁을 금지하고, 시프트형 버스(50) 상에서 종단을 행하지 않는다. 시프트형 버스(50)는, 루프 형상을 하고 있고, 본 리드 커맨드가 시프트형 버스(50)를 일주한 시점에서, 리드 커맨드를 수탁함으로써, 리드 커맨드의 재기동을 가능하게 한다. 블록간의 데이터 전송의 대부분을 라이트 모드로 행하고, 리드의 발생 빈도를 억제함으로써, 이 성능 저하를 저감 가능하다. 영상 처리는, 데이터 플로우적인 동작이 많고, 블록간 전송은, 라이트 모드의 사용이 대부분으로 되기 때문에, 본 방식은 성능 저하를 억지할 수 있다.
로컬 DMAC(34)에 의한 전송에서는, 시프트형 버스(50)에 대하여, "Last" 신호를 출력할 수 있다. 이것은, 마스터 D 레지스터(340) 혹은 슬레이브 D 레지스터(342) 내의 Last 필드가 "1"인 전송 시, 2차원 직사각형의 전송의 최후의 전송 시에, 1 사이클만 어서트한다. 이에 의해, 대상으로 하는 다이렉트 메모리 전송이 종료하였는지 인식 가능하게 된다. 이것은, 후술하는 블록간 동기 시에 사용한다.
도 13을 이용하여, 제1 실시예에서의 데이터 패스부(36)의 설명을 행한다. 도 13은 데이터 패스부(36)의 블록도이다. 데이터 패스부(36)는, 시프트형 버스(50)과, 명령 메모리 제어부(32)와 데이터 패스부(33)와 로컬 DMAC(34) 사이의 데이터 주고 받기를 행하는 블록이다. 우선, 시프트형 버스부(50)로부터의 데이터 입력에 대하여 설명한다. 우회전 시프트형 버스의 입력인 신호선군(51a)과 좌회전 시프트형 버스의 입력인 신호선군(51c)은, 명령 메모리(31)에의 기입 패스인 패스(42)와, 데이터 메모리(35)에의 기입 패스로, 그 중 어드레스인 패스(43a)와 데이터인 패스(43d), 및 로컬 DMAC(34) 내의 슬레이브 D 레지스터(342)와 슬레이브 S 레지스터(343)에의 기입 패스인 패스(44sw)에 접속된다. 시프트형 버스(50)에의 데이터 출력인 신호선군(51b)은, 2개의 블록으로부터 입력되고, 1개는 데이터 메모리(35)로부터의 리드 데이터(43r)이며, 2개째는, 로컬 DMAC(34)로부터의 출력인, 마스터 D 레지스터(340)와 마스터 S 레지스터(341)의 직접 출력 신호(44swb)와, 시프트형 버스(50)에의 출력 어드레스(44sa)이다. 이들은, 배타적으로 처리되며, 시프트형 버스(50)의 프로토콜로써 제어된다. 또한, 로컬 DMAC(34)가 데이터 메모리(35)를 읽어내기 위한 어드레스(44da)는, 데이터 메모리 제어부(33)의 어드레스(43p)에 접속된다.
이와 같이, 제1 실시예에 따르면, 명령 메모리(31)의 액세스 빈도 삭감과, 각 블록에의 클럭 공급 정지 등에 의해, 소비 전력을 삭감 가능하다. 또한, 분기 명령에 은폐나, 로컬 DMAC(34)와의 병렬 동작 등에 의해, 실질적으로 처리 사이클수를 삭감하여, 저전력화를 실현한다.
(제2 실시예)
도 14를 이용하여, 본 발명의 제2 실시예에 대하여 설명한다. 도 14는, 본 실시예에서의 영상 처리 엔진(66)의 블록도이다. 도 6에 도시한, 제1 실시예의 영상 처리 엔진(66)에 대하여, 3개의 차분이 있다. 1개째는, CPU부(30)의 입력 데이터(30i)와 연산 데이터(30wb)가, 벡터 연산부(46)에 접속된 것이다. 입력 데이터(30i)는, CPU부(30) 내의 레지스터 파일(304)에 입력하는 데이터로서, 레지스터 파일(304)의 데이터를 갱신 가능하다. 연산 데이터(30wb)는, CPU부(30)의 연산 결과로서, 벡터 연산부(46)에 입력된다. 2개째는, 도 6의 명령 메모리 제어부(32)에 대해, 명령 메모리 제어부(47)가 접속된다. 명령 메모리 제어부(47)는, 복수의 프로그램 카운터를 갖고, 명령 메모리(31)의 제어를 행한다. 이것에 수반하여, 3개째의 차분은, 벡터 연산부(46)가, 명령 메모리 제어부(47)에 패스(37)를 통하여 접속된다.
도 15에, 제2 실시예에서의 벡터 연산부(46)의 블록도를 도시한다. 벡터 연산부(46)의 기능은, 도 8에서 도시한 CPU부(30)에 대하여, 데이터 메모리(35)에 대한 액세스를 할 수 없는 점이다. 인터페이스의 차는, 패스(38), 패스(39), 패스(45)가 존재하지 않는다. 또한, 연산부(463)는, 도 8의 연산부(313)와 동일 구성, 혹은, 명령 세트가 상이해도 된다. 벡터 연산부(46)의 연산 내용에 대해서는, 도 21 내지 도 26을 이용하여 후술한다.
도 16에 명령 메모리 제어부(47)의 블록도를 도시한다. 명령 메모리 제어부(47)와 도 10에 도시한 명령 메모리 제어부(32)의 차는 2개이다. 1개째는, 조정부(470)에서, CPU부(30)와 벡터 연산부(46)로부터의 2개의 명령 페치 요구(37r)를 수탁하고, 조정한다. 조정 결과(471)는, 벡터 연산부(46)용의 프로그램 카운터(472)에 입력된다. 또한, 셀렉터(475)를 제어하여, 명령 메모리(31)를 액세스하기 위한 어드레스 등의 제어선(40c)을 출력한다. 이와 같이, 명령 메모리(31)로부터는 2개의 CPU의 명령열이 저장되고, 명령 메모리(31)를 공유하는 것이 가능하다. 제1 실시예의 설명에서, 본 방식에서는, 명령 페치의 발행 간격을 크게 할 수 있다고 설명하였다. 따라서, 복수의 CPU가 공유의 명령 메모리(31)를 액세스한 경우에도, 액세스 경합이 발생하는 빈도는 낮아, 성능 저하를 억지 가능하다. 2개째의 차분은, 동기 제어부(473)이다. 동기 제어부(473)는, CPU부(30)와 벡터 연산부(46)의 동기 처리를 행하는 블록으로, 각 CPU에 대한 스톨 신호(474)를 생성한다.
도 14 및 도 15의 설명에서, CPU부(30)와 벡터 연산부(46)의 연산 결과는, 다른 쪽의 레지스터 파일(304과 462)에 저장 가능하다고 설명하였다. 동기 제어는, 2개의 방식이 있으며, 1개는, 입력 데이터의 준비가 되어 있는지를 나타내는 동기화이다. 예를 들면, CPU부(30)의 연산 데이터(30wb)가 유효하게 된 시점에서, 벡터 연산부(46)는, 그 연산 데이터(30wb)를 사용 가능하게 된다. 따라서, 연산 데이터(30wb)가 유효로 될 때까지, 벡터 연산부(46)는 스톨해야만 한다. 이것을 입력 동기로 한다. 2개째는, 기입처의 레지스터 파일이, 기입 가능 상태인지를 아는 동기화이다. 예를 들면, 벡터 연산부(46)의 레지스터 파일(462)이 기입 가능하게 될 때까지, CPU부(30)는 스톨해야만 한다. 이것을 출력 동기로 한다.
또한, 다른 영상 처리 엔진(6)으로부터, 로컬 DMAC(34)를 사용하여, 데이터 메모리(35)에 데이터를 다이렉트 메모리 전송하고, 본 전송 데이터를 CPU부(30)가 읽어내는 경우, 그 다이렉트 메모리 전송이 종료하고 있는 것을 인식해야만 한다. 데이터 전송이 종료하고 있지 않은 경우, CPU부(30)는 스톨한다. 이것을 블록간 동기라고 부른다. 또한, 블록간 동기에 대해서는, 제1 실시예에서도 사용 가능하지만, 이 제2 실시예에서만 설명을 행한다. 동기 제어부(473)는, 이들 3개의 동기화 처리를 행한다. 다음으로, 동기 제어 방식에 대하여 설명한다. 동기 제어에는, CPU마다 배치되는 4개의 카운터와, 블록에 1페어로 배치되는 2개의 카운터와, 명령 상에 정의된 5개의 플래그에 의해 동기화를 행한다. 표 16에 카운터의 정의를 나타낸다. 또한, 표 17에 명령 내에 배치하는 동기화 필드의 정의를 나타낸다.
동기화 카운터의 정의
카운터명 |
내용 |
SRC(슬레이브 요구수 카운터) |
입력 동기를 행한 횟수를 카운트하는 카운터. |
ERC(실행 레디 카운터) |
후단 CPU가 사용하는 데이터가 준비 가능하게 되었을 때에 카운트업하는 카운터. |
MRC(마스터 요구수 카운터) |
출력 동기를 행한 횟수를 카운트하는 카운터. |
RFRC(레지스터 파일 레디 카운터) |
레지스터 파일에 몇 개의 빈 곳이 있는지를 나타내는 카운터. |
DARC(데이터 메모리 액세스 요구수 카운터) |
블록간 동기를 행한 횟수를 카운트하는 카운터. |
DMRC(데이터 메모리 레디 카운터) |
다른 엔진으로부터 데이터 메모리(35)에 대해 다이렉트 메모리 액세스에 의한 라이트를 행한 횟수를 카운트하는 카운터. |
명령 내의 동기화 필드
필드 |
필드의 의미 |
ISYNC(입력 동기 인에이블 플래그) |
입력 동기가 필요한 명령에서 본 필드가 "1"인 경우, 입력 동기 처리를 행한다. 본 필드가 "0"인 경우, 입력 동기를 행하지 않고, 명령을 실행한다. 입력 동기에서, 실행 가능하게 된 시점에서, 슬레이브 요구수 카운터 SRC를 카운트업한다. |
DRE(데이터 레디 인에이블 플래그) |
본 필드가 "1"인 경우, 명령 실행 종료 시점에서, 다음단 블록에 배치된 실행 레디 카운터 ERC를 카운트업한다. |
OSYNC(출력 동기 인에이블 플래그) |
출력 동기가 필요한 명령에서 본 필드가 "1"인 경우, 출력 동기 처리를 행한다. 본 필드가 "0"인 경우, 출력 동기를 행하지 않고, 명령을 실행한다. 출력 동기를 필요로 하는 명령이 종료 시점에서, 마스터 요구수 카운터 MRC를 카운트업한다. |
RFR(레지스터 파일 레디 플래그) |
본 필드가 "1"인 경우, 명령 종료 시점에서, 전단 블록에 배치된, 자신 블록의 레지스터 파일에 빈 곳이 몇 개 있는지를 카운트하는 레지스터 파일 레디 카운터를 카운트업한다. |
MSYNC |
정보 처리 엔지간의 블록 동기 처리를 제어하는 필드에서 리드 명령만 본 필드를 갖는다. 본 필드가 "1"인 경우, 정보 처리 엔진간의 동기 처리를 행한다. 블록간 동기에서, 본 리드 명령이 실행 가능하게 된 시점에서, 데이터 액세스 요구수 카운터 DARC를 카운트업한다. |
우선, 도 17을 이용하여, 입력 동기에 대하여 설명한다. CPU부(30)의 연산 데이터(30wb)가 유효하게 된 시점에서, 벡터 연산부(46)는, 그 연산 데이터(30wb)를 사용 가능하게 된다. 따라서, 연산 데이터(30wb)가 유효로 될 때까지, 벡터 연산부(46)는 스톨할 필요가 있다. CPU부(30)의 명령에서, DRE 필드가 1인 명령이 종료 시점에서, 벡터 연산부(46) 내의 실행 레디 카운터 ERC〔벡터 연산부(46)〕를 카운트업한다. 본 명령에서, 연산 데이터(30wb)를 벡터 연산부(46)에 저장하고, 본 명령 종료 시점에서, 벡터 연산기(46)는, 데이터(30wb)를 사용한 연산이 가능하게 된다. 지금까지 벡터 연산기(46)에서의, ISYNC를 가진 명령은 스톨한다. 본 스톨 조건은, ERC〔벡터 연산부(46)〕가 SRC〔벡터 연산부(46)〕보다도 작거나 동일할 때로, ISYNC를 가진 명령 시이다. 앞의 실행 레디 카운터 ERC〔벡터 연산부(46)〕가 카운트업된 시점에서, 실행 레디 카운터 ERC〔벡터 연산부(46)〕는 슬레이브 요구수 카운터 SRC〔벡터 연산부(46)〕보다도 커진다. 이 시점에서, 벡터 연산기(46)는, 스톨을 해제하고 연산을 스타트할 수 있다. 동시에 슬레이브 요구수 카운터 SRC〔벡터 연산부(46)〕를 카운트업한다. 이 2개의 카운터의 갱신 1세트에서, 1개의 입력 동기를 행한다.
또한, 벡터 연산기(46)의 처리 속도가 느리고, SRC와 ERC의 카운트업에 괴리가 있었던 경우에도, CPU부(30)에 의한 연산 데이터(30wb)의 준비, 즉, 실행 레디 카운터 ERC의 카운트업은 가능하며, 데이터의 프리 페치로서 동작 가능하다.
마찬가지로, 벡터 연산기(46)가 생성한 연산 데이터(30i)를 CPU부(30)가 사용하는 경우에는, 앞의 설명과는 반대로, 벡터 연산기(46)의 명령에서, DRE 필드를 사용하고, CPU부(30)의 명령에서 ISYNC 필드를 사용하며, CPU부(30) 내에 배치된 실행 레디 카운터 ERC〔CPU부(30)〕와 슬레이브 요구수 카운터 SRC〔CPU부(30)〕에 의해, 입력 동기가 가능하게 된다. 또한, 여기서는, 실행 레디 카운터 ERC와 슬레이브 요구수 카운터 SRC를 사용한 입력 동기에 대하여 설명하였지만, 1비트폭의 플래그이어도 가능하다. 예를 들면, 실행 레디 카운터 ERC의 갱신 조건으로 플래그를 세트한다. 본 플래그와 연산 데이터의 수신측의 CPU 명령의 ISYNC 플래그가 모두 1로 될 때까지, 2개의 CPU는 스톨한다. 스톨 해제 시점에서, 플래그를 클리어함으로써, 적은 논리 회로로, 2개의 CPU간의 동기화를 가능하게 한다.
다음으로, 도 18을 사용하여, 출력 동기에 대하여 설명한다. 출력 동기도 입력 동기와 마찬가지로 2개의 카운터와 2개의 명령 내에서 정의하는 동기 필드에 의해 동기화를 행한다. 출력 동기는, 기입처의 레지스터 파일이, 기입 가능 상태인지를 아는 동기화로서, 예를 들면, 벡터 연산부(46)의 레지스터 파일(462)이 기입 가능하게 될 때까지, CPU부(30)는 스톨해야만 한다. 입력 동기는, 후단 CPU의 스톨이었던 것에 대해, 출력 동기는 전단 CPU의 스톨이다.
본 예의 동작에서는, 벡터 연산기(46)의 명령에서, RFR 필드가 1로 세트된 명령이 종료한 시점에서, 벡터 연산기(46)의 레지스터 파일(462)에 대하여, CPU부(30)로부터 기입 가능하게 한다. 이 RFR 필드가 1로 세트된 명령이 종료한 시점에서, CPU부(30)의 레지스터 파일 레디 카운터 RFRC〔CPU부〕를 카운트업한다. 지금까지, CPU(30)부의 OSYNC가 세트된 명령은 기동 요구 시점에서 스톨한다. 본 스톨 조건은, 레지스터 파일 레디 카운터 RFRC〔CPU부〕의 값이, 마스터 요구수 카운터 MRC〔CPU부〕보다도 작거나 동일할 때이다. CPU부(30)의 OSYNC가 세트된 명령을 기동 수탁 시점에서, 마스터 요구수 카운터 MRC〔CPU부〕를 카운트업한다. 본 방식도 입력 동기와 마찬가지로, 전단 CPU의 처리가 매우 느리고, 후단 CPU의 처리가 빠른 경우, 레지스터 파일의 빈 용량을 많이 비우는 것이 가능하다. 이 경우, 전단 CPU의 출력 동기 시에는 스톨이 발생하지 않는다. 마찬가지로, CPU부(30)의 레지스터 파일(304)이 기입 가능하게 될 때까지, 벡터 연산부(46)는 스톨하는 출력 동기에서는, 벡터 연산부(46)가 OSYNC를 사용하고, CPU부(30)가 RFR 필드를 세트함으로써, 2CPU간의 출력 동기를 실현한다. 이들 입력 동기와 출력 동기의 조합에 의해, 2개의 CPU간의 레지스터 파일 레벨의 세립도의 동기화를 실현한다. 이들 동기화 방식에서는, 명령 자신에 동기화 필드를 갖는 것이 특징이다.
마지막으로, 도 19를 이용하여, 블록간 동기에 대하여 설명한다. 블록간 동기란, 다른 정보 처리 엔진(6) 등이, 다이렉트 메모리 전송에 의해, 데이터 메모리(35)에 데이터를 저장하고, 본 전송 데이터를 CPU부(30)에 의한 리드 명령에서 사용할 때의 동기화이다. CPU부(30)는, 다이렉트 메모리 전송이 종료하고, 모든 데이터가 데이터 메모리(35) 내에 저장되어 있는 것을 인식할 필요가 있으며, 저장되어 있지 않은 경우, 입력 데이터는 무효인 값으로 되기 때문에, 스톨해야만 한다. 즉, 리드 명령 시에서, 그 리드 명령이 실행 가능한지의 여부를 조사하기 위해, 앞에 나타낸, 입력 동기와 거의 마찬가지의 방식으로 동기화를 행한다. 즉, 2개의 카운터의 대소 비교에 의해 동기화를 행한다. 1개째의 카운터는, 데이터 메모리 레디 카운터 DMRC로서, 앞에 나타낸 시프트형 버스(50)의 전송에서, "Last" 신호를 수반하는 전송으로 카운트업하는 카운터이다. 이것은 로컬 DMAC(34)의 마스터 D 레지스터(340)의 "Last" 플래그의 설정에 의해, 다이렉트 메모리 전송의 최종 전송, 즉, 2차원 직사각형 전송의 최후의 전송 시점에서 어서트된다. 즉, 다이렉트 메모리 전송이 종료한 것을 인지 가능한 신호에서, 이것이 "1" 일 때에, 데이터 메모리 레디 카운터 DMRC를 카운트업한다. 즉, CPU부(30)로부터 본 경우, 데이터의 준비가 되어 있는 것을 나타낸다.
2개째의 카운터는, 데이터 메모리 액세스 카운터 DARC로서, 리드 명령의 오피코드 내에 배치된 MSYNC가 "1"인 명령이 실행 가능하게 된 시점에서 카운트업하는 카운터이다. 따라서, CPU부(30)가 리드를 실행 가능한 타이밍은, 데이터 메모리 레디 카운터 DMRC가 데이터 메모리 액세스 카운터 DARC보다도 클 때이다. 바꿔 말하면, 데이터 메모리 레디 카운터 DMRC가 데이터 메모리 액세스 카운터 DARC보다도 동일하거나 작은 경우, CPU부(30)는 스톨한다. 이와 같이, 리드 명령이라고 하는 명령 레벨에서, 블록간의 동기화를 가능하게 한다.
이와 같이, 제2 실시예에 따르면, 복수의 2차원의 오퍼랜드를 사용 가능한 CPU가 명령 메모리를 공유화한 경우에도, 명령의 발행 간격이 크기 때문에, 성능 저하를 억지 가능함과 함께, 명령 메모리의 공유화에 의한 메모리 면적의 삭감이 가능하다. 또한, CPU부(30)에서, 데이터 메모리(35)에의 리드와 라이트 처리, 및 벡터 연산기(46)에서, 연산 처리를 행하고, 동기 수단에서 2개의 CPU간의 레지스터 파일 레벨의 동기화에 의해, 연산 스루풋을 향상할 수 있다. 또한, 명령 레벨에서, 블록간의 동기화를 실현한다.
(제3 실시예)
도 20을 이용하여, 제3 실시예에 대하여 설명한다. 도 20은, 본 실시예에서의 영상 처리 엔진(66) 내에 배치되는 CPU부의 구성이다. 제1 실시예에서는, 1개의 CPU부(30)로 구성하고, 제2 실시예에서는, CPU부(30)와 벡터 연산부(46)의 2개의 CPU에 의한 구성으로 설명하였다. 제3 실시예에서는, 2개 이상의 복수의 CPU를 직렬 또한 링형으로 접속하는 것이다. 도 3에서는, 선두의 CPU에, 데이터 메모리(35)에의 액세스가 가능한 CPU부(30)를 배치하고, 복수의 벡터 연산부(46, 46n)를 직렬 접속하고, 종단에 데이터 메모리(35)에의 액세스가 가능한 CPU부(30s)를 접속한다. CPU부(30s)의 연산 데이터(30i)는, 재차, CPU부(30)의 입력 데이터부에 접속된다. 이 때, 각 CPU는 각각 프로그램 카운터를 갖는 구성으로 되고, 실제로는 도 16에서 도시한 명령 메모리 제어부(47) 내의 프로그램 카운터를 복수 갖는 구성으로 된다. 조정부(470)는, 복수의 명령 페치 요구(37r)로부터, 명령 페치의 선택을 행한다.
또한, 동기화 처리에 대해서도, 제어가 상이하다. 제2 실시예의 설명에서는, 2개의 인접하는 CPU간의 입력 동기 방식과 출력 동기화 방식에 대하여 설명하였다. 제3 실시예에서도 마찬가지의 동기화 처리를 행한다. 즉, 인접하는 CPU끼리에서, 입력 동기와 출력 동기를 행하는 것이다. 또한, 최종단의 CPU부(30s)와 초단의 CPU(30) 사이에서도, 동기화를 행한다. 또한, CPU부(30)와 CPU부(30s)는 모두 데이터 메모리(35)를 액세스한다. 따라서, 도 11에서 도시한 데이터 메모리 제어부(33)도, 복수의 데이터 메모리 액세스를 제어한다. 본 방식에 따르면, CPU부(30)에서, 데이터 메모리(35)로부터의 데이터 읽어들이기를 행하고, 벡터 연산부(46)에 전송한다. 벡터 연산기(46)의 연산 결과를 벡터 연산기(46n)에 전송하고, 벡터 연산기(46n)는, 다음의 처리를 행하고, CPU부(30s)에 연산 데이터를 전송한다. CPU부(30s)는, 연산 결과를 데이터 메모리(35)에 전송함으로써, 데이터의 리드, 연산, 데이터의 저장이 파이프라인에서 동작하여, 높은 연산 스루풋을 얻을 수 있다. 특히 데이터 메모리(35)를 인터리브 구성으로 하고, 리드 명령과 라이트 명령, 및 다이렉트 메모리 액세스의 블록을 분할함으로써, 높은 스루풋을 얻는 것이 가능하다.
또한 본 방식에 따르면, 2개 이상의 CPU를 직렬 또한 링적으로 접속한 구성에서도, CPU간의 동기화를 수반하는 멀티 CPU 구성을 실현한다. 또한, CPU수가 늘어난 경우에도, 레지스터 파일의 리드 라이트 포트수는 증가하지 않아, 네트워크나 레지스터 파일의 면적을 증가시키지 않는다. 예를 들면, 상게한 특허 문헌 3에 개시된 VLIW 구성 등에 의한 CPU수의 증가에서는, 연산기수에 비례하여, 레지스터의 포트수가 증가하고, 면적 코스트가 커지는 것에 대해, 본 방식의 직렬 접속에서는, 이것이 증가하지 않는다.
또한, VLIW 방식에서는, 복수의 연산기가 활성하는 타이밍이 상이하다. 예를 들면, 동일 연산 루프 내에서, 1개의 연산기는 메모리 리드를 행하고, 2개째의 연산기는, 범용 연산을 행하고, 3개째의 연산기가 메모리 라이트하는 예를 생각한다. 이 때, 각각의 CPU가 실제로 동작하는 연산 사이클수는 상이하지만, 동일 연산 루프에서 처리가 이루어지기 때문에, 연산기의 가동률이 저하하고, 그 결과, 필요 처리 사이클수가 증가하여, 소비 전력이 증가한다. 한편, 본 방식에서는, 각 CPU가 각각 프로그램 카운터를 갖는 것이 가능하며, 다른 CPU의 동작 및 프로그램 카운터의 동작에 의존하지 않고, 각자의 연산을 처리할 수 있다. 예를 들면, 10회의 루프 중, 5회째 6회째 사이에, 1개의 파라미터를 변경하는 경우, VLIW 방식에서는, 5회씩의 2루프로 명령열을 기술할 필요가 있지만, 본 방식에서는, 각각 프로그램 카운터를 가짐으로써, 파라미터 변경을 행하는 CPU만 2개의 루프로 명령열을 지정 가능하며, 연산 가동률을 향상 가능함과 동시에, 사용하는 명령 메모리(31)의 용량을 삭감할 수 있다.
다음으로, 명령의 오퍼랜드에 Width 필드와 Count 필드에 의한 2차원 오퍼랜드 지정 방식에 대해서, 그 실시예를 설명한다. 지금까지, 2차원 오퍼랜드 지정에 의해, 명령수를 삭감하고, 명령 메모리(31)의 읽어내기 횟수 삭감에 의한 저전력화, 명령 메모리(31)의 용량 삭감에 의한 저전력화와 면적 코스트 삭감에 대하여 설명하였다. 그 외에, 처리 사이클수 삭감에 의한, 저전력화도 실현할 수 있다. 여기서는, 내적 연산과 컨볼루션 연산을 이용하여, 그 실시예에 대하여 설명한다.
내적 연산은, 화상 코덱이나 화상 필터 등에 사용되는 범용적인 화상 처리의 1개이다. 여기서는, 4×4 행렬의 내적 연산을 예로 하여 설명을 행한다. 본 내적 연산예를 도 21에 도시한다. 도면이 도시하는 바와 같이, 4×4 행렬의 내적 연산의 1개의 데이터 출력은, 승산을 4회 실행하고, 그들 연산 결과를 가산한 값이다. 본 연산을 4×4 행렬로 하여, 16요소에 대하여, 마찬가지의 연산을 행하는 것이다. 본 예에서의 설명에서는, 각 데이터 요소의 사이즈를 16비트(2바이트)로 하고, 64비트폭 연산기에서 연산하는 것으로 한다. 또한, 벡터 연산기(46)의 레지스터 파일(462) 내의 레지스터에는, 행렬 A와 행렬 B가 이하와 같이 저장되어 있는 것으로 하고, 연산 결과는, 레지스터(8, 9, 10, 11)에 저장하는 것으로 한다.
레지스터 0:{A00, A10, A20, A30}
레지스터 1:{A01, A11, A21, A31}
레지스터 2:{A02, A12, A22, A32}
레지스터 3:{A03, A13, A23, A33}
레지스터 4:{B00, B10, B20, B30}
레지스터 5:{B01, B11, B21, B31}
레지스터 6:{B02, B12, B22, B32}
레지스터 7:{B03, B13, B23, B33}
이와 같이, 2차원 내적 연산에서는, 연산의 입력에 복수의 레지스터를 사용하는 것이 특징이다. 도 22에 도시하는 일반적인 1 사이클에 1명령을 발행하는 4병렬의 SIMD형 연산기에서는, 이하와 같은 명령열로 처리된다. 또한, 행렬 A는, 하기와 같이 전치된 값이 저장되어 있는 것으로 한다.
레지스터 0:{A00, A01, A02, A03}
레지스터 1:{A10, A11, A12, A13}
레지스터 2:{A20, A21, A22, A23}
레지스터 3:{A30, A31, A32, A33}
명령1:Src1(레지스터 0), Src2(레지스터 4), Dest(레지스터 8[0])로 하는, 곱합 연산.
명령2:Src1(레지스터 0), Src2(레지스터 5), Dest(레지스터 8[1])로 하는, 곱합 연산.
명령3:Src1(레지스터 0), Src2(레지스터 6), Dest(레지스터 8[2])로 하는, 곱합 연산.
명령4:Src1(레지스터 0), Src2(레지스터 7), Dest(레지스터 8[3])로 하는, 곱합 연산.
이 4명령에서, 내적 연산에 제1행을 연산하고, Src1 레지스터를 변경함으로써, 4행분의 연산을 행한다. 따라서, 합계 16명령을 16 사이클 곱하여 연산한다. 또한, 전처리로서, 행렬 A의 전치가 필요로 된다. 따라서, 실질적으로 필요 사이클수가 16 사이클보다도 크다.
한편, 2차원 오퍼랜드를 지정 가능한 본 실시예에서는, 도 23에 도시하는 연산기 구성을 취한다. 도 22에 도시한 SIMD형의 연산기와 비교하여, Src2 입력의 전단에 셀렉터(609)를 배치하고, Src2와 Src2[0]의 값을 선택 입력한다. 또한, 연산 1 사이클마다, 패스(610)를 사용하여, Src2의 값을 좌측 시프트한다. 또한 승산기(600)의 연산 결과를 저장하는 레지스터(601)의 출력은, 시그마 가산기(607)에 입력되고, 시그마 가산기(607)의 연산 결과는 레지스터(608)에 저장된다. 시그마 가산기(607)는, 레지스터(601)의 결과와 레지스터(608)의 결과를 순차적으로 시그마 가산하는 연산기이다. 본 예에서는, 4 사이클분의 승산 결과를 시그마 가산하고, 사사오입을 행하여, Dest로서 연산 결과를 얻는다.
도 21의 내적 연산예의 연산 결과의 제1행째에 주목한다. 행렬 B에 관해서는, 16요소의 데이터 입력이 필요한 것에 대해, 행렬 A의 입력은, A00, A10, A20, A30에서, 레지스터 0에 저장된 값뿐이다. 또한 제1 요소의 승산에 관해서는, 모두 A00이 입력된다. 본 연산의 처리예를 도 23에 도시하는 연산기에서 실현한다. Src1에는 행렬 B, 즉 레지스터 4를 설정하고, Src2에는 행렬 A, 즉 레지스터 0을 설정한다. Src1 측은, 클럭이 공급될 때마다, 레지스터 4, 레지스터 5, 레지스터 6, 레지스터 7, 다시 레지스터 4의 순으로 공급한다. Src2 측은, 1 사이클째에 레지스터 0을 입력하고, 2, 3, 4 사이클째는, 패스(610)를 사용하여 좌측 시프트한다. 이 때 셀렉터(609)는, Src2[0] 데이터를 선택한다. 이에 의해, Src2 출력은, 1 사이클째는 A00으로 되고, 2 사이클째는 A10으로 되고, 3 사이클째는 A20으로 되고, 4 사이클째는 A30으로 된다. 5 사이클째에는 레지스터 1을 공급하고, 6, 7, 8 사이클은 마찬가지로 시프트한다. 이러한 데이터 공급에 의해, 4 사이클에서 1행의 연산 결과를 얻을 수 있다. 이에 의해, 4 사이클에 1회, 연산 결과 Dest(606)가 생성되고, 이 타이밍에서, 레지스터 파일(462)을 갱신한다. 본 방식에 의해, 레지스터 파일(462)의 기입에 바이트 인에이블을 필요로 하지 않고, 레지스터 파일의 면적을 축소할 수 있음과 함께, 데이터의 전치를 필요로 하지 않고, 합계 16 사이클에서 내적 연산을 실현한다.
다음으로 전치 행렬에 대한 내적 연산에 대하여, 도 24의 내적 연산예를 이용하여 동작을 설명한다. 도 24에서는, 제1 행렬인 행렬 A를 전치한 경우의 내적이다. 여기서도, 연산 결과의 제1행째에 주목한다. 행렬 B에 관해서는, 16요소의 데이터 입력이 필요한 것에 대해, 행렬 A의 입력은, A00, A01, A02, A03에서, 레지스터 0으로부터 레지스터 3까지의 데이터 요소[0]에 저장된 값뿐이다. 본 연산에서는, 앞의 전치가 없는 내적 연산과 비교하여, Src2의 공급 방법을 변경함으로써, 제1 행렬이 전치의 내적 연산을 실현한다. 앞의 전치가 없는 행렬 연산에서는, 사이클 2, 3, 4시에 패스(610)를 이용하여, Src2를 시프트하여 데이터 공급한 것에 대해, 본 예에서는, 사이클 1에서는 레지스터 0을 사용하고, 사이클 2에서는 레지스터 1을 사용하고, 사이클 3에서는 레지스터 2를 사용하고, 사이클 4에서는 레지스터 3을 사용한다. 제1행의 내적에서는, 레지스터 0으로부터 3까지의 데이터 요소[0]을 사용하고, 제2행의 내적에서는 데이터 요소[1]를 사용하고, 제3행의 내적에서는 데이터 요소[2]를 사용하고, 제3행의 내적에서는 데이터 요소[3]를 사용한다. 본 방식에 의해, 이전에 설명한 Src2의 공급 방법만을 변경함으로써, 제1 행렬이 전치의 내적 연산을 실현한다. 이 때, 승산기 이후의 데이터 패스가 상이한 동작은 존재하지 않는다. 따라서, 일반적인 SIMD형 연산기에서는, 내적 연산 전의 전처리로서 전치가 필요로 되지만, 본 방식에서는 필요 없고, 처리 사이클수를 삭감할 수 있다.
또한, 제2 행렬만 전치의 행렬 연산에서는, Src1과 Src2의 입력은 전치를 수반하지 않는 내적과 마찬가지의 데이터 공급을 행하고, 연산기는 통상의 SIMD형 연산기와 마찬가지로, 1 사이클에서 4요소를 가산하는 구성으로 실현한다. 본 방식에서는, 시그마 가산기(607)의 입력에 레지스터(608)를 사용하지 않고, 4개의 레지스터(601)의 출력을 가산한다. 다음으로 컨볼루션 연산의 동작예에 대하여 설명한다. 컨볼루션 연산은, 화상의 로우 패스 필터나 하이패스 필터 등에 의한 필터링 처리나 엣지 강조 등에 사용된다. 또한, 화상 코덱의 움직임 보상 처리 등에서도 사용되는 연산이다. 컨볼루션 연산은, 내적 연산과 달리, 제2 행렬(컨볼루션 계수로 함)이 고정이고, 본 컨볼루션 계수를, 제1 행렬의 전체 데이터 요소에 대하여 연산하는 것이다. 도 25에 2차원의 컨볼루션 연산예를 도시한다. 도면이 도시하는 바와 같이, 출력 데이터의 전체 데이터 요소에는, 제2 배열의 컨볼루션 계수를 곱해져, 시그마 가산한 것이다.
이것을 실현하는 연산기 구성의 일부를 도 26에 도시한다. 본 구성에서는, 도 23에서 도시한 내적 연산기 구성의 레지스터(601)의 입력 전까지의 구성을 설명하고 있다. 내적 연산기 구성과의 차이는, Src1도 마찬가지로, 패스(612)에 의한 시프트 레지스터 구성인 것이다. 컨볼루션 연산의 동작을 도시한다. 우선, 배열 A와 배열 B는, 이하에 기재하는 레지스터에 배치되어 있는 것으로 한다. 이 때, 배열 A의 1열째 내지 4열째의 데이터와 5열째의 데이터는 서로 다른 레지스터에 배치한다. 배열 B는 1개의 레지스터에 배치한다.
레지스터 0:{A00, A10, A20, A30}
레지스터 1:{A40, 없음, 없음, 없음}
레지스터 2:{A01, A11, A21, A31}
레지스터 3:{A41, 없음, 없음, 없음}
레지스터 4:{A02, A12, A22, A32}
레지스터 5:{A42, 없음, 없음, 없음}
레지스터 6:{A03, A13, A23, A33}
레지스터 7:{A43, 없음, 없음, 없음}
레지스터 8:{B00, B01, B10, B11}
Src1에는, 레지스터 0을 투입하고, Src2에는 레지스터 8을 투입한다. 이 때, Src2의 출력은 셀렉터(609)에 의해, Src2의 제1 데이터 요소가 투입된다. 즉, Src2[0], Src2[0], Src2[0], Src2[0]이다. 1 사이클째에서의, 4개의 승산기(600)의 출력은 이하와 같다.
1 사이클째:
600[0]출력:A00*B[00]
600[1]출력:A10*B[00]
600[2]출력:A20*B[00]
600[3]출력:A30*B[00]
2 사이클째에서는, Src1과 Src2 모두 패스(610과 612)를 사용하여 좌측 시프트한다. Src1은, 레지스터 1의 제1 데이터 요소인 A40을 Src1의 [3]에 투입한다. 그 결과, 4개의 승산기(600)의 출력은 이하로 된다.
2 사이클째:
600[0]출력:A10*B[01]
600[1]출력:A20*B[01]
600[2]출력:A30*B[01]
600[3]출력:A40*B[01]
3 사이클째에서는,
3 사이클째:Src2는 패스(612)를 사용하여 좌측 시프트한다. Src1은 읽어내기 레지스터 포인터를 갱신하고, 레지스터 2를 투입한다. 그 결과, 4개의 승산기(600)의 출력은 이하로 된다.
3 사이클째:
600[0]출력:A01*B[10]
600[1]출력:A11*B[10]
600[2]출력:A21*B[10]
600[3]출력:A31*B[10]
4 사이클째에서는, 2 사이클째와 마찬가지로, Src1과 Src2 모두 패스(610)와 패스(612)를 사용하여 좌측 시프트한다. 그 결과, 4개의 승산기(600)의 출력은 이하로 된다.
4 사이클째:
600[0]출력:A11*B[10]
600[1]출력:A21*B[10]
600[2]출력:A31*B[10]
600[3]출력:A41*B[10]
이 4 사이클분의 데이터를 시그마 가산기(607)에서 시그마 가산함으로써, 1행째의 컨볼루션 연산 결과를 얻는다. 5 사이클째에서는, 재차, Src1에 레지스터 2를 투입하고, Src2에는 다시 레지스터 8을 투입하고, 제2행째의 컨볼루션 연산을 행한다. 그 결과, 16 사이클에서, 4×4행렬의 컨볼루션 연산 결과를 얻는다.
또한, 이들 설명에서는, Src1과 Src2의 공급에 시프트 레지스터를 사용한다고 설명하였지만, 셀렉터를 사용한 데이터의 선택을 행하고, 마찬가지의 데이터 공급을 행함으로써, 마찬가지의 효과를 얻는다. 따라서, 데이터의 공급 수단이 특징이다.
도 22에 도시한 일반적인 SIMD형 연산기에서는, 수직 방향의 컨볼루션 연산은, 데이터 요소마다의 곱합 연산을 이용한다. 단, 4개의 곱합 연산을 종료한 시점에서, 데이터의 사사오입이 필요하기 때문에, 각 곱합 연산의 스테이지에서는, 8비트 데이터를 16비트 데이터로 비트 확장하여 곱합 연산을 행해야만 한다. 또한 4개의 곱합 연산이 종료한 시점에서, 재차, 16비트 데이터를 8비트 데이터로 사사오입한다. 곱합 연산 시에는, 비트 확장 때문에, 실질적으로 병렬 사용하는 연산기수가 반감되고, 처리 사이클수가 증가한다. 또한, 비트 확장 자신과 사사오입 자신의 연산 사이클수가 증가한다. 본 방식과 같이, 2차원 오퍼랜드를 지정함으로써, 처리 사이클수를 삭감할 수 있다.
한편, 도 22에 도시한 일반적인 SIMD형 연산기에 의한, 수평 방향의 컨볼루션 연산에서는, 데이터 요소를 생성할 때마다, 배열 A를 데이터 요소 단위로 시프트하여, 연산기에 투입해야만 하여, 처리 사이클수가 증가한다. 또한, 2차원의 컨볼루션에서는, 비트 확장, 시프트, 사사오입 등에 의해 처리 사이클수가 증가한다.
따라서, 본 방식과 같이 2차원의 오퍼랜드를 지정하는 것은, 복수의 소스 사용하는 명령을 1개의 명령으로 표현하는 것을 의미하며, 정말로 필요한 곱합 연산 이외의 전처리나 후처리를 포함시켜 처리 사이클을 삭감할 수 있다. 그 결과, 낮은 동작 주파수로 처리를 실현할 수 있어, 더욱 소비 전력을 삭감할 수 있다.