본문 바로가기
language/Verilog

[verilog] memory 및 image filter 설계

by 파란하늘코더 2021. 1. 24.
반응형

 

image processing을 하기 위해서는 다양한 filter mask를 설계하여야 하는데

 

가장 간단한 3x3 sobel filter를 설계해보겠습니다

 

그냥 하기엔 아쉬우니 Ycbcr로 변경하여 아래와 같은 data flow로 진행이 됩니다

 

block diagram


1. YCbCr

 

이제 Ycbcr을 구현하면 되는데 구글링 하면 아래와 같은 수식이 나오게 됩니다

 

hardware에서는 소수점을 표현하는데 제한이 있기 때문에 아래와 같은 수식으로 변경하여 설계를 합니다

 

이걸로 검증을 해보면 아래와 같이 나오게 됩니다

 

결과를 보면 Y에 대한 수식이 거의 동일하게 나오는 것을 확인하고

 

simulation을 하면 아래와 같이 나오게 됩니다.


2. image filter

이제 간단한 sobel mask를 설계를 해봅시다

 

우선 sobel mask는 아래와 같은 모양을 하고 있습니다

 

sobel filter는 edge를 detection 하기 위한 filter로 결과는 아래와 같이 나오게 됩니다

 

이걸 verilog로 설계하면 아래와 같이 설계하면 됩니다

 

 


3. line memory

sobel filter를 보면 현재 처리하는 block 위,아래의 data가 필요합니다.

 

그리고 앞서 설명한 sync를 생각해보면 가로단위로 신호들이 진행이 되기 때문에

 

내가 지금 받고 있는 line을 제외하면 상위라인과 하위라인 data는 전혀 알 수가 없습니다

 

따라서 memory를 두어 필요한 line들을 저장을 하여야 합니다.

 

line 메모리는 아래와 같이 간단하게 만들었습니다.

 

memory logic

지금 설계한 memory는 simple dual memory를 설계한건데

 

원래 fpga에서 만들어서 simulation model을 가지고 돌려야 하지만 그건 나중에 포스팅하기로...

 

이 block을 simulation을 하면 아래와 같이 파형이 나옵니다

 

memory signal check

보면 write 했던 신호들이 몇 clock뒤에 read를 하면 제대로 읽히는 것을 볼 수가 있습니다.

 

설계하기 위해선 상위 line과 하위 line이 필요한데 그것을 위해선 아래와 같이

 

sync를 설계해야 합니다

 

이걸 설명하려면 아래와 같은 concept 인건데, 원리는 이미 지나간 시간은 돌아오지 않기 때문에

 

값을 기억하고 있다가 좀 나중에 연산을 한다고 생각하면 됩니다

위의 그림을 보면 빨간색으로 표시한 부분 부터는 항상 3line에 대한 값을 가져올 수가 있는데

 

하지만 이렇게 하게되면 1번, 100번은 어떻게 하냐고 말이 나올 수 있는데,

 

영상처리하는 사람이라면 원래 mask를 처리하면 이미지가 줄어들어 padding을 한다고 생각하면 됩니다.

 

따라서 패딩을 생각하면 빨간색보다 한번 더 앞에서부터 처리하면 가능하고

 

맨마지막 enable 한개가 부족하기때문에 하나 새로 만들어서 처리해야 하며,

 

simulation 결과는 아래와 같습니다.

 

첫번째 line

두번째 line

세번째 line

이제 ppt의 컨셉처럼 line data를 latch 하면 아래와 같이 나오는데

지금 처리한건 상/하 data를 접근하기 위해 처리한 것이고,

 

좌/우 data는 clock 단위로 delay하면 똑같이 data를 취득할 수가 있습니다.

 

 


4. simulation 결과

 

이렇게 edge가 강조된 data를 취득할 수가 있습니다.

 

댓글