CNN

[CNN]Convolution Control

낑낑이 2025. 1. 16. 14:49

Convolution은 Control 신호에 따라 움직이게된다

Systolic array는 하나의 Channel에 대한 연산을 거치게된다

이와같이 구성되어 이전에도 설명한

이 모식도를 따라 움직이게된다

PE에는 각 Weight가 들어가있고  Pix data에 따라 Row에대한 Convolution 연산을 진행하게된다

이와같은 초기 값이있으면 첫번째 연산에서

PE에 Weight는 고정되어있고

Fmap에서 한열씩 계산되는것이므로, 6Cycle뒤 이와같이 Conv 연산이 이루어지게된다. 최종적으로 

이처럼 연산이 이루어진다고 보면된다 

왼쪽그림은 모든 사각형이 3*3이라고보면된다(아래에 깔린거처럼 생각해주면 편할듯..)

이 연산은

이처럼 하나의 채널에 대한 연산이다

하지만 Conv 연산은 여러 Channel에 대해 수행하게된다

이처럼 output Channel은 Kernel의 Channel을 따라가게되는데

이런 Systolic Array들이 모여 Channel Array가 되도록 한다

보통 하나의 Channel Array에 16개의 Channel에 대해 연산하도록하는데

만일 Conv Kernel Channel이 32라면?

Input featuremap이 16channel이라면 하나의 Channel Array만 거치면 되지만 Output Featuremap이 32 channel이라면

하나의 Channel Array만으로 부족하게된다 따라서

이처럼 iteration(반복)을 하게된다

만일 Output Channel이 32라면 하나의 Iteration이 존재하게되고 Output Channel이 64라면 3개의 Iteration이 존재하게된다

이처럼 연산이 되도록 하는것이다

저 하나의 Block이 Channel Array이고 ,Channel Array중 하나가 Systolic Array,

그 속에 연산을 위해 3*3 Kernel이라면 9개의 PE가 존재하게된다

이것을 보면

Fmap_buffer: ch별로 fmap 저장

Weight_buffer   :Out ch 별로 weight 저장

Systolic array: Out ch별로 병렬로 컨벌루젼 진행

Control: 필요한 enable 신호 생성 ex)rd_en ,wr_en

Conv_mem : out ch 별로 컨벌루젼 결과값 저장

으로 변수를 나타내주고 

저 Diagram중 Main Control을 보자

이처럼 구성되어있는데 

IDLE: 대기 (start 신호 오면 시작)

K_READ : weight -> Peload (weight_rd_en) //Weight가 PE에 저장되는것

CONV: CONV 시작 (fmap, fifo, valid, Conv_mem)// Fmap이 PE로  행(Row)으로 들어오게되는것이다

CONV_DONE : 신호 초기화 main한테 done signal// 다음 Weight가 들어오도록 한다 

K_READ일때 PE 에 Weight를 Load하므로 Weight_rd_en을 On 시켜준다 

해당 문을 보게되면 Fmap_Buffer는 Input featuremap을 보관하는 Buffer이다

Input Featuremap이 14*14 image라고 가정하고 작성하였고 그렇게되니 총 Depth는 196이 필요하게된다

첫번째 addr가 Fmap_buffer1, 두번째가 Fmap_buffer2이다

해당 generate문으로 인해 채널당 하나의 Fmapbuffer에 data가 인가되도록 만들어 주었다.

 

기본적인 모듈은 이렇게 설명하고 다음 설명때 제가 설계한 전체적인 블럭과, 코드를 보며 어떻게 흘러가는지 리뷰하도록 하겠습니당

'CNN' 카테고리의 다른 글

[CNN]3. MINST Conv0_Input Buffer  (0) 2025.01.16
[CNN]2. MNIST Ctrl  (0) 2025.01.16
[CNN]1. MNIST  (2) 2025.01.16
[CNN] Padding  (1) 2025.01.14
[CNN] CNN in Verilog 1  (0) 2025.01.13