왜 필요한가?

5517 은 각각의 다른 장치들과 통신하기 위해, 아래의 표와 같이 address 와 data bus 를 제공한다.

interface address data
SMI 14개 16개
EMI 24개 16개
  1. SMI : 5517 과 SDRAM 이 통신하기 위한 인터페이스로서 최대 2 개까지 지원(chip selecter 2 개)
  2. EMI : SDRAM 뿐만 아니라, 다른 기타 장치들을 붙일 수 있다. 최대 6개까지 지원(chip selecter 6 개)

위의 표에서 알 수 있듯이 16 bit 로 동작한다는 것을 알 수 있다. 그래서 5517 은 16 bit CPU 이다. 갑자기 이 얘기를 왜 했는지 궁금할 지도 모르겠다. 예를 들어 만일, EMI 에 16 bit 로 동작하는 flash 를 붙였다고 하자!

이때는 5517 과 flash 가 1:1 로 동작할 것이다. 서로 16 bit 로 통신하기 때문이다. 이번에는 32 bit 로 동작하는 7020 을 붙였다고 생각해 보자!
5517 은 16 bit 로 동작하는 데, 반해 7020 은 32 bit 로 동작한다. 과연 어떻게 통신할 것 인가?

이번에는 8bit 로 동작하는 eeprom 을 붙였다고 생각해보자! 과연 어떻게 통신할 것 인가?

언뜻 생각해보기에, 5517 에는 16 bit 가 아닌, 다른 bit 로 동작하는 디바이스는 붙이지 못한다고 생각할 것이다. 하지만, 결론 부터 얘기하자면, 가능하다. 그리고 바로 이때 필요한 것이 'address shift' 이다.

5517 의 EMI 로 부터 나가는 address bus 를 shift 해서 8, 32 bit 각각의 디바이스를 지원한다. 이제 부터는 각각의 상황에 따라서, 5517 을 어떻게 세팅해주어야 하는지에 대해서 알아보도록 하겠다.

32 bit 디바이스 일 때

앞에서 예를 들었던, 7020 은 32 bit 로 동작하는 디바이스이다. 현재 7020 은 EMI bank 2 에 물려 있다. 현재 DAC5000 소스 프로그램의 초기화 루틴을 보면 알겠지만, 먼저

7020 reset → 5517 aux clock setting

순으로 동작한다. 이 후에 동작은 5517 을 32 bit 모드로 설정하고, 7020 을 16 bit 모드로 세팅한다. 이 때, 소스 코드를 보면 아래와 같다.

STSYS_WriteRegDev32LE(0x20010028, 0x0022003f); // 여기서는 bank 2 address shift 를 0 으로 세팅한다. (EMI_GENCFG[8])
 
STSYS_WriteRegDev32LE(0x20200028, 0x000006c1); // 여기서는 bank 2 의 address 를 확장한다. (EMI_ADDRESS_EXPANSION)

위에서 특별히 세팅해주지 않은 것들은 모두 mb382_emi.cfg 파일의 설정을 따른다. (port size = 16 bit)
레지스터 세팅이 끝나면, 32 bit 모드로 동작한다. 이 때는 5517 의 EMI_CAS 를 7020 의 BE[3] 에 연결해야 한다. 왜냐하면, 5517 에서 32 bit 의 데이터를 보내려면, 2번을 보내야 한다.

7020 쪽에서는 현재 받아온 데이터가 LSB 인지 MSB 인지 알 수 있는 방법이 없다. 이 때 바로 BE[3] 를 보고 판단하게 된다.
5517 의 EMI_CAS 에서는 LSB 인 경우 LOW 를, MSB 인 경우 HIGH 를 내보낸다. 5517 이 32 bit 로 동작하는지 알아보려면, BE[3] 를 보면 된다.

프로그램에서는 32 bit 로 캐스팅해야 한다. (그러면, 7020_cs 가 두번 뜬다)
32 bit 모드에서는 아래와 표와 같이,

0x00000000, 0x00000001, 0x00000002, 0x00000003 0 번지로 출력
0x00000004, 0x00000005, 0x00000006, 0x00000007 1 번지로 출력

출력이 나간다.

32 bit 요약 정리

32 bit 로 동작하기 위해서는 아래의 항목들을 설정해주어야 한다.

  1. PORT SIZE : 16 bit 세팅
  2. Address shift : 0 으로 세팅
  3. EMI_ADDRESS_EXPANSSON : 1 로 세팅
  4. EMI_CAS 를 7020 의 BE[3] 에 연결
  5. 프로그램에서 디바이스로의 R/W 시, 32 bit 로 casting 하여 access 함
  6. BE[3] 가 LOW 에서 HIGH 로 변하면, 32 bit 모드이다.

16 bit 디바이스 일 때

역시 앞에서 예를 들었던 flash 의 경우 16 bit 로 동작한다. 5517 역시 16 bit 모드로 동작하기 때문에, 32 비트 보다는 훨씬 간단하다.
우선, 아래의 항목을 세팅해주어야 한다.

  1. PORT SIZE : 16 bit 세팅
  2. Address shift : 1 로 세팅
  3. EMI_ADDRESS_EXPANSSON : 0 으로 세팅
  4. EMI_CAS 를 반드시 BE[3] 에 연결할 필요는 없음(이유 : EMI_CAS 가 아무런 역할도 하지 않기 때문)
  5. 프로그램에서 디바이스로의 R/W 시, 16 bit 로 casting 하여 assess 함 (chip selecter 한번 뜸)

실제로 출력은 아래 표와 같다.

0x00000000, 0x00000001 0 번지로 출력
0x00000001, 0x00000002 1 번지로 출력

8 bit 디바이스 일 때

POD 의 경우, 처음에는 16 bit 로 동작했다가, personality change 를 거치면서, 8 bit 로 동작한다. 32 bit 때와 비슷하게 서로 인터페이스 하는 방식이 다르기 때문에, 32 bit 에서의 BE[3] 와 같은 것이 필요하다. 그 것이 바로 BE[1] 이다.
우선 8 bit 세팅을 위해서

  1. PORT SIZE : 8 bit 세팅
  2. Address shift : 1 로 세팅
  3. EMI_ADDRESS_EXPANSSON : 0 으로 세팅
  4. EMI_CAS 를 반드시 BE[3] 에 연결할 필요는 없음
  5. 프로그램에서 디바이스로의 R/W 시, 8 bit 로 casting 하여 access 함 (chip selecter 한번 뜸)
  6. BE[1] 이 HIGH → LOW 로 바뀌면 8 bit 모드로 동작한다고 보면 된다

실제로 출력은 아래 표와 같다.

0x00000000 0 번지로 출력
0x00000001 1 번지로 출력
0x00000002 2 번지로 출력

결론

EMI 에 어떤 디바이스가 붙느냐에 따라서, 위의 설정을 맞춰주면 될 것 같다. 여기서 유의할 것은 32, 8 bit 처럼 5517 과 다르게 통신하는 경우에는 반드시 이를 맞추기 위한 BE[3] 와 BE[1] 패턴이 있다는 것이다.

덧붙여

클럭에 관련한 몇가지 실험을 했었다.
방법은 기존의 타겟보드 인 Ver 2 를 가지고, PLL CLOCK 을 변경해보면서, EMI CLOCK 와 DDR CLOCK 를 보는 것이었다. 실험 결과는 다음과 같다.

PLL CLOCK EMI_CLOCK DDR_CLOCK
300 50MHz 80MHz
486 108MHz 108MHz

위의 결과를 보면, PLL CLOCK 를 변경했을 때, EMI_CLOCK 는 변경되지만, DDR_CLOCK 은 변경되지 않는다.

  • computer/digitalarena/address_shifting.txt
  • Last modified: 3 years ago
  • by likewind