적극적 생각/FPGA

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

무말랭이 2022. 8. 8. 07:31

Lab03

lab3.pdf
0.73MB

본 문서를 대략적으로 살펴보니

timing violation에 대한 해소는 

이 프로젝트에서 수행하는 것을 확인할 수 있었다.

lab3을 시작하자.

---

Introduction

정적 타이밍 분석

하드웨어 세션을 통해 FPGA를 프로그래밍

A9에서 실행되는 Software App을 통해 SDK에서 하드웨어를 프로그래밍함으로써 설계 검증

Objectives

implement

generate various report and analyze them.

run static timing analysis

generate bitstream and verify it.

Design Description

same

---

 

Step1 : Open a Vivado Project using IDE

lab2를 재활용한다.

save as를 활용해서 lab3로 만든다.

다시 rebuilt로 설정도 바꾸어준다.

 

timing report는 다음과 같은 4개의 section으로 이루어져있다.

(i) Summary, (ii) Source Clock Path, (iii) Data Path, and (iv) Destination Clock Path. 

 

각 path에 대한 schematic을 볼 수 있다.

근데 이건 output data path이다.

여러번 더블클릭해서 clk path까지 보이게 만들 수 있다.

(여기서 지금 IBUF, BUFG, FDRE, OBUF와 관련된 내용을 이해하지 못한 것으로 느껴진다.)

 

현재 고의적인 12ns의 virtual clk으로 인해 에러가 난 것으로 보인다. (?!)

이 virtual clk을 12ns에서 10ns로 수정해준다.

 

이 부분을 수정했음에도 불구하고

아직 setup time violation이 해소되지 못하였고

오히려 심화되는 현상이 발생했다.

 

synth1과 synth2의 충돌문제인가 싶어

우선 다음 단계로 넘어가며 앞단계로 돌아오며 문제해결을 하도록 하자.

 

(둘다 10 10 으로 수정해주었더니 해결되었다.)

 

다음 단계는 setup time이 아닌 hold time에 대한 violation 해결

 

우선 무시하고 implementation으로 넘어간다. (왜?!)

 

Step2 : Implement the Design

timing 해결되지 않았음을 알려줌.

 

이상하게 다시 Setup과 Hold에서의 시간이 바뀌었다.

(근데 문서보면 문서도 마찬가지다.)

왜 패스하고 syn-imp로 넘어왔으며, 그때 왜 변경이 이렇게 되었는지?

 

---

 

First failing path delays for the Zybo

 

여기서 set output delay 를 -2ns로 수정해주었더니

violation이 해결되었다.

-2ns 쯤이야 무시하겠다는 발상이긴 하다. 이 발상에 대해 조금 더 생각해볼 여지는 있다.

 

report clk networks.

 

Step3 : Generate the Bitstream

이걸로 비트스트림 만들어서

Step4 : Verify the Functionality

hw manager에서 

auto connect 시키고

uart_top.bit 를 쓴다.

 

---

 

자 이제 이걸 검증하기 위해서 

docs에서는 TeraTerm 이나 HyperTerminal과 같은 Terminal Emulator에서 SDK로 쓰라고 하는데

사실 vitis에서 검증하는 것과 같은 로직으로 보인다.

하지만 sdk 파일들을 다 열어봐도 c file이 잘 보이지 않으므로

Terminal Emulator로써 HyperTerminal을 선택해서 실행해본다.

 

 

그런데 이 문서에서 이야기하는 HyperTerminal이 이 Hyper는 아닌듯싶고

sdk 파일을 다시 찾아서 c 파일을 찾는것을 성공했다.

 

#include "xparameters.h"
#include "xgpiops.h"

//====================================================

// static XGpioPs psGpioInstancePtr;
// static int iPinNumber_TX = 48; // serial data sent to PC
// static int iPinNumber_RX = 49; // serial data received from PC

int main (void)
{

	  XGpioPs psGpioInstancePtr;
	  int iPinNumber_RX = 49; // serial data received from PC
	  XGpioPs_Config*GpioConfigPtr;
	  int xStatus, in1_status;
	  int iPinNumberEMIO_RX = 54; // data sent to FPGA serial module on this port
	  u32 uPinDirectionEMIO_RX = 0x1; // output to serial module in FPGA

	  // PS GPIO Intialization
	  GpioConfigPtr = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID);
	  if(GpioConfigPtr == NULL)
	    return XST_FAILURE;
	  xStatus = XGpioPs_CfgInitialize(&psGpioInstancePtr,
	      GpioConfigPtr,
	      GpioConfigPtr->BaseAddr);
	  if(XST_SUCCESS != xStatus)
	    print(" PS GPIO INIT FAILED \n\r");

	  //PS GPIO pin 49 setting to Input
	  XGpioPs_SetDirectionPin(&psGpioInstancePtr, iPinNumber_RX,0);

	  //EMIO PIN 54 Setting to Output port
	  XGpioPs_SetDirectionPin(&psGpioInstancePtr,iPinNumberEMIO_RX,uPinDirectionEMIO_RX);
	  XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, iPinNumberEMIO_RX, 1); // output to PL


	  while (1)
	  {
          // Read from the PC input and send it to the serial module in the FPGA
          in1_status = XGpioPs_ReadPin(&psGpioInstancePtr,iPinNumber_RX);
		  XGpioPs_WritePin(&psGpioInstancePtr,iPinNumberEMIO_RX, in1_status);
	   }
}

 

이걸 vitis blank c proj에서 여는 것을 시도해보자.

build 및 launch hw 수행했는데 

원하는 동작이 검증이 되지는 않는다.

FPGA 보드에서는 tx led만 깜빡거린다.

 

---

 

내가 지금 할 디버깅에 대해서 

다시 기본 설계부터 파악할 수 있도록 하자 again

그리고 그것을 기본적인 workflow에 녹여내야 한다.

 

이어서

https://learn-future.tistory.com/3927