2013년 9월 3일 화요일

[예전글] FPGA_CPLD 배우기 3 - 입력/출력/입출력 핀


이번장에서는 PLD의 입력/출력/입출력 핀에 대해서 알아보자.
(앞으로는 FPGA와 CPLD를 합쳐서 PLD-Programmable Logic Device로 부른다)


2장에서 나왔던 AND/OR gate 예제는 아주 단순한 예제로 입력핀과 출력핀에 대한
사용법이나와 있다.

2장의 예제는 단지 예제일뿐 실제 PLD에서는 거의 사용하지 않는다.
이제부터 실전예제를 살펴보자.


 IDE_io_144.pdf 이 화일은 참고 자료이다.

A.출력













[그림1]

위의 그림1이 PLD내부의 전형적인 출력예제이다.
위 예제는 BW_Board CD의 CPLD예제에 들어있는 그림이다.
FD8CE는 인스턴스이고, MDI(7:0),MSEL2,MNWE,PRESET,led_out(7:0)은 net이다.
FD8CE의 역할은 schematic editor에 FD8CE를 위치시키고 오른쪽 마우스 버튼을
누른뒤 Symbol Information을 확인하면 알수 있다.
대략적인 역할은 D flip-flop가 8개 있는데, Enable과 Clear가 같이 있는 로직이다.

led_out(7:0)은 CPLD의 외부 핀으로 출력핀이다.

출력핀은A라는 출력값이 한번 write되면새로운 B라는출력값이 write되기전까지
항상 A값을 유지해야 한다.
위의 회로가MSEL2가 1이고, MNWE의 상승에지일때 MDI(7:0)을 led_out(7:0)으로
전달하는 회로이다.
일단 MNWE가 한번 올라가면(한번 write되면), 그 이후에는 MDI(7:0)이 무슨 값을
가지던 led_out(7:0)이 값은 변하지 않는다.
여기서 MSEL2는 led_out(7:0)을 선택하고, MNWE는 MDI(7:0)의 값을 led_out(7:0)을
전달하는 역할을 한다.

flip-flop는 위와 같이 data의 저장역할을 한다.

출력핀은 상당히 다루기가 쉽다.
문제는 MDI(7:0)과 MSEL2, MNWE 신호를
누가(who) 언제(when) 어떻게(how) 주는가(write)이다.
이 문제는 다음기회에 언급하기로 하자.


B. 입력



[그림2]

위 그림이 입력핀의 예이다.
모든 PLD에서 출력은 [그림1]과 거의 비슷한 형태를 갖지만,
입력핀의 사용법은 용도에 따라서 다르다. 그림2는 단지 하나의 예를 든것 뿐이다.
이 예는 PLD의 입력핀 sw_in(7:0)의 값을 MSEL3이 1일때 MDO(7:0)으로 전달하는 예이다.
BUFE8은 tri-state buffer로 E핀(MSEL3)이 1일때 data가 전달되고, 0일때는 Hi-Z(하이임피던스)이다.
Hi-Z의 뜻은 E=0일때 MDO(7:0)에는 아무것도 연결되지 않은것과 같다는 의미이다.


입력핀은 약간 어렵다.
여기서도 문제는 MSEL3과 MDO(7:0)을
누가(who) 언제(when) 어떻게(how) 가져가는가(read)이다.
이 문제 역시 다음기회에 언급한다.


C. 입출력핀

이제 위의 출력핀과 입력핀을 하나로 합쳐보자.




[그림3-1]

그림3-1은 IO_CTL이 1이면 MDO(7:0)의 값이 IN_OUT(7:0)으로 나가고,
IO_CTL이 0이면 IN_OUT(7:0)의 값이 MDI(7:0)으로 들어오는 회로이다.

하지만 실제 PLD에서는 아래와 같은 회로가 사용된다.


[그림3-2]

PLD의 입출력핀은 다른IC의 입출력핀과 연결된다.

CPU와 PLD를 연결하는 예를 들어보자.
CPU의 어드레스버스와 컨트롤(nCS,nWE,nOE)핀은 CPU의 입장에서 출력핀이다.
이 핀들은 PLD의 입력핀으로 연결된다.
CPU의 데이터버스는 CPU의 입장에서입출력핀이다.
이 핀들은 PLD의 입출력핀으로 연결된다.

하지만 보통의 경우에 CPU의 data bus에는 PLD만 연결되지 않는다.
RAM과 ROM이 연결되며 기타 다른 IC들도 연결된다.
따라서 Data Bus에는 CPU가 data를 출력할수도 있고, PLD가 출력할수도 있으며,
램과 롬이 출력할수도 있다.
하지만 동시에 두개의 IC가 Data Bus에 출력해서는 안된다.
두개의 IC가 출력할 경우에는 해당 IC들끼리 싸우다가 둘다 죽는다
(IC내부의트랜지스터가 파괴된다)

따라서 Data Bus에 Data를 출력할수 있는 IC를지정하는 교통정리가 필요하며
이 교통정리를 CPU가 담당하게 된다.
(물론 CPU가 아닌 PLD가 담당할수도 있지만, 누군가는 반드시 교통정리를 해야 한다.)

시스템 상에서 Data Bus는 여러 IC가 공유하지만, 필요한 시점에서는
단지 Data를 출력하는 IC와 입력받는 IC,
이 두 IC만이 Bus를 점유하고, 다른 IC들은이 점유를 방해해서는 안된다.

BUS를 점유하지 않은 다른 IC들은 Data BUS에 연결되지 않은것처럼 행동해야 하며
이 상태를 Tri-state상태 혹은 Hi-Z(하이 임피던스)상태라고 한다.

DATA BUS를 점유하지 않는 IC들은 해당 핀을 입력상태로 유지하면,
DATA를 입출력하는 IC들에게 방해가 되지 않는다.
이 회로가 바로 [그림3-2] 이다.


그림3-2는 필요한 시점에
IO_CTL을 1로 하면 MDO(7:0)가 IN_OUT(7:0) 으로 출력되고,
IO_CTL을 0으로 하면 IN_OUT(7:0)이 MDI(7:0)으로 입력되는 회로이다.

엄밀하게 따지면 입출력핀은 대부분의경우에 입력상태이다.
하지만 보통의 IC Datasheet는 이 상태를 Hi-Z상태라고 표시한다.

Hi-Z은 그림2의 BUFE8, 그림3-1의 BUFT8, OBUFE8의 출력측이다.
이 버퍼들은enable신호가 없으면 출력선에서 완전히 분리되어
버퍼의 존재자체가 없는것처럼 보인다.
따라서 그림2의 경우에 MSEL3가 0이면 MDO(7:0)의 값은
어떤값이 될지는 전혀 예측할수 없다.


그림3-2에서도문제는 IO_CTL과 MDI(7:0)과 MDO(7:0)을
누가(who) 언제(when) 어떻게(how) 주거나(write) 가져가는가(read)이다.
이 문제 역시 다음기회에 언급한다.

댓글 없음:

댓글 쓰기