[FPGA와 Verilog 초보자 가이드 4] synthesis

지금까지 Verilog를 이용하여 모듈을 생성하고 시뮬레이션을 동작시키는 것을 살펴보았습니다. 시뮬레이션이 모듈이 올바르게 동작하는지에 대해 많은 정보를 알려주지만 실제 하드웨어에 옮겼을때 동작하는가에 대한 것을 말해주고 있지 않습니다. 여기서는 모듈을 sythesize하는 방법과 Spartan 3A FPGA 개발보드인 Elbert에 구현하는 것을 설명하겠습니다.

앞서 언급하였지만 test bench는 시뮬레이션에만 사용이 됩니다. 모듈을 syntheszie하기 위해서는 test bench코드를 지워야 합니다. 혹 모르시는 분을 위해 설명하면, HDL Synthesis란 Verilog나 VHDL과 같은 HDL 언어를 해석하여 동일한 하드웨어 토폴로지를 생성하여 내는 과정을 의미합니다. 이 하드웨어 토폴로지는 타켓으로 선정된 FPGA에 따라 달라집니다. Synthesis는 매우 복잡한 프로세스로 여기서 그 구체적인 내용까지는 알 필요는 없습니다.

모듈을 구현하기 위해서 Spartan 3A FPGA 개발보드인 Elbert를 선정하였습니다. 이 보드는 Xilinx Spartan 3A FPGA를 보드상에 탑재하고 있습니다. 정확한 파트넘버는 XC3S50A-VQ100이며 50K개의 게이트를 가진 100핀 VQFP칩입니다. 아래는 본 칩의 핀아웃그림입니다.


다시 모듈로 돌아와서 하드웨어에 이 모듈을 어떻게 구현할 수 있을 지 생각해보겠습니다. 모듈은 NOT 게이트이며, 이 모듈을 테스트 하기 위한 많은 가능한 하드웨어 설정이 있습니다. 여기서는 스위치와 LED를 이용한 하드웨어 설정을 통해 테스트를 하도록 하겠습니다. 하드웨어 설정은 아래와 같습니다.


위의 다이어그램을 보면 스위치는 VCC에 저항으로 풀업된 입력에 연결되어 있고, 출력은 LED에 연결되어 있습니다. 스위치가 열려 있을 경우에는 양 전압이 걸리게 되고 NOT 게이트의 입력에는 로직 1이 들어가게 됩니다. 이렇게 되면 출력은 로직 0이 되어 LED는 꺼지게 됩니다. 반대로 스위치가 닫히게 되면 NOT게이트의 입력은 로직 0이 되고 출력은 로직1이 되게 되어 LED는 켜지게 됩니다.

위의 테스트를 위한 기본적인 하드웨어 구성은 다음과 같습니다.

1. 풀업저항에 연결된 입력가능한 I/O에 스위치가 연결됨

2. 출력가능한 I/O에 LED가 연결됨

아래는 Spartan 3A FPGA 개발보드 Elbert 의 I/O와 장착 모듈을 보여주는 그림입니다.


위의 그림에서 볼수 있듯이 Elbert는 범용목적의 4개의 푸쉬 스위치를 가지고 있고, 여덟개의 LED를 가지고 있습니다. Elbert 회로도 를 살펴보면 스위치와 LED가 어떻게 연결되어 있는지 좀 더 확인 할 수 있습니다. 본 테스트를 위해서 SW0와 LED0를 사용하기로 하고 스키마틱을 살펴보면 SW0이 IP_3(핀7번)에 연결되어 있고 LED0는 IO_L01P(핀3번)에 각각 연결되어 있는 것을 확인 할 수 있습니다. 참고로, IP_3은 입력으로만 사용되는 핀입니다.

자, 이제 준비가 끝났습니다. 구현할 베릴로그 모듈이 있고, 하드웨어 플랫폼을 선택했으며, 어떤 IO를 사용할 것인지 결정했습니다. 모듈을 다시 살펴보겠습니다.

module myModule(A, B);
input wire A;
output wire B;
assign B = !A;
endmodule

모듈은 두개의 포트를 가지고 있습니다. 포트A는 입력, 포트B는 출력입니다. 포트A는 FPGA의 IP_3에 붙여 주어야 하고 포트B는 IO_L01P에 붙여 주어야 하는데 user constraint를 정의함으로써 연결을 할 수 있습니다. User Constraint는 HDL synthersizer의 한부분인 placement logic과 라우터에 모듈 신호들이 어떻게 물리적인 핀에 연결되어야 하는지를 알려주게 됩니다. 이러한 contraint의 리스트를 만들어 파일을 만들고, 이 파일을 프로젝트에 포함시키게 되는데 이 파일을 종종 User Constraints File이라고 부릅니다. Xilinx툴에서는 .ucf 확장자를 가진 텍스트 파일이 User Constraint File입니다. Elbert를 위한 contraint 파일은 여기서 다운로드 받으십시오(다운로드). 이 파일은 Elbert의 모든 IO에 대한 정의값을 가지고 있습니다만, 역기서 전부가 필요하지는 않습니다. 사용하지 않는 부분을 지운 부분은 아래에 있습니다.

# User Constraint File for NOT gate implementation on Elbert
# Onboard LEDs
NET "LED[0]" LOC = P3;
# Push Button Switches.
# Internall pull-ups need to be enabled since
# there is no pull-up resistor available on board
NET "SW0" PULLUP;
NET "SW0" LOC = P7;

4번라인을 살펴보면 NET이라는 말이 나와 있는데 NET은 실제 회로에서 wire나 연결과 동일한 말입니다. 즉 4번라인은 LED[0]을 3번핀에 연결하라는 명령입니다. NET "SW0" PULLUP은 SW0이 VCC에 풀업되어야 함을 의미합니다. 많은 FPGA IO는 내장된 풀업 저항을 가지고 있습니다. 이러한 저항들은 위와 같이 user constraint 파일에 설정함으로써 사용할 수 있습니다. 마지막으로 11번째 라인은 SW0을 7번 핀에 연결하라는 명령입니다.

그러면 모듈의 포트를 스위치나 LED에는 어떻게 연결하여야 할까요? 언급하였듯이 포트는 모듈에 들어오고 나가는 일종의 선과 같고, 다시말하면 NET와 동일한 역활을 합니다. 그래서 User Constraint파일에서 포트 이름을 NET 이름과 같이 사용할 수 있습니다. NOT 게이트 모듈을 위해서 위의 user constraint파일을 수정하면 아래와 같습니다.

# User Constraint File for NOT gate implementation on Elbert
# Onboard LEDs
NET "B"; LOC = P3;
# Push Button Switches.
# Internall pull-ups need to be enabled since
# there is no pull-up resistor available on board
NET "A" PULLUP;
NET "A" LOC = P7;

UCF 파일 다운로드

이제 디자인을 synthesize하고 테스트하여 보도록 하겠습니다. Xilinx ISE Webpack에서 시뮬레이터 프로젝트를 열고 모드를 Implementation으로 선택합니다. User constraint파일을 아래와 같이 프로젝트에 추가합니다. 테스트 벤치코드가 verilog소스파일에 있다면 지우십시오.


프로젝트를 저장하고 모듈의 오른쪽은 클릭하여 "Implement Top Module" 을 선택합니다. Synthesis는 수초에서 분이 걸릴 수 있습니다. 모든 것이 이상없으면 Process 창에서 체크표시가 된 초록색 원들을 보게 될 것입니다.


만약 어떤 아이템이 노랑색으로 변하였다면 warning이 발생하였다는 이야깁니다. warning은 때에 따라 무시해도 괜찮을 수 있을 수 있습니다. 만약 어떤 아이템이 빨간색으로 변하였다면 무언가 잘못되었다는 이야기이므로 처음으로 돌아가 재점검 해야합니다.

디자인을 synthesize 하였으면 하드웨어에 프로그래밍을 하여야 합니다. Elbert는 raw binary형태의 비트파일이 필요한데 이 파일은 synthesis 후에 생성된 최종 파일입니다. ISE는 디폴트로 raw binary bit 파일을 생성해주지 않으므로 아래와 같이 설정하여 얻을 수 있습니다.

1. Progress 창에서 "Generate Programming File"을 오른쪽 클릭하여 선택합니다.


2. Process Properties를 팝업메뉴에서 선택하고 다이얼로그박스에서 Create Binary Configuration 파일을 체크하고 "Apply"를 클릭합니다.


3. OK버튼을 눌러 다이얼로그박스를 닫고 progress창에서 "Generate Programmig File"옵션을 클릭한 후 "Run"을 선택합니다. 프로젝트 폴더에 보면 .bin파일이 생성 되어 있는 것을 확인 할 수 있고 이 파일을 Elbert에서 사용 가능합니다.

myModule.bin 파일을 Spartan 3A 개발보드 Elbert에 다운로드 하고 SW0 스위치를 눌러 LED가 켜지는지 확인해 보십시오. Elbert에 다운로드하는 것에 대해 좀더 자세히 알고 싶으면 Elbert의 유저가이드를 참고하세요

Xilinx ISE project 전체 다운로드 하기

Comments