https://www.xilinx.com/support/university/vivado/vivado-workshops/Vivado-fpga-design-flow.html
Lab01
버튼을 누르면 스위치에 불이 들어오게하는 기초 예제이다.
각 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
수동으로 추가해준다.
구조는 다음과 같으니 향후 참고할 수 있도록 하자.
## 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.)
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!!!
'적극적 생각 > FPGA' 카테고리의 다른 글
hls, ps, pl (0) | 2022.08.07 |
---|---|
[Vivado-Based Workshops] FPGA Design Flow using Vivado (2) (0) | 2022.08.04 |
[VerilogHDL, HLS, FPGA를 이용한 AMBA System 2장] Typical ASIC-flow (0) | 2022.08.02 |
[VerilogHDL, HLS, FPGA를 이용한 AMBA System 1장] (0) | 2022.08.02 |
verilog(.v) 대신 system verilog(.sv)를 사용하자 (검증특화) (0) | 2022.08.02 |