Zynq Image Enhancement System

2019. 3. 31. 08:26Xilinx/Zynq

먼저 Zynq Board로 Image Enhancement 실습을 해보겠습니다.

 

instructables라는 사이트 참고했습니다. 

https://www.instructables.com/id/Zynq-Image-Enhancement-System/ 

 

Zynq Image Enhancement System

Zynq Image Enhancement System: As you could probably make out from the title, the aim of this project is to make an Image Enhancement System using the ZYNQ ApSOC. More specifically, we wish to build a system that can clear out the fog from images or video.

www.instructables.com

instructables는 Autocad로 잘 알려진 Autodesk에서 운영하는 사이트입니다.

한국에도 이런 지식 공유 사이트가 많아졌으면 좋겠네요.

 

이번 실습은 Zynq SoC로 이미지 개선 시스템을 만드는 것입니다. 보다 구체적으로, 이미지나 비디오에서 안개를 제거 할 수 있는 시스템입니다. 열악한 조건의 시각 데이터를 입력 받아 이미지 향상 처리 후 결과를 출력합니다.

 

프로젝트를 3개의 파트로 나눠봤습니다.

1) Input = 컴퓨터/카메라의 이더넷을 통해 이미지를 입력

2) Process = 이미지 처리

3) Output = HDMI 인터페이스를 통해 이미지를 출력

 

 

실습에 필요한 준비물은 아래와 같습니다.

 

하드웨어

 - Zynq Board with HDMI and Ethernet port (Zybo, Zybo Z7-10, Zybo Z7-20)

 - USB A to micro B cable

 - HDMI cable

 - Ethernet cable

 - Display with HDMI input

 

소프트웨어

 - VIVADO 툴

 


Step 1: Output - VGA Controller 파트 1

 

Board의 HDMI 포트를 통해 시각 데이터를 출력합니다. HDMI 포트는 Zynq의 PL(Programmable Logic = FPGA)영역에 연결되어 있으며 Controller는 VHDL로 설계합니다. VGA Controller와 매우 유사합니다. 실제로 HDMI와 VGA의 타이밍은 동일합니다. 기존 VGA Controller를 기반으로 HDMI Controller를 만들 수 있습니다.

 

먼저 1920x1080 해상도 VGA Controller를 설계해보겠습니다.

 

VGA Controller는 픽셀 데이터(RGB 형식)를 픽셀 단위로 디스플레이에 순차적으로 전송합니다. 1920x1080의 실제 표시 영역 밖에 front porch, back porch, retrace 영역이 있습니다. 이런 영역의 픽셀 사이즈는 표준이며 해상도에 따라 다릅니다. 이런 영역은 실제로 화면에 나타나지 않지만 필수적인 영역이며 생상은 검은색이어야 합니다.

 

1920x1080 해상도에 따른 타이밍입니다.

 

Horizontal Display Area = 1920 pixels

Horizontal Front Porch = 88 pixels

Horizontal Back Porch = 148 pixels

Horizontal Retrace =44 pixels

Vertical Display Area = 1080 pixels

Vertical Front Porch = 4 pixels

Vertical Back Porch = 36 pixels

Vertical Retrace = 5 pixels

 

실제 해상도는 2200x1125가 됩니다. 60fps(초당 프레임 수)를 목표로 하면 클럭은 60*2200*1125 = 148.5MHz 입니다. Zybo Board는 125MHz 클럭을 제공합니다. MMCM IP를 사용하여 148.5MHz 클럭을 생성합니다.

 


Step 2: Output - VGA Controller 파트 2

 

대부분의 VGA 포트는 픽셀 당 8비트를 제공하지 않으므로 보드에서 제공되는 색상당 핀 수에 맞게 디자인을 조정해야합니다. 왼쪽 상단 픽셀이 빨간색으로 표시되는 것을 제외하고는 전체 화면을 파란색으로 표시합니다. VGA Controller에서 색깔 별 5/6 비트를 출력하는 동안 해당 비트는 케이블을 통과하기 전에 각 색깔 채널에 대해 하나의 아날로그 신호로 변환됩니다.

 

zynq_vga.rar
0.85MB


Step 3: Output - HDMI Controller 파트 1

HDMI Controller는 VGA Controller와 동일한 코드를 사용합니다. HDMI와 VGA는 동일한 타이밍과 신호를 사용합니다. 차이점은 출력 핀입니다.

 

VGA가 각 색에 대해 하나의 선을 사용하고 이를 통해 아날로그 신호를 전송하는 동안, HDMI는 각 색에 대해 데이터를 한 번에 1비트로 디지털 방식으로 전송하고 차등 신호를 사용합니다.

차동신호는 각 비트마다 HDMI의 핀 2개가 서로 반대입니다. 따라서 '1'을 전송하려면 '1'을 하나의 선으로 전송하고 ~'1'을 다른 선에서 전송합니다. 이렇게 하면 신호 무결성이 보장됩니다.

자세한 설명은 https://en.wikipedia.org/wiki/Differential_signaling 해당 링크 참조

 

빨간색, 녹색, 파란색 각각에 대한 채널과 클락을 위한 채널이 있습니다. 차동신호의 HDMI를 통해 전송하는 신호는 DC 밸런스 되어야 합니다. 즉, 1과 0의 수는 특정시간 대략적으로 동일해야 합니다. 이를 위해 8b/10b encoding을 사용합니다. DVI 사양에서 차등 신호와 8b/10b 인코딩이 어떻게 작동하는지 자세히 알아볼 수 있습니다. http://goo.gl/hhh8Ge(DVI 및 HDMI는 동일한 비디오 신호를 사용합니다.)

 

HDMIController.rar
0.00MB


Step 4: Output - HDMI Controller 파트 2

 

VGA 컨트롤러에서 148.5MHz 클럭을 사용하는 동안 각 색상에 대해 8비트를 전송하고 픽셀당 10비트와 10*148.5로 변환되는 8b/10b 인코딩을 사용하기 때문에 이 주파수의 10배를 1485MHz 제공해야 합니다. Zybo 보드에서는 얻을 수 없는 큰 주파수지만, 몇가지 속임수를 사용하면 가능합니다. 5*158.4MHz = 742.5MHz는 커버 가능합니다. 그리고 OSERDES(serializer) IP를 사용하여 742.5MHz의 rising와 falling edge에서 모두 데이터를 전송합니다. 그렇다면 1485MHz의 속도로 데이터를 전송하는것과 같습니다.

 

따라서 VGA 컨트롤러 출력의 데이터를 8b/10b 형식으로 인코딩한 다음 직렬화해야 합니다. 또한 742.5MHz 클럭을 생성하기 위해 프로젝트에 다른 MMCM을 추가해야 합니다.

 

인코더와 시리얼라이저용 vhdl 파일을 아래에 첨부했습니다. 먼저 RGB 채널을 인코딩한 다음 직렬화해야 합니다.

 

빨간색 채널의 예는 다음과 같습니다.

 

TMDS_encoder_RED : TMDS_encoder

port map(clk148, red_channel_8bits, c_red, video_on, encoded_red_10bits);

Serialiser_RED : Serialiser10_1

port map(clk148, clk742, encoded_red_10bits, reset, red_serial_1bit);

 


Step 5: Displaying Images From RAM

 

HDMI 컨트롤러의 목적은 처리된 이미지를 표시하는 것입니다. 컨트롤러를 구현하고 시작할 준비가 되었으므로 이 컨트롤러에 데이터를 제공하는 방법을 생각해 보아야 합니다. 이미지 향상 프로세스가 PS(프로세스 시스템 = ARM 프로세서)에서 이루어지며, 그 결과 이미지가 DDR RAM에 저장되기 때문에 RAM에서 HDMI 컨트롤러로 데이터를 가져올 수 있는 방법이 필요합니다.

 

이 작업을 수행하려면 다음 3개의 IP가 필요합니다.

1) VDMA (Video Direct Memory Access)

2) VTC (Video timing Controller)

3) Stream to Video Out (we will call it S2VO from now on)

 

S2VO는 실제로 출력 및 필요한 HSYNC 및 VSYNC 신호에 RGB 24BIT 신호를 제공합니다. IP를 추가해서 적절한 연결을 구성해야 합니다. IP 디자인은 사진으로 밖에 공개가 되있지 않아서 연결을 직접 해봐야 할 거 같습니다.
마지막으로 위의 schematic과 같이 구성이 되야 합니다.


Step 6: OUTPUT - SDK

하드웨어를 구축했다면 PS에 소프트웨어를 빌드해야합니다. 하드웨어와 bitstream를 export하고 SDK를 실행합니다.

 

1) File -> Export -> Export Hardware -> Check Include Bitstream and Press OK

2) File -> Launch SDK

In the SDK create a new application project.

3) File -> New -> Application Project

4) Choose a name for your project and press Next

5) Select the "Hello World" template and press Finish

 

SDK의 애플리케이션은 VDMA를 프로그래밍해야 합니다. 이를 위해 몇 가지 표준 기능이 사용됩니다.

 

설계를 테스트하기 위해 SDK 복원(Xilinx Tools -> Dump/Restore) 기능을 사용하여 DDR RAM 메모리에 이미지를 넣고 HDMI 컨트롤러를 사용하여 표시합니다. 원하는 위치에 영상을 로드할 수 있습니다(메모리 시작 부분에 있는 일부 작은 제한 영역 제외). 

 

예시)

address : 16777216

file size : 8294400

1920 * 1080 * 4 (4 channels = RGB + alpha)

'Xilinx > Zynq' 카테고리의 다른 글

스터디 계획  (0) 2019.03.30
Zybo Z7-20 ARM/FPGA SoC를 활용한 Zynq 스터디  (0) 2019.03.30