OV7670 CAMERA SENSOR APPLICATION USING ZYBO

43
KOCAELİ ÜNİVERSİTESİ*MÜHENDİSLİK FAKÜLTESİ ZYBO FPGA KARTI İLE OV7670 KAMERA SENSÖRÜ UYGULAMASI 7. DÖNEM PROJESİ Melek Sönmez 130207075 Bölümü: Elektronik ve Haberleşme Mühendisliği Danışman: Yrd. Doç. Dr. Anıl ÇELEBİ KOCAELİ, 2016

Transcript of OV7670 CAMERA SENSOR APPLICATION USING ZYBO

Page 1: OV7670 CAMERA SENSOR APPLICATION USING ZYBO

KOCAELİ ÜNİVERSİTESİ*MÜHENDİSLİK FAKÜLTESİ

ZYBO FPGA KARTI İLE OV7670 KAMERA SENSÖRÜ UYGULAMASI

7. DÖNEM PROJESİ

Melek Sönmez

130207075

Bölümü: Elektronik ve Haberleşme Mühendisliği

Danışman: Yrd. Doç. Dr. Anıl ÇELEBİ

KOCAELİ, 2016

Page 2: OV7670 CAMERA SENSOR APPLICATION USING ZYBO

ii

İÇİNDEKİLER İÇİNDEKİLER ............................................................................................................. ii 1. GİRİŞ .................................................................................................................... 1 2. PROJEDE YAPILAN ÇALIŞMALAR ................................................................ 2 2.1 Kavramsal Tasarım .............................................................................................. 2 2.2 OV7670 Kamera Sensörü .................................................................................... 3 2.3 VGA Arayüzü ...................................................................................................... 4 2.4 IP Blok Tasarımları ............................................................................................. 6 2.5 OV7670 IP Blokları ............................................................................................. 9 2.5.1.1 Controller Bloğu ......................................................................................... 9 2.5.1.2 Debounce Bloğu ....................................................................................... 10 2.5.1.3 Capture Bloğu .......................................................................................... 11 2.5.1.4 VGA Bloğu .............................................................................................. 12 2.6 VDMA ............................................................................................................... 13 2.7 Ön Yükleme Dosyası Oluşturma ....................................................................... 14 2.8 SD Kart İle Ön yükleme .................................................................................... 17 2.9 Flash İle Ön yükleme ......................................................................................... 18 2.10 Sistem Tasarımı ................................................................................................. 19 3. KAYNAKLAR ................................................................................................... 20 4. EKLER ................................................................................................................ 21 4.1 EK 1 ................................................................................................................... 21 4.1.1 EK 1.A .......................................................................................................... 21 4.1.2 EK 1.B ........................................................................................................... 22 4.1.3 EK 1.C ........................................................................................................... 24 4.2 EK 2 ................................................................................................................... 26 4.3 EK 3 ................................................................................................................... 27 4.4 EK 4 ................................................................................................................... 29 4.5 EK 5 ................................................................................................................... 32 4.5.1 EK 5.A .......................................................................................................... 32 4.5.2 EK 5.B ........................................................................................................... 34 4.6 EK 6 ................................................................................................................... 40 4.7 EK 7 ................................................................................................................... 41

Page 3: OV7670 CAMERA SENSOR APPLICATION USING ZYBO

1

1. GİRİŞ

FPGAlar (Field Programmable Gate Array-Alanda Programlanabilir Kapı Dizisi),

elektronik yapısı yazılım ile değiştirilebilen mantık bloklarına sahip tümleşik

devrelerdir. FPGAlar elektronik açıdan esnek tasarım yapısı, paralel işlem ve yüksek

hızlarda çalışabilme özellikleri sayesinde birçok alanda tercih ediliriler. FPGAlar

robotik [1], görüntü işleme ve iyileştirme [2], şifreleme/şifre çözme sistemleri [3],

radar haberleşme sistemleri [4-5], sinyal işleme sistemleri [6], video işleme [7],

askeri savunma sistemleri [8], çoklu sensör uygulamaları [9] gibi birçok alanda

kullanılırlar. İmge işleme ve video işleme gibi paralel işlem özelliği ve yüksek hız

gerektiren çalışmalarda FPGAlar en çok tercih edilen entegrelerdir. Bu projede de

ZYBO FPGA kartında OV7670 kamera sensörü uygulaması tasarlanmış, VDMA adı

verilen hafıza arayüzü ile FPGA kartının DDR3 hafızasına erişilip görüntüler buraya

kaydedilerek, FPGA kartından VGA portu ile görüntü alınmıştır.

Şekil 1: Sistemin genel akış şeması

Page 4: OV7670 CAMERA SENSOR APPLICATION USING ZYBO

2

2. PROJEDE YAPILAN ÇALIŞMALAR

2.1 Kavramsal Tasarım

Proje kapsamında yapılması planlanan görevler aşağıda belirtilmiştir:

1. OV7670 kamera sensörü analizi ve tasarımda kullanılacak IP blok

tasarımlarının Verilog programlama dilinde kodlanması,

2. VGA arayüzünün incelenmesi ve tasarımda kullanılacak IP blok

tasarımlarının Verilog programlama dilinde kodlanması,

3. Tasarlanan blokların ZYNQ-7 mimarisi ile birleştirilip BRAM bloğu

kullanılan sistemin tasarlanması,

4. Tasarlanan sistemin SD kart ile ön yüklenebilmesi için ön yükleme

dosyasının oluşturulması,

5. Tasarlanan sistemde hafıza birimini arttırmak için BRAM bloğu yerine

VDMA bloğu eklenerek sistemin tekrar tasarlanması,

6. Tasarlanan sistemin kalıcı bellek (Flash memory) üzerinden ön

yüklenebilmesi için sistem konfigürasyonunun yapılması.

Şekil 2.1: İş-zaman çizelgesi

Page 5: OV7670 CAMERA SENSOR APPLICATION USING ZYBO

3

2.2 OV7670 Kamera Sensörü

OV7670 kamera sensörü 640x480 çözünürlüğünde saniyede 30 görüntü ile 50/60Hz

frekansta, 3.3V besleme gerilimi ile çalışır (Şekil 2.2). Sensörde 7 tanesi veri pini, 2

tanesi gerilim ve toprak pinleri, 2 tanesi zamanlayıcı pini, 1 tanesi sıfırlama pini ve

diğerleri senkronizasyon pinleri olmak üzere 16 pin bulunur (Şekil 2.3).

Şekil 2.2:OV7670 teknik özellikler tablosu

Şekil 2.3: OV7670 pin diyagramı

Page 6: OV7670 CAMERA SENSOR APPLICATION USING ZYBO

4

2.3 VGA Arayüzü

Şekil 2.4: VGA konnektörü

• VGA analog bir görüntü standardıdır.

• VGA haberleşmesinde sadece görüntü bilgisi iletilir, VGA haberleşmesinde

ses bilgisi yoktur.

• VGA portunda temel olarak 3 tane veri sinyali (RGB) ve ekrandaki

görüntüyü doğru taramak için kullanılan 2 tane senkronizasyon sinyali

bulunur.

• Görüntü oluşturulurken ekranda blank adı verilen çerçeve oluşur. Görüntü

ekrana basıldığı sırada bu blank (Şekil 2.6) kısımları senkronizasyon

sinyalleri aracılığıyla hesaplanır (Şekil 2.5).

Şekil 2.5: VGA zamanlama diyagramı

Page 7: OV7670 CAMERA SENSOR APPLICATION USING ZYBO

5

• Bu projede kullanılan OV7670 kamera sensörü 640x480, 60Hz formatında

çalışmaktadır. Şekil 2.6’da bu format için tanımlı senkronizasyon pikselleri yer

almaktadır.

Şekil 2.6: VGA blank pikselleri

Page 8: OV7670 CAMERA SENSOR APPLICATION USING ZYBO

6

2.4 IP Blok Tasarımları

OV7670 kamera sensörü fonksiyonelliğinin FPGA kartının anlayabileceği bir tanımı

olması için IP blokları tasarlanmıştır. IP blok tasarımının nasıl yapıldığı bu bölümde

Vivado 2016.2 programına göre anlatılmış olup, alt başlıklarda sistem

fonksiyonelliği için tasarlanan IP blokları ile ilgi bilgi verilmiştir.

IP tasarımının kaydedileceği klasör oluşturulup, içerisine .v uzantılı IP Verilog kodu

eklenir. Vivado 2016.2 programı çalıştırılır. Manage ip seçeneği tıklanır (Şekil 2.7)

ve new ip location seçilir.

Şekil 2.7: Vivado programı ana sayfası

Açılan pencerede next butonuna tıklanıp ip tasarımının kaydedileceği dosya adresi

yazılıp finish butonuna tıklanır. Daha sonra tools→create and package ip seçilir

(Şekil 2.8).

Şekil 2.8: IP projesi oluşturma

Page 9: OV7670 CAMERA SENSOR APPLICATION USING ZYBO

7

Açılan pencerede next butonuna tıklanır, daha sonra Package a specified directory

seçeneği seçilip next butonuna tıklanır (Şekil 2.9).

Şekil 2.9: IP oluşturma seçim ekranı

Sonraki ekranda IP tasarımının klasör adresi girilir ve next butonuna tıklanır (Şekil

2.10). Daha sonra 2 kere next ve ardından finish butonuna tıklanarak proje açılır.

Şekil 2.10: IP adı giriş ekranı

IP packager penceresinde bulunan sekmelerde bir hata olup olmadığı kontrol edilir,

hata varsa düzeltilip IP packager penceresi Şekil 2.11de gösterildiği gibi olduğunda

Review and Package sekmesinde bulunan Package IP butonuna tıklanarak IP

Page 10: OV7670 CAMERA SENSOR APPLICATION USING ZYBO

8

paketlenmiş olur. Paketleme işlemi bittiğinde açılan pencerede Ok buyonuna

tıklanarak proje kapatılır.

Şekil 2.11: IP paketleme penceresi

Tüm IP tasarımları tamamlandıktan sonra sistem projesi oluşturulur. Oluşturulan

projede butonuna tıklanarak proje ayarları açılır. Açılan pencerede ip sekmesi

seçilir (Şekil 2.12(a)) ve simgesine tıklanarak eklenmek istenen ip projesinden

ip_repo klasörü seçilip projeye eklenir. Klasör eklendikten sonra açılan pencerede ok

butonuna basılır ve proje ayarları penceresinde apply (Şekil 2.12(b)) butonuna

basılarak ip tasarımı projeye eklenmiş olur.

Şekil 2.12(a) Şekil 2.12(b)

Page 11: OV7670 CAMERA SENSOR APPLICATION USING ZYBO

9

2.5 OV7670 IP Blokları

Bu bölümde sistemde kullanılan, kullanıcıya ait IP blokları alt başlıklar halinde

incelenmiş olup Verilog dilinde yazılmış kodları Ekler kısmında verilmiştir.

2.5.1.1 Controller Bloğu

OV7670 kontrol bloğu kamera sensörü ile FPGA sistemin haberleşmesi için

tasarlanmış bir arayüz görevindedir. Bu bloğun tasarımı 3 farklı fonksiyondan oluşur

ve Verilog kodları EK 1’de verilmiştir.

Kontrol bloğunda sensörün pinleri ile haberleşme sağlanır. Üst modül olan controller

fonksiyonunda (EK 1.A) sensörün giriş-çıkış pinleri ile alt fonksiyonların bağlantısı

gerçekleştirilir. Alt fonksiyon olan register fonksiyonu (EK 1.B) sensörün

kaydedicilerinin adres bilgisini tutar. Diğer bir alt fonksiyon olan i2c_sender

fonksiyonu (EK 1.C) ile ise görüntü bilgisinin sensörden dış dünyaya gönderilmesi

sağlanır.

Bu blok tasarımında kullanılan fonksiyonların RTL şemaları Şekil.7-9’da verilmiştir.

Şekil 2.7: controller fonksiyonu RTL şeması

Page 12: OV7670 CAMERA SENSOR APPLICATION USING ZYBO

10

Şekil 2.8: i2c_sender fonksiyonu RTL şeması

Şekil 2.9: ov7670_registers fonksiyonu RTL şeması

2.5.1.2 Debounce Bloğu

Debounce IP bloğu sistem sinyallerinde gerçekleşebilecek olası dalgalanmaları

filtrelemek amacıyla kullanılır. Bir başka deyişle sistem kararlılığı için kullanılır.

IP tasarımı için kullanılacak olan Verilog dilinde kodlanmış fonksiyon EK 2’dedir.

Bu blok tasarımında kullanılan fonksiyonun RTL şeması Şekil 2.10’da verilmiştir.

Şekil 2.10: debounce kodu RTL şeması

Page 13: OV7670 CAMERA SENSOR APPLICATION USING ZYBO

11

2.5.1.3 Capture Bloğu

Capture IP bloğu sensörde algılanan sinyallerin FPGA kartına aktarılabilmesi için bir

arayüz görevi görür. Sensörde bulunan 7 veri pininden gelen bilgiler bu blok aracılığı

ile alınır. Aynı zamanda bu blok tasarıma, VDMA bloğu ile haberleşme

sağlanabilmesi için AXI Stream arayüzü de gömülmüştür.

IP tasarımı için kullanılacak olan Verilog dilinde kodlanmış fonksiyon EK 3’tedir.

Bu blok tasarımında kullanılan fonksiyonun RTL şeması Şekil 2.11’de verilmiştir.

Şekil 2.11: Capture bloğu RTL şeması

Page 14: OV7670 CAMERA SENSOR APPLICATION USING ZYBO

12

2.5.1.4 VGA Bloğu

VGA IP bloğu, FPGA kartının hafıza biriminden alınan veriyi FPGAde bulunan

VGA çıkışına yazma işlevini gerçekleştirir. Hafıza birimine ulaşmak için VDMA

bloğu kullanıldığı için blok tasarımına AXI Stream arayüzü de gömülmüştür.

IP tasarımı için kullanılacak olan Verilog dilinde kodlanmış fonksiyon EK 4’tedir.

Bu blok tasarımında kullanılan fonksiyonun RTL şeması Şekil 2.12’de verilmiştir.

Şekil 2.12: VGA bloğu RTL şeması

Page 15: OV7670 CAMERA SENSOR APPLICATION USING ZYBO

13

2.6 VDMA

Bu projede FPGA kartının hafıza birimine erişimi sağlamak için VDMA IP bloğu

kullanılmıştır. VDMA arayüzünün konfigürasyonu ve doğru çalışabilmesi için

ZYNQ7 Processing System bloğunda GP (General Purpose) ve HP (High

Performance) portları aktifleştirilmiştir (Şekil 2.13). HP portu yüksek hızda işlem

yapılacak sistemlerde kullanılır.

Şekil 2.13: GP ve HP portlarını aktifleştirme

Sistem tasarımında kullanılan VDMA bloğu için yapılan ayarlar Şekil 2.14-15’te

verilmiştir. Vivado SDK programında kullanılmış olan C dilinde yazılmış VDMA

fonksiyonellik kodu EK 5’te verilmiştir.

Şekil 2.14: VDMA ayarları ekranı

Page 16: OV7670 CAMERA SENSOR APPLICATION USING ZYBO

14

Şekil 2.15: VDMA ayarları ekranı

2.7 Ön Yükleme Dosyası Oluşturma

Vivado programında proje sentezlenip bitstream oluşturulduktan sonra file

menüsündeki export hardware seçeneği ile (Şekil 2.16(a)) tasarım SDK’ya aktarılmış

olur (Şekil 2.16(b)). Daha sonra yine file menüsünden launch SDK seçeneği ile

(Şekil 2.16(c)) SDK programına geçilir.

Şekil 2.16(a) Şekil 2.16(b) Şekil 2.16(c)

Page 17: OV7670 CAMERA SENSOR APPLICATION USING ZYBO

15

SDK programı açıldığında Şekil 2.17’deki gibi gözükür.

Şekil 2.17: Vivado SDK ekranı

File menüsünden new→application project seçilir (Şekil 2.18).

Şekil 2.18: Yeni proje oluşturma

Açılan pencerede proje adı girilip next butonuna basılır (Şekil 2.19(a)), empty

application seçeneği işaretlenip finish butonuna tıklanır (Şekil 2.19(b)).

Page 18: OV7670 CAMERA SENSOR APPLICATION USING ZYBO

16

Şekil 2.19(a) Şekil 2.19(b)

Bu işlemden sonra C/C++ dosyalarının ekleneceği “proje_adi” isimli bir klasör ve

“proje_adi_bsp” isimli başka bir klasör projeye eklenir (Şekil 2.20(a)). “proje_adi”

isimli klasöre sağ tıklanıp import seçilir (Şekil 2.20(b)). Açılan pencerede

general→file system seçilir (Şekil 2.20(c)).

Şekil 2.20(a) Şekil 2.20(b) Şekil 2.20(c)

Page 19: OV7670 CAMERA SENSOR APPLICATION USING ZYBO

17

Açılan yeni pencerede browse butonuyla eklenecek kaynak dosyanın klasörü seçilip

tamam butonuna tıklanır (Şekil 2.20(d)). Ve Şekil 2.20(e)’de görülen ekranda

eklenmek istenen kaynak dosya/lar seçilip finish butonuna tıklanır.

Şekil 2.20(d) Şekil 2.20(e)

Bu proje için EK 5’te verilen VDMA fonksiyonellik kodları bu aşamada eklenir.

Daha sonra tekrar File menüsünden new→application project seçilir ve bu sefer

Empty Application seçeneği yerine Zynq FSBL seçilir. FSBL uygulaması

oluşturulduktan sonra Project Explorer sekmesinde FSBL uygulamasının C

dosyalarının bulunduğu klasöre sağ tıklanır ve Create Boot Image seçeneği seçilir.

Açılan pencerede Add butonuna tıklanarak VDMA fonksiyonelliğini de ön yükleme

dosyasına ekleyebilmek için data file olarak VDMA koduna ait .elf uzantılı dosya

eklenir. Daha sonra Create Image butonuna tıklanarak ön yükleme dosyası

oluşturulur.

2.8 SD Kart İle Ön yükleme

SD kart ile ön yükleme yapılabilmesi için Vivado programında tasarım yapılırken

ZYNQ Processing System bloğuna çift tıklanarak IP özelleştirme ekranı açılır.

Peripheral I/O Pins sekmesinde SD 0 portu bulunup etkinleştirilir. Tasarım

tamamlandığında bitstream oluşturulup Vivado SDK programına geçilir. Ön yükleme

dosyası oluşturulduktan sonra BOOT.bin dosyası FAT32 formatlı SD karta yüklenir.

Page 20: OV7670 CAMERA SENSOR APPLICATION USING ZYBO

18

Ön yükleme dosyası yüklenmiş SD kart FPGA kartına takılıp ZYBO üzerinde

bulunan JP5 bağlantısı SD moduna alınır ve kart güç düğmesinden açılarak SD

karttan ön yükleme tamamlanmış olur.

2.9 Flash İle Ön yükleme

Flash ile ön yükleme yapılabilmesi için Vivado programında tasarım yapılırken

ZYNQ Processing System bloğuna çift tıklanarak IP özelleştirme ekranı açılır.

Peripheral I/O Pins sekmesinde Quad SPI Flash portu bulunup etkinleştirilir. Tasarım

tamamlandığında bitstream oluşturulup Vivado SDK programına geçilir. Ön yükleme

dosyası oluşturulduktan sonra SDK araç çubuğunda bulunan Program Flash

butonuna (Şekil 2.21) tıklanarak açılan pencerede BOOT.bin dosyasının uzantısı

girilerek yüklenir (Şekil 2.22). ZYBO üzerinde bulunan JP5 bağlantısı QSPI moduna

alınıp kart güç düğmesinden açılarak flashtan ön yükleme tamamlanmış olur.

Şekil 2.21: Program Flash butonu

Şekil 2.22: BOOT dosyasının adresini giriş ekranı

Page 21: OV7670 CAMERA SENSOR APPLICATION USING ZYBO

19

2.10 Sistem Tasarımı

Sistemin blok tasarımı EK 6’da, Address Editor sekmesi Şekil 2.23’te ve sistem için

oluşturulmuş .xdc uzantılı dosya EK 7’de verilmiştir.

Şekil 2.23: Adres editörü

Sistem tasarımında ZYBO FPGA kartı Vivado 2016.2 programında Verilog ve C

programlama dillerinde programlanmış ve flash üzerinden ön yükleme yapılarak

OV7670 kamera sensöründen görüntü bilgisi alınıp, alınan görüntü bilgisinin

aktarımı VDMA IP bloğu ile DDR3 hafızasına erişilerek gerçekleştirilip, AXI

Stream arayüzü kullanılarak VGA çıkış portuna yazdırılmıştır.

Sistemde üç farklı zamanlayıcı frekansı kullanılmıştır. İşlemci sisteminde 100KHz,

kameradan bilgi okuma için 50KHz, VGA IP bloğu için ise 25KHz zamanlayıcı

kullanılmıştır ve bu frekans dönüşümü Clocking Wizard IP bloğu ile sağlanmıştır.

Page 22: OV7670 CAMERA SENSOR APPLICATION USING ZYBO

20

3. KAYNAKLAR

[1] Fatih Ahmet Şenel, Bayram Çetişli. "Görüntü İşelme ve Beş Eksenli Robot Kol

ile Üretim Bandında Nesne Denetimi”. Pamukkale Üniversitesi Mühendislik

Bilimleri Dergisi, 21(5), 158-161, 2015.

[2] P. Dillinger, J.F. Vogelbruch, J. Leinen, S. Suslov, H. Winkler, K. Schwan.

"FPGA-Based Real-Time Image Segmentation for Medical Systems and Data

Processing". IEEE Transactions on Nuclear Science, 53(4), 2006

[3] Jyrwa B., Paily R. "An Area-Throughput Efficient FPGA Implementation of the

Block Cipher AES Algorithm". International Conference on Advances in

Computing, Control, and Telecommunication Technologies, 328-332, 2009.

[4] Yazhou Wang, Quanhua Liu, Aly E. Fathy. "CW and Pulse–Doppler Radar

Processing Based on FPGA for Human Sensing Applications". IEEE

Transactions on Geoscience and Remote Sensing, 51(5), 2013.

[5] Yunqiang Yang, Aly E. Fathy. "Development and Implementation of a Real-

Time See-Through-Wall Radar System Based on FPGA". IEEE Transactions

on Geoscience and Remote Sensing, 47(5), 2009.

[6] Seda Yavuz, Anıl Çelebi, Muhammad Aslam, Oğuzhan Urhan. "Selective Gray-

Coded Bit-Plane Based Low-Complexity Motion Estimation and its Hardware

Architecture". IEEE Transactions on Consumer Electronics, 62(1), 2016.

[7] K. Benrid, D. Crookes, J. Smith, A. Benkrid. "High level programming for real

time FPGA based video processing". Acoustics, Speech, and Signal Processing,

IEEE International Conference, 2000.

[8] Mark McLean, Jason Moore. "FPGA-Based Single Chip Cryptographic

Solution". Millitary Embedded Systems, 2007.

[9] Hasan Şahin, Ali Tangel. "FPGA TABANLI 5 EKSENLİ MOBİL ROBOT

KOLU TASARIMI VE PROTOTİP GERÇEKLENMESİ". Gazi Üniversitesi

Mühendislik ve Mimarlık Fakültesi Dergisi, 31(2), 295-302, 2016.

Page 23: OV7670 CAMERA SENSOR APPLICATION USING ZYBO

21

4. EKLER

4.1 EK 1

4.1.1 EK 1.A

module ov7670_controller (

input clk, input resend, output reg config_finished, output sioc, inout siod, output reg reset, output reg pwdn, output reg xclk ); reg sys_clk; wire [15:0] command; wire finished; wire taken; reg send; initial sys_clk = 0;

localparam [7:0] camera_address = 8'h42; always@* begin config_finished <= finished; send <= ~finished; end i2c_sender Inst_i2c_sender ( .clk(clk), .taken(taken), .siod(siod), .sioc(sioc), .send(send), .id(camera_address), .register(command[15:8]), .value(command[7:0])); always@* begin reset <= 1'b1; pwdn <= 1'b0; xclk <= sys_clk; end

Page 24: OV7670 CAMERA SENSOR APPLICATION USING ZYBO

22

ov7670_registers Inst_ov7670_registers ( .clk(clk), .advance(taken), .command(command), .finished(finished), .resend(resend)); always@(posedge clk) begin sys_clk <= ~sys_clk; end

endmodule

4.1.2 EK 1.B

module ov7670_registers ( input clk, input resend, input advance, output reg [15:0] command, output reg finished); reg [15:0] sreg; reg [7:0] address; reg [15:0] comp; initial address = 0; always@* begin command <= sreg; case(sreg) 16'hFFFF: finished = 1'b1; default : finished = 1'b0; endcase end always@(posedge clk) begin if (resend == 1'b1) begin address <= 0; end else if (advance == 1'b1) begin address <= address + 1; end case (address) 8'h00: sreg = 16'h1280; // COM7 Reset 8'h01: sreg = 16'h1280; // COM7 Reset 8'h02: sreg = 16'h1100; // CLKRC Prescaler-Fin/ (1+1) 8'h03: sreg = 16'h1204; // COM7 QIF + RGB output 8'h04: sreg = 16'h0C04; // COM3 8'h05: sreg = 16'h3E19; // COM14 PCLK scaling = 0

Page 25: OV7670 CAMERA SENSOR APPLICATION USING ZYBO

23

8'h06: sreg = 16'h4010; //COM15 Full 0-255 output,RGB 565 8'h07: sreg = 16'h3a04; // TSLB Set UV ordering 8'h08: sreg = 16'h8C00; // RGB444 Set RGB format 8'h09: sreg = 16'h1714; // HSTART HREF start 8'h0a: sreg = 16'h1802; // HSTOP HREF stop (high 8 bits) 8'h0b: sreg = 16'h32A4; // HREF Edge 8'h0c: sreg = 16'h1903; // VSTART VSYNC start(high 8bits) 8'h0d: sreg = 16'h1A7b; // VSTOP VSYNC stop(high 8 bits) 8'h0e: sreg = 16'h030a; // VREF VSYNC low two bits 8'h0f: sreg = 16'h703a; // SCALING_XSC 8'h10: sreg = 16'h7135; // SCALING_YSC 8'h11: sreg = 16'h7211; // SCALING_DCWCTR 8'h12: sreg = 16'h73f1; // SCALING_PCLK_DIV 8'h13: sreg = 16'ha202; // SCALING_PCLK 8'h14: sreg = 16'h1500; // COM10 Use HREF not hSYNC 8'h15: sreg = 16'h7a20; // SLOP 8'h16: sreg = 16'h7b10; // GAM1 8'h17: sreg = 16'h7c1e; // GAM2 8'h18: sreg = 16'h7d35; // GAM3 8'h19: sreg = 16'h7e5a; // GAM4 8'h1A: sreg = 16'h7f69; // GAM5 8'h1B: sreg = 16'h8076; // GAM6 8'h1C: sreg = 16'h8180; // GAM7 8'h1D: sreg = 16'h8288; // GAM8 8'h1E: sreg = 16'h838f; // GAM9 8'h1F: sreg = 16'h8496; // GAM10 8'h20: sreg = 16'h85a3; // GAM11 8'h21: sreg = 16'h86af; // GAM12 8'h22: sreg = 16'h87c4; // GAM13 8'h23: sreg = 16'h88d7; // GAM14 8'h24: sreg = 16'h89e8; // GAM15 8'h25: sreg = 16'h13E0; // COM8 - AGC, White balance 8'h26: sreg = 16'h0000; // GAIN AGC 8'h27: sreg = 16'h1000; // AECH Exposure 8'h28: sreg = 16'h0D40; // COMM4 - Window Size 8'h29: sreg = 16'h1418; // COMM9 AGC 8'h2a: sreg = 16'ha505; // AECGMAX banding filter step 8'h2b: sreg = 16'h2495; // AEW AGC Stable upper limite 8'h2c: sreg = 16'h2533; // AEB AGC Stable lower limi 8'h2d: sreg = 16'h26e3; // VPT AGC fast mode limits 8'h2e: sreg = 16'h9f78; // HRL High reference level 8'h2f: sreg = 16'hA068; // LRL low reference level 8'h30: sreg = 16'ha103; // DSPC3 DSP control 8'h31: sreg = 16'hA6d8; // LPH Lower Prob High 8'h32: sreg = 16'hA7d8; // UPL Upper Prob Low 8'h33: sreg = 16'hA8f0; // TPL Total Prob Low 8'h34: sreg = 16'hA990; // TPH Total Prob High 8'h35: sreg = 16'hAA94; // NALG AEC Algo select 8'h36: sreg = 16'h13E5; // COM8 AGC Settings default: sreg = 16'hffff; endcase end endmodule

Page 26: OV7670 CAMERA SENSOR APPLICATION USING ZYBO

24

4.1.3 EK 1.C

module i2c_sender( input clk, inout siod, output reg sioc, output reg taken, input send, input [7:0] id, input [7:0] register, input [7:0] value ); reg SIOD; reg [7:0] divider; reg [31:0] busy_sr; reg [31:0] data_sr; initial divider = 8'b00000001; initial busy_sr = 0; initial data_sr = 32'hFFFFFFFF; assign siod = SIOD; always@(busy_sr, data_sr[31]) begin if (busy_sr[11:10] == 2'b10 || busy_sr[20:19] == 2'b10 || busy_sr[29:28] == 2'b10) SIOD <= 1'bZ; else SIOD <= data_sr[31]; end always@(posedge clk) begin taken <= 1'b0; if (busy_sr[31] == 1'b0) begin sioc <= 1'b1; if (send == 1'b1) begin if (divider == 8'b00000000) begin data_sr <= {3'b100, id, 1'b0, register, 1'b0, value, 1'b0, 2'b01}; busy_sr <= {3'b111, 9'b111111111, 9'b111111111, 9'b111111111, 2'b1}; taken <= 1'b1; end else begin divider <= divider + 1; end end end

Page 27: OV7670 CAMERA SENSOR APPLICATION USING ZYBO

25

else begin case ({busy_sr[31:29], busy_sr[2:0]}) 6'b111111: case (divider[7:6]) 2'b00: sioc <= 1'b1; 2'b01: sioc <= 1'b1; 2'b10: sioc <= 1'b1; default : sioc <= 1'b1; endcase 6'b111110: case (divider[7:6]) 2'b00: sioc <= 1'b1; 2'b01: sioc <= 1'b1; 2'b10: sioc <= 1'b1; default : sioc <= 1'b1; endcase 6'b111100: case (divider[7:6]) 2'b00: sioc <= 1'b0; 2'b01: sioc <= 1'b0; 2'b10: sioc <= 1'b0; default : sioc <= 1'b0; endcase 6'b111000: case (divider[7:6]) 2'b00: sioc <= 1'b0; 2'b01: sioc <= 1'b1; 2'b10: sioc <= 1'b1; default : sioc <= 1'b1; endcase 6'b100000: case (divider[7:6]) 2'b00: sioc <= 1'b1; 2'b01: sioc <= 1'b1; 2'b10: sioc <= 1'b1; default : sioc <= 1'b1; endcase 6'b000000: case (divider[7:6]) 2'b00: sioc <= 1'b1; 2'b01: sioc <= 1'b1; 2'b10: sioc <= 1'b1; default : sioc <= 1'b1; endcase default: case (divider[7:6]) 2'b00: sioc <= 1'b0; 2'b01: sioc <= 1'b1; 2'b10: sioc <= 1'b1; default : sioc <= 1'b0; endcase endcase end

Page 28: OV7670 CAMERA SENSOR APPLICATION USING ZYBO

26

if (divider == 8'b11111111) begin busy_sr <= {busy_sr[30:0], 1'b0}; data_sr <= {data_sr[30:0], 1'b1}; divider <= 0; end else begin divider <= divider + 1; end end endmodule

4.2 EK 2

module debounce( input clk,

input i, output reg o); reg [23:0] c; always@(posedge clk) begin if (i == 1'b1) begin if (c == 24'hFFFFFF) begin o <= 1'b1; end else begin o <= 1'b0; end c <= c+1; end else begin c <= 0; o <= 1'b0; end end

endmodule

Page 29: OV7670 CAMERA SENSOR APPLICATION USING ZYBO

27

4.3 EK 3

module ov7670_axi_stream_capture ( input pclk, input vsync, input href, input [7:0] d, output reg [31:0] m_axis_tdata, output reg m_axis_tvalid, input m_axis_tready, output reg m_axis_tlast, output reg m_axis_tuser, output reg aclk ); reg [15:0] d_latch; reg [18:0] address; reg [1:0] line; reg [6:0] href_last; reg we_reg; reg href_hold; reg latched_vsync; reg latched_href; reg [7:0] latched_d; reg sof; reg eol; initial begin d_latch <= 0; address <= 0; line <= 0; href_last <= 0; we_reg <= 0; href_hold <= 0; latched_vsync <= 0; latched_href <= 0; latched_d <= 0; sof <= 0; eol <= 0; end always@* begin m_axis_tdata <= {8'b11111111, d_latch[4:0], d_latch[0], d_latch[0], d_latch[0], d_latch[10:5], d_latch[5], d_latch[5], d_latch[15:11], d_latch[11], d_latch[11], d_latch[11]}; m_axis_tvalid <= we_reg; m_axis_tlast <= eol; m_axis_tuser <= sof; aclk <= ~pclk; end always@ (posedge pclk) begin if (we_reg == 1'b1) begin address <= address + 1; end

Page 30: OV7670 CAMERA SENSOR APPLICATION USING ZYBO

28

if (href_hold == 1'b0 && latched_href == 1'b1) begin case (line) 2'b00: line <= 2'b01; 2'b01: line <= 2'b10; 2'b10: line <= 2'b11; default: line <= 2'b00; endcase end href_hold <= latched_href; // Capturing the data from the camera if (latched_href == 1'b1) begin d_latch <= {d_latch[7:0], latched_d}; end we_reg <= 1'b0; // Is a new screen about to start if (latched_vsync == 1'b1) begin address <= 0; href_last <= 0; line <= 0; end

else begin if (href_last[0] == 1'b1) begin we_reg <= 1'b1; href_last <= 0; end else begin href_last <= {href_last[5:0], latched_href}; end end if(address % 640 == 639) begin eol <= 1'b1; end else begin eol <= 1'b0; end if(address == 0) begin sof <= 1'b1; end else begin sof <= 1'b0; end end

Page 31: OV7670 CAMERA SENSOR APPLICATION USING ZYBO

29

always@(negedge pclk) begin latched_d <= d; latched_href <= href; latched_vsync <= vsync; end

endmodule

4.4 EK 4

module ov7670_axi_stream_vga ( input clk25, output reg [4:0] vga_red, output reg [5:0] vga_green, output reg [4:0] vga_blue, output reg vga_hsync, output reg vga_vsync, input [31:0] s_axis_tdata, input s_axis_tvalid, output reg s_axis_tready, input s_axis_tlast, input s_axis_tuser ); // Timing constants localparam hRez = 640; localparam hStartSync = 640+16; localparam hEndSync = 640+16+96; localparam hMaxCount = 800; localparam vRez = 480; localparam vStartSync = 480+10; localparam vEndSync = 480+10+2; localparam vMaxCount = 480+10+2+33; localparam hsync_active = 1'b0; localparam vsync_active = 1'b0; reg [9:0] hCounter; reg [9:0] vCounter; reg [18:0] address; reg [17:0] frame_addr; reg [15:0] frame_pixel; reg blank; reg we_reg; reg sof; reg eol; reg start;

Page 32: OV7670 CAMERA SENSOR APPLICATION USING ZYBO

30

initial begin hCounter = 0; vCounter = 0; address = 0; frame_addr = 0; frame_pixel = 0; blank = 1'b1; we_reg = 0; sof = 0; eol = 0; start = 0; end always@* begin frame_pixel <= {s_axis_tdata[23:19], s_axis_tdata[15:10], s_axis_tdata[7:3]}; we_reg <= s_axis_tvalid; eol <= s_axis_tlast; sof <= s_axis_tuser; frame_addr <= address[18:1]; end always@(posedge clk25) begin // Count the lines and rows if (hCounter == hMaxCount-1) //yatay sıfırla begin hCounter <= 0; if (vCounter == vMaxCount-1) //dikey sıfırla begin s_axis_tready <= 1'b0; vCounter <= 0; end else begin s_axis_tready <= 1'b1; vCounter <= vCounter + 1;// dikey arttır end end else begin hCounter <= hCounter + 1; //tarama için yatay arttır end if (blank == 1'b0) begin vga_red <= frame_pixel[15:11]; vga_green <= frame_pixel[10:5]; vga_blue <= frame_pixel[ 4:0]; end else begin vga_red <= 0; vga_green <= 0; vga_blue <= 0; end

Page 33: OV7670 CAMERA SENSOR APPLICATION USING ZYBO

31

if (we_reg == 1'b1) begin if (eol == 1'b1) begin address <= 0; start <= 1'b0; end else begin if (sof == 1'b1) begin start <= 1'b1; end end if (start == 1'b1) begin if (vCounter >= vRez ) //blank durumu begin address <= 0; blank <= 1'b1; end else begin if (hCounter < 640) //blank yok begin blank <= 1'b0; address <= address + 1; end else begin blank <= 1'b1; //blank durumu end end end end if (hCounter > hStartSync && hCounter <= hEndSync) vga_hsync <= hsync_active; else vga_hsync <= ~hsync_active; // Are we in the vSync pulse? if (vCounter >= vStartSync && vCounter < vEndSync) vga_vsync <= vsync_active; else vga_vsync <= ~vsync_active; end

endmodule

Page 34: OV7670 CAMERA SENSOR APPLICATION USING ZYBO

32

4.5 EK 5

4.5.1 EK 5.A #include "xparameters.h" #include "xstatus.h" #include "xintc.h" #include "xil_exception.h" #include "xil_assert.h" #include "xaxivdma.h" #include "xaxivdma_i.h" #define MEMORY_BASE XPAR_PS7_DDR_0_S_AXI_BASEADDR unsigned int srcBuffer = (MEMORY_BASE + 0x1000000); static XIntc Intc; int run_triple_frame_buffer(XAxiVdma* InstancePtr, int DeviceId, int hsize, int vsize, int buf_base_addr, int number_frame_count, int enable_frm_cnt_intr); static int SetupIntrSystem(XAxiVdma *AxiVdmaPtr, u16 ReadIntrId, u16 WriteIntrId); int main(){ int Status; XAxiVdma InstancePtr; xil_printf("\n--- Entering main() --- \r\n"); xil_printf("Starting the VDMA \n\r"); while(1){ Status = run_triple_frame_buffer(&InstancePtr, 0, 640, 480, srcBuffer, 100, 0); if (Status != XST_SUCCESS) { xil_printf("Transfer of frames failed with error = %d\r\n",Status); return XST_FAILURE; } else { xil_printf("Transfer of frames started \r\n"); } } SetupIntrSystem(&InstancePtr, XPAR_INTC_0_AXIVDMA_0_MM2S_INTROUT_VEC_ID, XPAR_INTC_0_AXIVDMA_0_S2MM_INTROUT_VEC_ID); while(1); } static void ReadCallBack(void *CallbackRef, u32 Mask) { xil_printf("Read Call back function is called\r\n"); }

Page 35: OV7670 CAMERA SENSOR APPLICATION USING ZYBO

33

static void ReadErrorCallBack(void *CallbackRef, u32 Mask) { xil_printf("Read Call back Error function is called\r\n"); } static void WriteCallBack(void *CallbackRef, u32 Mask) { xil_printf("Write Call back function is called\r\n"); } static void WriteErrorCallBack(void *CallbackRef, u32 Mask) { xil_printf("Write Call back Error function is called \r\n"); } static int SetupIntrSystem(XAxiVdma *AxiVdmaPtr, u16 ReadIntrId, u16 WriteIntrId) { int Status; XIntc *IntcInstancePtr =&Intc; Status = XIntc_Initialize(IntcInstancePtr, XPAR_INTC_0_DEVICE_ID); if (Status != XST_SUCCESS) { xil_printf( "Failed init intc\r\n"); return XST_FAILURE; } Status = XIntc_Connect(IntcInstancePtr, ReadIntrId, (XInterruptHandler)XAxiVdma_ReadIntrHandler, AxiVdmaPtr); if (Status != XST_SUCCESS) { xil_printf("Failed read channel connect intc %d\r\n", Status); return XST_FAILURE; } Status = XIntc_Connect(IntcInstancePtr, WriteIntrId, (XInterruptHandler)XAxiVdma_WriteIntrHandler, AxiVdmaPtr); if (Status != XST_SUCCESS) { xil_printf("Failed write channel connect intc %d\r\n", Status); return XST_FAILURE; } Status = XIntc_Start(IntcInstancePtr, XIN_REAL_MODE); if (Status != XST_SUCCESS) { xil_printf( "Failed to start intc\r\n"); return XST_FAILURE; } XIntc_Enable(IntcInstancePtr, ReadIntrId); XIntc_Enable(IntcInstancePtr, WriteIntrId);

Page 36: OV7670 CAMERA SENSOR APPLICATION USING ZYBO

34

Xil_ExceptionInit(); Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT, (Xil_ExceptionHandler)XIntc_InterruptHandler, (void *)IntcInstancePtr); Xil_ExceptionEnable(); XAxiVdma_SetCallBack(AxiVdmaPtr, XAXIVDMA_HANDLER_GENERAL, ReadCallBack, (void *)AxiVdmaPtr, XAXIVDMA_READ); XAxiVdma_SetCallBack(AxiVdmaPtr, XAXIVDMA_HANDLER_ERROR, ReadErrorCallBack, (void *)AxiVdmaPtr, XAXIVDMA_READ); XAxiVdma_SetCallBack(AxiVdmaPtr, XAXIVDMA_HANDLER_GENERAL, WriteCallBack, (void *)AxiVdmaPtr, XAXIVDMA_WRITE); XAxiVdma_SetCallBack(AxiVdmaPtr, XAXIVDMA_HANDLER_ERROR, WriteErrorCallBack, (void *)AxiVdmaPtr, XAXIVDMA_WRITE); return XST_SUCCESS; } static void DisableIntrSystem(u16 ReadIntrId, u16 WriteIntrId) { XIntc_Disconnect(&Intc, ReadIntrId); XIntc_Disconnect(&Intc, WriteIntrId); }

4.5.2 EK 5.B

/******************************************************************* * * Copyright (C) 2014 - 2016 Xilinx, Inc. All rights reserved. * *******************************************************************/ #define DEBUG_MODE 0 #include "xaxivdma.h" #include "xparameters.h" #include "xil_exception.h" typedef struct vdma_handle { unsigned int device_id; unsigned int init_done; XAxiVdma* InstancePtr; XAxiVdma_DmaSetup ReadCfg; XAxiVdma_DmaSetup WriteCfg; unsigned int hsize; unsigned int vsize; unsigned int buffer_address; unsigned int enable_frm_cnt_intr; unsigned int number_of_frame_count; }vdma_handle;

Page 37: OV7670 CAMERA SENSOR APPLICATION USING ZYBO

35

vdma_handle vdma_context[XPAR_XAXIVDMA_NUM_INSTANCES]; static unsigned int context_init=0; static int ReadSetup(vdma_handle *vdma_context); static int WriteSetup(vdma_handle *vdma_context); static int StartTransfer(XAxiVdma *InstancePtr); int run_triple_frame_buffer(XAxiVdma* InstancePtr, int DeviceId, int hsize, int vsize, int buf_base_addr, int number_frame_count, int enable_frm_cnt_intr) { int Status,i; XAxiVdma_Config *Config; XAxiVdma_FrameCounter FrameCfgPtr; if(context_init==0) { for(i=0; i < XPAR_XAXIVDMA_NUM_INSTANCES; i++) { vdma_context[i].InstancePtr = NULL; vdma_context[i].device_id = -1; vdma_context[i].hsize = 0; vdma_context[i].vsize = 0; vdma_context[i].init_done = 0; vdma_context[i].buffer_address = 0; vdma_context[i].enable_frm_cnt_intr = 0; vdma_context[i].number_of_frame_count = 0; } context_init = 1; } Config = XAxiVdma_LookupConfig(DeviceId); if (!Config) { xil_printf("No video DMA found for ID %d\r\n",DeviceId ); return XST_FAILURE; } if(vdma_context[DeviceId].init_done ==0) { vdma_context[DeviceId].InstancePtr = InstancePtr; Status = XAxiVdma_CfgInitialize(vdma_context[DeviceId].InstancePtr, Config, Config->BaseAddress); if (Status != XST_SUCCESS) { xil_printf("Configuration Initialization failed %d\r\n", Status); return XST_FAILURE; } vdma_context[DeviceId].init_done = 1; } vdma_context[DeviceId].device_id = DeviceId; vdma_context[DeviceId].vsize = vsize; vdma_context[DeviceId].buffer_address = buf_base_addr; vdma_context[DeviceId].enable_frm_cnt_intr = enable_frm_cnt_intr; vdma_context[DeviceId].number_of_frame_count = number_frame_count; vdma_context[DeviceId].hsize = hsize * (Config->Mm2SStreamWidth>>3);

Page 38: OV7670 CAMERA SENSOR APPLICATION USING ZYBO

36

Status = WriteSetup(&vdma_context[DeviceId]); if (Status != XST_SUCCESS) { xil_printf("Write channel setup failed %d\r\n", Status); if(Status == XST_VDMA_MISMATCH_ERROR) xil_printf("DMA Mismatch Error\r\n"); return XST_FAILURE; } Status = ReadSetup(&vdma_context[DeviceId]); if (Status != XST_SUCCESS) { xil_printf("Read channel setup failed %d\r\n", Status); if(Status == XST_VDMA_MISMATCH_ERROR) xil_printf("DMA Mismatch Error\r\n"); return XST_FAILURE; } if(vdma_context[DeviceId].enable_frm_cnt_intr) { FrameCfgPtr.ReadDelayTimerCount = 1; FrameCfgPtr.ReadFrameCount = number_frame_count; FrameCfgPtr.WriteDelayTimerCount = 1; FrameCfgPtr.WriteFrameCount = number_frame_count; XAxiVdma_SetFrameCounter(vdma_context[DeviceId].InstancePtr,&FrameCfgPtr); XAxiVdma_IntrEnable(vdma_context[DeviceId].InstancePtr, XAXIVDMA_IXR_ERROR_MASK | XAXIVDMA_IXR_FRMCNT_MASK,XAXIVDMA_WRITE); XAxiVdma_IntrEnable(vdma_context[DeviceId].InstancePtr, XAXIVDMA_IXR_ERROR_MASK | XAXIVDMA_IXR_FRMCNT_MASK,XAXIVDMA_READ); } else { XAxiVdma_IntrEnable(vdma_context[DeviceId].InstancePtr, XAXIVDMA_IXR_ERROR_MASK,XAXIVDMA_WRITE); XAxiVdma_IntrEnable(vdma_context[DeviceId].InstancePtr, XAXIVDMA_IXR_ERROR_MASK ,XAXIVDMA_READ); } Status = StartTransfer(vdma_context[DeviceId].InstancePtr); if (Status != XST_SUCCESS) { if(Status == XST_VDMA_MISMATCH_ERROR) xil_printf("DMA Mismatch Error\r\n"); return XST_FAILURE; } #if DEBUG_MODE xil_printf("Code is in Debug mode, Make sure that buffer addresses are at valid memory \r\n"); xil_printf("In triple mode, there has to be six consecutive buffers for Debug mode \r\n"); { u32 pixels,j,Addr = vdma_context[DeviceId].buffer_address; u8 *dst,*src; u32 total_pixel = vdma_context[DeviceId].stride * vdma_context[DeviceId].vsize; src = (unsigned char *)Addr; dst = (unsigned char *)Addr + (total_pixel * vdma_context->InstancePtr->MaxNumFrames);

Page 39: OV7670 CAMERA SENSOR APPLICATION USING ZYBO

37

for(j=0;j<vdma_context->InstancePtr->MaxNumFrames;j++) { for(pixels=0;pixels<total_pixel;pixels++) { if(src[pixels] != dst[pixels]) { xil_printf("VDMA transfer failed: SRC=0x%x, DST=0x%x\r\n", src[pixels],dst[pixels]); exit(-1); } } src = src + total_pixel; dst = dst + total_pixel; } } xil_printf("VDMA transfer is happening and checked for 3 frames \r\n"); #endif return XST_SUCCESS; } static int ReadSetup(vdma_handle *vdma_context) { int Index; u32 Addr; int Status; vdma_context->ReadCfg.VertSizeInput = vdma_context->vsize; vdma_context->ReadCfg.HoriSizeInput = vdma_context->hsize; vdma_context->ReadCfg.Stride = vdma_context->hsize; vdma_context->ReadCfg.FrameDelay = 0; vdma_context->ReadCfg.EnableCircularBuf = 1; vdma_context->ReadCfg.EnableSync = 1; vdma_context->ReadCfg.PointNum = 0; vdma_context->ReadCfg.EnableFrameCounter = 0; vdma_context->ReadCfg.FixedFrameStoreAddr = 0; Status = XAxiVdma_DmaConfig(vdma_context->InstancePtr, XAXIVDMA_READ, &vdma_context->ReadCfg); if (Status != XST_SUCCESS) { xil_printf("Read channel config failed %d\r\n", Status); return XST_FAILURE; } Addr = vdma_context->buffer_address; for(Index = 0; Index < vdma_context->InstancePtr->MaxNumFrames; Index++) { vdma_context->ReadCfg.FrameStoreStartAddr[Index] = Addr; #if DEBUG_MODE { u32 i; u8 *src; u32 total_pixel = vdma_context->stride * vdma_context->vsize;

Page 40: OV7670 CAMERA SENSOR APPLICATION USING ZYBO

38

src = (unsigned char *)Addr; xil_printf("Read Buffer %d address: 0x%x \r\n",Index,Addr); for(i=0;i<total_pixel;i++) { src[i] = i & 0xFF; } } #endif Addr += vdma_context->hsize * vdma_context->vsize; } Status = XAxiVdma_DmaSetBufferAddr(vdma_context->InstancePtr, XAXIVDMA_READ, vdma_context->ReadCfg.FrameStoreStartAddr); if (Status != XST_SUCCESS) { xil_printf( "Read channel set buffer address failed %d\r\n", Status); return XST_FAILURE; } return XST_SUCCESS; } static int WriteSetup(vdma_handle *vdma_context) { int Index; u32 Addr; int Status; vdma_context->WriteCfg.VertSizeInput = vdma_context->vsize; vdma_context->WriteCfg.HoriSizeInput = vdma_context->hsize; vdma_context->WriteCfg.Stride = vdma_context->hsize; vdma_context->WriteCfg.FrameDelay = 0; vdma_context->WriteCfg.EnableCircularBuf = 1; vdma_context->WriteCfg.EnableSync = 1; vdma_context->WriteCfg.PointNum = 0; vdma_context->WriteCfg.EnableFrameCounter = 0; vdma_context->WriteCfg.FixedFrameStoreAddr = 0; Status = XAxiVdma_DmaConfig(vdma_context->InstancePtr, XAXIVDMA_WRITE, &vdma_context->WriteCfg); if (Status != XST_SUCCESS) { xil_printf( "Write channel config failed %d\r\n", Status); return Status; } Addr = vdma_context->buffer_address;

Page 41: OV7670 CAMERA SENSOR APPLICATION USING ZYBO

39

#if DEBUG_MODE Addr = Addr + vdma_context->InstancePtr->MaxNumFrames * \ (vdma_context->stride * vdma_context->vsize); #endif for(Index = 0; Index < vdma_context->InstancePtr->MaxNumFrames; Index++) { vdma_context->WriteCfg.FrameStoreStartAddr[Index] = Addr; #if DEBUG_MODE xil_printf("Write Buffer %d address: 0x%x \r\n",Index,Addr); #endif Addr += (vdma_context->hsize * vdma_context->vsize); } Status = XAxiVdma_DmaSetBufferAddr(vdma_context->InstancePtr, XAXIVDMA_WRITE, vdma_context->WriteCfg.FrameStoreStartAddr); if (Status != XST_SUCCESS) { xil_printf("Write channel set buffer address failed %d\r\n", Status); return XST_FAILURE; } #if DEBUG_MODE memset((void *)vdma_context->buffer_address, 0, vdma_context->ReadCfg.Stride * vdma_context->ReadCfg.VertSizeInput * vdma_context->InstancePtr->MaxNumFrames); #endif return XST_SUCCESS; } static int StartTransfer(XAxiVdma *InstancePtr) { int Status; Status = XAxiVdma_DmaStart(InstancePtr, XAXIVDMA_WRITE); if (Status != XST_SUCCESS) { xil_printf("Start Write transfer failed %d\r\n", Status); return XST_FAILURE; } Status = XAxiVdma_DmaStart(InstancePtr, XAXIVDMA_READ); if (Status != XST_SUCCESS) { xil_printf("Start read transfer failed %d\r\n", Status); return XST_FAILURE; } return XST_SUCCESS; }

Page 42: OV7670 CAMERA SENSOR APPLICATION USING ZYBO

40

4.6 EK 6

Page 43: OV7670 CAMERA SENSOR APPLICATION USING ZYBO

41

4.7 EK 7

set_property PACKAGE_PIN R18 [get_ports button_debounce] set_property PACKAGE_PIN M14 [get_ports led_config_finished] set_property PACKAGE_PIN T10 [get_ports reset] set_property PACKAGE_PIN T11 [get_ports {d[1]}] set_property PACKAGE_PIN W15 [get_ports {d[3]}] set_property PACKAGE_PIN V15 [get_ports {d[5]}] set_property PACKAGE_PIN U12 [get_ports pwdn] set_property PACKAGE_PIN T12 [get_ports {d[0]}] set_property PACKAGE_PIN Y14 [get_ports {d[2]}] set_property PACKAGE_PIN W14 [get_ports {d[4]}] set_property PACKAGE_PIN W20 [get_ports {d[7]}] set_property PACKAGE_PIN V20 [get_ports pclk] set_property PACKAGE_PIN U20 [get_ports vsync] set_property PACKAGE_PIN T20 [get_ports sioc] set_property PACKAGE_PIN W19 [get_ports {d[6]}] set_property PACKAGE_PIN W18 [get_ports xclk] set_property PACKAGE_PIN Y19 [get_ports href] set_property PACKAGE_PIN Y18 [get_ports siod] set_property PACKAGE_PIN M19 [get_ports {vga_red[0]}] set_property PACKAGE_PIN L20 [get_ports {vga_red[1]}] set_property PACKAGE_PIN J20 [get_ports {vga_red[2]}] set_property PACKAGE_PIN G20 [get_ports {vga_red[3]}] set_property PACKAGE_PIN F19 [get_ports {vga_red[4]}] set_property PACKAGE_PIN H18 [get_ports {vga_green[0]}] set_property PACKAGE_PIN N20 [get_ports {vga_green[1]}] set_property PACKAGE_PIN L19 [get_ports {vga_green[2]}] set_property PACKAGE_PIN J19 [get_ports {vga_green[3]}] set_property PACKAGE_PIN H20 [get_ports {vga_green[4]}] set_property PACKAGE_PIN F20 [get_ports {vga_green[5]}] set_property PACKAGE_PIN P20 [get_ports {vga_blue[0]}] set_property PACKAGE_PIN M20 [get_ports {vga_blue[1]}] set_property PACKAGE_PIN K19 [get_ports {vga_blue[2]}] set_property PACKAGE_PIN J18 [get_ports {vga_blue[3]}] set_property PACKAGE_PIN G19 [get_ports {vga_blue[4]}] set_property PACKAGE_PIN P19 [get_ports vga_hsync] set_property PACKAGE_PIN R19 [get_ports vga_vsync] set_property IOSTANDARD LVCMOS33 [get_ports button_debounce] set_property IOSTANDARD LVCMOS33 [get_ports led_config_finished] set_property IOSTANDARD LVCMOS33 [get_ports pclk] set_property IOSTANDARD LVCMOS33 [get_ports sioc] set_property IOSTANDARD LVCMOS33 [get_ports vsync] set_property IOSTANDARD LVCMOS33 [get_ports reset] set_property IOSTANDARD LVCMOS33 [get_ports pwdn] set_property IOSTANDARD LVCMOS33 [get_ports href] set_property IOSTANDARD LVCMOS33 [get_ports xclk] set_property IOSTANDARD LVCMOS33 [get_ports siod] set_property IOSTANDARD LVCMOS33 [get_ports {d[*]}] set_property IOSTANDARD LVCMOS33 [get_ports {vga_red[*]}] set_property IOSTANDARD LVCMOS33 [get_ports {vga_green[*]}] set_property IOSTANDARD LVCMOS33 [get_ports {vga_blue[*]}] set_property IOSTANDARD LVCMOS33 [get_ports vga_hsync] set_property IOSTANDARD LVCMOS33 [get_ports vga_vsync] # Magic set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets pclk_IBUF]