2018년 4월 20일 금요일

Bram 사용(PL+PS mmap)

목적 : Linux의 mmap()함수를 사용하여 PL의 Bram에 Write하고 다시 Read하여 Bram을 Linux에서 사용하는데 목적을 둔다.

* 컴파일 및 자세한 사용법은 이전 gpio 프로젝트를 참고하고, 여기서는 간단하게 사용법을 적어둔다.

1. 하드웨어 디자인은 Bram 사용(PL+SDK Application)에서 사용된 디자인을 그대로 사용한다.

2. mmap()관련 테스트 소스코드는 https://github.com/pcw821029/ZC706_Study/tree/master/02.bram/mmap_src/mmap_test.c 을 참고한다.

3. SDK의 Board Support Package의 devicetree로 pl.dtsi파일을 생성하고, 리눅스에서 devicetree을 생성한다.

4. u-boot.elf, fsbl.elf, wrapper.bit 파일을 사용하여 BOOT.BIN파일 만든다.

5.  SD카드에 BOOT.BIN, devicetree.dtb, uImage, 파일을 복사 후 보드에 삽입하여 부팅한다.

6. 부팅이 완료되면 mmap을 사용하여 예제프로그램을 컴파일하여 tftp을 이용해 target보드에 download한다.
  a. mmap테스트 프로그램 컴파일 : 
     * Cross compiler path : buildroot-2017.02.1/output/host/usr/bin/
     $ Cross compiler path/arm-buildroot-linux-uclibcgnueabihf-gcc -o test test.c
  b. target 보드에 download : 
    - 컴파일 된 test파일을 tftp 폴더로 복사
      $ cp test /tftpboot
   - target 보드에서 tftp명령을 이용하여 파일 다운로드
     # tftp -gr test 192.168.0.102

7. 테스트 프로그램 실행
  # ./test

Bram 사용(PL+SDK Application)

목적 : 비바도에서 제공하는 IP core인 AXI BRAM Controller 2개와 실제 메모리 역할을 하는 Block Memory Generator(True Dual Port RAM)를 사용하여 axi_bram_ctrl_0을 통해 PORTA에 데이터를 쓰고  axi_bram_ctrl_1을 통해 PORTB에서 써진 데이터를 읽어봄으로서 Bram을 사용해보는데 목적을 둔다.

* 비바도 H/W 디자인 설계
1. 기본적인 zynq설정은 Add IP -> Re-customize IP -> Presets -> ZC706 선택.
    ; PS-PL Configuration -> GP Master AXI Interface GP0, GP1 선택

2. AXI Bram Controller 2개 추가 
    ; Add IP -> AXI BRAM Controller 선택

3. Bram을 더블클릭하여 Re-customize IP 설정 화면에서 Number of BRAM interfaces 을 1로 설정한다.

4. Block Memory Generator 추가
    a. Add IP -> Block Memory Generator 선택
    b. Block Memory Generator 설정 - Memory Type -> True Dual Port RAM

5. Net 연결
    a. Run Block Automation 클릭
    b. Run Connection Automation 클릭 

    c. 최종 연결 정보

6번 부터는 Axi_GPIO를 참고해서 수행하자
6. Create HDL Wrapper 
7. Generate Ouput Products 
8. Run Implementation
    ; Include Bitstream 을 꼭 체크하자.
9. Generate Bitstream
10. Export Hardware... 
11. Launch SDK

* SDK Application 제작
1. File -> New -> Application project
  a. New Project 팝업창에 Project name 을 입력하고 Next를 클릭
  b. Hello World 선택하고 Finish 클릭

2. Project Explorer 탭의 test_bram/src/helloworld.c 파일 수정

3.  DIP SW12을 모두 0로 설정한다. (Jtag mode로 동작시키기 위함)

4. DIP SW4를 01로 설정한다.

5. Jtag 케이블과 UART케이블을 컴퓨터에 연결한다.

6. File -> Xilinx Tools -> Program FPGA 를 클릭한다.
   ; Program 클릭한다.

7. 아래 그림과 같이 실행한다.

8. 결과 화면

AXI GPIO 이용한 LED 제어(PS)

목적 : ZC706 Board의 LED를 PS와 PL간 AXI Interface GPIO를 통해 LED를 제어한다.
* VirtualBox의 Ubuntu 14.04를 설치하였으며, buildroot-2017.02.1을 이용하여 이미지를 만든다. buildroot-2017.02.1 설정파일에 보면 Xilinx의 커널과 Uboot는 모두 xilinx-v2016.2를 다운받아 설치하게 되어있다.

1. buildroot-2017.02.1 설정 맞추기
  ; buildroot-2017.02.1 폴더로 이동하여 아래 명령을 실행한다. ($표시는 프롬프트다)
   $ make zynq_zc706_defconfig
  ; 이명령이 실행되면 ZC706 Evaluation Kit에 맞게 설정된다. 혹 다른 보드를 사용하는 경우 개발자가 직접 맞춰주던가 비슷한 플랫폼으로 기본설정을 맞추고 추가되는부분을 설정하면 된다.
config파일들은 buildroot-2017.02.1/configs 경로에 있다.

2. 컴파일 
  ; 설정이 끝나면 아래 명령으로 컴파일 한다.
   $ make
  ; 최초 컴파일시 시간이 약 2~3시간 정도 걸린다.
  ; 컴파일이 완료되면 buildroot-2017.02.1/output/images 폴더안에 uboot, 커널, rootfs, devicetree 등이 존재한다. (파일명은 다를수 있다)
  ;BOOT.BIN 파일이 만들기 위해서 uboot 파일이 필요하고,
uImage파일은 커널이며, rootfs.cpio.uboot 파일은 rootfs인데 파일이름을 uramdisk.image.gz변경하여 SD카드에 복사하면 된다.

3. devicetree 재 컴파일 
  ; 컴파일을 완료된 순간에는 gpio를 추가하지 않았기 때문에 SDK에서 만들어진 pl.dtsi파일을 추가해서 재컴파일이 필요하다.
  a. SDK에서 만들어진 pl.dtsi 파일을 buildroot-2017.02.1/output/build/linux-xilinx-v2016.2/arch/arm/boot/dts 폴더로 이동시킨다.(윈도우에서 리눅스로 파일을 옮기는 방법은 몇가지가 있지만 VirtualBox에서 제공하는 공유폴더를 이용하는게 편하다. 공유폴더 이용방법은 인터넷에서 찾아보자)
  아래는 파일 이동 명령이다.
   $ mv pl.dtsi /home/pcw1029/projects/buildroot-2017.02.1/output/build/linux-xilinx-v2016.2/arch/arm/boot/dts

  b. buildroot-2017.02.1/output/build/linux-xilinx-v2016.2/arch/arm/boot/dts 이동한다.
   $ cd buildroot-2017.02.1/output/build/linux-xilinx-v2016.2/arch/arm/boot/dts

  c. zynq-zc706.dts파일을 열어서 아래와 같이 pl.dtsi을 추가한다.

 d. 아래 명령어로 devicetree 컴파일을 한다.
   $ dtc -I dts -O dtb -o devicetree.dtb zynq-zc706.dts
   ; 컴파일 완료후 devicetree.dtb 파일이 생성되고, devicetree.dtb 파일을 SD카드로 복사하면 된다.

4. BOOT.BIN 파일 만들기
  ; BOOT.BIN 파일을 만들기 위해 u-boot.elf 파일, fsbl.elf파일, ??.bit 파일이 필요하다. 
  ; u-boot.elf 파일은 u-boot 파일의 이름을 u-boot.elf로 변경하면 된다.
  ; ??.bit 파일은 비바도에서 생성해주며, 위치는 프로젝트 생성 폴더/??.sdk/??wrapper_hw_platform/안에 보면 확장자가 bit인 파일이 있다.
  a. SDK의 메뉴에서 Xilinx Tools -> Create Boot Image를 선택한다.
  b. Output BIF file path: 의 Browse..을 클릭하여 BIF파일이 생성될 폴더를 지정한다. 
  
  ; Boot image partitions 에서 Add를 클릭하여 fsbl을 추가하고 OK를 클릭한다.
   ; Boot image partitions 에서 Add를 클릭하여 ??.bit 파일을 추가하고 OK를 클릭한다.

    ; Boot image partitions 에서 Add를 클릭하여 u-boot.elf파일을 추가하고 OK를 클릭한다

   ; 모든 파일이 추가되면 Create Image을 클릭하여 BOOT.BIN 파일을 만든다.

; BOOT.BIN 파일은 처음 Output BIF file path로 설정한 폴더에 생성된다.

5. BOOT.BIN파일을 SD카드로 복사한다.
  ; SD카드에는 리눅스에서 복사한 uImage, uramdisk.image.gz, devicetree.dtb와 윈도우 SDK에서 만들 BOOT.BIN파일이 들어있다.

6. 보드의 DIP SW를 아래와 같이 설정한다.

7. SD카드를 삽입후 전원을 인가한다.

8. 부팅이 완료하면 /sys/class/gpio 로 이동하여 gpio를 제어한다.
  a. 폴더 이동 : # cd /sys/class/gpio
  b. gpio1020 생성 : echo 1029 > export
  c. gpio1029 방향 설정 : echo out > gpio1020/direction
  d. gpio1020 led on : echo 1 > gpio1029/value

; 4bit의 LED를 제어하도록 비바도에서 설정했으며(자동설정이), gpio1020이 첫번째 비트가 되며 1021, 1022, 2013으로 각 각 gpio를 생성하여 제어 할 수 있다. 

2018년 4월 19일 목요일

AXI GPIO 이용한 LED제어 (PL)

목적 : ZC706 Board의 LED를 PS와 PL간 AXI Interface GPIO를 통해 LED를 제어한다.
* Vivado의 프로젝트 생성및 Block Design 추가는 생략한다.

1.  Add IP로 Zynq IP와 AXI GPIO IP 를 추가한다.

2. Zynq IP를 더블클릭하여 Re-customize IP설정을 한다.
  a. ZC706 개발 보드를 사용하기 때문에 기본적인 설정은 저장되어 있다. 따라서 이를 선택하면 기본적인 설정은 자동으로 맞춰지며, 추가 적인 부분은 개발자가 추가해주길(ex interrupt 추가)...

b. interrupt 는 추가적으로 설정해줘야 한다.

3. AXI GPIO 설정
  a. 추가된 AXI GPIO를 더블클릭하여 GPIO설정해 준다. (ZC706 Evaluation Kit를 사용하기 때문에 GPIO설정에서 lde 4bits를 선택한다. 이미 준비되어있다.)

4. Zynq와 GPIO를 서로 연결해준다. (비바도 툴에서 자동으로 연결하는 기능이 있다.)
  a. Run Block Automation 과 Run Connection Automation을 클릭하여 자동 연결을 수행하는데 체크박스가 모두 체크되어 있어야 한다.

  b. Zynq와 GPIO연결된 결과 화면

5. HDL Wrapper 생성

6. Output products 생성

7. Synthesis 
  a. Synthesis && Open Synthesized Design

  b. Pin mapping 정보 (ZC706 Evaluation Kit를 사용하기 때문에 개발자가 따로 설정할 필요없다)

8. Implementation & Bitstream

9. Export Hardware 
  a. 메뉴에서 File -> Export -> Export Hardware... 선택
  b. Include bitstream 체크박스를 선택하고 Ok 클릭

10. Launch SDK
  a. 메뉴에서 File -> Launch SDK 선택

11. FSBL 생성
  a. 10번에서 Launch SDK를 하게 되면 자동으로 SDK가 실행되는데 SDK 메뉴에서 File -> New -> Application Project를 선택한다.
  b. New Project란 팝업창이 뜨면 Project name을 입력하고 Next를 선택한다.
  c. Available Templates 에서 Zynq FSBL을 선택후 Finish를 클릭. (FSBL이 만들어지는데는 약간의 시간이 소요된다.)

12. GPIO가 추가됐기 때문에 Devicetree에 해당 GPIO에 대한 정보를 추가해주어야 한다. SDK에서 자동으로 만들어 주기 때문에 크게 문제가 되진않는다.
  a. SDK의 메뉴에서 File -> New -> Board Support Package를 선택
  b. New Board Support Package Project 팝업이 뜨면 project name을 입력하고, Board Support Package OS에서 device_tree를 선택하면 된다. ( 처음 설치하면 devicetree리스트가 존재하지 않는다 Xilinx의 Github에 들어가서 devicetree압축 파일을 받아와야 하며 SDK의 설정을 추가적으로 해주어야 한다.  추가 방법은 블로그를 참고하자)

13. 추가된 devicetree에서 필요한 파일은 pl.dtsi파일이며, 이 파일을 리눅스로 옮겨서 devicetree를 다시 컴파일 해주면 된다. (이부분은 AXI GPIO 이용한 LED 제어(PS) 를 참고하자)

VITIS Git + Doxygen Config

 Doxygen Configure 1. Vitis 메뉴의 Window->Preference의 C/C++ -> Editor의 Documentation tool comments 기본 설정값을 Doxygen으로 변경 설정 후 함수 바로 위에서 /...