Zynq SoC Training – Hardware Design Flow

Acknowledgement (Korean)
아래의 글은 Ali Aljaani가 운영하는 블로그인 embedded centric의 “Zynq SoC Training”을 번역한 문서입니다. 한글 번역 및 공개를 허용한 Ali Aljaani에게 감사의 말을 전합니다.

Acknowledgement (English)
This post is a translated version of “Zynq SoC training” in embedded centric. Thank you Ali Aljaani for allowing me to translate nice posts. I’m Taekyung Heo, and I translated this post into Korean.

Contact information (Author)
Ali Aljaani’s blog: http://embeddedcentric.com/
Ali Aljaani’s mail: alialjaani@embeddedcentric.com
Ali Aljaani’s LinkedIn: https://www.linkedin.com/in/ali-aljaani-a7130099
Ali Aljaani’s github: https://github.com/ama142


지난 실습(Memory-mapped I/O)에서 Zynq의 PS side, PL side 모두를 사용하는 실습을 했다. 이진 카운터를 구현하기 위해 ARM 프로세서에서 어플리케이션을 실행했다. 이번 실습에서는 이진 카운터를 다른 방식으로 구현할 것이다. 칩의 PL-side만 사용해 이진 카운터를 구현할 것이다. 하드웨어의 기능은 Verilog HDL (Hardware Description Language)를 사용해 구현할 수 있다. 이렇게 구현한 내용은 Verilog synthesizer가 Verilog 프로그램을 회로 netlist로 변환해준다. 이번 실습을 통해 하드웨어 디자인 흐름(specification, design, simulation, verification)에 대한 것을 학습할 수 있을 것이다.

lab2-design-flow

Lab2 Design Flow

lab2-block-diagram1

Lab2 Block Diagram

lab2-physical-connections

Lab2 Board Interface

실제 현장에서 하드웨어 엔지니어의 디자인 방식보다는 간소화된 방식으로 진행할 것이다. 우리가 지난 실습에서 사용한 IP 블록 또한 같은 방식으로 구현되었고, Verilog로 쓰여 쉽게 쓰일 수 있는 IP로 만들어진 것이다. Lab2의 Verilog 소스 코드는 여기에서 받을 수 있다. 이번 실습에서 우리는 Verilog 디자인을 검증하기 위해 시뮬레이션할 것이고, 그 이후에 구현하고 Bitstream을 생성해 ZedBoard에 올릴 것이다. 이 실습을 통해 소프트웨어로 구현된 것이 하드웨어로도 구현될 수 있음을 확인할 수 있을 것이다. 하드웨어로 구현하는 것은 더 복잡하지만, 경우에 따라 상당한 성능 향상을 얻을 수 있다.

이 실습에서 배울 것
1. Vivado를 사용해 ZedBoard에서 간단한 하드웨어를 HDL을 사용해 설계하는 방법
2. Vivado 프로젝트의 디렉토리 구조를 확인하고, Vivado가 생성하는 디렉토리와 파일에 익숙해진다.
3. 디자인에 대해 RTL 분석을 수행하고, Vivado에 의해 생성된 schematic을 분석하는 방법
4. Post-synthesis(estimation), post-implementation 분석을 통해 하드웨어 사용률을 확인하는 방법. 하드웨어 사용률을 통해 chip에서 사용 가능한 하드웨어 자원 중에 얼마나 사용했는지를 확인할 수 있다.
5. Vivado Simulator를 사용해 behavioral simulation을 수행하는 방법. Verilog testbench를 생성하고 waveform을 분석하는 방법.

실습 단계
A. GitHub에서 소스 코드 다운로드
Lab2에 사용될 Verilog 소스 코드와 constraints 파일을 GitHub Page에서 다운받는다. GitHub에서 파일을 다운로드하기 위해, 파일 이름을 클릭한다(이 경우에 Lab2 소스 코드가 압축되어 있다). 클릭하면 다음 페이지가 열린다. Raw를 클릭해 파일을 다운로드한다.

github-zynq-soc-training-source-code-repository

GitHub Zynq SoC Training Source Code Repository

download-source-code-from-github

Download Source Code from GitHub

소스 코드를 사용하기 쉽도록 압축된 파일을 추출해낸다.

source-code-after-extracting-from-the-compressed-file

Source code after extracting from the compressed file

B. Vivado에서 프로젝트를 생성하고 target board로 ZedBoard 선택
1. Vivado Design Suite를 실행한다.
2. File -> New Project를 클릭하고, New Project Wizard를 연다.

new-project-wizard

New Project Wizard

3. 다음 창에서 Project Name에 “lab2″를 입력한다. 그리고 프로젝트를 생성할 디렉토리를 선택한다. 현재 창에서는 Project Location으로 “c:/embeddedcentric/”를 선택했다. Create Project Subdirectory를 선택한다.

project-name-and-location

Project Name and Location

4. 다음으로 프로젝트 타입을 선택한다. RTL Project를 선택하고, Do not specify sources at this time을 체크 해제한다. 이번에는 소스 코드와 constraints를 Vivado에 import할 것이기 때문이다.

project-type-uncheck-do-not-specify-sources-at-this-time

Project Type (Uncheck Do not specify sources at this time)

5. Add Sources 창에서 초록색 더하기를 누르고 Add Files를 선택한다. 앞서 압축 해제한 디렉토리를 찾아 다음의 세 파일을 컨트롤 키를 눌러 선택한다 (Lab2.v,Freq_div.v,Direction_ctrl.v). 이 파일들은 Lab2를 위한 하드웨어 디자인 파일들이다. OK를 누른다. Add Sources창에서 Copy Sources into project를 체크한다. Next를 두 번 클릭해 Add Existing IP를 건너뛴다 (이번 디자인에서는 추가할 IP가 없다).

add-sources2

Add Sources

add-the-design-files-for-lab2

Add the design files for lab2

add-sources-window-after-adding-files

Add Sources window after adding files

6. Add Constraints 창에서 초록색 더하기를 누르고 Add Files를 선택한다. 앞서 압축 해제한 디렉토리에서 top_module.xdc를 추가한다. Copy Sources into project를 체크한다. Next를 클릭해 계속 진행한다. 이 파일은 LED, 푸시 버튼, 클럭에 대한 물리적인 제약을 담고 있다. 이 파일은 Verilog 파일에서 정의된 포트와 ZedBoard를 연결하는 역할을 한다.

add-constraints-window

Add Constraints Window

constraint-file

Constraint File top_module.xdc

7. 다음으로 프로젝트에서 사용하고자 하는 개발 보드를 선택한다. ZedBoard를 선택하고 NextFinish를 차례로 클릭한다.

default-part

Default Part

C. Vivado 프로젝트 디렉토리 구조 탐색하기
이 섹션에서는 Vivado가 어떻게 소스 코드를 다른 디렉토리에 나누어 관리하는지를 보여줄 것이다. 윈도우 탐색기를 사용해 “C:\embeddedcentric\lab2″를 확인한다. lab2.cache, lab2.hw, lab2.sim, lab2.srcs 디렉토리와 lab2.xpr Vivado 프로젝트 파일이 생성된 것을 확인할 수 있다. lab2.cache 디렉토리는 Vivado 프로그램 데이터베이스를 위한 디렉토리이다. lab2.srcs아래에는 constrs_1, sources_1 디렉토리가 있다. 이 디렉토리들 안에는 top_module.xdc (constraints), Lab2.v, Freq_div.v, Direction_ctrl.v (소스 코드)가 나뉘어 저장되어 있다 (다른 디렉토리에 대해서는 다른 섹션에서 다룰 것이다).

vivado-project-directory-structure

Vivado Project Directory Structure


Vivado로 돌아가서, Sources 창에서 Lab2를 더블 클릭한다. Freq_div와 Direction_ctrl이 Lab2보다 구조적으로 아래에 위치하는 것을 확인할 수 있다. 이는 Lab2가 top level이고, 이 안에서 Freq_div, Direction_ctrl을 생성하여 사용하고 있기 때문이다. 그리고 앞서 프로젝트로 가져온 top_module.xdc또한 Constraints > constrs_1 아래에서 확인할 수 있다.
vivado-sources-pane2

Vivado Sources Pane

D. 소스 파일에 대한 RTL 분석 수행하기
Register Transfer Level(RTL) 분석을 통해 Verilog 소스 코드에서 생성되는 회로에 대한 정보를 얻을 수 있다. Flow Navigator 창의 RTL Analysis 아래, Open Elaborated Design > Schematic을 클릭한다 (어느 정도 시간이 걸릴 수 있다).

rtl-analysis

RTL Analysis

design-schematic

Design Schematic

Schematic viewer는 설계한 하드웨어에 대한 도식을 보여준다.
– 두 개의 입력을 가지고 있음을 확인할 수 있다. 5 bits 너비의 스위치 (푸시 버튼)와, clk을 볼 수 있다.
– 8 bits 너비의 한 개의 출력, leds를 확인할 수 있다.
– 두 개의 모듈이 사용되고 있음을 볼 수 있다 (Freq_div, Direction_ctrl).
– u1의 출력(freq_out)이 u2의 입력(clk)으로 들어가는 것을 확인할 수 있다.
– 스위치의 하위 3비트는 u1에 연결되어 있다.
– 스위치의 상위 2비트는 u2에 연결되어 있다.

Schematic viewer에서 보이는 모듈에 더하기 표시를 눌러 내부 구조를 확인할 수 있다.

여기서 Freq_div 모듈은 frequency divider이다. 개발 보드에서 생성되는 100MHz 주파수를 3~12Hz 크기로 바꿔준다 (주파수의 결정은 푸시 버튼의 입력에 따라 바뀐다). Direction_ctrl 모듈은 frequency divider에서 출력한 주파수에 의해 동작한다. 이진 카운터를 증가시킬 것인지 감소시킬 것인지를 스위치의 입력에 따라 결정하는 역할을 한다. 그리고 이진 카운터의 출력은 보드의 8개 LED에 연결되어 있다.

E. Vivado 시뮬레이터를 사용해 디자인 시뮬레이션
여기에서는 Verilog 모듈의 기능을 테스트하기 위해, 모듈이 우리가 기대하는 동작하는지 확인하고자 한다. 이는 behavioral simulation을 통해 확인할 수 있다. Behavioral simulation을 통해 논리적인 오류, 미처 잡아내지 못한 문법 오류 등을 확인할 수 있다.

1. Flow NavigatorProject Manager > Add Sources를 클릭한다.

add-sources

Add Sources

2. Add or Create Simulation Sources를 선택하고 Next를 클릭한다.

add-simulation-source

Add Source Window

3. Add or Create Simulation Sources 창에서 초록색 더하기 표시를 누르고 Add Files를 선택한다. 앞서 압축 해제한 디렉토리로 이동하여 Lab2.sim을 선택해 추가한다. Copy Sources into projectInclude all design sources for simulation를 체크한다. Finish를 클릭해 설정을 완료한다.

add-simulation-file

Add simulation file

4. Sources 창을 선택하고 Simulation Sources를 확장한다. Lab2_sim.v를 Simulation Sources에 추가한다. 그러면 자동적으로 Lab2.v가 UUT instance로 추가될 것이다 (UUT는 Unit Under Test의 약자이다).

sources-pane

Sources Pane

5. 이 단계는 Vivado가 어떻게 시뮬레이션 파일을 구조화하는지 보기 위한 단계이다. 윈도우 탐색기를 열고, sim_1 디렉토리가 constrs_1 그리고 sources_1 디렉토리와 동일한 수준에 생성된 것을 확인한다. lab2_sim.v는 “C:\embeddedcentric\lab2\lab2.srcs\sim_1\imports\Lab2 Source Code”에 위치한다.

6. Vivado로 돌아온다. Sources 창의 lab2_sim을 더블 클릭하고 그 내용을 확인한다. Simulation file (testbench)는 Lab2 디자인을 unit under test (UUT)로 49~53번 줄에 걸쳐 초기화한다.

lab2-design-as-a-unit-under-test

Lab2 design as a Unit Under Test

Lab2의 입력은 62번 줄에서 정의된다.

input-stimuli

Input stimuli

switches의 각 비트는 차례대로 Down[4], Up[3], Low[2], High[1], Medium[0]을 의미한다. 1을 인가하는 것은 해당 신호를 활성화하는 것을 의미한다. 따라서 01010은 빠른 속도로 이진 카운터를 증가시키는 것을 의미한다.

Lab2 모듈의 클럭을 시뮬레이션하는 것은 68번 줄의 always 블록에서 수행된다. 클럭의 주기는 10ns(5×2) 이다. 시뮬레이션 파일의 첫 번째 줄에 있는 ‘timescale 1ns/1ps’는 시뮬레이션 단위와 해상도를 의미한다. 다시 말해, # 뒤에 나오는 숫자를 나노 초 단위로 간주하고 시뮬레이션 결과를 확인할 수 있는 기본 단위를 피코 초로 하겠다는 것이다.

clock-stimulus1

Clock stimulus

7. Flow NavigatorProject Manager 아래 Simulation Settings를 선택한다. Project Settings 창이 열릴 것이다.

8. Simulation 탭을 선택하고, Simulation Run Time의 값을 500ms (1초의 절반)로 설정한다. OK를 클릭해 설정을 완료한다. (Note: 컴퓨터의 성능이 낮다면 timescale 해상도를 바꿔야 할 수도 있다.)

project-settings-window1

Project Settings Window

9. Flow NavigatorProject Manager 아래 Run Simulation > Run Behavioral Simulation을 선택한다. Testbench와 소스 파일이 컴파일되고 Vivado 시뮬레이터가 실행될 것이다. 시뮬레이션의 결과가 아래와 같이 나타날 것이다 (크게 보려면 그림 클릭).

design-simulation

Design Simulation

Vivado 시뮬레이터에는 크게 네 가지 창이 있다: (i) Scopes: glbl 객체를 비롯해 testbench 구조를 보여준다, (ii) Objects: 최상위 레벨 신호를 보여준다, (iii) Waveform: 시뮬레이션 결과를 보여준다, (iv) Tcl Console: 시뮬레이션 상태를 텍스트로 출력한다.

(01010) 신호가 입력으로 주어지고, 출력값이 500m마다 0에서 6까지 차례대로 증가하는 것을 확인할 수 있다. 500ms마다 6개의 트랜잭션이 발생한다. 1초에는 12개의 트랜잭션이 발생하는 셈이고, 따라서 LED는 12Hz의 주파수로 반짝인다. 만약 입력 신호가 (01100)이면 반짝임은 더 낮은 주파수로 진행된다.

Waveform 창 옆에서 몇 개의 버튼을 볼 수 있다. 각각의 버튼은 Vivado 시뮬레이터의 기능을 지원하는 버튼이다.

vivado-simulator-features

Vivado Simulator Features

Pause 버튼을 눌러 시뮬레이션을 일시 정지할 수 있고, Zoom Fit 버튼을 눌러 전체 waveform을 확인 가능하도록 할 수 있다. Waveform만 따로 보기 위해서는 창의 우측 상단에 있는 float 버튼을 누르면 된다.

필요한 경우에는 wave의 출력 포맷을 변경할 수 있다. 예를 들어, leds[7:0]을 선택하고 우클릭하여 Radix 메뉴에서 Unsigned Decimal을 선택해 값을 2진수가 아닌 10진수로 변경할 수 있다.

10. File > Close Simulation을 선택해 시뮬레이터를 종류한다.
11. OK를 클릭하고 No를 클릭해 waveform을 저장하지 않고 종료한다.

탐색기를 열어서 “C:\embeddedcentric\lab2\lab2.srcs”를 보면 Vivado가 시뮬레이션 파일을 sim_1 아래에 가져온 것을 확인할 수 있다.

lab2-directory-structure-after-running-simulation

Lab2 directory structure after running simulation

F. 디자인을 합성하고 Project Summary Report 분석 (Post-Synthesis)
1. Flow Navigator에서 SynthesisRun Synthesis를 클릭한다. Vivado는 Lab2.v 파일을 합성할 것이다. 합성 과정이 끝나면 Synthesis Completed 대화 상자가 세 가지 옵션과 함께 뜰것이다. Open Synthesized Design을 선택하고 OK를 클릭한다. Open Synthesized Design을 클릭함으로써 합성 결과를 확인할 수 있다.

2. Project Summary 탭을 선택한다. Project Summary가 보이지 않는다면 Layout > Default Layout을 선택하거나 Project Summary 아이콘을 클릭한다.

project-summary-post-synrhesis

Project Summary Post-Synthesis

3. Utilization 탭의 Table 탭을 클릭한다. 이 화면에서 디자인에 쓰인 칩 자원 소모량을 확인할 수 있다. 아래 표의 내용을 설명하면 다음과 같다. Lab2 디자인은 ZedBoard의 Zynq chip (XC7Z020)에 있는 106400의 Flip-Flop 중에서 48개의 Flip-Flops(FF)를 사용하고 있다. 93개의 Look up tables (LUT), 14개의 입출력 포트 (5개의 입력, 8개의 출력, 1개의 클럭) 그리고 한 개의 global buffer (BUFG)를 사용하고 있다.

utilization-post-synhesis

Utilization Post-Synhesis

구현은 아직 하지 않았으므로, post-implementation 정보는 아직 보여지지 않는다.

post-implementation-utilization-empty-at-this-moment

Post-Implementation Utilization empty at this moment

G. 디자인을 구현하고 Project Summary 결과를 분석하기 (Post-Implementation)
1. Flow Navigator에서 ImplementationRun Implementation을 클릭한다. 구현 프로세스가 완료되면 Implementation Completed 대화 상자가 세 가지 옵션과 함께 뜰 것이다. Open implemented Design을 선택하고 OK를 클릭한다. Synthesized Design 창을 닫을 것인지 물으면 Yes를 클릭한다.

device-viewresources-view

Device View(Resources View)

Device view는 구체적으로 장치가 어디에 배치되고, 어떻게 연결되었는지 보여준다. 실제로 이 창에서 LUT, FF 그리고 다른 자원들이 어디에 배치되었는지를 확인할 수 있다. 회로가 어떻게 배치되고 연결되었는지는 성능에 직접적인 영향을 미친다. 따라서 Vivado는 Implementation Settings를 통해 이에 대한 유연성을 제공한다. Timing constraints를 줌으로써 배치와 연결을 효율적으로 할 수 있다. 이에 대한 내용은 이 실습의 범위를 벗어난다.

Device view를 크게 확대해봄으로써 상세 내용을 확인해볼 수 있다. Routing Resources 버튼을 누르면 컴포넌트 사이에 연결이 어떻게 되어 있는지를 확인할 수 있다.

routing-resources

Zoomed in view of the Device View

2. Project Summary 페이지를 연다. 그리고 Post-Implementation Utilization 결과를 확인한다. 여기서 보이는 값들이 실제 Lab2 Verilog 디자인이 사용하는 자원이다.

post-implementation-utilization

Post-Implementation Utilization

H. Bitstream 생성 및 기능 검증
1. Flow Navigator 창에서 Program and DebugGenerate Bitstream을 클릭한다. 프로세스가 완료되면 Bitstream Generation Completed 대화 상자가 두 개의 옵션과 함께 보여진다. Open Hardware Manager를 선택하고 OK를 클릭한다. Hardware Manager 창이 “unconnected” 상태로 열린다.

2. Open Target을 선택하고, Auto Connect를 선택한다 (방화벽 설정 메시지가 뜨면 Allow Access를 선택한다).

open-target

Hardware Manager Tab

3. Program device를 클릭하고, xc7z020_1을 선택한다. 다음 창에서 기본 옵션으로 두고 Program을 클릭한다.

program-device

Program Device

장치에 프로그래밍이 완료되면 DONE 불빛이 켜진다 (청색 LED). 버튼을 눌러보며 Lab1에서 구현한 것과 기능이 동일한지 확인한다.


이로써 두 번째 실습인 Hardware Design Flow를 마친다. 이번 실습에 대한 해답은 여기에 있다.


Advertisements
Tagged with: , , , , , , , , , , , , , , , , , , , ,
Posted in FPGA

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

누적 방문자 수
  • 96,190 hits
%d bloggers like this: