반응형

 

이번에도 셀러가 제공해준 파일을 참고한다.

 

Vivado를 실행시켜 준다.

 

프로젝트 생성 전,

셀러는 Linaro LINUX를 사용하기 위해 arm_fpga_hdmi_output 프로젝트를 가져왔다고 한다.

우리는 아직  HDMI 를 해 보지 않았기 때문에 이번에 같이 진행하도록 한다.

ZYNQ_MINI_New > 02 Tests(중국어를 임의로 번역했다. 2번 폴더다) > ARM + FPGA > 04 ZYNQ HDMI 어쩌고 pdf파일을 열어준다.

 

 이 파일을 먼저 선행 학습해 본다.

 

이제 프로젝트를 생성한다.

프로젝트 이름 : arm_fpga_04_hdmi_output

나머지는 전에 했던 설정들과 동일하다.

 

 

프로젝트를 생성했다.

Create Block Design > ZYNQ7 Processing System을 바로 추가해 준다.

 

 

이전에 했던 것과 비슷하게 세팅을 진행한다.

 

 

체크 된 상태여야 한다.

GP0는 slave고, 다른 모듈에 의한 비디오 전송은 비디오 스트림을 제어해 데이터 전송을 시작한다고 한다.

 

 

S AXI HP0 Interface를 새로 체크해 준다. 

 

Peripheral I/O의 이더넷, usb, sd, 시리얼 포트를 조정한다.

 

 

다음은 MIO 설정을 본다.

 

 

HDMI만 하는 프로젝트에서는 이더넷을 사용하지 않지만, 우리가 하려는 Linaro LINUX를 구동하기 위해 켜는 옵션이다. 위의 I/O MIO16..27 도 설정해야 하고, Bank 1 I/O Voltage 도 LVCMOS 1.8V 로 고쳐줘야 한다.

그리고 속도를 모두 fast로 고쳐준다.

 

다음은 USB 0 을 고쳐준다.

 

전압은 이미 모든 I/O 타입의 전압을 바꿨기 때문에 속도만 바꿔준다.

 

다음은 SD0 이다.

 

 

마찬가지로 속도만 바꿔준다.

시리얼 포트는 기본으로 놔둔다.

 

다음은 클럭 세팅이다.

두 개의 클럭을 가져야 하는데, 한쪽은 100Mhz, 다른 한 쪽은 140Mhz를 가진다.

100Mhz는 AXI 버스와 타이밍 컨트롤에 사용되고, 

140Mhz 는 HP0 포트 비디오 데이터 스트림의 DMA 부분이다.(?)

 

 

 

아무튼 바꿔준다.

 

VDMA 모듈을 사용한다고 한다.

 

이거 때문에 100Mhz, 140Mhz 두개를 만들었다고 한다.

 

다음은 DDR 세팅을 한다.

 

 

두 부분을 수정해 준다.

 

마지막은 인터럽트 설정이다.

인터럽트는 PL-PS 인터럽트를 필요로 하는데, FPGA부분이 제공하기 위함이다.

프로세서는 HDMI insert detection interruptions, VDMA image transfer interruptions, image timing interruptions 에 사용된다고 한다.

 

세팅은 다음과 같다.

 

다 했으면 OK를 눌러 준다.

 

IP가 이렇게 변한 것을 볼 수 있다.

 

다음은 프로세서의 로직 부분에 대해 설명한다.

자일링스에서 제공하지 않는 IP를 사용해야 한다.

셀러가 제공해준 파일에

03 sample projects > 7010 > arm+fpga > 04_hdmi_output > repo > ip

axi_dynclk_v1_0

rgb2dvi_v1_2 

두 개의 폴더가 존재한다.

 

 

설명은 이렇다.

axi_dynclk_v1_0: IP module that generates corresponding display clock signals according to different resolutions, and AXI for ARM total
The line is configured.And we have used HDMI interface in the previous "HDMI interface using VGA display" tutorial, careful friends
You may also have the impression that HDMI requires two clocks, one is a pixel clock and the other is 5 times the HDMI encoded clock.This one.
The module also plays this role here, except that the output clock is configurable and uses ARM to pass through the AXI bus.
Configured. That is, ARM can configure the clock frequency of the output image through software code.

rgb2dvi_v1_2: Convert VGA display drive signal to TMDS HDMI encoded signal output to HDMI connector
Port. Same as the module used in the FPGA section "HDMI Interface Using VGA Display".

 

아무튼 이 IP를 추가하도록 한다.

추가하는 방법은 다음과 같다.

 

 

나의 경우 경로가 다음과 같다.

 

 

repo 전체를 select 해준다.

 

그럼 IP 2개, Interface 1개가 추가된다.

Apply > OK 를 눌러 나온다.

 

추가한 IP를 보기 위해 IP Catalog 를 선택해 준다.

User Repository 가 새로 생성되있는 것을 볼 수 있다.

UserIP, Video & Image Processing 에 각각 IP 가 들어있다.

 

 

기본적인 준비가 끝났다.

다음으로, AXIVideo Direct Memory Access 모듈을 추가한다.

다이어그램에서 + 를 눌러 추가한다.

 

 

추가한 뒤, 기본 ZYNQ PS를 다음과 같이 연결 해 준다.

 

 

 

새로 추가한 VDMA 를 더블클릭 해 본다.

 

 

 IP 설정 창이 나온다.

이를 다음과 같이 고쳐준다.

 

 

그리고 Advanced 옵션에 들어가 GenLock Mode를 Master 로 바꿔준다.

 

 

다 했다면 Ok를 눌러 나온다.

 

 

동그라미 친 Run Connection Automation 을 클릭한다.

 

모두 선택해 준다.

 

그럼 자동으로 연결이 된다.

그리고 VDMA(axi_vdma_0) 모듈의 왼쪽에 있는 두 개의 클럭을 수동으로 연결하고, 두 클럭은 모두 동일 클럭을 사용한다.

 

 

다음으로, AXI Stream Subset Converter 모듈을 추가한다. 

이 모듈은 32비트 데이터를 24비트 데이터로 변환하는데,

ARM은 32-bit 지만 데이터는 오직 24비트만 사용한다.

RGB 각각이 1 바이트씩 차지해 24비트가 됨.

 

다이어그램에서 subset 을 검색해 추가해 준다.

 

 

위쪽에 모듈이 하나 추가된 것을 볼 수 있다.

그리고 더블클릭 해 설정에 들어간다.

 

 

다음과 같이 설정해 준다.

이 모듈에 대한 자세한 설명은 arm_fpga_hdmi_output\related IP module documentation 에 있다

우리는 이 설정으로, RGB 데이터 배열을 설정한다.

왜냐면 이 이미지 배열은 DDR3에 저장되어 있고, 각각의 픽셀은 BGR로 배열되어 있지만 우리가 필요한 HDMI 출력 데이터는 RBG이기 때문이다.

 

설정이 끝난 이후, 다음과 같이 연결해준다.

 

 

그리고 새로운 모듈을 하나 더 추가해 준다.

+ 를 누르고 const 를 검색하자

 

 

추가를 해 준다.

마찬가지로 설정을 바꿀 것이므로 더블클릭 해 설정창에 들어간다.

 

 

1, 1 로 되어 있으면 된다.(기본값이기도 하다.)

그리고 다음과 같이 연결해준다.

 

 

다음은 AXI4-Stream to Video out 모듈을 추가해 AXI 인터페이스를 사용해 데이터를 읽은 값을 비디오 스트림으로 변환한다.

+ 표시를 눌러 vid를 검색 > AXI4-Stream to Video out 을 더블클릭 해 준다.

 

마찬가지로 설정에 들어간다.

 

 

다음과 같이 설정을 바꿔준다.

그리고 나와서 다음과 같이 연결해 준다.

 

 

연결을 완료했다면 모듈을 하나 더 추가한다.

+ 버튼 > timing 검색 > Video Timing Controller 추가한다.

 

 

 

추가한 모듈 설정에 들어가서 다음 그림과 같이 바꿔준다.

 

 

여기까지 완료했다면, Run Connection Automation 을 선택한다.

 

 

 

위 그림과 같으면 OK를 누른다.

 

그리고 수동으로 Video timing controller 의 vtiming_out 을 AXI4-Stream to Video out 모듈의 vtiming_in 에 연결한다.

 

연결했다면 다음은 AXI4 모듈의 vtg_ce 를 VTC의 gen_clken 에 연결한다.

 

 

연결을 완료했다면 HDMI 를 위한 인코딩 모듈을 추가한다.

+ > rgb2dvi 

 

 

추가한 뒤 더블클릭해 설정에 들어가 다음과 같이 만든다.

 

 

여기서 클럭을 2개로 나눠 쓰는 이유를 설명하고 있다.

720p@30hz는 클럭을 74.25Mhz를 사용하지만, 우리는 1080p@60Hz를 사용할 것이기 때문에 클럭을 120Mhz 이상으로 만든 것이다.

 

설정을 끝내고 나왔으면 수동으로 선을 연결해 준다.

 

 

연결을 완료했다면 클럭 생성 모듈을 추가한다.

+ > dynclk 검색

 

추가하면 이런 모듈이 생성된 것을 볼 수 있다.

 

따로 설정은 하지 않고, Run Connection Automation 을 선택한다.

 

rgb2dvi 를 제외하고 모두 선택해준다.

 

다 했다면 나와서 두 모듈을 이렇게 연결해 준다.

 

 

소프트웨어가 100Mhz 클럭에 자동으로 연결되므로 이전에 자동으로 연결된 v_tc_0의 클럭 및 s_axi_acl_axik 와 v_axi4s_vid-out0 모듈의 vid_io_out_clk 신호를 수동 분리한다.

 

 

위처럼 분리하고, 하나만 하는게 아니라 총 3개의 핀을 분리해 줘야 한다.

 

그리고 다음 그림과 같이 연결 해 준다.

 

 

 

연결이 마무리 되었다면 GPIO 모듈을 추가해준다.

+ > GPIO

추가하고 설정에 들어가 다음과 같이 설정해 준다.

 

 

OK를 누르고 나와 Run Connection Automation 을 눌러 자동으로 연결되게 한다.

 

 

전부 선택하고 OK 눌러준다.

끝난 후에 블럭을 보면(Zoom fit 상태) 이따구로 되어 있다.

 

 

좀 정렬을 해 준다.

 

 

Optimize routing 옵션을 이용해 최적화를 해 봤다.

다음은 EN 핀을 추가한다.

+ > const 검색

 

만들어진 모듈의 output 핀을 누르고 Make External 옵션을 선택한다.

 

이렇게 꼬리가 생긴 것을 볼 수 있다.

 

그리고 이름을 바꿔준다.

 

 

기존 dout > HDMI_EN 으로 이름을 변경해 주었다.

 

그리고 인터럽트 제어 모듈을 하나 더 추가한다.

+ > concat

 

 

이런 모듈이 하나 더 생겼다.

더블클릭 해 설정에 들어간다.

 

 

Number of Ports 를 3으로 조정해 주고 OK 를 누른다.

각 포트를 연결한다.

 

 

AXI Video Direct Memory Access의 mm2s_introut 과 Concat의 In1을 연결

 

 

Input은 이렇게 연결해 주고 남은 Output은 ZYNQ PS에 연결한다.

 

연결이 끝난 후, Run Block Automation 을 실행시킨다.

 

OK를 누른다.

다음은 RGB to DVI Video encoder 의 output 을 외부와 연결해 준다.

 

 

 

완료했다면, 만든 디자인을 한 번 검증 해 보자.

 

 

다음과 같은 메세지가 나온다.

 

 

지금은 크게 신경쓰지 않아도 되는 듯 하다. OK를 눌러 무시한다.

이렇게 하면 디자인 생성이 완료다.

 

HDMI 검증도 해 볼 필요가 있기에 비트스트림까지 생성해 보도록 한다.

합성을 하려는데 top 모듈이 없다고 하면, 이름을 design_1 이라고 칭하고 생성한다.

 

I/O 포트가 중요하다.

 

전압이 1.8V로 되어 있는 부분들을 3.3V로 고쳐준다(LVCMOS33)

핀은 위 사진과 같이 할당해준다.

저장하고, 다시 합성부터 비트스트림 생성까지 진행한다.

 

비트스트림까지 생성이 완료되었다면, SDK를 켜 준다.

(전에 HW Export 과정이 필요하다. 그냥 File > Export 에서 진행해 주면 된다.)

 

SDK를 켰다면, 새로운 프로젝트를 만든다.

file > new > application project

 

 

프로젝트 이름은 다음과 같다.

일단 wrapping 안 하고 진행해 보도록 한다.(뭐에 쓰는건지 아직도 모르겠다)

저대로 했다면 Finish 를 눌러 준다.

 

셀러가 SDK 소스 코드를 이미 파일 안에 넣어 줬다고 한다.

 

arm_fpga_04_hdmi_output.sdk > hdmi_test > src 에서 찾도록 하자.

폴더 째로 옮겨와야 한다.

hdmi_test 폴더와 hdmi_test_bsp 폴더를 둘 다 가져오자.

 

그리고 JTAG 와 UART 에 연결해 디버깅 하면 완료 라고 하는데..

디버깅 하는 방법은 ARM 의 03_AXI_GPIO 파일을 보라고 한다. 후..

일단 모르니까 보도록 한다.

다 필요없고 SDK 사용 부분만 본다.

 

 

Debug 설정으로 들어간다.

 

 

뭔 이상한 리눅스 어플리케이션 디버깅으로 잡혀있다.

FPGA 상에서 디버깅 환경을 만들기 위해 Debug type를 Standalone application debug 로 고친다.

 

 

추가로 뜨는 창에서는 Hardware platform 을 설정 해 준다.

그리고 Reset entire system, Program FPGA 를 체크 해 준다.

 

하고 Application 에서 프로세서를 선택하라고 하는데 나는 그게 안 뜬다(Hardware platform 을 design_1_hw_platform_0 으로 설정시)

 

그래서 비트스트림 파일을 저걸 쓰는 대신에 HW platform 은 ZC702_hw_platform 으로 변경한다.

 

그리고 Application 에서 ps7_cortexa9_0을 선택한다.

 

 

이랬는데 디버그가 비활성화 된 상태다. 일단 문제를 모르겠으니 sdk 폴더를 한 번 싹다 비운다.

그리고 다시 design_1 을 Wrapping 해준다.

 

wrapping 하고 나서 Export 하면 Wrapping 된 design_1이 아닌 그냥 design_1 만 내보낸다.

뭐지 제대로 한 것 같은데 싶어서 다시 비트스트림 생성을 한다.

 

역시 비트스트림 생성 과정에서 뭔가 있었던 것 같다.

다시 하니까 Wrapper 생성을 잘 한다.

 

그래도 혹시 모르니까 다시 hdmi_test 생성부터 한다.

셀러 hdmi_test 폴더를 다시 가져온다(hdmi_test_bsp 도 가져와야 함!)

 

가져 왔으면 바로 반영이 되는 시스템이 아니라 File > Refresh 를 꼭 해줘야 반영이 된다.

참고로 디버그 표시가 보이지 않는다면 위쪽 탭의 Run > Debug Config 로 들어가면 된다.

들어가서 실행시킨다.

 

 

아무튼 디버깅은 정상 작동한다.

아마도

근데 HDMI output이 아무것도 없는건가 화면이 왜 안나오는지는 잘 모르겠다

 

일단 동작은 확인했으니 HDMI 은 이까지 하고 본래 목적인 linaro linux 를 진행한다.

 

 

---------------------------------

추가

셀러가 제공해 준 소스로 debug 시는 동작하지 않았지만, Run으로는 60Hz 상에서 동작하는 것을 확인 가능했다. 참고로 30Hz로도 시험해 봤는데 현재 사용하는 모니터 출력모드는 지원하지 않아 출력이 되지 않았다.

 

Debug만 해봤기 때문에 기존 나의 코드로도 Run을 해 보았다.

잘 된다. 그냥 실행시키지 않아 화면이 출력되지 않던 것이다.

해결!

반응형
반응형

petalinux 2018.3 버전을 사용하였음

 

Linux 설치에 앞서, 새로 Vivado Project 를 먼저 생성 해 준다.

 

 

Project name 은 그림과 같이 설정하고, 나머지는 이전과 동일하게 한다.

물론 소스코드는 생성하지 않는다.

 

다 생성했다면, IP 블록을 하나 생성한다.

 

 

이후 다이어그램 창에서 ZYNQ PS를 불러온다.

 

 

이후 ZYNQ7 PS 를 더블클릭해 Configuration tab 에 들어가 다음과 같이 설정 해 준다.

 

 

Peripheral I/O Pins 에 들어가 UART1을 enable 해준다.

 

 

Clock configuration 에서 FCLK_CLK0 도 disable 해준다.

 

 

DDR configuration 에서 Memory part, bus width 를 바꿔 준다.

 

 

다 되었으면 OK

 

 

이후 Run block Automation 으로 DDR, FIXED_IO output 으로 나오게 설정한다.

 

여기서 다시 ZYNQ7 PS 를 더블클릭해 이번에는 MIO Configuration 에 들어간다.

 

 

해당하는 부분들을 바꿔 준다.

조금 내리면 SD 0 이 보이는데 이것도 체크 해 준다.

 

 

이후 OK 를 눌러준다.

 

다 되었다면 SDK를 실행시키기 위해 만든 디자인을 Wrapping 해준다.

 

이후 Output 파일을 만들어 준다.(Wrapping 하기 전 해도 된다.)

 

 

이후 파일을 Export 해준다.

 

 

그리고 SDK를 실행시켜 준다.

 

 

HW에 대한 정보들이 나와있는 페이지를 볼 수 있다.

 


Petalinux 2018.3 을 다운받는다.

다운로드 경로는 다음과 같다.

 

Downloads

Vivado, Vitis, Vitis Embedded Platform, PetaLinux, Device models

www.xilinx.com

 

Petalinux installer 를 다운받아 준다.

 

 

Windows 환경에서 해 보려고 했는데, 아무래도 Linux 환경에서만 가능한 듯 하다.

따라서 Virtual Machine 을 설치해서 해 보도록 하겠다.

 

반응형
반응형

03_Use SDK to solidfy FLASH code.pdf 를 참고하였다.

 

이번에는 셀러가 제공해 준 코드를 사용해 만들어 보도록 한다.

먼저, 프로젝트를 하나 생성한다.

프로젝트 네임 fpga_03_fpga_flash_download
프로젝트 타입 RTL project
소스 추가 X
보드 설정 xc7z010clg400-1

 

 

생성된 프로젝트 모습이다.

여기서 이번에는, IP INTEGRATOR 의 Generate Block Design 을 선택한다.

 

 

OK 를 선택한다.

그럼 Design 탭이 추가로 생성된 것을 볼 수 있다.

소스에도 디자인 소스에 design_1.bd 파일이 추가된 것을 볼 수 있다.

 

 

다이어그램에 + 에 커서를 갖다대면 Add IP 라는 창이 뜨는데, 이를 선택한다.

 

 

ZYNQ7 Processing System 을 선택한다.

 

 

그러면 ZYNQ7 PS 를 가지고 오게 된다. 이를 더블클릭 해 보자.

 

 

내부 구조가 나오게 된다.

 

이번에 설정할 것은, PS-PL Configuration 을 먼저 클릭해 보자.

General > Enable Clock Resets > FCLK_RESET0_N 의 Select 를 disable 한다.

 

 

아래의 AXI Non Secure Enablement > GP Master AXI Interface > M AXI GP0 interface의 select 도 disable 한다.

 

 

왼쪽 네비게이터 탭의 Peripheral I/O Pins 에 들어간다.

Quad SPI Flash 를 활성화 한다.

 

 

이후 MIO Configuration 으로 들어가 Quad SPI Flash 항목의 Speed를 모두 Fast로 바꾼다.

 

 

이후 Clock Configuration > PL Fabric Clocks > FCLK_CLK0 을 disable 한다.

 

 

이후 DDR Configuration > DDR Controller Configuration > Memory Part 를 MT41J128M16 HA-125로 바꿔준다.

 

 

아래의 Effective DRAM Bus Width 도 16Bit 로 바꿔준다.

 

 

긴 설정 작업을 다 했다. OK 를 눌러 나간다.

 

 

위의 초록색 바에 Designer Assistance avilable. Run Block Automation 이라고 나와 있는데, Run Block Automation 을 누른다.

 

 

선택을 하고 OK를 누른다.

 

그러면 ZYNQ PS OUTPUT 으로 DDR, FIXED_IO 가 생긴다.

 

 

이후 디자인 검증을 한 번 해준다.

 

 

성공했다면 OK 를 누른다.

 

 

이후 소스에서 내가 만든 .bd 파일에서 Generate Output Products 를 선택한다.

 

 

바로 Generate 버튼을 눌러 준다.

Number of jobs 는 자신의 스레드 개수에 따라 바뀌니 상관을 크게 하지 않아도 된다.

 

 

끝나면 끝났다고 알려준다.

 

 

다음으로 Create HDL Wrapper 를 실행한다.

 

 

OK 선택.

그리고 소스를 하나 더 추가한다.

 

 

디자인 소스를 추가하는데, 파일은 이것이다.

 

breath_led.v
0.00MB

 

 

파일을 추가하고 Copy sources into project 옵션도 on 으로 설정한뒤 Finish 선택.

 

 

이렇게 소스에 breath_led 가 추가로 생겼다.

 

그리고 design_1_wrapper.v 를 살짝 수정해 준다.

 

 

...
FIXED_IO_ps_porb,
FIXED_IO_ps_srstb,

    clk,
    rstn,
    led
    );
    input wire clk;
    input wire rstn;
    output wire [3:0] led;
    
  inout [14:0]DDR_addr;
  ...

 

 

breath_led breath_led_inst(
    .clk(clk),
    .rstn(rstn),
    .led(led));

 

를 각각 추가하고 저장해준다.

 

이후 합성을 진행한다(Synthesis > Run Synthesis)

이후 I/O 핀 매핑을 위해 RTL ANALYSIS의 Open Elaborated Design > 우측 상단 I/O Planning 에 들어가 I/O Ports 변경

I/O port 는 led [0]~[3], clk, rstn 만 수정한다.

 

 

그림과 같다.

다 기입했다면 저장하고 File name을 fpga_flash_download 로 설정해 준다.

 

 

OK 를 누른다.

이후 Bitstream 까지 다시 만들어 준다.

(Synthesis > Implementation > Bitstream)

 

이번에는 Bitstream 을 바로 보드에 올릴 것이 아니기 때문에 Bitstream 생성이 끝난 뒤에 cancel 을 눌러 창을 닫는다.

 

 

 

HW Export 를 선택한다.

 

 

bitstream 포함을 하고 OK 를 누른다.

 

이후 SDK 를 켠다.

 

 

Launch SDK 창이 뜨면 OK를 눌러 SDK를 킨다.

 

그러면 Eclipse 기반의 SDK 창이 켜진다.

 

 

SDK는 이렇게 생겼고, HW description file인 system.hdf 가 생성되어 있는 것을 확인 가능하다.

 

이제 SDK 상에서 새로운 프로젝트를 만들어 본다.

File > New > Application Project

 

 

프로젝트 이름은 fsbl 로 한다.

 

 

Next 를 누르고 Zynq FSBL 을 선택한다.

 

 

Finish 를 누른다.

 

왼쪽 프로젝트에 fsbl, fsbl_bsp 가 생성된 것을 볼 수 있다.

 

 

다음으로, Xilinx > Create Boot Image 를 선택한다.

 

 

 

이런 이상한 창이 나오는데, Output BIF file path 를 찾아보자.

 

 

.\fpga_03_fpga_flash_download\fpga_03_fpga_flash_download.sdk\fsbl\Debug 

경로 지정을 해 준다.

 

 

경로 지정을 했다면 아래 Boot image partitions 의 우측 Add 를 선택한다.

 

들어가서 File path > Browse..

보통 이쪽 경로는 자동으로 잡힌다.

 

 

아까 있었던 경로에서 .elf 파일을 찾고 열기를 눌러준다.

 

 

File Path 가 이렇게 잡히고, Partition type 는 bootloader 로 설정해 준다. 그리고 OK를 눌러 나가자.

파일을 하나 더 추가할 것이다. 다시 Add 를 눌러 아까 만들었던 wrapper 의 bitstream을 추가 할 것이다.

 

 

이 파일은 .\fpga_03_fpga_flash_download\fpga_03_fpga_)flash_download.runs\impl_1 에 위치해 있다.

찾아서 열고, Partition type 을 datafile 로 지정해 주자.

 

 

다 되었다면 OK를 눌러준다.

 

 

이렇게 추가되었다면 완료다.

Create Image 를 눌러 바이너리 파일을 생성하자.

 

이후 보드에 파일을 올리기 위해 처음은 JTAG(00) 모드로 킨다.

JTAG 에 USB를 꼽고 JTAG 모드로 전원을 켠다.

 

 

 

그림과 같이 Program Flash 를 켜준다.

 

 

그럼 그림과 같은 창이 나오는데, Image file 은 아까 우리가 생성했던 Binary 파일을 넣어준다.

 

 

경로는 다음과 같다. .\fpga_03_fpga_flash_download\fpga_03_fpga_flash_download.sdk\fsbl\Debug 

BOOT.bin 파일을 열어주고

FSBL file 도 지정을 해 줘야 한다. 이 친구도 BOOT.bin 과 있는 위치가 동일하기 때문에 바로 열 수 있다.

.elf 파일을 넣어 주도록 하자.

 

 

다 끝나면 이렇게 되어 있다.

Program 을 눌러 실행 시킨다.

 

Progress Information 이라는 창이 나오는데, 첫 실행에 굉장히 느리다.

나의 경우 30분 정도 기다렸는데 진행 될 생각을 안 해서 껐다가 키니까 빨리 진행 되었다.

 

Programming Flash를 진행 할 때에는 JTAG 모드로 키는 것을 잊지 말자.

 

이후 완료되었다면 보드의 BOOT 를 QSPI(10) 으로 설정하고 POR(reset button) 을 한 번 눌러 보자.

LED breathing 이 구현 되었을 것이다.

또한 보드의 ROM에 Write 한 것이기 때문에 전원이 끊겼다가 다시 QSPI 모드로 키더라도 내장된 코드가 바로 구현된다.

반응형
반응형

02_Create project under VIVADO.pdf 를 참고하였다.

 

첫 번째로, 설치한 VIVADO 2018.3 을 실행한다.

 

프로젝트 설치를 위해 File > Project > New 를 선택한다.

 

New Vivado Project Wizard 가 나올 텐데, Next 를 누르고 

Project name 을 정해보도록 하자.

Project name : fpga_01_pl_led_stream
Project location : <use your own path>

 

Project location 같은 경우, 너무 깊게 Path 를 설정하면 오류가 날 수도 있다고 했으니 적당하게 C 드라이브에 폴더를 하나 생성하자. 예를 들자면 C:\VivadoProjects 같은게 좋겠다. 다음과 같은 경로로 설정한다.

 

 

다 했으면 Next 를 누른다.

 

 

이번에 Verilog 파일을 이용해 보드를 세팅할 계획이므로 RTL Project 로 만든다.

 

Add Sources, Add Constraints (optional)

: Skip (Next 누르기)

 

 

우리가 쓰는 칩을 고른다.

셀러가 친절하게도, 선택 기준에 대해 알려주고 있다.

Family : Zynq - 7000

Package : clg400

Speed : 7010은 -1, 7020은 -2

 

결론은 

Ver 7010 : xc7z010clg400-1

Ver 7020 : xc7z020clg400-2

 

지금 봤는데 7010이 LUT 나 FF 나 개수가 역시 적긴 하다. 7020이 7010에 비해 약 3배 정도 차이나는 듯 하다.

Next 선택하면 프로젝트 요약을 보여준다.

확인하고 Finish 를 선택해 프로젝트를 생성하자.

 


 

 

현재 프로젝트는 생성되었지만 프로젝트 내의 소스 파일이 없기 때문에 아무것도 실행할 수 없다.

좌측 상단 Project Manager > Add sources 를 선택해 소스 파일을 추가하자.

 

 

새로 디자인 소스를 추가한다. Next 선택

 

 

새로 파일 생성을 해야 하므로 Create File 을 선택

 

 

새 파일의 이름은 led_stream 으로 한다. OK > Finish 선택

 

끝나면 Define Module 창이 나올텐데, 그냥 OK > YES 로 넘기도록 하자.

간단하게 input / output 설정을 할 수 있는 창이라 넘겨도 무방하다.

 

 

그러면 led_stream.v 파일이 디자인 소스에 추가된 것을 확인할 수 있다.

더블클릭을 해서 파일을 연다.

 

 

Verilog 파일 하나가 생성되어 있는 것을 볼 수 있다.

이후 다음과 같은 코드를 붙여넣는다.

 

module led_stream(
    input i_Clk,          // 클럭 입력
    input i_Rst,          // 리셋 입력
    output reg [3:0] o_LED // LED 출력
);

// 카운터와 LED 번호를 저장하는 레지스터 변수 정의
reg [31:0] cnt;
reg [1:0] led_on_number;

// 클럭 주파수와 카운터의 최대 카운트 값을 설정하는 매개변수
parameter CLOCK_FREQ = 50_000_000;
parameter COUNTER_MAX_CNT = CLOCK_FREQ/2 - 1;

// 클럭 신호의 상승 에지와 리셋 신호의 하강 에지에 반응하여 동작하는 블록
always @(posedge i_Clk, negedge i_Rst) begin
    if (!i_Rst) begin
        // 리셋 신호가 활성화되면 카운터와 LED 번호를 초기화
        cnt <= 0;
        led_on_number <= 0;
    end else begin
        // 그렇지 않으면 카운터를 증가시키고 최대 카운트에 도달하면 리셋
        cnt <= cnt + 1;
        if (cnt == COUNTER_MAX_CNT) begin
            cnt <= 0;
            led_on_number <= led_on_number + 1;
        end
    end
end

// LED 번호에 따라 LED 출력을 설정하는 블록
always @ (led_on_number) begin
    case(led_on_number)
        0: o_LED <= 4'b0001; // LED 번호가 0이면 0001
        1: o_LED <= 4'b0010; // LED 번호가 1이면 0010
        2: o_LED <= 4'b0100; // LED 번호가 2이면 0100
        3: o_LED <= 4'b1000; // LED 번호가 3이면 1000
        default: o_LED <= 4'b1111; // 그 외의 경우 모든 LED가 꺼짐
    endcase
end

endmodule

 

모두 작성했다면 저장한다. (Ctrl + S)

 

 

이후 SYNTHESIS 항목의 Run Synthesis 를 선택하면 다음과 같은 창이 나온다.

OK 를 눌러 다음으로 넘어가면 자동으로 디자인 합성을 시도한다.

 

 

합성이 성공하면 다음과 같은 창이 나온다.

I/O 포트를 지정해 줘야 하므로 Cancel 을 눌러 나온다.

이후 RTL ANALYSIS > Open Elaborated Design 을 선택한다. 창 나오면 OK 눌러준다.

 

 

그럼 우리가 짠 Verilog 파일에 대응하는 회로도가 나온다.

오른쪽 위를 보면 현재 Default Layout 이라고 나와 있는데 이걸 눌러 I/O Planning 으로 바꿔준다.

 

 

그럼 핀 설정 창이 나오게 되고, 아래 콘솔이 있던 부분에 I/O Ports 라는 새 창이 나오게 된다.

I/O std 를 전부 LVCMOS33 으로 설정해주고

대응하는 패키지 핀만 넣으면 나머지는 자동으로 채워진다.

 

 

현재 코드와 대응하는 ZYNQ_MINI 보드의 I/O 는 그림과 같다.

다른 핀들에 대해 궁금하다면, 이 보드를 만든 사람이 친절하게도 핀 넘버와 기능에 대해 설명한 자료가 있다.

01_Schematic\ZYNQ_MINI_REVB Schematic.pdf 파일을 한번 구경해 보자.

 

등등 대략적으로 알려주고 있다.

이번에 사용한 핀들을 보면 

K17 : PL_CLK_50M

M19 : FPGA_PL_KEY2

T12 : FPGA_PL_LED1

U12 : FPGA_PL_LED2

V12 : FPGA_PL_LED3

W13 : FPGA_PL_LED4

로 구성된 것을 볼 수 있다.

 

LVCMOS33 은 3.3V 전압 레벨에서 작동한다는 의미라 생각하면 될 것 같다.

 

핀 설정이 끝났다면 저장을 해 준다.

 

 

다음과 같은 화면이 나오는데, File name 만 적당히 수정해 준다. 현재 모듈과 같은 이름이면 될 것 같다.

타이핑 후 OK 버튼을 선택하자.

 

그리고 비트스트림이라는 파일을 생성하기 위해

PROGRAM AND DEBUG > Generate Bitstream 을 클릭한다.

 

 

이런 창이 뜰 텐데 그럼 Yes 를 누르고 다시 합성을 진행한다.(I/O 핀 매핑을 했기 때문에 달라짐)

그리고 비트스트림도 합성이 끝난 뒤에 자동으로 진행된다.

 

 

끝나면 Open Hardware Manager 을 누르고 OK 을 누른다.

 

 

Hardware Manager 창이 열리면, 아직 우리가 보드를 툴과 연결하지 않았기 때문에 하드웨어가 잡히지 않는다.

HW 연결 전, 보드와 PC를 연결하는 과정을 한다.

 

 

[중요] Boot 가 00 상태여야 한다. {ON / KE} 방향이 0이고 {1, 2} 방향이 1이다.

Boot 모드가 총 3개로 나뉜다.

* 만약 QSPI 모드로 바꾸고 싶다면 1을 1 방향으로, 2를 KE 방향으로 스위치 조정을 하고 전원을 인가한다.

Boot ON KE
JTAG 0 0
QSPI 1 0
SDCARD 1 1

 

JTAG 에 USB-C 케이블을 연결하고, PC와 연결한다.

 

이후 Vivado 로 돌아와 Open Target > Auto connect 를 선택한다.

 

 

그러면 이렇게 칩이 잡힌다. FPGA 용 칩과 ARM 코어가 잡힌 모습이다.

그럼 우리가 만든 Verilog 파일(현재 bitstream 으로 만듦) 을 보드에 올려볼 차례이다.

Program Device 를 누른다.

 

 

비트스트림 파일에는 우리가 만든 비트스트림 파일의 경로를 넣어 준다.

기본으로는 자동으로 잡힌다.

그리고 Program 버튼을 선택한다.

동작하는 것을 확인한다.

 

 

분명 처음 했을 때는 에러가 나지 않았는데 지금은 에러가 난다........

더 알아보고 고쳐봐야겠다.

 

[추가]

재부팅 하니 정상작동을 한다.

localhost 에서 Auto connect 로 XADC 를 못 잡아서 프로그램 실행이 되지 않은 것 같다.

그 전까지 로컬 서버 리스타트 등을 해도 효과가 없고, 재부팅 해야 되는 듯 하다

 

 

이런 식으로 PL LED쪽 제어를 해 보았다.

(코드는 위에 제공해준 것과 달라 LED 켜지는 모습이 다름)

반응형
반응형

보드가 도착했지만 아직 이 보드에 대해 잘 알지 못한다.

셀러가 보내준 사용 전 준비 사항을 한 번 살펴보자.

 

1. 모든 예제 프로젝트에 Vivado 2018.3을 사용하라.

2. 예제 프로젝트를 디스크의 루트 디렉토리에서 사용하는게 가장 좋다.

- vivado 가 파일 이름 경로 길이 제한이 있어 디렉토리가 너무 많으면 문제가 생길 수 있다고 한다.

3. 온보드 다운로더가 FPGA 디버깅과 다운로딩, 그리고 ARM A9의 디버깅과 시뮬레이션을 지원한다.[1]

또한 Win10은 드라이버가 필요 없고, 오직 하나의 다운로더만 하나의 컴퓨터에 적용된다.. 고 하는데 무슨 말인지는 잘 모르겠다.

4. FPGA 부분은 ZYNQ에 통합되어 있고, 일반적으로 칩의 소모 전력은 1W 정도라고 한다. 그런데 여름이나 자원을 많이    사용하면 열이 날건데, 그럼에도 일반적인 학습용으로는 여름에 써도 무방할 정도라고 한다.

물론 큰 프로젝트를 한다면 히트 싱크가 필요하겠다.

5. 보드가 PL(Programmable logic)-side FPGA에서 IO 핀을 34개 가지고 있다. IO 정규 레벨은 3.3V 고 5V를 인가하면 안  되는 것 같다.

6. 보드를 사용하기 위해 다음과 같은 소프트웨어가 설치되어 있어야 한다.

vivado 2018.3, CH340 driver, Serial port assistant

(additional for installing linux : petalinux installation program under linux / ubuntu / vmbox)

 

[1] : ZYNQ 칩이 FPGA 부분과 ARM-Cortex 로 이루어져 있어서 그렇다고 한다.

반응형
반응형

주문한 보드는 24년 3월 18일에 주문해 28일에 도착했다.

 

 

구성품은 그대로 왔다.

나는 아크릴 판이랑 나사, 스탠드오프는 미리 장착을 해 둔 상태고, 배송은 각각 따로 와서 조립을 해야 한다.

 

그리고 셀러가 SW, 설명서 등이 담긴 링크를 보내준다만

이게 정품일거라 생각은 하지도 않았지만 vivado 2018 + 라ol선스를 같이 보내준다.

 

음.. 웬만해선 개인 학습용으로 사용만 하도록 하자.

 


 

그럼 Vivado 를 설치해 보자. 불친절하게도 셀러는 툴 설치법에 대해서는 알려주지 않는다.

 

vivado 폴더의 xsetup.exe 를 실행시키면

 

와 같은 화면이 나올 텐데, 이후 인스톨러가 실행된다.

 

New version avilable 창이 뜨면 가볍게 무시해주도록 하자.

 

Vivado 2018에서 권장하는 OS 목록이다. 

Windows 11 에서도 정상적으로 동작하는걸 확인했다. Win11 사용자도 그대로 사용해도 될 듯 하다.

 

Next 를 누르고 License agreements 에 모두 동의하고 다시 Next 를 누르자.

 

 

설치할 판을 선택한다. 설명서에 SDK 주저리 적혀있는 것도 있으니 대충 HL Design Edition 을 설치하면 될 것 같다.

Next를 잘 못 눌렀어도 뒤에 설치 옵션을 지정할 수 있기 때문에 상관 없다.

 

Next 를 눌러 설치하자.

 


 

설치가 끝나면 라이선스를 추가하는 팝업 창이 나온다.(설치는 좀 걸린다.)

그러면 라이선스 파일을 모두 추가해주면 된다

 

 

Load License 에 들어가서 라이선스를 복사해 오자. 나는 셀러가 총 5개 파일을 제공해 줘서 모두 적용했다.

정식적으로 사서 사용하는 라ol선스도 아니기 때문에 개인 공부용으로만 사용하자.

반응형
반응형

 

연구실에서 공부를 하던 중, 심심해서 Aliexpress 에 접속을 했다.

그리고 생각보다 재밌어 보이는 보드를 발견했다.

ZYNQ-7010 칩을 사용하는 미니 개발 보드인데, Vivado를 한 번 써볼까 싶은 마음에 구매했다.

 

주 목적은 인터페이스 공부와 GPIO가 될 듯 하다. 기본적으로 달려 있는 OLED, 이더넷, HDMI, SDcard, GPIO 실습을 할 계획이다. 또한 AXI4 인터페이스도 추가로 할 것 같다.

 

다만 Quartus 라면 사용해 본 경험이 있는데, Vivado 라는 툴이 굉장히 익숙치 않아 배워 가는 과정이 필요할 듯 하다.

반응형

+ Recent posts