반응형

 

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

 

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을 해 보았다.

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

해결!

반응형
반응형

프로젝트 생성부터 시작한다.

Project name : pll_clock

Project type : RTL

Source : X

 

 

프로젝트를 생성 후 pll_clock_top.v 파일을 생성해 준다.

코드는 다음과 같다.

module pll_clock_top(
    input i_Clk,
    input i_Rst,
    output reg [3:0] o_LED
    );
    
parameter CLOCK_FREQ = 1_000_000_00;
parameter COUNTER_MAX_CNT=CLOCK_FREQ/2 - 1;    
reg [31:0] cnt;
reg [1:0] led_on_number;
wire clk_out1;
    
clk_wiz_0 clk_wiz_0_inst(
    .clk_out1(clk_out1),
    .resetn(i_Rst),
    .locked(),
    .clk_in1(i_Clk)
);

always@(posedge clk_out1, negedge i_Rst) begin
    if(!i_Rst) begin
        cnt <= 32'd0;
        led_on_number <= 2'd0;
    end else begin
        cnt <= cnt + 1'b1;
        if(cnt == COUNTER_MAX_CNT) begin
            cnt <= 32'd0;
            led_on_number <= led_on_number + 1'b1;
        end
    end
end

always@(led_on_number) begin
    case(led_on_number)
        0: o_LED <= 4'b0001;
        1: o_LED <= 4'b0010;
        2: o_LED <= 4'b0100;
        3: o_LED <= 4'b1000;
        default: o_LED <= 4'b1111;
    endcase
end
   
endmodule

 

Project manager > IP catalog 를 클릭 해 준다.

IP(Intellectual Property) 는 재사용 가능한 블럭들을 지칭한다. 근데 이 블럭들은 기능을 가지고 있는 

 

 

그러면 다음과 같은 창이 나온다.

 

 

Search : clock

 

아래에 있는 FPGA Features and Design > Clocking > Clocking Wizard 를 더블클릭 해 준다.

 

 

다음과 같은 IP 생성창이 나온다.

 

 

 

Input Frequency 를 50Mhz 로 조정해 준다.

 

 

위의 Output Clocks 탭을 클릭하고 clk_out1이 100Mhz인지 확인한다.

 

 

이 창에서 휠 다운을 해서 Reset Type > Negetive 로 돌려준다.(Active low)

 

 

OK 를 눌러 생성한다.

 

 

OK > 다음과 같은 창이 나온다.

 

 

이 정보가 생성이 된다고 알려주는데 그냥 generate 시킨다.

생성을 다하면 다음과 같은 창이 나오고 OK 눌러준다.

 

 

그럼 소스에 IP가 추가되어 있는 것을 볼 수 있다.

 

다음 사진과 같이 빨간 원을 친 부분을 누르면

 

 

 

이런 창이 뜨는데, OK를 눌러준다. 그러면 아래에 clk_wiz_0이 생기는걸 볼 수 있다(위 사진과 같음)

생성된 clk_wiz_0.v 파일을 열어본다.

 

 

자동 생성된 clk_wiz_0 모듈을 볼 수 있다.

이 모듈은 submodule 로 clk_wiz_0_clk_wiz 를 받는다.

그리고 우리가 설정한 대로 input 50Mhz clock 을 output 100Mhz clock 으로 늘려주는 역할을 한다.

 

모듈을 상세하게 더 알아보고 싶으면 submodule 을 클릭해 보면 된다.

 

반응형
반응형

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 켜지는 모습이 다름)

반응형

+ Recent posts