https://chanfifo77.tistory.com/99
이전 포스팅의 마무리인 STA부터 이어서 작성하겠습니다.
STA로 모든 경로를 전수조사 할 때, 최단 경로와 최장 경로만 체크하여 그 부분의 Setup 및 Hold Time을 체크하면 됩니다.\
아래에 예시를 보겠습니다.
위 회로에서 STA를 진행한다고 가정하면, 위 경로 중에 Longest Path의 시간을 계산하고, Shortest Path의 시간을 계산해야 합니다.
먼저 Longest Path를 본다면 (적색) F/F 에서 Tpd가 40이고, Longest Path에서 거치는 게이트가 3개이므로
longest path = 80 + 40 + 40 + 40 + 50(setup time) = 250
4.0 GHz의 Tc인 250ps와 일치하므로 계산상으로는 문제가 없습니다.
Shortest Path를 살펴보자면 1개의 Gate를 지나고 최단 시간으로 계산하면
Shortest Path = 25 + 30 = 55ps
하지만, 맞춰야 하는 hold time은 60ps 입니다.
Tccq + Tcd ≥ Thold를 지켜야 하기 때문에 지연 시간을 늘려야 합니다.
하지만 Tccq는 contamination Delay로 정해진 값이기 때문에 수정할 수 있는 것은 Tcd밖에 없습니다.
그래서 Shortest Path에 Buffer를 추가하여 지연시간을 늘려 Hold Time보다 키우는 방법을 사용합니다.
Tc ≥ Tpcq + Tpd + Tsetup + Tskew
여기서 좌항 - 우항 = Slack 이 나오는데 이 값은 꼭 양수여야 합니다.
PS / PL
Zynq 7000 SoC는 아래와 같이 구성되어 있습니다.
PS(Processing System)와 PL(Programable Logic)으로 나눌 수 있고,
Main Processor와 Peripheral로도 나눌 수 있습니다.
Main Processor인 CPU에서는 AMBA BUS 뿐 아니라 PL도 Peripheral입니다.
PS에 대한 구조도입니다. 살펴보면 I/O Port는 MUX를 통해 외부와 연결되고, 아래쪽은 AXI를 사용해서 연결되는 모습을 볼 수 있습니다.
Structure Logic Transformation
- Pipelining
- Fine-Grain Pipelining
- Parallel Processing
이 작업으로 수행할 때 알아야 할 중요한 두 가지가 있습니다.
Throughput : 입력을 얼마나 자주 넣어줄 수 있는가
Latancy : 입력이 출력으로 나오는 시간
사실 제일 중요한 건 Throughput입니다.
Throughput은 clk의 주기와 관련이 있습니다. clk의 주기를 줄이면 줄일수록 Throughput이 증가합니다.
그러나, Thold, Tsetup의 한계가 있기 때문에 C.L에서의 소요시간(Delay)을 줄이는 것이 관건입니다.
위 사진처럼 세탁기와 건조기로 예시를 들겠습니다. 세탁기는 30분, 건조기는 1시간의 시간이 소요된다고 가정하겠습니다. 위 그림처럼 진행한다면 90분이 지난 후에 건조가 완료되어 결과가 나오게 됩니다.
Pipelining
하지만 위처럼 진행한다면 output이 출력되는 Thruoughput을 늘릴 수 있겠죠?
이러면 1 CLK Cycle을 기존 90분에서 60분으로 줄일 수 있습니다.Latency는 기존 90분에서 120분으로 늘었지만, 1/90 min의 Throughput에서 1/60 min으로 향상할 수 있습니다.
이걸 회로에 적용한다면 값을 저장하는 Register를 추가하여 Throughput을 늘릴 수 있습니다.
위 같은 회로가 있다고 하면 Critical Path를 찾고 그 선을 가로지르는 선을 그리고 Pipeline Register를 추가하면 됩니다.
Pipeline
장점
- Critical Path의 Delay를 줄일 수 있기 때문에, 더 빠른 Clock을 사용가능합니다.
- Throughput을 증가시킵니다.
단점
- Pipeline Register 추가로 인한 면적이 증가됩니다.
- Latency가 증가됩니다.
- 전력 소모가 증가합니다.
Fine-Grain Pipelining
Fine-Grain Pipelining은 Logic 내부에서 나누는 겁니다.
예를 들어 위 그림에 있는 3-tap FIR를 예로 들겠습니다.
기존 a, b, c의 Delay가 8ns라고 가정하고 그다음 Adder의 Delay가 2ns라고 하겠습니다. 그러면 현재 회로의 Longest Path는 10ns가 되겠네요.
하지만 Fine-Grain Pipelining을 사용하여 Logic 내부에서 구분해 Register를 추가할 수 있습니다. Fine-Grain Pipelining을 사용해서 m1은 5ns. m2는 3ns의 지연으로 나누었다고 한다면, Longest Path를 5ns로 줄일 수 있습니다. 이는 Throughput을 줄여 동작 속도를 올릴 수 있게 도와줍니다.
Parallel Processing
전체 모듈을 병렬처리하는 방법이 있습니다.
10ns의 Delay를 갖는 모듈이 있다면 2개를 배치하고 5ns 마다 input을 받게 하는 방법입니다.
이런 방식을 사용해서도 Throughput을 늘릴 수 있습니다.
LAB3
module clk_divider (
input clk_in,
output clk_out
);
reg[31:0] o=32'd0;
reg clk_out=1'b0;
parameter DIVISOR = 32'd6000000;
//clk_out = clk_in / DIVISOR
always @(posedge clk_in) begin
if(o == DIVISOR/2-1) begin
o <= 0;
clk_out <= ~clk_out;
end
else o <= o + 1;
end
endmodule
clk divider를 작성하고 위 Diagram처럼 연결해 줍니다.
ZYNQ7 Processing System을 추가합니다.
그 후에 Run Block Automation으로 Board Preset
UART1과 GPIO MIO 제외하고 다 꺼준다.
MIO 50번 기존 Pull up에서 Pull Down으로 변경
PS에서 CLK만 전해줄 거기 때문에 AXI는 필요 없다.
PS에서 생성한 CLK을 clk_divider로 전달하게 선 연결.
50 MHz로 변경.
그 후 Validate Design으로 체크.
wrapper 파일 생성
.xdc 파일 생성
set_property PACKAGE_PIN M14 [get_ports {LED[0]}]
set_property PACKAGE_PIN M15 [get_ports {LED[1]}]
set_property PACKAGE_PIN G14 [get_ports {LED[2]}]
set_property PACKAGE_PIN D18 [get_ports {LED[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {LED[*]}]
그 후 Generate Bitstream
File > Export > Export Hardware "include bitstream"
후 Launch Vitis IDE
Empty Application 생성 후 src에 우클릭 new
main.c
#include <stdio.h>
int main()
{
printf("Hello!!\n");
return 0;
}
아까 설정한 UART를 통해 통신한다.
Build > Run
LAB4
MIO Configuration
50번은 Board에서 버튼과 연결됨
그 후 AXI 그대로 두고 OK
AXI GPIO 추가 후 더블 클릭
Run Connection Automation
GPIO 클릭 gpio_io_o[3:0] 우클릭 Create Port LED로 설정
Validate Design
Design Source에 wrapper 파일 만듦
.xdc 파일 생성
set_property PACKAGE_PIN M14 [get_ports {LED[0]}]
set_property PACKAGE_PIN M15 [get_ports {LED[1]}]
set_property PACKAGE_PIN G14 [get_ports {LED[2]}]
set_property PACKAGE_PIN D18 [get_ports {LED[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {LED[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {LED[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {LED[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {LED[3]}]
Generate Bitstream
Master Base Address : 메모리 주소 최저값
Master High Adderss : 메모리 주소 최고값
Store Operation이 일어나는 주소 : Master Base Address ~ Master High Address
Export > Export Hardware > include bitstream
tool > launch Vitis IDE
xsa 불러온 후, Empty Application 생성
main.c 생성
#include <stdio.h>
#include "xgpio.h"
#include "xgpiops.h"
int main()
{
static XGpio GpioInstance_ptr;
static XGpioPs psGpioInstance_ptr;
XGpioPs_Config *GpioConfigPtr;
u8 count = 0;
int xStatus;
int BtnPinDirection = 0, BtnPinNumber = 50;
int Readstatus = 0, OldReadstatus = 0;
// AXI GPIO Initialization
xStatus = XGpio_Initialize(&GpioInstance_ptr,XPAR_AXI_GPIO_0_DEVICE_ID);
if(XST_SUCCESS != xStatus)
print("GPIO INIT FAILDED \n\r");
// AXI GPIO Set
XGpio_SetDataDirection(&GpioInstance_ptr,1,0);
// PS GPIO Initialization
GpioConfigPtr = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID);
if(GpioConfigPtr == NULL)
return XST_FAILURE;
xStatus = XGpioPs_CfgInitialize(&psGpioInstance_ptr, GpioConfigPtr, GpioConfigPtr->BaseAddr);
if(XST_SUCCESS != xStatus)
print("PS GPIO INIT FAILED \n\r");
// PS GPIO pin setting to input
XGpioPs_SetDirectionPin(&psGpioInstance_ptr,BtnPinNumber,BtnPinDirection);
XGpioPs_SetOutputEnablePin(&psGpioInstance_ptr,BtnPinNumber,0);
while(1)
{
Readstatus = XGpioPs_ReadPin(&psGpioInstance_ptr,BtnPinNumber);
if((Readstatus == 1) && ( OldReadstatus == 0) )
{
print("BTN PUSH Button pressed \n\r");
count++;
XGpio_DiscreteWrite(&GpioInstance_ptr,1,count);
}
OldReadstatus = Readstatus;
}
return 0;
}
버튼을 누르면 count가 증가
버튼을 누르면 출력이 나오고
count 증가
axi로 전송
똑같이 Serial 생성
COM8 포트로 연결
Build > Run
Board도 정상 동작.
'Circuit Design > 🔥HDL' 카테고리의 다른 글
[후기] SEDEX 반도체 대전 2024 (1) | 2024.10.27 |
---|---|
[Verilog] Verilog를 이용한 AI 설계 응용 및 SoC 설계(3) (0) | 2024.10.09 |
[Verilog] Verilog를 이용한 AI 설계 응용 및 SoC 설계 (1) (0) | 2024.09.25 |
[Verilog] 27. Counter (0) | 2024.08.23 |
[Verilog] 26. SPI - AXI Portfolio (0) | 2024.08.23 |