STUDY/Others

DE1-SoC Tutorial (3)

sinawi95 2018. 10. 7. 17:33
728x90

왜 DE1-SoC Tutorial (2)가 아니고 DE1-SoC Tutorial (3)일까?

(2)는 My_first_HPS인데 더 급한게 HPS-FPGA 여서 (3)을 작성한다.

(2)도 있는데 제목은 작성했지만 글이 없어서 비공개로 해두었다.

어쨌든 이번 글은 DE1-SoC My First HPS-FPGA 이다. (자료는 내 포스팅 한 글에 링크로 첨부되어있다.)


1. Overview

DE1-SoC_Getting_Started_Guide와 My_First_Fpga, My_First_HPS 튜토리얼을 잘 할줄 알아야한다고 한다.

앗 망했다... 하지만 걱정하지 마라 손은 눈보다 빠르니까

이게 아니고 모르는 부분이 있으면 (주로 HPS부분) 그때그때 찾아서 해결하는걸로 한다.


다음과 같은 배경지식이 필요하다.

FPGA RTL Design

- Basic Quartus II operation skill

- Basic RTL coding skill

- Basic Qsys operation skill

- Knowledge about Altera Memory-Mapped Interface 

C Program Design

- Basic Altera SoC EDS(Embedded Design Suite) operation skill

- Basic C coding and compiling skill

- Skill to Create a Linux Boot SD-Card for DE1-SoC with a given image file

- Skill to boot Linux from SD-Card on DE1-SoC

- Skill to cope files into Linux file system on DE1-SoC

- Basic Linux command operation skill


그리고 DE1-SoC FPGA Board와 x86 PC가 필요하다고 한다.

UART 통신이 되는 mini usb cable, microSD card 4GB 이상, microSD card reader ,프로그램 (Quartus 13.1 이상, SoC EDS 13,1 이상, win32 Disk imager)

많은게 필요하니 미리 구비하도록 하자

(나는 근데 microSD card가 없다. 큰일)


Altera SoC FPGA에는 HPS logic과 FPGA fabric이 AXI(Advanced eXtenstible Interface)라는 걸로 연결이 되어있다.

즉 HPS logic와 FPGA fabric간의 통신을 위해서는 Qsys라는 프로그램을 사용해야한다.


HPS가 갖고있는 HPS-FPGA AXI bridge의 종류와 특성은 다음과 같다.

Lightweight HPS-to-FPGA bridge(lwh2f)

- control and status register access

- fixed 32 bits

- lwh2f bridge is mastered by the L3 slave peripheral switch

HPS-to-FPGA bridge(h2f)

- connect memory

- 32, 64, or 128 bits

- should not be used for accessing peripheral registers like lwh2f

- h2f bridge is mastered by the L3 main switch (L3 main switch가 h2f bridge를 제어한다?)

FPGA-to-HPS bridge(f2h)

- cacheable access to the HPS

- 32, 64, or 128 bits

- FPGA-to-SDRAM(non-cacheable access)

- f2h bridge masters the L3 main switch(f2h bridge가 L3 main switch를 제어한다?)


이번 튜토리얼에서는 HPS-FPGA bridge를 이용하여 HPS로 FPGA에 연결되어있는 LED를 제어한다.

Quartus project 는 CD-ROM\Demonstration\SOC_FPGA\my_first_hps-fpga\fpga-rtl

C project는 CD-ROM\Demonstration\SOC_FPGA\my_first_hps-fpga\hps-c

에 각각 저장되어있다.


2. Quartus project

2.1 my_first_hps-fpga_base Quaruts Project

HPS와 FPGA의 핀 선언을 해야한다. HPS 핀선언은 핀의 방향과 IO standard 만 필요하고 location은 필요하지 않다.

Quartus를 실행시켜서 File > Open Project >CD-ROM\Demonstration\SOC_FPGA\my_first_hps-fpga_base 에 있는 project를 실행한다.

Tools에서 Qsys를 클릭하라고 되어있는데 다들 찾지 못할것이다.

Quartus II 버전 몇번까지 Qsys 인지는 모르겠지만 지금은 Platform Designer로 이름이 바뀌었다.

참고: Platform Designer (formerly Qsys) (https://www.intel.com/content/www/us/en/programmable/products/design-software/fpga-design/quartus-prime/features/qts-platform-designer.html)


어쨌든 Tools에서 Platform Designer를 찾아서 클릭하자.

Platform Designer를 실행하면 이런 화면을 볼수있다. 

맨위에 hps_0를 보면 h2f_axi, h2f_lw_axi, f2h_axi bridge를 확인할수 있다


2.2 Create a Quartus Project

이번엔 Platform Designer에서 PIO를 HPS를 연결해보자.


PIO는 FPGA에 연결되어있는 LED를 제어할때 쓰인다.

2.1에서 실행한 Platform Designer(Qsys)에서 IP Catalog 에서 PIO를 검색한후 더블클릭하여 추가한다.(Processors and Peripherals - Peripherlas - PIO)

Width:10, Direction: Output, Output Port Reset Value: 0x3ff

위와 같이 작성한후 Finish를 누르면 pio_0이 생긴걸 확인할수 있다. pio_0를 pio_led로 변경하자. 

AXI Master port(h2f_lw_axi_master)와 PIO slave port(s1)을 연결한다.

h2f_lw_axi_master를 클릭하면 두꺼운 검은선이 생기는데 이때 s1 옆에 있는 노드(점)을 클릭하면 연결된다.

Clock Input(clk)의 오른쪽을 보면 Clock 열이 있는데 클릭해서 clk_0으로 바꿔준다

Reset Input(reset)을 system reset과 연결한다

Conduit(external_connection) 오른쪽의 Export를 보면 "Double-Click to export"라고 되어있는데 더블클릭하면 "pio_led_external_connection"이 자동으로 채워진다.


Platform Designer에서 Generate > HDL Example... 을 눌러보면 pio_led_external_connection_export 이라는 시그널이 추가 되어있다고 하는데

Generate를 클릭해보면 HDL Example은 따로 없고 HDL Example Design이라는게 있는데 여기에는 뭐없다.

그래서 무시하고 Generate > Generate HDL > Generate 했다.

Compile(complete?) with warning이지만 되긴했으니 warning도 무시했다.

Platform Designer를 종료하고 다시 Quartus로 돌아간다.

ghrd_top을 열어서 220번째 줄 쯤에 soc_system u0가 있는데 여기에 ".pio_led_external_connection_export    (LEDR)," 를 추가한다.

저장후 Processing > start Compilation 을 클릭하여 컴파일을 한다.

컴파일이 제대로 되었다면 soc_system.sof 가 생겼을것이다.

Tools > Programmer 에서 Board에 잘 올려주면 모든 LED, 7segment가 켜진다.

 TCL script 창에서 project - soc_system - synthesis - submodules - hps_sdram_p0_parameters.tcl, hps_sdram_p0_pin_assignments.tcl 를 RUN한다.


3. C project

pio_led PIO 컨트롤러를 제어하는 ARM C program을 디자인한다.

3.1 HPS Header File

CD-ROM\Demonstration\SOC_FPGA\my_first_hps-fpga\fpga-rtl

위 주소에 generate_hps_qsys_header.sh, hps_0.h 이 있다.

hps_0.h를 잘 찾아보면 아래와 같이 적혀있다.

#define PIO_LED_BASE 0x0

#define PIO_LED_DATA_WIDTH 10

pio_led 의 base address와 width 인데 C program demo code에 쓰인다.


3.2 Map pio_led Address

application software로 접근할수 있게 pio_led의 physical address를 virtual address로 매핑한다.

어떻게 하는지 잘 모르겠다


3.3 LED control

PIO core(pio_led)의 Register Map을 이해해야 한다.

Register width는 32bits 이다.

LED control을 위해 offset 0 Register(data) 에 Output value를 사용한다.

DE1-SoC board의 LED는 LOW active 이기 때문에

offset 0 register에 0x00000000를 쓰면 모든 LED가 ON 되고, 0x000003ff를 하면 모든 LED가 OFF 된다.

C program에서 다음과 같이 사용할수 있다.

*(uint32_t *) h2p_lw_led_addr= 0x000003ff;

h2p_lw_led_addr 라는 virtual address에 0x000003ff를 쓰는건데

h2f가 아니고 왜 h2p인지는 모르겠다.


3.4 Main Program 

PDF 자료에 잘 나와있으니 skip

CD-ROM\Demonstration\SOC_FPGA\my_first_hps-fpga\fpga-c 에 main.c 가 있다.


3.5 Makefile and compile

CD-ROM\Demonstration\SOC_FPGA\my_first_hps-fpga\fpga-c 에 Makefile 이 있다.(없으면 작성하자)

SoC EDS command shell을 실행해서 아래와 같이 작성한다.

cd .. /cygdrive/c/(저장한 경로)/Demonstrations/SOC_FPGA/my_first_hps-fpga/hps-c

폴더가 이동된 상태로 make를 하면 my_first_hps-fpga file이 만들어진다.

내가 make를 했을때 "make: *** [main.o] Error 2" 가 떴는데 왜이러는지는 잘 모르겠다.

검색해보니 gcc compiler를 사용할 때 사용하는 파일이 없어서 make를 못하는 것 같다. 아직 해결하지 못하였다



3.6 Execute the Demo

Micro SD card에 Linux를 올려서 부팅하고 만들었던 my_first_hps-fpga를 linux에 복사한다.

“chmod +x my_first_hps-fpga” 을 작성하고 Quartus Programmer를 사용해서 .sof 를 FPGA에 올린다.(2에서 이미 했으니 이건 생략.)

linux에서 "./my_first_hps-fpga"를 입력하여 프로그램 시작을 하면 Board에서 LED가 작동된다.


참고 블로그: http://develop-fpga.tistory.com/14