FPGA 실습(4)

4. SDLC 구현

SDLC(Synchronous Data Link Control)를 구현하여 본다
SDLC를 구현하기 위해 SDLC의 프레임의 구조를 먼저 살펴보고 SDLC 프로토콜을 구현하기 위한 IP를 제작하는 과정과 통합하여 시험하는 과정을 기술한다.

4.1 SDLC 프로토콜 개요

4.1.1 SDLC 프레임

- Flag : b’0111110의 값으로 구성되면 프레임의 시작과 끝을 나타낸다. 데이터가 없는 구간은 All High로 구성되거나 b’01111111이 반복될 수 있다. - 규격 확인이 필요한 부분임. HW 구현 관점에서는 b’01111111이 반복되는 구조가 구현을 간단히 할 수 있다. 또한 Flag이외에 필드에 b’01111110 값이 들어가면 프레임 오류가 발생할 수 있기 때문에 송신측에서는 1이 5번 반복되면 ‘0’을 하나 삽입한다. 이를 bit stuffing이라고 하며, 수신측에서는 Flag이외의 필드에서 1이 5번 반복되는 것을 발견하면 뒤에 따라오는 ‘0’을 제거하고 데이터를 처리하여야 한다.
- Address/Control 부분은 당초 SDLC 규격을 만들 때 각종 토폴로지와 통신 프로토콜을 정의하기 위해 삽입된 부분으로 생각되며 우리가 흔히 사용하는 Point-to-point의 토폴로지에서는 Source Address(1byte), Destination Address(1 byte), Message ID(1byte), Data Length(2 byte)등으로 흔히 구성되며, 이는 프로토콜 정의할 때 결정하면 된다.
- Data : 데이터는 사용자가 전송하고자 하는 데이터를 바이트 크기단위로 전송하는 구간이다. 데이터의 크기는 control 필드에 송수신 프로토콜을 정의하는 부분에서 정의하여야 한다.(Link 계층의 SW에서 필요한 정보 임)
- FCS : Foward Control Sequence는 전송된 프레임의 오류 여부를 판별하기 위한 것으로 흔히 CCITT CRC-16을 사용하는 것으로 표시한다. CRC(Cyclic Redundancy Check)는 송신측에서 계산하여 삽입하고 수신측에서도 동일한 방식으로 계산하여 오류 발생 여부를 확인한다. - CRC에 대해서는 본 블로그에 게시한 CRC 부분을 참고한다.

4.1.2 Line Coding

SDLC의 규격에는 Line Coding을 NRZI(None Return to Zero, Inverted)를 사용하도록 규정하고 있다고 한다. 이는 동기식 통신 방식을 사용하기 때문에 송수신간의 클럭 동기를 맞추기 위한 것으로 생각되는데, idle 구간을 all high하는 경우에는 데이터 트랜지션이 일어나지 않기 때문에 클럭 동기를 추출하기 어렵게 되며, idle 구간을 b’01111111을 사용하면 7클럭을 주기로 데이터 트랜지션이 발생하기 때문에 클럭 동기를 추출하기 위한 PLL 회로등이 구성이 가능 해 질 것으로 생각된다.
- NRZI : NRZI가 의미하는 선로코딩 방식도 여러 가지 있지만 SDLC에서 사용하는 NRZI는  전송할 데이터가 ‘0’일때는 신호를 반전시키고, ‘1’일 때는 신호를 그대로 유지하는 것을 의미한다.
- NRZ : 전송할 데이터를 binary 형태로 그대로 전송하는 것을 의미한다. 즉 데이터가 ‘1’이면 Logic High를 전송하고, ‘0’이면 Logic Low를 전송한다.

4.1.3 전송속도

전송속도는 1M, 2M, 4M, 8M등의 다양한 전송속도에 대한 요구사항이 있으므로 앞의 4가지 클럭을 생성할 수 있어야 한다.

4.2. SDLC 구현

AXIS-4 버스와 인터페이스를 갖는 SDLC의 전체적인 구성은 다음그림과 같다. 송수신부에 각각 데이터 FIFO와 CMD FIFO를 두어 송신부에서는 외부 DMA FIFO로부터 데이터를 읽어서 데이터 FIFO에 저장하고, 데이터 FIFO에 저장된 byte를 카운트하여 코맨드 FIFO에 write하고, 코맨드 FIFO에 데이터가 입력되면 송신부가 이것을 읽어 데이터 전송 크기를 확인하고 데이터 FIFO로부터 데이이터를 읽어서 송신부 처리를 수행하여 전송한다.


4.2.1 송신부

송신부는 zero stuffing과 Flag 삽입을 위해 중간에 1x8K의 FIFO를 두어 먼저 DMA FIFO로부터 데이터를 읽어와서 직렬데이터로 변환하고, CRC를 계산하여 FIFO에 저장하고, FIFO에 저장된 데이터를 읽어서 Flag를 삽입하고, zero stuffing을 수행하여 데이터를 전송한다.


4.2.2 수신부

수신부는 입력으로 들어오는 신호에서 헤더를 찾고, 데이터 필드에서 1이 다섯 번 반복되면 다음에오는 0을 제거하고, CRC를 계산하여 정상적인 데이터가 수신되었다면 병렬로 변환하여 FIFO에 write한다. 헤더 뒤에 일정시간 동안 Flag가 입력되지 않으면 프레임 오류 처리를 하고 FIFO에 쌓여 있는 데이터를 클리어 한다.


4.2.3 클럭 생성부

클럭 생성부는 SDLC 채널의 기준 클럭을 생성하는 부분으로 레지스터의 설정에 따라, 마스터로 설정하면 송신 클럭은 시스템 클럭을 사용하고 수신 클럭은 수신 클럭을 사용하며, 슬래이브 모드로 설정하면 송수신 클럭 모두 수신클럭을 사용한다.
클럭을 사용하지 않는 것으로 설정하면 송수신 모두 시스템 클럭을 사용한다.

4.4. 시험

시험을 위한 SW는 이전 UART를 시험했던 SW와 거의 유사하다. 다만 레지스터가 변경되었기 때문에 레지스터를 설정하는 부분만 신경 써서 해주면 되고, 여기서는 SDLC 채널을 4채널로 만들어서 자체 루프백 시험한 결과만을 나타내었다.



댓글

이 블로그의 인기 게시물