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 켜지는 모습이 다름)
'ZYNQ_MINI' 카테고리의 다른 글
[ZYNQ MINI] 보드로 petalinux 돌려보기 - [1] (0) | 2024.04.01 |
---|---|
[ZYNQ MINI] SDK를 사용해 코드 내장시키기 (0) | 2024.04.01 |
[ZYNQ MINI] 설명서 읽어보기 (0) | 2024.04.01 |
[ZYNQ MINI] 보드 도착 및 툴 설치 (0) | 2024.04.01 |
[ZYNQ MINI] 테스트에 앞서서 (0) | 2024.04.01 |