FPGA 실습(5) 5. Manchester Code 맨체스터 코드는 앞절에서 설명한 SDLC의 NRZ 모드에서 별도의 클럭을 사용하지 않고 데이터에서 클럭을 추출하기 위해 사용하며, 멘체스터 코드의 코딩 방식은 다음 그림과 같다. 5.1. 송신부(Encoder) 송신부는 앞의 그림에서 살펴본 바와 같이 CLK과 NRZ를 XOR을 취해서 출력하면 된다. 그런데 CLK과 NRZ를 XOR을 취하면 서로의 위상차로 인해 glitch가 발생할 수 있으므로 전송 속도보다 아주 빠른 클럭으로 래치해서 출력하는 것이 좋다. 5.2. 수신부(Decoder) 수신부는 입력되는 맨체스터 코드로부터 데이터와 클럭을 추출하여 출력하여야 한다. 먼저 전송속도보다 아주 빠른 클럭을 이용하여 전송속도에 맞는 클럭을 생성하기 위한 카운터를 구동하여 기본적인 클럭을 생성한다. 예를 들어 전송 속도가 1Mbps인데 회로에서 사용하는 클럭이 128MHz 클럭이라고 한다면 카운터 값이 63이 된뒤 다시 0으로 돌아가도록 구성하여 카운 터값이 0일 때 반전이 일어나도록 하여 1MHz의 클럭을 생성한다. 그리고 입력되는 데이터를 전송속도 보다 아주 빠른 클럭(예: 128MHz)으로 래치를 해서 rising edge와 falling edge를 검출하고 rinsing edge나 falling edge에서 앞에서 언급한 카운터를 0으로 셋팅하여 주기를 맞춘다. 그리고 클럭 주기의 1/2되는 지점에서 sample 클럭을 생성하여 sample 클럭에서 입력되는 데이터를 래치하여 이전데이터와 비교한다. sample 데이터가 b’01이면 1로 디코딩하고 데이터가 b’10이면 0으로 디코딩하며 출력 클럭을 반전시킨다. 만일 데이터가 b’00이거나 b’11이면 디코딩하지 않으며 출력 클럭을 그대로 유지 한다. 이렇게 하면 입력되는 데이터로부터 데이터와 클럭을 추출하여 NRZ 데이터를 출력할 수 있다. 다음 그림은 Loopback되는 맨체스터코드로부터 NRZ 데이터와 출력 클럭을 시험 한 결과이다...
글
7월, 2023의 게시물 표시
- 공유 링크 만들기
- X
- 이메일
- 기타 앱
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을 사용하는 것으로 표시한다...
- 공유 링크 만들기
- X
- 이메일
- 기타 앱
FPGA 실습(3) 3. 다중 UART 구현 이전 글에 작성한 UART블럭을 여러개를 추가하고, UART baud rate가 다르도록 구성하여 보고 여러 포트에서 입력되는 인터럽트를 처리하는 과정을 살펴본다. 3.1요구사항 - UART port을 5개로 구성하고, 사용자의 설정에 따라 baud rate을 10M 혹은 115200으로 설정할 수 있게 한다. 3.2 구현 앞에서 설계한 설계화면의 Diagram Tab에서 마우스의 오른쪽 버튼을 클릭하여 “Create Hierarchy”를 수행하고 블록 이름을 uart0라고 지정한다. 그러면 조그만 box가 보이게 되는데 이 box를 확대하고 UART블럭을 드래그하여 box 안으로 넣는다. 그리고 DMA 블록과 DMA FIFO블럭을 모두 box안으로 넣는다. 그러면 다이어그램은 다음과 같이 변경된다. 위의 그림에서 uart0 블록을 더블클릭하면 uart0블럭의 다이어그램이 다음과 같이 나타난다. 이제 uartdma 블록이 10MHz의 클럭과 115200Hz의 클럭을 선택하여 동작하도록 변경하여 보자. uartdma블록에 커서를 놓고 오른쪽 버튼을 눌러 Edit in IP Packager를 수행한다. 설계 도구가 실행되면 top design을 열고 IO 포트를 다음과 같이 변경한다. clk10m : in std_logic; clk115 : in std_logic; uclko : out std_logic; uarttx : out std_logic; ...
- 공유 링크 만들기
- X
- 이메일
- 기타 앱
FPGA실습(2) 2. UART 구현 이전 글에 이어서 이번에는 UART를 구현하여 DMA를 통해 데이터를 전송하고 수신하는 부분에 대해 다룬다. 2.1 요구사항 - AXIS Stream FIFO와 연동되는 UART 구성 - UART 회로에 공급되는 클럭에 따라 BAUD Rate 결정 2.2 UART 개요 위키백과에 나오는 UART의 소개자료는 다음과 같다. UART(범용 비동기화 송수신기: Universal asynchronous receiver/transmitter)는 병렬 데이터의 형태를 직렬 방식으로 전환하여 데이터를 전송하는 컴퓨터 하드웨어의 일종이다. UART는 일반적으로 EIA RS-232, RS-422, RS-485와 같은 통신 표준과 함께 사용한다. UART의 U는 범용을 가리키는데 이는 자료 형태나 전송 속도를 직접 구성할 수 있고 실제 전기 신호 수준과 방식(이를테면 차분 신호)이 일반적으로 UART 바깥의 특정한 드라이버 회로를 통해 관리를 받는다는 뜻이다. 즉 동기 신호는 전달하지 않고 약정된 통신 속도로 8비트의 데이터를 직렬로 전송한다는 뜻이고 실제 PC 등과 통신을 수행하기 위해서는 선로 인터페이스 소자가 따로 있어야 한다. 여기서 설계한 것은 Zynq에서 선로 인터페이스 소자로 출력하는 송신신호, 선로 인터페이스 소자로부터 수신하는 수신 신호를 생성하거나 수신하여 데이터를 처리하는 과정을 설계하고 시험하는 것이다. UART의 코딩 규격은 다음과 같다. STOP 앞에 패리티 비트를 추가하기도 하는데 여기서는 패리티 비트를 사용하지 않는 UART를 사용한다. 2.3 AXI4 Stream Bus AXI4 Stream Bus의 프로토콜은 다음 그림과 같다. 즉 VALID 신호를 송신측에서 전달하면 수신 측에서 READY 신호를 출력하여 데이터를 수신하는 방식으로 데이터를 전달 받는다. 그리고 데이터의 마지막임을 알리는 TLAST 신호는 마지막 워드(32 bit의 데이터)일 때 HIGH가 되고 그 외에는 LOW를 유지한다. 또한 ...