적극적 생각/FPGA

[Vivado-Based Workshops] FPGA Design Flow using Vivado (1)

무말랭이 2022. 8. 4. 10:26

https://www.xilinx.com/support/university/vivado/vivado-workshops/Vivado-fpga-design-flow.html

 

FPGA Design Flow using Vivado

 

www.xilinx.com

 

 

 

Lab01

lab1.pdf
1.58MB

버튼을 누르면 스위치에 불이 들어오게하는 기초 예제이다.

각 Flow에 대한 이름에 대한 정확한 명칭을 참고하자.

코딩을 하기전에 설계를 먼저 해야한다. 이 능력은 갈수록 중점적으로 키워나가도록 하자.

명세 :

스위치[3:0]가 모두 켜져있고, 버튼[3:0]이 눌리면, 버튼에 대응하는 LED[3:0]이 동작하게끔 하자. (변형함)

그렇게 만든 모듈에 대하여 tb를 통해 검증해보고, 그리고 hw에도 올려서 검증해보자.

step1 Create a Vivado Project using IDE 

간단하게 design을 짜면 이렇게 되기는 하는데

향후 hw연결을 할 것을 감안하면

어떤 naming 규칙을 사용할것인지에 대하여

미리 zybo board에서 참고할 수 있는 source가 있어야 한다.

하다못해 우리는 switch 말고도 보드에 달린 모든것을 쓸 수 있어야하니깐 말이다.

이때 Zybo-Z7-Master.xdc 파일을 사용하면 된다. 적절히 변형하여 활용하자.

https://github.com/Digilent/digilent-xdc/blob/master/Zybo-Z7-Master.xdc

 

GitHub - Digilent/digilent-xdc: A collection of Master XDC files for Digilent FPGA and Zynq boards.

A collection of Master XDC files for Digilent FPGA and Zynq boards. - GitHub - Digilent/digilent-xdc: A collection of Master XDC files for Digilent FPGA and Zynq boards.

github.com

수동으로 추가해준다.

구조는 다음과 같으니 향후 참고할 수 있도록 하자.

## This file is a general .xdc for the Zybo Z7 Rev. B
## It is compatible with the Zybo Z7-20 and Zybo Z7-10
## To use it in a project:
## - uncomment the lines corresponding to used pins
## - rename the used ports (in each line, after get_ports) according to the top level signal names in the project

##Clock signal
#set_property -dict { PACKAGE_PIN K17   IOSTANDARD LVCMOS33 } [get_ports { sysclk }]; #IO_L12P_T1_MRCC_35 Sch=sysclk
#create_clock -add -name sys_clk_pin -period 8.00 -waveform {0 4} [get_ports { sysclk }];

##Switches
##Buttons
##LEDs
##RGB LED 5 (Zybo Z7-20 only)
##RGB LED 6
##Audio Codec
##Additional Ethernet signals
##USB-OTG over-current detect pin
##Fan (Zybo Z7-20 only)
##HDMI RX
##HDMI RX CEC (Zybo Z7-20 only)
##HDMI TX
##HDMI TX CEC 
##Pmod Header JA (XADC)
##Pmod Header JB (Zybo Z7-20 only)                                                                                                                                                                                                                                                         
##Pmod Header JC                                                                                                                                                                                                                                                  
##Pmod Header JD                                                                                                         
##Pmod Header JE                                                                                                                 
##Pcam MIPI CSI-2 Connector
## This configuration expects the sensor to use 672Mbps/lane = 336 MHz HS_Clk
##Unloaded Crypto Chip SWI (for future use)
##Unconnected Pins (Zybo Z7-20 only)

다음과 같이 활용할 핀들을 activate 시켜주고

다시 design 코드로 돌아가서 미리 호응관계를 맞추어준다.

step2 Simulate the Design using the Vivado Simulator 

tb를 구성하여

다음과 같이 시뮬레이션 되었다.

10ns마다 btn을 조작해서 led를 조작한다.

0001

0010

0100

1000

...

(이 초기화 조건이 fpga에 올릴때 어떻게 되는지에 대하여 확인할 필요가 있다.

    sw = 4'b1111;
    btn = 4'b0000;)

step3 Synthesize the Design 

검증이 되었으니 synthesis 해주자.

output 1개당 input 5개가 물려서

encoder lut가 많아지는

비효율적인 결과가 나오기는 하였다.

하지만 이 단에서의 최적화 문제까지는 아직 고려할 필요까지는 없어보이니 생략한다.

 

project summary에서 utilization을 확인할 수 있으며

step4 Implement the Design 

다음과 같이 implementation 되었으며

timing violation 또한 발생하지 않았음을 알 수 있다.

다음과 같이 구체적인 신호경로 또한 확인할 수 있다. Routing Resource.

그리고 각 라우팅에 대한 로그를 상세 레포트라는 형태로 또한 확인할 수 있다.

(synthesis와 대비되는 implementation의 차이점에 대하여 알고 넘어가자.

RTL을 Netlist로 바꾸는 것이 Synthesis, 그것을 Opt, Place, Routing 시키는 것이 Implementation.)

https://support.xilinx.com/s/question/0D52E00006hpkc2SAA/the-difference-between-implementation-and-synthesize?language=en_US 

 

The difference between Implementation and Synthesize

 

support.xilinx.com

step5 Perform Timing Simulation (Post-Implementation Timing Simulation)

기존 결과와 미묘하게 다르다.

예를들어 다음과 같은 두 지점에서.

이 두가지 패턴은

[1] tb에서의 if 구문의 위치가 정확한 timing을 지정하고 있지 않음

[2] 위에서 지적한 '초기화문제'로 예상된다. 

하지만 실제 시뮬레이션을 하면 진행이 없을 것으로 예상된다.

왜냐하면 junk값이고 combinational 회로이기 때문이다.

보드에 올리기 위해 여러 방향으로 검증을 할때는 이런 논리를 더 많이 뜯어야 한다.

보드에 올리고나서 이런 것들을 잡는것은 효율적이지 않은 flow이다. 그래서 tb다.

step6 Generate the Bitstream and Verify Functionality

JTag 모드를 확인하고

Power on 한다.

비트스트림 만들고

open hw manager 한다. (open target, auto connect)

(평소같으면 vitis로 가겠지만

지금은 바로 vivado 내부에서만 한다.)

hw에 올리고나서 실험을 해보았다.

예상했던대로 작동한다.

처음에는 junk값 때문에 정상 동작하지 않는다.

버튼을 눌러도 이상한 스위치가 켜지게 된다.

하지만 4버튼을 한차례 눌러주는 작업이 수행되고 나서는

각 버튼이 정상적으로 동작하게된다.

 

우선 이렇게해서 fpga에까지 bitstream을 올릴 수 있다는 사실에 대해서 확인되었다.

 

하지만 이런 junk값을 무시하고 넘어갈 수 없으니, 이 사소한 문제를 처리할 수 있도록 하자.

(아 근데 reprogram 하거나 refresh를 해도 재현이 안된다. 우선 생략하도록 하자.) 끘1!!!