반응형

 

OV7670 카메라 모듈의 핀은 위와 같이 나타나 있다.

 

SCL과 SDA는 SCCB 통신을 위한 핀으로

SCL은 input Port, SCCB 인터페이스 제어 클럭을 입력받는 핀이고

SDA는 InOut Port로 통신을 위한 데이터를 전송하고 전송받는 핀이다.

 

 

MCLK는 시스템 클럭으로 Input Port이고 여기에 입력되는 클럭을 통해 이미지 데이터를

D0~D7로 출력하고 픽셀클럭(PCLK)를 출력하게 된다.

 

 

 

 

위 이미지는 OV7670 카메라 모듈의 Functional Block Diagram(FBD) 이다.  XCLK핀에 클럭 신호를 입력해주면

이를 기반으로 Video Timing Generator에서 VSYNC, HSYNC, PCLK 신호를 출력해준다.

 

 

그럼 우선 SBBC 통신을 통해 데이터를 받아오기 위한 설정부터 진행해보자.

일단 왜 SBBC 통신을 쓰는지, SBBC통신의 장점을 간단히 적자면

SBBC통신(I2C통신)은 시리얼통신과 다르게 동기화 통신방식을 사용하여 통신속도를 따로 정해주지 않아도 되고

클럭신호를 통해 데이터의 전송  타이밍을 맞추게 된다.

(그리고 많은 센서를 동시에 편하게 연결할 수 있다고 한다.)

 

 

위의 그림은 I2C 통신을 나타내는 그림으로 다음 두 그림을 참고하여 설명하겠다.

 

 

 

SDA신호와 SCL신호는 모두 풀업저항에 의해 초기에 HIGH상태를 유지한다.

 

그리고 SDA신호가 LOW로 떨어지게 되면 데이터 전송을 시작하게 되고 그 이후 클럭신호(SCL)에 맞춰

데이터 전송이 진행된다.

 

Device Address의 데이터 전송이 끝났으면 Read/Write 데이터를 전송하고 쓰기모드일 경우

데이터가 잘 전송되었는지는 Slave측의 ACK 신호를 통해 확인하게 된다. 

 

그리고 난 후 SCL이 LOW신호일 때 다음 데이터인 Register Address 데이터 전송을 위해 data값을 바꾸고 위의 내용들을 반복하여 진행하게 된다.

 

 

 

위의 그림에서 SDA신호가 0이 되면 통신 시작

-> 그 다음 SCL이 0이 되는 순간부터 데이터 전송

-> 8개 비트 데이터(7bit Address, 1bit R/W) 전송

-> ACK확인

-> 그 다음 데이터 전송

-> ...

 

을 진행하게 된다.

 

위는 PCF8574A 라는 장치의 Address에 A0앞에 R/W의 정보가 담기는 것을 확인할 수 있다.

 

즉 Address 안에 R/W 정보를 담고 있는 것이다.

 

 

OV7670.pdf
0.84MB

 

 

 

위 파일은 OV7670의 메뉴얼 파일이다.

 

 

메뉴얼을 보면 위와 같이 Register을 설정해주는 부분이 보이는데 이 부분에 대한 설정 값들을 SBBC 통신을 통해

진행하게 된다. 즉 위의 설정값을 통해 어떠한 데이터를 받아올 것인지 설정해주게 된다.

 

 

OV7670_config_rom.v
0.00MB

 

 

 

위 파일이 Register에 대한 값들을 설정해주기 위한 값들을 담고있다.

 

 

위의 addr값이 0 일때의 조건문을 보면

dout 값에 16'h1280 의 값을 넣어주는 것을 확인할 수 있다.

 

이는 Register의 12번 주소에 0x80 이라는 값으로 설정해주겠다는 의미이다.

 

SCCB.zip
0.01MB

 

 

위의 파일은 SCCB 통신을 위한 코드가 담긴 파일이다.

 

Camera_configure 모듈을 살펴보면 입력으로

CLK, start, RST가 존재하고 출력신호로 SIOC, SIOD, done 신호가 존재한다.

 

내부적으로는 config 모듈과 SCCB_Interface 모듈, ROM 모듈이 존재하며

이들과의 관계를 통해 결과적으로 SIOC, SIOD 출력을 내보내게 되고

이를 통해 카메라모듈과 통신을 진행하게 된다.

 

start신호는 임의로 만들어주었다.

 

ZedBoard에서 출력되는 신호는 100MHz의 클럭이 출력되므로

아래와 같이 clock_divider 이라는 모듈을 만들어 100MHz 신호를 1MHz로 바꿔주어 출력하고 이를 Configure 모듈로 입력하여 통신을 진행하도록 한다.

 

또한 start신호는

 

위와 같이 cnt가 200보다 작을때는 계속 증가시키고

200이 되는 순간 start를 1로, 201이 되면 다시 start를 0으로 하고 cnt가 증가하지 않도록 함으로서

순간적인 start신호를 만들어 주었다.

 

clock_divider.v
0.00MB

 

 

 

 

그리고 난 후 이를 minized 보드에 입히고

실행시키면 Camera Module에서 pixel clock과 함께 데이터 신호들이 나오고 있는 것을

오실로스코프를 통해 확인할 수 있다.

 

 

 

 

위의 D0신호는 카메라 모듈의 Vsync, D1은 HSync,

D2~D5는 Image Data를 의미한다.

 

확인해보면 조금 이상하긴 하지만 HSync가 멈추는 사이사이 Vsync가 1이 되면서 프레임완료 신호를 출력하는 것을

확인할 수 있다.

 

 

그리고 Href 가 High인 상태에서 각각의 데이터 신호들이 전달되는 것을 확인할 수 있다.

 

 

그럼 XCLK로 몇 Hz의 신호를 주어야 할까?

 

Hacking the OV7670 camera module (SCCB cheat sheet inside)

An in-depth look of the OV7670 camera module The OV7670 is a low cost image sensor + DSP that can operate at a maximum of 30 fps and 640...

embeddedprogrammer.blogspot.com

위의 블로그를 참고하면 30fps의 경우 24MHz의 클럭을 입력하여야 한다고 한다.

 

 

*******************************************************************

하지만 통신이 완료되면 done신호가 1이 되어 출력되어야 할 것 같은데 이는 아직 출력되지 않고 있다.

 

이를 확인해볼 필요가 있다.

 

반응형
반응형

Vivado 첫 화면은 다음과 같다.

 

여기서 가장 위의 Create Project를 선택

 

 

프로젝트 이름과 경로를 설정하고 NEXT

 

 

위의 화면에서 일단 나는 장비 없이 간단한 코드들만 실행시켜보면서 시뮬레이션 돌려볼 것이므로

그냥 NEXT를 눌러 진행한다.

Constraint는 사용할 보드의 구조를 담고있는 파일을 말하는 듯 하다.

 

 

이 부분도 현재 보드가 없으므로 그냥 NEXT

 

 

 

위와 같이 설정 Summery가 확인되는데 source파일을 추가해주지 않았고 constraints 파일을 지정해주지 않았기에

위와 같은 알림이 뜨게 된다.

 

그리고 마무리를 하면 다음과 같은 창이 뜨게된다.

 

 

위의 Design Source부분에서 Add Source를 선택하여 소스코드를 넣어주자.

 

 

 

위와 같이 Create File 클릭 수 File name과 File Type을 설정해준다.

 

이렇게 test.v 라는 파일이 생성되게 된다.

여기서 test라는 Module의 입출력 포트를 지정해주게 된다.

 

하지만 나는 여기서 설정하는 것 보다 나중에 코드로 설정하는게 더 편하므로(개인적으로)

여기서는 그냥 OK를 눌러 진행한다.

 

 

위와 같이 test라는 파일이 만들어지고 또 test라는 모듈이 만들어진 것을 확인할 수 있다.

 

위와 같이 간단한 AND게이트를 만들어보자.

 

코드로 작성한걸 회로로 보기 위해 좌측 RTL ANALYSIS 항목의 Schematic 선택 후 다음과 같이 진행

 

위와 같이 a,b를 입력으로 받고 c를 출력으로 갖는 AND게이트가 나타나게 된다.

 

그럼 시뮬레이션을 통해 더 작업을 진행해보자.

우측의 SIMULATION 항목에서 Run Simulation 진행

그리고 Run Behavioral Simulation 진행

 

위와 같이 뜨는데 a, b 에 아직 값을 안정해줬기에 Z 라는 이상한 값이 들어가있고

출력을 나타내는 c에도  X 라는 이상한 값이 들어가있다.

 

그렇기에 입력의 a, b에 값을 넣어줘보자.

 

위의 사진에서 가장 좌측 상단의 아이콘을 누르면 시간이 0ps로 이동하는 것을 확인할 수 있다.

 

그리고 상단의 시간을 표현하는 부분에 1 us 를 선택해주자.

 

위와 같이 a의 값에 Force Constant를 통해 0이라는 Force Value를 넣어주고 OK

 

똑같이 b의 값에도 0을 넣어주자.

 

위와 같이 0이라는 Value가 제대로 들어간 것을 확인할 수 있다.

 

그럼 상단 시간을 표현하는 부분에 (T)라고 쓰인 아이콘을 클릭

 

0us부터 시간을 표현하는 부분에 적어준 1us까지 지정해준 값을 통한 출력값 c가 표현된다.

 

이렇게 진행해보면 입력값에 따른 결과값이 표현되는 것을 확인할 수 있다.

 

여기까지 완전 기초로 초등학생도 따라할 수 있는 과정이였다.

중간중간 설정이 의미하는게 어떤건지,

좀 더 디테일한 과정을 진행하기 위해선 어떻게 해야하는지

앞으로 차근차근 정리해보겠다.

반응형
반응형

 

 

 

 

Minized를 구입하였고 Vivado에서 이를 다뤄보려 한다.

 

이를 위해 프로젝트를 생성해줘야 하는데 생성하는 과정에서

보드의 Constraint 파일이 없으므로

아래 파일을 다운받은 후 위의 "Add Constraints" 윈도우에서 아래의 파일을 추가하여준다.

MiniZed_Constraints_Rev1_170613.xdc
0.02MB

 

 

 

 

그 다음 창인 "Default Part" 윈도우에서 MiniZed보드를 선택해야 하는데 아래 사진에서 볼 수 있듯이

Minized가 검색되지 않는 경우일 수 있다.

 

 

 

 

 

C:\Xilinx\Vivado\2017.4\data\boards\board_files

 

위의 경로로 이동해보면 해당되는 minized에 대한 정보가 없기 때문이다.

따라서 아래 첨부된 파일인 MiniZed_Board_Definition_File_1p2.zip파일을 압축을 풀고

위의 경로에 추가하여준다.

 

MiniZed_Board_Definition_File_1p2 (1).zip
0.46MB

 

 

이렇게 minized폴더를 만들어 넣어주었다.

 

그리고 Vivado를 다시 실행시키면 위와 같이 Minized 항목이 추가된 것을 확인할 수 있다.

 

 

반응형

'FPGA' 카테고리의 다른 글

MiniZed 를 통한 Pulse 출력  (0) 2020.12.29
Tera Term(테라텀)을 사용하여 FPGA 보드 다루기  (0) 2020.09.23
MiniZed 를 통한 VGA 출력(Pmod VGA)  (0) 2020.07.02

+ Recent posts