Zynq SoC Training – Customized Hardware Integration

Acknowledgement (Korean)
아래의 글은 Ali Aljaani가 운영하는 블로그인 embedded centric의 “Zynq SoC Training”을 번역한 문서입니다. 한글 번역 및 공개를 허용한 Ali Aljaani에게 감사의 말을 전합니다.

Acknowledgement (English)
This post is a translated version of “Zynq SoC training” in embedded centric. Thank you Ali Aljaani for allowing me to translate nice posts. I’m Taekyung Heo, and I translated this post into Korean.

Contact information (Author)
Ali Aljaani’s blog: http://embeddedcentric.com/
Ali Aljaani’s mail: alialjaani@embeddedcentric.com
Ali Aljaani’s LinkedIn: https://www.linkedin.com/in/ali-aljaani-a7130099
Ali Aljaani’s github: https://github.com/ama142


이번 실습에서는 open source로 개발된 memory mapped 입출력 주변 장치를 사용해볼 것이다 (OLED display controller인 ZedboardOLED_V1.0과 드라이버). 제어 회로 및 데이터 레지스터를 포함한 입출력 인터페이스를 살펴볼 것이다. 그리고 드라이버를 살펴보며, 어떻게 구현되어 있는지, 어떻게 하드웨어와의 인터페이스를 단순화하는지 살펴볼 것이다. ZedboardOLED 컨트롤러는 OLED 디스플레이 패널을 specification에 맞추어 동작시키는 역할을 한다. SPI 인터페이스를 통해 정해진 시간 간격으로 바이트 (명령어)를 전송함으로써 컨트롤러를 초기화 할 수 있다. 초기화가 완료되면, 컨트롤러는 프로세서 시스템이 memory-mapped 레지스터를 통해 OLED 디스플레이를 접근할 수 있도록 해준다. ZedboardOLED 컨트롤러는 slave AXI 주변 장치이며, 17개의 32-bit 크기의 레지스터를 갖는다. AXI 인터페이스는 AXI crossbar와 컨트롤러를 연결하는 역할을 한다. 한편, ZedboardOLED는 OLED 디스플레이 패널과 SPI 인터페이스를 통해 통신한다. 3rd party IP를 사용해 회로를 설계하는 방법도 이번 실습에서 다룬다.

lab3-design-flow

Lab3 Design Flow

lab3-block-diagram1

Lab3 Block Diagram

lab3-physical-connections

Lab3 Board Interface

zedboardoled-interface1

ZedboardOLED Interface

배경 지식
A. OLED Display Panel
ZedBoard에서 사용하는 OLED 디스플레이 패널은 32×128 픽셀을 갖는다. 패널의 인터페이스는 다음과 같이 구성되어 있다:

zedboard-oled-panel-electrical-interface

Zedboard OLED Panel Electrical Interface

위 그림에서 볼 수 있듯이, OLED 패널 그 자체는 Solomon Systech에서 생산한 SSD1306 Segment/Common 드라이버 칩을 사용한다. 이 칩은 패널의 픽셀들을 직접 다룬다. 이 칩은 추가로 다른 것들도 가지고 있는데, 출력할 그림의 비트맵을 갖는 디스플레이 버퍼를 갖고 있다. 그리고 SPI 인터페이스를 통해 받은 명령어를 갖는 명령어 레지스터도 갖고 있다. SSD1306 인터페이스는 다음 표와 같다.

VBAT Display Voltage Control
VDD Logic Voltage Control
DC Data/Command Control
RES Power Reset
SDIN SPI Data In (MOSI)
SCLK SPI Clock

패널은 디스플레이로 전송되는 바이트가 데이터로 해석되어야 하는지, 명령어로 해석되어야 하는지를 결정하는 D/C 핀 (display or command select)을 갖고 있다. D/C 핀을 high로 설정하면 디스플레이 버퍼를 접근할 수 있고, low로 설정하면 명령어 레지스터를 접근할 수 있다. RES 핀은 SSD1306을 리셋하기 위해 사용할 수 있다. RES 핀을 low로 설정하면 리셋할 수 있고, high로 설정하면 현재 상태를 유지할 수 있다. 리셋을 적합하게 하기 위해서는 낮게 발생하는 리셋이 적어도 3 마이크로초는 유지되어야 한다. 스크린은 32×128 픽셀로 이루어져 있으며, 그림으로 표현하면 아래와 같다.

oled-screen-physical-dimensions

OLED Screen Physical Dimensions

스크린에 그리고자 하는 모양을 디스플레이 버퍼에 저장함으로써 그릴 수 있다 (SSD1306 datasheet에 따르면 Graphic Display Data RAM (GDDRAM) 이라고 함). 패널은 Serial Peripheral Interface 프로토콜 (SPI)를 사용해 접근할 수 있는 직렬 장치이다.

B. SPI Protocol
데이터 또는 명령어는 바이트 단위로 SPI 프로토콜을 사용해 패널에 전달된다. SPI는 일반적으로 PCB 위에 있는 칩과 통신하기 위해 사용되며, 짧은 거리, 낮은 대역폭, 한 개의 마스터가 있는 상황에서 사용된다. 마스터 (이 경우에 Zedboard OLED 컨트롤러 – SSD1306과의 관계에서 마스터이고, ARM 프로세서에 대해서는 슬레이브이다.) 가 클럭 (SCLK)을 생성하면 SCLK의 rising edge에서 SDIN의 데이터 또는 명령어를 한 비트 이동시킨다. 반면에 슬레이브 (OLED 패널 드라이버 칩 – SSD1306)는 8 클럭마다 샘플링해서 shift register에 있는 데이터를 디스플레이 버퍼 또는 명령어 레지스터에 쓴다.

spi-timing-diagram

SPI Timing Diagram

C. ZedBoardOLED Controller
ZedboardOLED 컨트롤러의 역할은 다음과 같이 요약할 수 있다.
1. AXI-interface 구현 (유형: Lite-Slave)
2. SPI 프로토콜 구현 (유형: Master)
3. 생산자가 제공한 정보에 맞추어 스크린을 초기화하고 전원 공급.
4. 논리적으로 스크린을 4개의 페이지로 나눈다. 한 페이지는 16개의 글자를 표현할 수 있음. 한 개의 문자는 8×8 비트맵으로 표현됨.

logical-division-of-the-oled-display

Logical Division of the OLED Screen

Note: 컨트롤러가 OLED 패널에 문자를 표시하기 위해서는 매번 8 바이트의 정보를 SSD1306에 전송해야 한다. 정보를 전송하기 위해서는 ZedboardOLED 컨트롤러가 열 순서로 칩에 바이트를 전송해야 한다. 예를 들어, 컨트롤러가 “B”를 스크린에 띄우고 싶으면 컨트롤러는 차례대로 다음과 같은 데이터를 전송해야 한다: 0x41,0x7F,0x49,0x49,0x49,0x49,0x36,0x00.

letter-b-representation-in-8x8-bitmap-column-by-column-order

Letter B representation in 8×8 bitmap (column by column order)

언어에 따라 문자와 심볼은 다르며, 따라서 비트맵 또한 다르다. 8×8 Pixel ROM Font Editor를 사용하면 된다.

application-8x8-pixel-rom

Application 8×8 Pixel ROM

5. 성능 향상을 위해 영문자를 내부 메모리에 저장한다.
6. 프로세서 또는 마이크로컨트롤러가 AXI 인터페이스를 통해 전송하는 요청에 반응한다. 요청들은 스크린에 무언가를 그리거나 지우기를 요청한다.
7. 소프트웨어 접근 가능한 32-bit 크기의 17개의 레지스터를 제공한다. 이 중에 16개는 데이터 레지스터이고, 나머지 한개는 제어 레지스터이다. 이 레지스터는 AXI 인터페이스를 사용해 memory-mapped되어 있다.

컨트롤러는 Verilog를 사용해 구현되어 있으며, 각 블록에 다른 기능을 위임하는 계층적인 구조로 되어 있다. 컨트롤러의 계층적인 구조를 추상화하면 다음과 같다:

hardware-hierarchical-design1

ZedboardOLED Hardware Hierarchical Design

일반적으로, 컨트롤러의 Verilog 모듈은 finite state machine (FSM)으로 구현된다. 각 모듈에 대한 간단한 설명은 다음과 같다.

SpiCtrl 모듈은 PS에 공급되는 100MHz 클럭을 사용해 3.125MHz의 SCLK을 생성한다 (Serial Clock). 이 모듈은 SPI 프로토콜을 구현한다. ZedboardOLED 컨트롤러가 SPI 트랜잭션을 수행해야 할 때마다 이 모듈이 사용된다. 이 모듈은 SPI_EN이 인가되면 상태를 Send state로 전환한다. 그리고 SPI_DATA에 있는 데이터를 SCLK의 rising edge에서 SDO (Serial Data Out)로 전송한다. 이후, SPI_FIN 신호가 high로 바뀌면 상태를 Done state로 전환한다. SPI_EN 신호가 low가 되면 모듈 상태는 Idle state로 변경되고 SPI_FIN의 신호가 low로 내려간다.

Delay 모듈은 PS에 공급되는 100MHz 클럭을 사용해 1KHz 카운터를 생성한다. 이 카운터를 사용해 밀리초를 센다. 이 모듈은 컨트롤러의 정확한 타이밍 제공을 위해 사용된다. 이 모듈은 DELAY_EN이 인가되면, Hold state로 변경된다. 그리고 1KHz 카운터가 카운팅을 시작한다. 카운터가 DELAY_MS 값에 도달하면, 컨트롤러는 Done state로 변경되고 DELAY_FIN 신호를 high로 변경한다.

CharLib은 영문자에 대한 비트맵을 갖는 블록 메모리이다. 문자는 8 바이트 단위로 구성된다 (앞서 설명했듯이, 각 문자는 8×8 bitmap이다). 이 메모리의 주소는 11-bit을 사용하며, 다음과 같은 구성을 갖는다: (“ASCII Value” & “XXX”) 뒤의 3 bits는 문자의 8개 부분을 나타낸다. 예를 들어, “01000001001”은 문자열 “A”의 두 번째 바이트를 나타낸다. 블록 메모리와 연관된 중요한 디자인 파일은 CharLib.coe이다. 이 파일은 블록 메모리에 대한 계수 파일이다. 이 파일은 컨트롤러 내부의 블록 메모리 내에 저장되는 파일이다. 문자와 숫자에 대한 비트맵이 ASCII 코드와 연관된 위치에 저장된다. 다음 예제에서 “B”가 어떻게 블록 메모리에 저장되는지 살펴보자. 이를 통해 어떻게 다른 문자 또는 심볼을 출력할 수 있는지 확인할 수 있을 것이다:

영문자 B에 대한 ASCII 값은 “66”이다. 실제로 B는 69번째 주소에 저장되어 있는데, 이는 계수 파일에서 헤딩에 의한 것이다. 헤딩이 3개의 주소를 차지하고 있어, B가 실제로는 69번째에 저장되어 있다. 41,7f,49,49,49,49,36,00이 문자열 B를 8 바이트로 저장한 16진수 표현이다.

charlib-coe-block-memory-coefficint-file

Bitmap of Letter “B” stored in 8 bytes in hexadecimal notation in CharLib.coe

ZedboardOLED_v1_0_S00_AXI 모듈은 컨트롤러의 핵심 기능을 구현한다. AXI 프로토콜 인터페이스를 구현하고, 데이터 레지스터 (slv_reg0~slv_reg15) 그리고 제어 레지스터 (slv_reg16)를 관리한다. 초기화 단계에 finite state machine이 사용된다. Idle state부터 시작해 25개의 초기화 상태를 갖게 된다. 초기화 상태는 ResetOff state로 끝나며, 이 이후에 모듈은 WaitRequest state에서 slv_reg16 제어 레지스터의 트리거를 기다린다. 트리거에 따라 스크린에 문자 또는 문자열을 출력할 수도 있고, 지울 수도 있다.

ZedboardOLED_v1_0이 컨트롤러의 최상단 모듈이다. 이 모듈에서 AXI 인터페이스 포트에 대한 정의를 확인할 수 있고, OLED 디스플레이 포트도 확인할 수 있다.

D. The Driver
컨트롤러와 통신하기 위해 드라이버 (ZedboardOLED_v1_0)를 사용할 수 있고, 이는 32×128 크기의 OLED 디스플레이에 대한 사용자 친화적인 인터페이스를 제공한다. 드라이버는 ZedboardOLED.c에 구현되어 있다. 함수에 대한 프로토타입들은 ZedboardOLED.h에서 확인할 수 있다. 다음 소스 코드는 드라이버에서 핵심적인 세 함수를 보여주고 있다:

driver-functions

Driver Functions

컨트롤러의 데이터 레지스터 (slv_reg0~slv_reg15), 제어 레지스터 (slv_reg16)는 모두 주소 공간 상에 매핑되어 있다. 각 레지스터는 32 bits 크기 (4 bytes) 를 가지며, 따라서 이 레지스터들에 대한 주소도 4 바이트 단위이다.

address-space-of-the-controller-registers1

Address space of the controller registers

OLED 스크린에 출력될 문자의 ASCII 코드가 데이터 레지스터에 저장된다. 한 개의 데이터 레지스터는 스크린의 4개 문자에 해당된다.

data-registers-and-screen-physical-dimensions-relation

Data Registers and Screen Physical Dimensions Relation

예를 들어, slv_reg0 레지스터가 다음과 같은 비트열로 채워져 있다면, ALII를 나타내게 된다 (01000001 01001100 01001001 01001001).

slv_reg0-with-the-content-alii

slv_reg0 with the content “ALII”

제어 레지스터의 D 비트가 high로 설정되어 있으면, 이는 컨트롤러로 하여금 OLED의 디스플레이 버퍼를 문자의 비트맵으로 채우도록 한다. 256 비트 (4x8x8 4개의 문자, 문자 당 8×8 비트맵) 의 데이터가 SPI 인터페이스를 통해 스크린으로 전송되고, 메시지가 다음과 같이 출력될 것이다:

oled-output-with-slv_reg-filled-with-the-bit-pattern-above-e1439447846924

OLED Output when slv_reg0 is filled with the bit pattern above

드라이버는 컨트롤러에 대한 인터페이스를 단순화하는 역할을 한다. 드라이버를 사용해 ASCII 전환과 비트 전송을 드라이버가 하도록 할 수 있다.

드라이버의 핵심 함수는 Xilinx Board Support Package (BSP)에 들어있는 Xil_Out32(Address, Value)이다. Xil_Out32(Address, Value)는 32-bit 메모리 주소에 쓰기 연산을 수행한다. 드라이버를 사용해 구현된 print_char() 함수를 살펴보자.

print_char-function-of-the-zedboardoled-driver

print_char() Function of the ZedboardOLED Driver

이 실습에서 배울 것
1. Memory mapped 입출력 장치 컨트롤러의 low-level에서의 구현에 대해 학습
2. Datasheet에서 확인한 specification 또는 잘 알려진 프로토콜을 사용해 실제 데이터 전송 구현하기
3. 소프트웨어 드라이버가 어떻게 구현되는지 이해하기. 하드웨어와 상호작용하는 그들의 역할을 이해하기.
4. Customized hardware (IP로 패키징된)를 Vivado Design Suite에서 통합해 사용하기.

실습 단계
A. Vivado에서 프로젝트를 생성하고 target board로 ZedBoard 선택
실습 1의 실습 단계 A의 다섯 단계를 동일하게 수행한다. 단, 프로젝트 이름은 “lab3″로 한다.
B. IP integrator를 사용해 embedded processor 프로젝트 생성
실습 1의 실습 단계 B의 네 단계를 동일하게 수행한다.
C. ZYNQ7 processing system 설정
실습 1의 실습 단계 C의 다섯 단계를 동일하게 수행한다.
D. Vivado IP repository에 ZedboardOLED IP 추가하기
이 단계를 수행하기 전에, 내 GitHub 페이지에서 ZedboardOLED IP 코어 압축 파일 (EmbeddedCentric.com_user_ZedboardOLED_1.0.1)을 다운받아야 한다 (Raw 버튼을 클릭해서 다운받을 수 있다). 다운로드가 완료되면, “C:\” 드라이브에 새로운 폴더를 생성하고, “oled_embeddedcentric”으로 이름을 변경한다. 압축 파일을 새롭게 생성한 폴더에 푼다.

zedboardoled-source-code-after-extraction1

ZEDboardOLED source code after extraction

Vivado에서 Flow NavigatorProject Settings 탭을 선택한다. IP를 선택하고, IP Repositories subview 내의 초록색 더하기를 누른다. 탐색기 창이 뜰 것이고, 앞서 IP 코어를 압축 해제한 “C:\oled_embeddedcentric”를 클릭한 뒤 Select를 클릭한다.

project-settings-window3

Project Settings Window

directing-to-the-zedboardoled-ip

Directing to the ZedboardOLED IP

이제 Vivado가 해당 디렉토리에서 새로운 IP를 탐지할 것이다. Apply을 클릭하고 OK를 클릭한다.

ip-repository-after-adding-zedboardoled

IP Repository After adding ZedboardOLED IP

이로써 ZedboardOLED_v1.0을 현재 프로젝트의 IP repository에 추가했다. 다음 단계는 이를 블록 디자인에 추가하고, Zynq processing system에 연결해 OLED 패널을 포트로 연결하는 것이다.

E. ZedboardOLED IP 코어를 연결하기
1. Add IP 마법사를 실행하고, “oled”를 입력한다. ZedboardOLED_V1.0이 보일 것이다. 더블 클릭하여 IP를 블록 디자인에 추가한다.

ip-catalog1

IP Catalog

2. 이제 초록생 정보 바에서 Designer Assistance를 사용할 수 있다. 이를 사용하면 processing system의 AXI에 IP 코어를 연결할 수 있다. Designer Assistance가 클럭과 리셋을 설정하고, IP에 base address (0x43C00000)을 할당하고, 연결과 동기화에 필요한 필수적인 하드웨어를 추가해준다. 기본 설정으로 Run Connection Automation을 수행하고, OK를 클릭한다. 블록 다이어그램이 다음과 같이 보일 것이다:

block-diagram-after-running-designer-assistance-on-the-zedboardoled

Block Diagram after running Designer Assistance on the ZedboardOLED

Designer Assistance가 ZedboardOLED IP 코어의 연결을 해주었다. ZedboardOLED와 processing system 사이의 인터페이스는 잘 알려진 프로토콜(AXI-Lite Slave)을 사용하고 있다. 따라서 Designer Assistance가 연결을 자동으로 수행할 수 있다. 하지만, Designer Assistance는 ZedboardOLED 디스플레이 패널에 대한 외부 연결을 잘 모르므로, 이에 대해서는 자동으로 연결을 수행하지 않았다.

연결되지 않은 것들에 대해서는 우리가 직접 해주어야 한다. ZedboardOLED SDIN 포트 위에 마우스를 올려 연필 모양이 되도록 한다. 그리고 우클릭한 뒤, Make External을 선택한다. 같은 방식으로 SCLK, DC, RES, VBAT, VDD 포트를 연결한다.

making-external-connection-to-zedboardoled-manually

Making external connections to ZedboardOLED manually

3. 블록 다이어그램의 빈 공간을 클릭한 뒤, Regenerate Layout을 클릭한다. 이는 디자인 내의 블록을 재배치해준다. 재배치 이후 디자인은 다음과 같다.

block-diagram-after-making-external-connections

Block Diagram after making external connections

이제 우리는 IP를 processing system에 AXI 인터페이스를 사용해 연결하는 것을 완료했다. 다음 단계로 외부 포트를 실제 OLED 패널의 핀에 연결해주어야 한다 (이에 대한 정보는 ZedBoard User Manual에 있다).

4. Flow Navigator 창의 Project Manager 섹션에서 Add Sources를 선택한다.

add-sources3

Add Sources

Add Sources 창이 뜰 것이다. Add or Create Constraints를 선택한다.

add-or-create-constraints

Add or Create constraints

Next를 클릭하고, 초록색 더하기를 선택하고 Create File을 선택한다.

create-a-new-constraint-file

Create a new constraint file

다음 창에서 File type으로는 XDC를 선택하고, File name으로는 oled_constraints를 입력한다.

name-new-constraints-file-oled_constraints

Name new constraints file oled_constraints

OK를 선택하고, Finish를 클릭해 파일을 생성하고 대화창을 닫는다. Sources 탭에서 Constraints 그룹을 선택하고 새롭게 생성된 XDC 파일을 연다.

sources-pane-with-oled_constraints-selected

Sources pane with oled_constraints selected

다음의 내용을 constraints file에 넣는다. 또는, 내 GitHub 페이지에 있는 oled_constraints.xdc를 사용해도 된다.

set_property PACKAGE_PIN U10 [get_ports DC]
set_property PACKAGE_PIN U9 [get_ports RES]
set_property PACKAGE_PIN AB12 [get_ports SCLK]
set_property PACKAGE_PIN AA12 [get_ports SDIN]
set_property PACKAGE_PIN U11 [get_ports VBAT]
set_property PACKAGE_PIN U12 [get_ports VDD]
set_property IOSTANDARD LVCMOS33 [get_ports DC]
set_property IOSTANDARD LVCMOS33 [get_ports RES]
set_property IOSTANDARD LVCMOS33 [get_ports SCLK]
set_property IOSTANDARD LVCMOS33 [get_ports SDIN]
set_property IOSTANDARD LVCMOS33 [get_ports VBAT]
set_property IOSTANDARD LVCMOS33 [get_ports VDD]

이러한 물리적 제약은 ZedboardOLED IP 코어의 외부 포트를 Zynq 장치의 핀에 연결해주는 역할을 한다. 이 핀들은 OLED 패널과 직접적으로 연결되어 있다 (이러한 정보는 ZedBoard User Manual에서 확인할 수 있다). 이 constraints file을 Ctrl+S를 눌러 저장한다.

5. Sources창에서 system.bd를 우클릭하고, Create HDL Wrapper를 클릭한다. 이를 통해 블록 다이어그램에서 Verilog file을 생성할 수 있다. 다음 메시지에서 Let Vivado manage wrapper and auto-update를 선택한다. system_wrapper.v가 생성되고 소스 계층 상단에 생성되었음을 확인할 수 있다.

create-hdl-wrapper1

Create HDL Wrapper

F. Bitstream 생성
Flow Navigator창의 Program and Debug 섹션에서 Generate Bitstream을 클릭한다. 수정 사항을 저장하겠냐고 묻는 대화창이 뜨면 Save를 클릭한다.

generating-bitstream1

Generating Bitstream

Bitstream 생성에는 컴퓨터 성능에 따라 시간이 다소 걸릴 수 있다. Bitstream 생성이 완료되면 View Reports를 클릭하고, 대화 상자가 뜨면 OK를 클릭한다.

G. 하드웨어 디자인 SDK로 내보내기
1. File > Export > Export Hardware을 클릭한다. Include bitstream을 선택하도록 한다.

export-hardware-to-sdk

Export Hardware to SDK

2. File > Launch SDK를 선택한다. SDK 창이 뜬다. ZedboardOLED_v1_0 IP 코어 드라이버를 포함한 IP와 관련된 모든 파일이 SDK 프로젝트에 내보내진다.

H. SDK에서 작업하기
1. SDK에서 File > New > Application Project를 선택한다.
2. 다음 창에서 다음 캡쳐와 같이 입력한다:

application-project-oled_test

Application Project oled_test

그 다음 창에서, Empty Application을 선택하고 Finish을 선택한다.

이는 BSP와 관련된 드라이버를 컴파일하게 된다.

3. oled_test_bsp>ps7_cortexa9_0>libsrc>zedboardoled_v1_0>src를 확장하고, 드라이버 함수가 구현된 파일인 ZedboardOLED.cZedboardOLED.h를 확인한다.

zedboardoled-driver

ZedboardOLED Driver

4. 이제 이 함수들을 사용해 간단한 어플리케이션을 만든다. oled_test 디렉토리를 확장하고, src 디렉토리를 우클릭해 New->Source File을 선택한다. 다음 창이 뜨면, source file에 “oled_test.c”를 입력하고 Finish를 클릭한다.

new-source-file

New Source File

다음의 C 코드를 “oled_test.c”에 복사 붙여넣기하고 저장한다 (Ctrl+S). oled_test 어플리케이션과 BSP들이 저절로 컴파일되어 .elf 파일이 생성될 것이다.

#include <ZedboardOLED.h>

int main(void){
clear_OLED();
print_message("EmbeddedCentric",0);
print_message("  ZedboardOLED",2);
print_message("By: Ali Aljaani",3);
return (1);
}

I. Bitstream을 다운로드하고 어플리케이션을 실행하기 (하드웨어 검증)
1. Xilinx Tools-> Program FPGA을 클릭해 Bitstream을 다운로드한다 (수 초 정도가 걸릴 것이다).

program-fpga

Downloading Bitstream to the PL

2. oled_test 프로젝트 디렉토리-> Run As-> Launch on Hardware (GDB)를 클릭해 oled_test 어플리케이션을 ARM 프로세서에서 실행한다.

run-application-oled_test-on-the-zedboard

Run Application oled_test on the ARM processor

다음과 같이 OLED 스크린에 메시지가 뜬다.

zedboard-e1439135393262

OLED screen output

실습에서 확인했듯이, OLED를 사용하는 것이 이제 함수를 호출하고, 출력하고자 하는 메시지와 위치를 전달하는 것으로 단순화되었다. ZedboardOLED 컨트롤러와 그 드라이버가 SSD1306 드라이버와 통신하는 것을 추상화해주었다.


이로써 세 번째 실습인 Customized Hardware Integration을 마친다. 이번 실습에 대한 해답은 여기에 있다.


Advertisements
Tagged with: , , , , , , , , , ,
Posted in FPGA

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

누적 방문자 수
  • 88,257 hits
%d bloggers like this: