본문 바로가기

FPGA

[FPGA] 5. Basys3 사용해보기

 

 아래 코드는 지난 시간에 만든 전가산기 4개를 이용하여 4비트짜리 전가산기를 구현한 코드이다. Basys3 보드에서 스위치로 input을 넣고 LED로 결과를 출력하는 기능을 구현해보고자 한다. 구현하는 순서를 알아보자.

module fadder_4bit(
    input [3:0] A,
    input [3:0] B,
    input Cin,
    output [3:0] S,
    output Cout
    );
    
    wire c1, c2, c3;    
        fadder fa0(.A(A[0]), .B(B[0]), .Cin(Cin), .S(S[0]), .Cout(c1));
        fadder fa1(.A(A[1]), .B(B[1]), .Cin(c1), .S(S[1]), .Cout(c2));
        fadder fa2(.A(A[2]), .B(B[2]), .Cin(c2), .S(S[2]), .Cout(c3)); 
        fadder fa3(.A(A[3]), .B(B[3]), .Cin(c3), .S(S[3]), .Cout(Cout));
endmodule

 

 

1. 쓰고싶은 보드의 xdc파일 가져오기


먼저 회로도에 대한 코딩을 마쳤으면, 해당 보드에 대한 xdc파일에 접근하여 포트를 수정해주어야 한다. xdc파일을 얻기 위해 basys3의 제조사인 digilent사의 홈페이지에서 xdc파일을 다운받는다.

digilent사 페이지

 

2. Vivado에서 xdc파일을 열어주기


xdc파일을 다운로드했다면, 아래 경로에서 xdc파일을 Add Sources 해준다.

xdc파일 여는 경로

 

3. 사용하고 싶은 포트에 Input변수를 할당하기

 

xdc파일 수정

코드를 보면 각 핀에 포트가 매핑되어있는 것을 확인할 수 있다. 우리는 스위치에 input값을 넣어주고, LED에서는 output값인 결과를 알아야 한다. 따라서 sw0~sw4에 A0~A3과 Cin을, sw12~sw15에 B0~B3를 할당해주고, led0~led4에 S0~S3과 CarryOut인 Cout을 할당해준다. 

 

4. xdc코드 변경 완료 후 Synthesis(회로를 만들어주는 기능)


우리가 앞서 작성했던 코드를 게이트 회로도로 표현하는 과정을 거쳐야한다. 따라서 Synthesis 기능을 통해서 작성한 코드를 이용하여 회로도로 변환을 시켜주어야한다.

 

5. Implementation 후 Generate bitstream (회로를 구현하는 기능)


Implementation은 FPGA 내부 리소스를 사용하여 네트리스트를 배치하고 논리적인 연결을 설정하여 목표 장치에 맞는 최적의 디바이스 레이아웃을 생성하는 과정이라고 한다. 쉽게 말해서 우리가 사용하는 장치의 특성에 맞게 앞서 Synthesis를 통해 얻은 회로도를 적절하게 보드에 구현하는 과정이라고 생각하면 된다. Implementation을 클릭하고 Generate bitstream을 통해서 최종적으로 디바이스에 맞게 프로그래밍 할 수 있는 Bitstream 파일을 생성할 수 있다.

 

6. Serial 상위 Layout 탭 클릭 - I/O Planning 클릭

 

이제 막바지 작업으로 실질적으로 보드에 I/O핀을 배치하는 과정이 필요하다. I/O Planning 기능을 사용하면,  장치에 연결되는 외부 신호와 내부 신호 간의 연결을 계획하고, 우리가 앞서 지정한 핀의 할당을 고려하여 최적화된 I/O 배치 계획을 생성한다고 한다. AVR의 경우 우리가 배치를 결정해야했는데 너무 편하다. 

 

 

7. 왼쪽창 맨 아래쪽에 Generate Bitstream 클릭 후 대기 - 창뜨면 open target - 위 초록색 탭 Auto Connect 클릭  - Program device 클릭(보드의 칩 안에 회로를 만들어주는 기능)



우리가 사용할 FPGA 디바이스는 프로그래밍이 가능한 장치이다. 따라서 장치에 프로그램을 다운시키기 전에는 무언갈 동작시키는 기능이 전혀 없다. 따라서 FPGA 디바이스는 우리가 설계한 코드를 위 과정을 통해서 디지털 회로를 바꿨고, 이를 Bitstream 파일로 변환시켜 생성해야한다. 따라서 아래 Generate Bitstream기능을 통해서 Bitstream을 만들어주자. (사실 코드를 작성하고 보드를 연결시킨 다음 바로 이 Generate Bitstream만 눌러도 앞서 작성한 중간과정이 다 진행된다. 하지만 각 기능의 의미를 알아야 하는 것이 우선이기에 각 기능을 순서대로 설명하였다.)

 

.

Bit Stream을 만들었으면 아래와 같은 창이 뜰 것이다. Open Hardware Manager을 체크하고 OK를 누르자.

 

 

OK를 누르고 나면 상단에 민트색 탭에 Open Target을 누를 수 있다.Open Target을 누르고 Auto Connect 클릭한다.

 

 

Auto Connect 버튼을 눌렀다면 최종적으로 Program device 버튼을 눌러 디바이스에 프로그램을 다운시킨다.

8. 실행 결과



첫번째 동작은 A1(10진수 : 2)과 B2(10진수 : 4)를 눌러 2번째와 3번째 LED가 ON이 되었음을 알 수 있다. 

두번째 동작은 버튼을 모두 OFF하고 다시 A0~A4를 모두 ON시키고 B0를 ON 시켜 CarryOut을 확인할 수 있다.