LAPORAN KERJA PRAKTIK
Error: Reference source not found PADA DEVELOPMENT
BOARD SPARTAN 3E STARTER
Disusun oleh :
Error: Reference source not found10/305234/TK/37425
PROGRAM STUDI TEKNIK ELEKTROJURUSAN TEKNIK
ELEKTRO DAN TEKNOLOGI INFORMASI
FAKULTAS TEKNIK UNIVERSITAS GADJAH MADA
YOGYAKARTA
Error: Reference source not found
ii
HALAMAN PENGESAHAN
Error: Reference source not found PADA DEVELOPMENT
BOARD SPARTAN 3E STARTER
LAPORAN KERJA PRAKTIK
Diajukan Sebagai Salah Satu Syarat untuk Memperoleh
Gelar Sarjana Teknik Program S-1
Pada Jurusan Teknik Elektro dan Teknologi Informasi Fakultas Teknik
Universitas Gadjah Mada
Disusun oleh :
Error: Reference source not found10/305234/TK/37425
Telah disetujui dan disahkan
pada tanggal 8 Mei 2014
Dosen Pembimbing Kerja Praktik
Bondhan Winduratna, Ir., M.EngNIP 196210151989031001
iii
[bukti pelaksanaan kerja praktik]
iv
KATA PENGANTAR
Laporan kerja praktek ini adalah hasil dari kegiatan yang dilaksanakan di
Laboratorium Pengolahan Isyarat. Pada kegiatan Kerja Praktek ini penulis mendesain
sebuah controller untuk komponen ADC dan DAC.
Alasan penulis mengambil tema ini adalah karena sedikitnya minat
Mahasiswa terhadap desain perangkat keras. Dengan contoh desain yang dibuat
penulis untuk Kerja Praktek ini maka penulis berharap dapat menarik minat
Mahasiswa terhadap desain perangkat keras.
Ucapan terima kasih kepada:
1. Bapak Sarjiya, S.T., M.T., Ph.D., selaku Ketua Jurusan Teknik Elektro dan
Teknologi Informasi Fakultas Teknik Universitas Gadjah Mada.
2. Bapak Bondhan Winduratna, Ir., M.Eng selaku dosen pembimbing kerja praktik
Yogyakarta, 8 April 2014
Penulis
v
DAFTAR ISI
HALAMAN PENGESAHAN......................................................................................ii
KATA PENGANTAR..................................................................................................iv
DAFTAR ISI.................................................................................................................v
DAFTAR GAMBAR..................................................................................................vii
DAFTAR TABEL......................................................................................................viii
1.1. Latar Belakang Masalah.................................................................................1
1.2. Perumusan Masalah........................................................................................3
1.3. Pembatasan Masalah.......................................................................................3
1.4. Maksud dan Tujuan.........................................................................................3
2.1. Jurusan Teknik Elektro dan Teknologi Informasi...........................................4
2.2. Laboratorium Pengolahan Isyarat...................................................................5
3.1. Protokol SPI....................................................................................................6
3.1.1. Antar Muka........................................................................................6
3.1.2. Metode Operasi..................................................................................7
3.1.3. Polaritas dan Fase Clock....................................................................8
3.1.4. Pengkawatan......................................................................................9
3.2. Development Board Spartan 3E Starter........................................................11
3.2.1. ADC LTC 1407................................................................................12
3.2.2. DAC LTC2624.................................................................................15
3.2.3. PGA LTC6912..................................................................................17
4.1. Konsep Rancangan........................................................................................19
4.1.1. Kompatibilitas Mode Operasi..........................................................21
vi
4.2. Implementasi Kode Verilog..........................................................................21
4.2.1. Inisialisasi I/O Dan Register............................................................22
4.2.2. Rutin Reset.......................................................................................24
4.2.3. Inisialisasi Amplifier........................................................................26
4.2.4. Rutin ADC/DAC..............................................................................27
4.3. Simulasi dan Pengujian.................................................................................29
4.3.1. Simulasi............................................................................................29
4.3.2. Pengujian..........................................................................................33
5.1. Kesimpulan...................................................................................................37
5.2. Saran.............................................................................................................38
LAMPIRAN A :Kode Verilog SPI Controller
LAMPIRAN B : Kode Stimulus Simulasi
LAMPIRAN C : Kode UCF (User Constraint File)
LAMPIRAN D : Device Utilization Summary
vii
DAFTAR GAMBAR
Gambar 3-1. Register geser pada protokol SPI......................................................8
Gambar 3-2. Mode operasi SPI..............................................................................9
Gambar 3-3. Mode independent slave...................................................................10
Gambar 3-4. Mode daisy chain..............................................................................11
Gambar 3-5 Sinyal pada protokol SPI...................................................................12
Gambar 3-6. Board Spartan 3E Starter..................................................................13
Gambar 3-7. Skematik LTC 1407..........................................................................14
Gambar 3-8. Timing diagram LTC 1407 bagian 1.................................................15
Gambar 3-9. Timing Diagram LTC 1407 bagian 2.
Gambar 3-10. Skematik LTC 2624........................................................................18
Gambar 3-11. Timing diagram LTC 2624..............................................................19
Gambar 3-12. Daftar command dan address..........................................................20
Gambar 3-13.Timing diagram LTC 6912..............................................................20
Gambar 4-14. Pembagian waktu akses ADC dan DAC.........................................22
Gambar 4-15. Pemakaian kanal oleh ADC dan DAC............................................23
Gambar 4-16. Transmisi tergabung ADC/DAC.....................................................23
Gambar 4-17. Blok diagram kode Verilog.............................................................25
Gambar 5-18. Simulasi inisialisasi amplifier.........................................................35
Gambar 5-19. Simulasi transisi amplifier ke ADC/DAC.......................................36
Gambar 5-20. Simulasi kecepatan sample rate dari controller..............................37
Gambar 4-21. Pengujian dengan sinus 1Khz.........................................................39
Gambar 4-22. Pengujian dengan sinus 10 Khz......................................................40
Gambar 4-23. Pengujian dengan sinus 100Khz.....................................................41
viii
DAFTAR TABEL
Tabel 3-1. Sinyal pada protokol SPI......................................................................7
1
BAB 1.
PENDAHULUAN
1.1. Latar Belakang Masalah
FPGA adalah IC yang memungkinkan seseorang mengimplementasikan
perangkat digital custom dengan mudah. Dengan FPGA, sebuah desain rangkain
digital tidak perlu diproduksi dengan mesin fabrikasi semikonduktor akan tetapi
cukup diprogram ulang ditempat. Dengan kemampuan reprogrammability seperti ini,
maka FPGA dapat menggantikan fungsi microcontroller untuk beberapa aplikasi.
Kemampuan reprogrammability FPGA didapat dari Look Up Table (LUT).
LUT pada dasarnya adalah sebuah memori dengan input berupa alamat dan output
berupa nilai yang tersimpan di dalamnya. Dengan mengubah-ubah nilai yang
tersimpan di LUT maka LUT dapat berperan sebagai berbagai macam gerbang
digital. Banyaknya variasi yang bisa direalisasikan dengan sebuah LUT tergantung
besar LUT itu sendiri.
Untuk membuat suatu rangkaian digital yang lebih kompleks, maka beragam
LUT dihubungkan. Banyaknya LUT dalam sebuah FPGA menentukan seberapa
kompleks rangkaian yang bisa tersimpan dalam sebuah FPGA.
Pada mikrokontroller, reprogrammability didapat dari memori yang bisa
ditulis ulang dan prosesor yang dapat mengartikan beragam perintah. Perintah yang
dimengerti prosesor disusun untuk menjadi suatu perintah yang lebih kompleks.
Semakin kompleks suatu algoritma yang diimplementasikan maka dibutuhkan
2
semakin banyak perintah penyusun sehingga waktu eksekusi menjadi lebih lama.
Perbedaan diatas menjadikan pemrograman untuk FPGA memiliki paradigma
yang berbeda dengan pemrograman untuk prosesor. Perbedaannya yaitu algoritma
yang dikerjakan oleh mikrokontroller dieksekusi bersifat sekuensial, sedangkan yang
dikerjakan oleh FPGA dikerjakan secara concurrent. Sehingga sekalipun keduanya
dapat diprogram dengan bahasa level tinggi, pemrograman untuk FPGA lebih sulit.
Salah satu cara untuk memudahkan pemrograman FPGA adalah dengan
menggunakan modul siap pakai. Modul tersebut berupa desain rangkain digital yang
menjalankan fungsi tertentu. Modul dapat sesederhana shift register atau bisa juga
lebih kompleks seperti multiplier.
Di Laboratorium Pengolahan Isyarat di Jurusan Teknik Elektro dan Teknologi
Informasi, praktikum pengolahan isyarat umumnya hanya dilakukan dengan simulasi
software. Hal ini sangat disayangkan karena terdapat fasilitas perangkat keras seperti
FPGA yang bisa digunakan untuk menguji coba suatu algoritma.
Tidak dipakainya FPGA dalam praktikum bisa dipahami karena tidak adanya
modul mendukung yang bisa memudahkan praktikum. Padahal development board
FPGA yang dimiliki laboratorium memiliki komponen ADC dan DAC yang tentu
dapat digunakan untuk menguji suatu algoritma pengolahan isyarat. Akan tetapi
ketidak adaan modul library untuk mengakses ADC dan DAC membuat FPGA sulit
digunakan.
Oleh karena itu, pada Kerja Praktek ini akan dibuat suatu modul yang dapat
memudahkan akses ke ADC dan DAC. Modul tersebut bertujuan mengabstraksi
detail perangkat keras yang digunakan. Dengan begitu seseorang bisa menguji coba
algoritma tanpa mempedulikan komponen ADC dan DAC yang digunakan.
3
1.2. Perumusan Masalah
Tidak adanya modul pendukung pada FPGA di Laboratorium Pengolahan
Isyarat Jurusan Teknik Elektro dan Teknologi Informasi mengakibatkan FPGA tidak
dipakai untuk praktikum.
1.3. Pembatasan Masalah
Controller yang didesain adalah khusus untuk development board Spartan 3E
Starter. Template kode yang dibuat adalah filter FIR 8 tap dengan konstanta bilangan
bulat. Perangkat seperti multiplier untuk filter FIR , akurasi ADC/DAC serta error
yang ditimbulkan oleh proses quantisasi tidak dibahas.
1.4. Maksud dan Tujuan
Kegiatan kerja praktek ini memiliki tujuan yang ingin dicapai antara lain
Dapat mempelajari protokol komunikasi SPI dan berbagai variasinya
Dapat mempelajari IC ADC dan DAC pada development board Spartan 3E
Starter serta metode komunikasinya.
Dapat mengimplementasikan suatu controller untuk berkomunikasi dengan IC
ADC dan DAC tersebut.
Dapat membuat template kode untuk mempermudah implementasi algoritma.
4
BAB 2.
PROFIL INSTITUSI
2.1. Jurusan Teknik Elektro dan Teknologi Informasi
Jurusan Teknik Elektro dan Teknologi Informasi adalah salah satu dari
delapan jurusan di Fakultas Teknik Universitas Gadjah Mada. Jurusan yang memiliki
program pendidikan dari S1 hingga S3 ini dipimpin oleh seorang ketua jurusan yang
pada tahun 2013 ini dijabat oleh Sarjiya, ST., MT., Ph.D.
Tanggal 17 Februari 1946 didirikan Sekolah Tinggi Teknik (Bandoeng) di
Yogyakarta. Bagian-bagian yang ada yaitu adalah Kimia, Mesin-Listrik, dan Sipil.
Namun pada tahun 1950 Bagian Mesin Listrik terpaksa ditutup, karena kekurangan
pengajar seiring pindahnya ibukota RI kembali ke Jakarta. Barulah tahun 1963
Bagian Teknik Listrik didirikan lagi setelah sebelumnya pada tahun 1959 Bagian
Teknik Mesin didirikan. Tahun 1976 secara administratif bagian Teknik Listrik dan
Bagian Teknik Mesin dipisah, tahun 1980 diganti menjadi Jurusan Teknik Listrik dan
kemudian tahun 1983 menyesuaikan SK Menteri Pendidikan dan Kebudayaan RI
No.0174/0/1983 tentang Penataan Jurusan pada Fakultas di Lingkungan
Universitas/Institut Negeri, nama jurusan berubah menjadi Jurusan Teknik Elektro.
Hingga pada tahun 2009 seiring dengan didirikannya program studi Teknologi
Informasi, nama Jurusan Teknik Elektro berganti menjadi Jurusan Teknik Elektro dan
Teknologi Informasi (JTETI).
5
2.2. Laboratorium Pengolahan Isyarat
Laboratorium Pengolahan Isyarat berdiri sejak pertengahan tahun 2010 dan
sebelumnya bernama laboratorium elektronika lanjut. Pergantian nama dan fungsi
laboratorium ini berdasar pada kebutuhan yang muncul akibat diselenggarakannya
sub konsentrasi baru, pengolahan isyarat, dalam prodi Teknik Elektro di JTETI.
Fasilitas dan Peralatan Utama
DSP development kit
FPGA development kit
Osiloskop
PC
Peralatan akuisisi isyarat
Peralatan Audio-Visual
6
BAB 3.
LANDASAN TEORI
3.1. Protokol SPI
SPI (Standard Peripheral Interface) adalah standar komunikasi serial sinkron
yang beroperasi secara full duplex. Sistem ini menggunakan model master / slave
dalam berkomunikasi. Perangkat yang berperan sebagai master bertugas menginisiasi
transfer data dan menentukan pesat data. Sebuah sistem dimungkinkan memiliki
banyak slave, dimana masing-masing slave memiliki suatu jalur slave select.
3.1.1. Antar Muka
Protokol SPI terdiri dari 4 sinyal digital, yaitu SCLK, MISO, MOSI dan SS.
Sinyal MOSI dan MISO adalah sinyal yang membawa data dan masing-masing
bersifat unidirectional. Sinyal SCLK adalah sinyal sinkronisasi sedangkan SS adalah
sinyal slave select. Slave select berfungsi memilih slave yang aktif pada konfigurasi
multi-slave
Sistem penamaan yang lain menggunakan nama SDI dan SDO untuk
menggantikan nama MISO dan MOSI. Pin dengan nama SDO selalu berfungsi
sebagai output dan pin dengan nama SDI selalu berfungsi sebagai input. Sedangkan
pin dengan nama MOSI dan MISO bisa berfungsi sebagai input atau output
tergantung modenya. Nama-nama sinyal dan fungsinya dirangkum pada Tabel 3-1.
7
Tabel 3-1. Sinyal pada protokol SPI
No Nama sinyal Fungsi
1 SCLK Clock sinkronisasi
2 MISO Jalur input master (SDI) / jalur output slave (SDO)
3 MOSI Jalur input slave (SDI) / jalur output master (SDO)
4 SS Pemilih slave
5 SDI
Jalur input. Sama dengan MISO jika sebagai master atau
MOSI jika sebagai slave
6 SDO
Jalur output. Sama dengan MISO jika sebagai slave atau
MOSI jika sebagai master
3.1.2. Metode Operasi
Seperti telah disebutkan di subbab sebelumnya, SPI menggunakan mode
master / slave dan master bertugas menginisiasi transmisi serta mengatur pesat data.
Artinya slave tidak bisa mengirim data ke master tanpa master memulai transmisi.
Transmisi dimulai dengan master membuat jalur SS dari slave yang ingin dialamati
bernilai LOW kemudian membangkitka sinyal SCLK.
Saat suatu slave aktif dan terdapat sinyal clock di jalur SCLK maka baik slave
maupun master akan menyampling data di pin SDI dan mengeluarkan data di SDO.
Slave yang tidak aktif akan mengabaikan sinyal clock dan tidak akan mengeluarkan
data di SDO.
Register SPI di master dan slave membentuk suatu circular buffer seperti
ditunjukkan pada Gambar 3-1. Jumlah periode clock yang dibutuhkan tergantung
8
panjang register . Setelah transfer selesai, masing-masing master dan slave dapat
menggunakan data tersebut. Jika terdapat data yang perlu ditransfer lagi maka
register diisi data baru dan proses transmisi diulang lagi.
Gambar 3-1. Register geser pada protokol SPI
3.1.3. Polaritas dan Fase Clock
SPI memiliki 4 mode operasi yang berkaitan dengan polaritas dan fase clock.
Mode polaritas diatur oleh register CPOL. CPOL = 0 berarti level logika pada jalur
SCLK saat idle adalah LOW, sedangkan CPOL = 1 berarti level logika bernilai
HIGH. Mode fase diatur dengan register CPHA. CPHA = 0 berarti nilai pada SDI
disampling pada leading edge clock dan nilai pada SDO dikeluarkan pada trailing
edge clock, sedangkan CPHA = 1 berarti SDI disampling pada trailing edge clock
dan SDO di-drive pada leading edge clock. Gambaran ke-4 mode operasi dapat
dilihat pada Gambar 3-2.
9
Gambar 3-2. Mode operasi SPI
3.1.4. Pengkawatan
Perangkat SPI dapat dihubungkan dalam mode independent slave atau daisy
chain. Mode independent slave mirip seperti topologi star, dengan master sebagai
pusatnya, sedangkan mode daisy chain mirip dengan topologi ring.
Pada mode independent slave, baik jalur MOSI maupun MISO terhubung di
satu titik yaitu di master. Mode ini menggunakan 1 jalur slave select untuk masing-
masing slave. Jika terdapat 3 slave maka dibutuhkan 3 buah jalur slave select. Mode
pengkawatan ini ditunjukkan oleh Gambar 3-3.
10
Gambar 3-3. Mode independent slave
Pada mode daisy chain, semua perangkat SPI dihubungkan secara back-to-
back. Maksudnya pin SDO dari suatu slave dihubungkan dengan pin SDI dari slave
lainnya. SDO dari slave paling ujung dihubungkan dengan MISO dari master dan
SDI dari slave di ujung satunya dihubungkan ke MOSI dari master. Dengan
pengkawatan seperti ini, maka seluruh perangkat SPI akan menjadi suatu circular
buffer yang panjangnya adalah total panjang register masing-masing perangkat.
Mode daisy chain ditunjukkan oleh Gambar 3-4.
11
Gambar 3-4. Mode daisy chain
Mode daisy chain lebih menghemat track pada PCB karena hanya
membutuhkan 1 jalur slave select, sedangkan mode independent slave membutuhkan
jalur slave select sebanyak jumlah slave. Kekurangan dari daisy chain adalah
kecepatan transfer lebih lambat karena panjang register menjadi panjang.
Jika hanya terdapat 1 slave maka jalur slave select bisa dihilangkan. Sebagai
gantinya pin SS pada slave dihubungkan permanen ke nilai tegangan logika LOW.
Sehingga total jalur yang dihubungkan hanya 3, yaitu SCK, MISO dan MOSI.
3.1.4.1 Pengkawatan Tidak Standar
Beberapa IC yang menggunakan protokol SPI juga menggunakan sinyal
diluar standar SPI untuk berkomunikasi.
12
Gambar 3-5 Sinyal pada protokol SPI
3.2. Development Board Spartan 3E Starter
Development Board / Papan Pengembangan Spartan 3E Starter adalah alat
pengembangan dari Digilent. Board ini memiliki komponen utama FPGA Xilinx
Spartan 3E . Selain itu terdapat komponen-komponen pendukung seperti memori,
LCD, IC periferal seperti LAN, ADC, DAC dan lain-lain. Board dapat dilihat pada
Gambar 3-6.
13
Gambar 3-6. Board Spartan 3E Starter
Komponen pendukung yang akan digunakan pada Kerja Praktek ini adalah
ADC LTC 1407, DAC LTC 2624 dan PGA LTC 6912. Komponen-komponen
tersebut adalah Analog to Digital Converter, Digital to Analog Converter dan
Programmable Gain Amplifier. Semua komponen tersebut menggunakan protokol
SPI untuk berkomunikasi dengan FPGA.
3.2.1. ADC LTC 1407
LTC 1407 adalah ADC dengan tipe SAR (Successive Aproximation Register )
yang memiliki kecepatan sampling maksimal 3 Msps. IC ini memiliki 2 kanal input
sehingga kecepatan sampling masing-masing kanal adalah 1,5Msps. Proses sampling
14
yang dilakukan pada kedua kanal dilakukan secara simultan.
LTC 1407 menggunakan tipe input differential dengan rentang ± 1,25V
terhadap tegangan referensi. Pada board Spartan 3 E Starter, tegangan referensi
adalah 1,65V. Artinya rentang tegangan input adalah 0,4V hingga 2,9V. Konfigurasi
pengkawatan LTC 1407 pada board Spartan 3 E Starter ditunjukkan oleh Gambar 3-
7.
Gambar 3-7. Skematik LTC 1407.
LTC 1407 menggunakan 3 jalur sinyal untuk berkomunikasi, yaitu SCK,
SDO dan CONV. SCK dan SDO adalah bagian dari standar SPI, sedangkan CONV
adalah jalur yang digunakan untuk memulai proses konversi. Timing diagram dari
15
ketiga sinyal tersebut ditunjukkan oleh Gambar 3-8 dan Gambar 3-9.
Gambar 3-8. Timing diagram LTC 1407 bagian 1
16
Gambar 3-9. Timing Diagram LTC 1407 bagian 2.
Proses akuisisi data dimulai dengan membangkitkan sinyal CONV. Rising
edge pada jalur CONV mengisyaratkan agar ADC menghentikan proses akuisisi dan
memulai proses konversi. Hal ini dilakukan dengan membuka saklar input pada
17
modul sample and hold dan menahan nilai tegangan pada kapasitor S/H.
Setelah sinyal CONV muncul, maka setiap rising edge pada SCK akan
menjalankan proses konversi. Karena ADC yang digunakan adalah tipe SAR, maka
data yang dikeluarkan pertama kali adalah MSB. Setelah proses konversi selesai
akan dilanjutkan proses konversi untuk kanal selanjutnya. Setelah kedua kanal
selesai dikonversi , ADC akan memulai proses akuisisi selanjutnya dan menunggu
muncul sinyal CONV selanjutnya.
Total siklus SCK yang dibutuhkan adalah 32 buah. Artinya panjang register
LTC 1407 adalah 32 bit. Data yang ditransfer berisi nilai konversi untuk kedua kanal
dalam bentuk 2’s complement. Transfer sebanyak 16 bit tidak dimungkinkan
sekalipun yang dibutuhkan hanya hasil konversi satu kanal. Hal ini disebabkan
proses akuisisi baru akan dimulai setelah 32 bit data selesai ditransfer. Sehingga jika
sinyal CONV dibangkitkan di pertengahan transfer maka sinyal tersebut akan
diabaikan.
3.2.2. DAC LTC2624
LTC 2624 adalah chip DAC yang digunakan di board Spartan 3 Starter. Chip
ini memiliki 4 kanal keluaran bertipe differential. Pada implementasi rangkaian LTC
2624 di board Spartan 3E Starter, referensi tegangan terendah adalah 0V, sedangkan
referensi tegangan tertinggi untuk kanal A dan B adalah 3,3V dan untuk kanal C serta
D adalah 2,5 V. Rangkain LTC 2624 ditunjukkan oleh Gambar 3-10.
18
Gambar 3-10. Skematik LTC 2624
LTC 2624 menggunakan 4 sinyal untuk berkomunikasi, yaitu SCK, SDI, CS
dan SDO. Ke empat sinyal tersebut adalah standar sinyal pada protokol SPI. Sinyal
SDO pada LTC 2624 hanya digunakan jika chip dirangkai dalam mode daisy chain,
sehingga pada implementasi pada development board sinyal SDO dapat diabaikan.
Sinyal CS adalah sinyal slave select. Sinyal ini perlu diaktifkan agar DAC bisa
menerima data dari FPGA. Hal ini berbeda dengan ADC yang tidak memiliki sinyal
slave select, sebaliknya digunakan pulsa CONV dengan cara kerja yang berbeda.
Chip ini menggunakan panjang register 24 atau 32 bit. Panjang data yang
ditransfer sebenarnya hanya 24 bit. Mode 32 bit digunakan jika master hanya bisa
mengirim data dengan kelipatan 16 bit. Chip ini mensampling data pada pin SDI
pada rising edge clock, artinya data harus dikirim pada falling edge. Timing diagram
sinyal untuk LTC 2624 ditunjukkan oleh Gambar 3-11.
19
Gambar 3-11. Timing diagram LTC 2624
Format data LTC 2624 terdiri dari 4 bit command, 4 bit address dan 16 bit
data.LTC 2624 sebenarnya hanya lah DAC 12 bit, sehingga 4 bit dari data diisi bit
don’t care. Command berisi perintah mengenai apa yang akan dilakukan DAC
dengan data yang diterima, sedangkan address adalah kanal DAC yang menjadi
tujuan. Penjelasan nilai bit command dan address ditunjukkan oleh Gambar 3-12.
20
Gambar 3-12. Daftar command dan address
3.2.3. PGA LTC6912
Pada board Spartan 3E Starter ,pin header input analog tidak terhubung
langsung ke ADC melainkan di buffer terlebih dahulu oleh PGA (Programmable
Gain Amplifier). PGA adalah amplifier dengan gain yang bisa diubah-ubah. PGA
yang digunakan pada board Spartan 3E Starter adalah LTC 6912. PGA ini
berkomunikasi menggunakan protokol SPI.
LTC 6912 memiliki pilihan gain 0,1,2,5,10,20 dan 50 dalam konfigurasi
inverting amplifier. Gain PGA hanya perlu di atur sekali saat inisialisasi dan dapat
diabaikan setelahnya. Hal ini berarti keberadaan PGA tidak berpengaruh signifikan
terhadap desain controller untuk ADC/DAC.
Gambar 3-13.Timing diagram LTC 6912
Mengkonfigurasi PGA dilakukan dengan mengirim nilai kode gain lewat jalur
21
SDI/MOSI. Timing diagram PGA ditunjukkan oleh Gambar 3-13 .Panjang data
adalah 8 bit yang memuat kode gain untuk kedua channel. Pada pemakaian
normal ,jalur SDO bisa diabaikan. PGA menyampling nilai pin SDI pada positive
edge clock, artinya FPGA mengirim data saat negative edge clock.
22
BAB 4.
PERANCANGAN DAN PENGUJIAN
4.1. Konsep Rancangan
Sebuah SPI master yang terhubung ke banyak slave perlu membagi-bagi
waktu akses bus untuk masing-masing slave. Pada implementasi ADC/DAC
controller ini, jalur SPI dipakai bergantian antara berkomunikasi dengan ADC dan
DAC. Diagram dari proses ini ditunjukkan oleh Gambar 4-14.
Gambar 4-14. Pembagian waktu akses ADC dan DAC.
ADC dan DAC sendiri pada dasarnya adalah komponen yang hanya
membutuhkan komunikasi simplex. Misalnya sebuah ADC hanya perlu mengirim
data ke master, sedangkan DAC hanya perlu menerima data dari master. Artinya ada
kanal yang selalu kosong sepeti ditunjukkan pada Gambar 4-15.
23
Gambar 4-15. Pemakaian kanal oleh ADC dan DAC.
Gambar diatas menunjukkan bahwa dengan pembagian waktu akses yang
dilakukan oleh SPI controller standar mengakibatkan ketidakefisiensian pemakaian
kanal. Solusi untuk hal tersebut adalah dengan melakukan transmisi yang digabung.
Metode ini ditunjukkan oleh Gambar 4-16. Transmisi ini tidak akan mengakibatkan
collision pada jalur data karena masing-masing transmisi terjadi pada jalur yang
berbeda.
Gambar 4-16. Transmisi tergabung ADC/DAC
Transmisi dengan cara seperti ini baru benar-benar bisa diimplementasikan
jika ADC maupun DAC yang digunakan benar-benar hanya memakai komunikasi
simplex. ADC LTC 1407 menggunakan jalur CONV untuk menerima perintah dari
FPGA, akan tetapi jalur ini diluar standar SPI dan tidak dibagi dengan komponen
lain. Artinya sinyal CONV ke ADC tidak akan bertabrakan dengan sinyal MOSI ke
DAC.
DAC LTC 2624 selain memiliki jalur terima (MOSI) juga memiliki jalur
kirim (MISO). Sehingga ada kemungkinan MISO dari DAC bertabrakan dengan
24
MISO dari ADC. Akan tetapi DAC hanya akan menggunakan jalur MISO jika
digunakan dalam konfigurasi daisy chain ,sehingga dalam konfigurasi yang
digunakan di development board jalur MISO tidak perlu digunakan.
4.1.1. Kompatibilitas Mode Operasi
ADC LTC1407 mengirim data pada rising edge clock. LTC1407 sendiri tidak
membedakan apakah rising edge clock terjadi saat leading edge atau trailing edge.
Hal disebabkan ADC hanya melakukan proses pengiriman data tanpa menerima data.
Karena ADC mengirim pada rising edge , maka FPGA harus melakukan sampling
pada falling edge. Sedangkan LTC2624 melakukan sampling pada rising edge tidak
perduli apakah merupakan leading edge atau trailing edge. Artinya FPGA harus
mengirim data saat falling edge.
Mengkombinasikan kedua slave menjadi satu berarti membuat FPGA harus
mengirim dan menyampling data saat falling edge clock. Sebuah SPI controller yang
standar selalu menyampling dan mengirim pada clock edge yang berlawanan. Hal ini
menjadikan controller yang akan didesain tidak mengikuti standar SPI. Pada desain
ini proses mengirim dan menyampling terjadi pada clock edge yang sama.
Ketidakcocokan antara desain controller yang dibutuhkan dengan SPI
controller standar menjadikan metode ini tidak bisa diimplementasikan dengan
perangkat SPI standar.Akan tetapi masih mungkin diimplementasikan dengan
membuat custom controller dengan FPGA
4.2. Implementasi Kode Verilog
Struktur kode HDL untuk controller dapat digambarkan dengan blok diagram pada
Gambar 4-17. Seluruh sistem dibuat sinkron dengan clock utama termasuk rutin reset. Modul
25
top level diberi nama fastADCDAC. Pada bagian ini I/O port dan register yang digunakan di
inisialisasi.
Gambar 4-17. Blok diagram kode Verilog.
Kode diatas dapat dibagi menjadi 3 bagian utama. Pertama adalah kode yang
dijalankan saat sinyal reset aktif atau disebut reset handler. Kedua adalah saat sinyal
reset tidak aktif dan PGA belum dikonfigurasi dan ketiga adalah saat reset tidak aktif
dan PGA telah dikonfigurasi.
26
4.2.1. Inisialisasi I/O Dan Register
Pada bagian ini input dan output dari controller dideskripsikan. Controller
memiliki input clock utama (clk), tombol reset (rst_n) dan jalur MISO (MISO).
Output yang dibutuhkan adalah jalur MOSI (MOSI), clock SPI (SCK), sinyal kontrol
ADC (AD_CONV) , slave select PGA (AMP_CS) dan slave select DAC (DA_CS).
Selain itu output tambahan yang diperlukan adalah deretan led untuk debugging
(led_array) dan sinyal kendali untuk men-disable chip lain yang berbagi jalur SPI
(SPI_SS_B,SF_CE0, FPGA_INIT_B). Kode yang digunakan adalah dibawah
ini.
module fastDACADC(input clk,input rst_n,input MISO,output reg MOSI,output reg SCK,output reg AD_CONV,output reg AMP_CS,output reg DA_CS,output DAC_CLR,output reg [7:0] led_array,output SPI_SS_B, output SF_CE0,output FPGA_INIT_B);
Register yang di inisialisasi adalah spi_clock_counter digunakan
untuk mendapatkan clock SCK dengan membagi clock utama, spi_clock_comp
berfungsi menyimpan nilai pembagian dan edge_counter yang menghitung
jumlah clock edge SCK yang telah dilewat. Register ini digunakan untuk
menentukan tindakan yang dilakukan controller untuk berbagai keadaan nilai pulsa
clock. Kode yang digunakan adalah sebagai berikut.
reg [2:0] spi_clock_counter;reg [2:0] spi_clock_comp;reg [7:0] edge_counter;
Register lain yang di inisialisasi berhubungan dengan transfer data itu sendiri.
27
AD_rx dan DA_tx adalah register buffer untuk transmit dan receive . AD_rx_ch1
dan AD_rx_ch2 menyimpan nilai konversi ADC kanal 1 dan kanal 2 yang diekstrak
dari register receive AD_rx. DA_tx_ch1 adalah nilai digital yang akan di-
concatenate dengan register DA_tx_ch1 untuk dikirim ke DAC. Kode yang
digunakan adalah sebagai berikut.
reg [31:0] AD_rx;reg [31:0] DA_tx;reg [13:0] AD_rx_ch1;reg [13:0] AD_rx_ch2;reg [11:0] DA_tx_ch1;
Register yang berhubungan dengan proses transformasi data kemudian
diinisialisasi. Pada contoh ini 8 buah register diinisialisasi untuk membuat delay
sebanyak 8 kali. Kode yang digunakan adalah sebagai berikut.
reg [13:0] tap1;reg [13:0] tap2;reg [13:0] tap3;reg [13:0] tap4;reg [13:0] tap5;reg [13:0] tap6;reg [13:0] tap7;reg [13:0] tap8;reg [31:0] sum;
wire spi_clock_enable;wire filter_clock_enable;reg AMP_ready;
4.2.2. Rutin Reset
Rutin reset berisi pernyataan untuk memberi nilai awal semua register.
Setelah power up ,nilai register pada rangkaian logika memiliki nilai yang tidak bisa
28
ditentukan. Rutin reset pada dasarnya menginisiasi register dengan nilai yang pasti.
Jika nilai register dibiarkan tidak terinisialisasi maka perilaku rangkaian logika bisa
tidak terduga..
Rutin reset paling sederhana adalah memasukkan nilai 0 ke semua register.
Beberapa register yang tidak diinisialisasi dengan nilai 0 antara lain register
spi_clock_comp. Register ini diinisialisasi dengan nilai 7 untuk menghasilkan
pembagian clock yang besar sehingga periode clock SPI menjadi panjang. Hal ini
diperlukan karena komunikasi pertama kali yang dilakukan controller adalah dengan
PGA. PGA yang digunakan pada board Spartan 3E Starter memiliki spesifikasi clock
maksimum yang lebih rendah dibanding ADC dan DAC. Kode yang digunakan
adalah sebagai berikut.
always @(posedge clk) //syncrhonous system
Begin
//put register init here
spi_clock_counter <= 3'b000;
spi_clock_comp <= 3'b111;
edge_counter <= 8'b0000000;
SCK <= 0;
AD_CONV <= 0;
AMP_ready <= 0;
AMP_CS <= 1;
DA_CS <= 1;
DA_tx <= 32'b00010001000000010000000100000001;
AD_rx_ch1 <= 14'b00000000000000;
AD_rx_ch2 <= 14'b00000000000000;
DA_tx_ch1 <= 12'b000000000000;
AD_rx <= 32'b00000000000000000000000000000000;
29
end //end reset
Beberapa teknologi FPGA sebenarnya mengimplementasikan rangkaian reset
dedicated dan atau memiliki kemampuan menginisialisasi register dengan nilai yang
tersimpan ke bitstream konfigurasi FPGA. Hal ini mengeliminasi rutin reset yang
harus ditambahkan ke dalam kode HDL akan tetapi metode ini umumnya bersifat
FPGA dependent. Hal ini mengakibatkan kode HDL harus disesuaikan untuk setiap
FPGA yang berbeda.
4.2.3. Inisialisasi Amplifier
Rutin inisialisasi amplifier adalah kode yang bertugas menginisialisasi IC
PGA. PGA diinisialisasi dengan mengirim 8 bit data lewat jalur MOSI. Data yang
dikirim telah dimasukkan ke register DA_tx pada rutin reset handler. Register
transmit yang digunakan sama dengan register yang digunakan untuk mengirim data
ke DAC yaitu DA_tx. Register tersebut memiliki panjang 32 bit sedangkan kode
konfigurasi amplifier hanya membutuhkan 8 bit sehingga hanya 8 bit paling
signifikan yang dipakai. Bit sisanya bisa diabaikan.
Rutin ini dijalankan secara sinkron dengan sinyal spi_clock_enable.
Register AMP_ready berfungsi sebagai flag yang menandakan status amplifier. Saat
FPGA baru saja dinyalakan, register ini diinisiasi dengan nilai 0 oleh rutin reset.
Nilai 0 berarti amplifier belum dikonfigurasi. Kode sensitivity list yang digunakan
adalah sebagai berikut.
if(spi_clock_enable && !(AMP_ready))beginedge_counter <= edge_counter +1;
30
Rutin transmisi terdiri dari satu blok if().Blok ini berisi kode yang
melakukan pergeseran register transmit dan clock toggling. Saat nilai
edge_counter bernilai genap (LSB nya bernilai 0) SCK dibuat menjadi high,
saat edge_counter bernilai ganjil (LSB nya bernilai 1) SCK dibuat low dan isi
register digeser keluar. Setelah semua bit selesai digeser komunikasi ke amplifier di
disable dengan mengeset register AMP_CS menjadi 1 dan membuat register
AMP_ready menjadi 1. Register edge_counter di reset menjadi 0 dan nilai
spi_clock_comp diberi nilai minimum (1) untuk mendapat frekuensi SCK
maksimum. Setelah rutin ini selesai, akan diambil alih oleh rutin komunikasi
ADC/DAC dan tidak akan aktif kecuali jka FPGA direset. Kode yang digunakan
adalah sebagai berikut
if(edge_counter[0]) //edge_counter odd, rising edge SCKbeginSCK <= 1;end //else //edge_counter even, falling edge SCK or right after reset deassertedbeginSCK <= 0;MOSI <= DA_tx[31];DA_tx <= {DA_tx[30:0],1'b0};end
4.2.4. Rutin ADC/DAC
Blok komunikasi ADC/DAC bekerja dengan prinsip yang sama dengan blok
inisialisasi amplifier. Setiap falling edge SCK data di MISO di-sample dan disimpan
31
di register AD_rx dan data di DA_tx digeser ke MOSI. Saat rising edge , controller
tidak melakukan apa-apa.
Sinyal SCK dibangkitkan berdasarkan nilai register edge_counter. Jika
nilai register ini ganjil atau LSB nya bernilai 1 maka sinyal SCK dibuat 1. Hal ini
berartinya rising edge SCK dihasilkan. Jika LSB bernilai genap maka dihasilkan
falling edge serta nilai register SPI digeser. Rutin ini diimplementasikan dengan kode
berikut
if(edge_counter[0]) //edge_counter odd, rising edge SCKbeginSCK <= 1;end //else //edge_counter even, falling edge SCK or right after reset deassertedbeginSCK <= 0;AD_rx <= {AD_rx[30:0],MISO};MOSI <= DA_tx[31];DA_tx <= {DA_tx[30:0],1'b0}; end
Pada blok if() ini beragam tindakan dilakukan berdasarkan nilai register
edge_counter. Jika nilai edge_counter adalah 0 atau awal dari transmisi
maka pulsa CONV aktifkan dan DA_CS di buat low. Kode ini berfungsi
memperintahkan ADC untuk mengirim hasil konversi dan DAC agar menerima data
baru dari FPGA. Data hasil konversi ADC sebelumnya kemudian diambil sekaligus
dikonversi ke format biner biasa. Kode yang digunakan adalah sebagai berikut.
if(edge_counter==0)beginAD_CONV <= 1;DA_CS <= 0;
32
AD_rx_ch1 <= AD_rx[29:16] + 14'b10000000000000;AD_rx_ch2 <= AD_rx[13:0] + 14'b10000000000000;end
Jika edge_counter bernilai 2 maka sinyal CONV dinonaktifkan. Kode
yang digunakan adalah sebagai berikut
else if(edge_counter == 2)beginAD_CONV <= 0;end
Jika edge_counter bernilai 48 atau akhir dari transmisi ke DAC maka
sinyal DA_CS dibuat high. Artinya DAC tidak akan menerima data lagi dari FPGA.
DAC baru akan aktif lagi setelah proses transfer data dari ADC selesai. Kode yang
digunakan adalah sebagai berikut.
else if(edge_counter == 48)beginDA_CS <= 1;end
Jika edge_counter bernilai 64 atau akhir dari transmisi maka
edge_counter diubah menjadi bernilai 0. Kemudian data baru dimasukkan ke register
kirim DA_tx untuk dikirim ke DAC pada siklus transfer selanjutnya. Kode yang
digunakan adalah sebagai berikut
else if(edge_counter == 64)beginedge_counter <= 0;DA_tx <= {4'b0011,4'b1111,DA_tx_ch1,4'b0000,8'b00000000};
33
4.3. Simulasi dan Pengujian
4.3.1. Simulasi
Simulasi dilakukan dengan Isim yang merupakan perangkat lunak yang
termasuk di dalam paket software Xilinx ISE. Sebelum dilakukan simulasi maka
perlu dibuat stimulus/test bench.Stimulus adalah sinyal yang akan mensimulasikan
input bagi sistem. Pada sistem ini, stimulus bertugas membangkitkan clock utama,
sinyal reset dan MISO.
Stimulus pada dasarnya juga sebuah kode verilog dengan input dan output.
Input output yang dideklarasikan untuk stimulus ini adalah sebagai berikut.
module fastADCDACstim;
// Inputsreg clk;reg rst_n;reg MISO;
// Outputswire MOSI;wire SCK;wire AD_CONV;wire AMP_CS;wire DA_CS;wire DAC_CLR;wire [7:0] led_array;wire SPI_SS_B;wire SF_CE0;wire FPGA_INIT_B;
Stimulus kemudian meng-instantiate Unit Under Test (UUT). UUT yang
dimaksud disini adalah SPI controller itu sendiri. Karena stimulus meng-instantiate,
maka stimulus yang menjadi top level module. Saat UUT di-instantiate, input/output
stimulus dihubungkan dengan input/output UUT sehingga stimulus dapat
mengendalikan UUT. Kode yang digunakan adalah sebagai berikut.
34
// Instantiate the Unit Under Test (UUT)fastDACADC uut ( .clk(clk),.rst_n(rst_n),.MISO(MISO), .MOSI(MOSI),.SCK(SCK),.AD_CONV(AD_CONV),.AMP_CS(AMP_CS), .DA_CS(DA_CS),.DAC_CLR(DAC_CLR),.led_array(led_array), .SPI_SS_B(SPI_SS_B),.SF_CE0(SF_CE0),.FPGA_INIT_B(FPGA_IN
IT_B) );
Kode selanjutnya adalah kode yang membangkitkan sinyal stimulus. Stimulus
yang digunakan hanya perlu membangkitkan sinyal clock dan sinyal reset. Sinyal
reset yang digunakan adalah sinyal yang aktif sejak t=0 kemudian dinonaktifkan
setelah lewat 40ns. Sedangkan sinyal clock adalah sinyal free running yang otomatis
melakukan toggling nilai setiap 10ns sehingga dihasilkan clock dengan frekuensi
50Mhz. Kode yang digunakan adalah sebagai berikut.
initial begin// Initialize Inputsclk = 0;rst_n = 0;MISO = 1;#40 rst_n = 1;
endalways begin
#10 clk = ~clk;end
endmodule
Controller kemudian disimulasi dengan software Isim. Saat simulator
dijalankan stimulus akan otomatis membangkitkan sinyal-sinyal kontrol. Hasil
Simulasi ditunjukkan oleh Gambar 5-18, dan Error: Reference source not found.
35
Gambar 5-18. Simulasi inisialisasi amplifier
Gambar 5-18 menunjukkan simulasi inisialisasi amplifier. Gambar diatas
adalah potongan simulasi dari t=0ns hingga t=600ns. Dapat dilihat dari gambar
tersebut adalah 1 siklus SCK memiliki periode 320ns atau sama dengan 16 siklus
clock utama. Sinyal SCK didapat dengan membagi clock utama . Nilai pembagian
36
disimpan di register spi_clock_comp yang pada gambar diatas berisi nilai 111b.
Nilai ini adalah nilai yang dimasukkan ke register spi_clock_comp oleh reset
handler. Dapat dilihat pula isi register DA_tx digeser tepat pada falling edge SCK.
DA_tx mulai digeser sejak AMP_CS bernilai low.
Gambar 5-19. Simulasi transisi amplifier ke ADC/DAC
37
Gambar 5-19 menunjukkan hasil simulasi dari t=2000ns hingga t= 3500ns.
Hal yang ditunjukkan dari potongan simulasi tersebut adalah saat amplifier selesai
dikonfigurasi dan berganti ke rutin ADC/DAC. Bisa dilihat setelah amplifier selesai
dikonfigurasi register AMP_ready berubah menjadi high. Frekuensi SCK juga
menjadi lebih tinggi. Hal ini dilakukan dengan cara mengubah nilai didalam register
spi_clock_comp menjadi 1b. Jika saat melakukan transfer ke PGA, 1 siklus SCK
terdiri dari 16 siklus clock utama maka saat transfer ke ADC/DAC 1 siklus SCK
terdiri dari 4 siklus clock utama.
Gambar 5-20. Simulasi kecepatan sample rate dari controller
38
Gambar 5-20 menunjukkan sample rate controller yang dibuat. Terlihat blok
filter dijalankan setiap 2,6us untuk nilai clock utama 50Mhz artinya sample rate dari
controller adalah sekitar 384ksps.
4.3.2. Pengujian
Pengujian yang dilakukan adalah dengan menghubungkan data dari ADC
langsung ke DAC di dalam FPGA. Data dari register terima AD_rx_ch2 ditunda
sebanyak 8 kali sampling dengan register tap1 hingga tap8 kemudian dimasukkan
ke register kirim DA_tx_ch1d. Dengan ini nilai analog dari ADC akan tampil di
DAC tanpa perubahan bentuk. Kode yang digunakan adalah sebagai berikut.
if(filter_clock_enable && AMP_ready)begintap1 <= AD_rx_ch2[13:0];tap2 <= tap1;tap3 <= tap2;tap4 <= tap3;tap5 <= tap4;tap6 <= tap5;tap7 <= tap6;tap8 <= tap7;
//sum <= (tap1*2 + tap2*2 + tap3*2 + tap4*2 + tap5*2 + tap6*2 + tap7*2 + tap8*2);sum[17:4] <= tap8;DA_tx_ch1 <= sum[17:6];//led_array <= sum[17:10];
endPengujian dilakukan dengan bantuan perangkat signal generator dan
osiloskop. Signal generator diatur untuk menghasilkan sinyal sinus dengan
amplitudo 2,5V dan offset sebesar 1,65 V. Nilai tegangan ini adalah rentang
maksimal dari ADC. Output dari DAC kemudian dihubungkan ke osiloskop. Sinyal
input dan output kemudian dibandingan.
39
Pengujian pertama menggunakan sinyal sinus dengan frekuensi 1Khz. Hasil
pengujian dapat dilihat pada Error: Reference source not found. Sinyal bagian atas
adalah keluaran DAC dan memiliki amplitudo peak to peak sebesar 3,3V. Sinyal
dibagian bawah adalah input ADC dan memiliki amplitudo peak to peak sebesar
2,5V.
Gambar 4-21. Pengujian dengan sinus 1Khz.
Pada Gambar 4-21 dapat dilihat bahwa sinyal input berbentuk sama dengan
sinyal output. Artinya data yang dibaca oleh ADC persis sama dengan data yang
dikirim ke DAC. Pada gambar tersebut sinyal output memiliki perbedaan fase
sebesar 180o. Pergeseran fase ini disebabkan oleh PGA yang berupa inverting
amplifier.
40
Gambar 4-22. Pengujian dengan sinus 10 Khz
Gambar 4-22 adalah hasil pengujian untuk sinyal input sinus 10Khz.Bisa
dilihat bahwa pergeseran fase yang ditimbulkan oleh register delay mulai tampak.
Berdasarkan gambar waktu tunda adalah sekitar 20us.
Bila dilihat di kode filter yang diimplementasikan, register AD_rx_ch2
digeser sebanyak 8 kali oleh register tap1 hingga tap8. Dengan nilai tunda 1
register 2,6us maka tunda oleh 8 register adalah 20,8us. Perlu diperhatikan tunda
tersebut untuk transfer dari register AD_rx_ch2 hingga register tap8. Tunda
sebenarnya dari input amplifier hingga output DAC bisa lebih lama akan tetapi tunda
oleh 8 register paling signifikan. Sehingga bisa diasumsikan group delay adalah
sebesar 20,8us.
41
Gambar 4-23. Pengujian dengan sinus 100Khz.
Gambar 4-23 menunjukkan hasil pengujian untuk sinyal input sinus 100Khz.
Bisa dilihat sinyal output telah mengalami distorsi.
42
BAB 5.
PENUTUP
5.1. Kesimpulan
Berdasarkan simulasi dan pengujian yang dilakukan dapat disimpulkan :
1) Pengujian terhadap ADC/DAC beserta controllernya memberikan hasil seperti
yang diharapkan. FPGA berhasil berkomunikasi dengan ADC dan DAC secara benar.
2) Dengan menggabung transfer ke DAC dan transfer ke ADC sample rate bisa
dimasimalkan. Controller yang didesain memiliki periode sample 2,6us untuk clock
utama 50Mhz atau sample rate sebesar 384ksps. Sedangkan jika menggunakan
metode komunikasi SPI standar maka sample rate menjadi setengahnya.
3) Pada pengujian dengan frekuensi 100Khz, sinyal sinus yang dibangkitkan mulai
terdistorsi. Hal ini disebabkan oleh sinyal frekuensi tinggi yang disebabkan oleh
proses sampling . Distorsi bisa dikurangi dengan memberi low pass filter pada output
DAC.
4) Dari hasil pengujian dengan sinyal sinus 100Khz, sinyal keluaran tidak tampak
memiliki step yang diskrit. Hal ini disebabkan DAC memiliki slew rate yang terbatas
yaitu sebesar 0,8V/us.
43
5.2. Saran
Beberapa pengembangan yang bisa dilakukan terhadap controller ini antara
lain
1) Meningkatkan sample rate hingga mendekati kemampuan maksimum chip
ADC/DAC. Peningkatan dapat dilakukan dengan memperbesar clock utama. Clock
utama bisa diperbesar dengan menggunakan PLL yang terdapat di dalam FPGA.
Peningkatan dengan cara lain adalah dengan mendesain ulang bagian clock
enable .Pada desain ini, clock SCK adalah 1/4 dari clock utama, peningkatan menjadi
1/2 clock utama masih bisa dilakukan
2) Membuat low pass filter untuk mengurangi distorsi DAC. Akan tetapi karena
keterbatasan respon frekuensi filter yang bisa direalisasikan maka pengurangan
distorsi juga harus dilakuakn dengan cara oversampling.
3) Menambah jumlah kanal output controller. Desain yang ini hanya memakai 1
kanal dari DAC. Sehingga masih memungkinkan dikembangkan desain dengan
keluaran 4 kanal. Akan tetapi karena data untuk 4 kanal perlu ditransfer dalam 96
siklus SCK maka sample rate akan turun.
44
DAFTAR PUSTAKA
Anonim.2006,Spartan-3E Starter Kit Board User Guide, [pdf],
(http://www.xilinx.com/support/documentation/boards_and_kits/ug130.pdf)
Anonim.2004,LTC1407-1/LTC1407A-1,[pdf],
http://cds.linear.com/docs/en/datasheet/14071fb.pdf
Anonim.2004,LTC2604/LTC2614/LTC2624,[pdf],
http://cds.linear.com/docs/en/datasheet/2604fd.pdf
Anonim.2004,LTC6912,[pdf],
http://cds.linear.com/docs/en/datasheet/6912fa.pdf
Bhasker,J.1998, Verilog HDL Syhthesis a Practical Primer.Allentown : Star
Galaxy Publishing
Palnitkar,Samir.1996, Verilog HDL A guide to Digital Design and Synthesis,
______:Sunsoft Press
1
LAMPIRAN A
Kode Verilog SPI Controller
`timescale 1ns / 1ns
//SPI mode:
//idle clock : LOW
//leading edge : positive going
//trailing edge : negative going
//sampling and propagating at trailing edge
module fastDACADC(input clk,input rst_n,input MISO,output
reg MOSI,output reg SCK,output reg AD_CONV,output reg
AMP_CS,output reg DA_CS,output DAC_CLR,output reg [7:0]
led_array,output SPI_SS_B, output SF_CE0,output
FPGA_INIT_B);
reg [2:0] spi_clock_counter;
reg [2:0] spi_clock_comp;
reg [7:0] edge_counter;
reg [31:0] AD_rx;
reg [31:0] DA_tx;
reg [13:0] AD_rx_ch1;
reg [13:0] AD_rx_ch2;
reg [11:0] DA_tx_ch1;
reg [13:0] tap1;
reg [13:0] tap2;
reg [13:0] tap3;
reg [13:0] tap4;
reg [13:0] tap5;
reg [13:0] tap6;
reg [13:0] tap7;
reg [13:0] tap8;
reg [31:0] sum;
2
wire spi_clock_enable;
wire filter_clock_enable;
reg AMP_ready;
always @(posedge clk) //syncrhonous system
begin
if(!rst_n) //reset asserted (low value)
begin //begin reset handler
//put register init here
spi_clock_counter <= 3'b000;
spi_clock_comp <= 3'b111;
edge_counter <= 8'b0000000;
SCK <= 0;
AD_CONV <= 0;
AMP_ready <= 0;
AMP_CS <= 1;
DA_CS <= 1;
DA_tx <= 32'b00010001000000010000000100000001;
AD_rx_ch1 <= 14'b00000000000000;
AD_rx_ch2 <= 14'b00000000000000;
DA_tx_ch1 <= 12'b000000000000;
AD_rx <= 32'b00000000000000000000000000000000;
end //end reset handler
else //reset deasserted (high value)
begin //normal program,everything that
happen on posedge of clk
//normal program should:
//generate clock enable for spi derived from main clock
//and clock enable for filter derived from spi clock
spi_clock_counter <= spi_clock_counter + 1; //free
running counter, overflow return to zero
if(spi_clock_counter == spi_clock_comp)
3
begin
spi_clock_counter <= 3'b000;
end
if(spi_clock_enable && AMP_ready) //everything happen on
posedge clk enabled by spi_clock_enable signal
begin
//things should happen here : and AD_CONV generation
//,SCK generation, capture MISO
edge_counter <= edge_counter +1; //free running
counter, overflow return to zero
if(edge_counter[0]) //edge_counter odd, rising edge SCK
begin
SCK <= 1;
end //
else //edge_counter even,
falling edge SCK or right after reset deasserted
begin
SCK <= 0;
AD_rx <= {AD_rx[30:0],MISO};
MOSI <= DA_tx[31];
DA_tx <= {DA_tx[30:0],1'b0};
end
if(edge_counter==0)
begin
AD_CONV <= 1;
DA_CS <= 0;
AD_rx_ch1 <= AD_rx[29:16] + 14'b10000000000000;
AD_rx_ch2 <= AD_rx[13:0] + 14'b10000000000000;
4
end
else if(edge_counter == 2)
begin
AD_CONV <= 0;
end
else if(edge_counter == 48)
begin
DA_CS <= 1;
end
else if(edge_counter == 64)
begin
edge_counter <= 0;
DA_tx <= {4'b0011,4'b1111,DA_tx_ch1,4'b0000,8'b00000000};
//DA_tx register itself is 32 bit long, but only 24 bit
is
//sampled by DAC due to DA_CS pullled high at
edge_counter=48
//Even if DA_CS pulled high at edge_counter = 32, the
rest bit
//is don't care which won't give any different effect.
end
end
if(spi_clock_enable && !(AMP_ready))
begin
edge_counter <= edge_counter +1;
if(edge_counter[0]) //edge_counter odd, rising edge SCK
begin
SCK <= 1;
end //
5
else //edge_counter even,
falling edge SCK or right after reset deasserted
begin
SCK <= 0;
MOSI <= DA_tx[31];
DA_tx <= {DA_tx[30:0],1'b0};
end
if(edge_counter==0)
begin
AMP_CS <= 0;
end
else if(edge_counter==16)
begin
AMP_CS <= 1;
AMP_ready <= 1;
DA_tx <= 32'b10110011100011110000111110000010;
edge_counter <= 0;
spi_clock_comp <= 3'b001;
end
end
if(filter_clock_enable && AMP_ready) //everything happen
on posedge clk enabled by filter_clock_enable signal
begin
tap1 <= AD_rx_ch2[13:0];
tap2 <= tap1;
tap3 <= tap2;
tap4 <= tap3;
tap5 <= tap4;
tap6 <= tap5;
tap7 <= tap6;
6
tap8 <= tap7;
//sum <= (tap1*2 + tap2*2 + tap3*2 + tap4*2 + tap5*2 +
tap6*2 + tap7*2 + tap8*2);
sum[17:4] <= tap8;
DA_tx_ch1 <= sum[17:6];
//led_array <= sum[17:10];
end
end //end normal program
end //end synchronous system
assign spi_clock_enable = (spi_clock_counter == 1)?1:0;
assign filter_clock_enable = (edge_counter == 1)?1:0;
assign SPI_SS_B = 1;
assign FPGA_INIT_B = 1;
assign SF_CE0 = 1;
assign DAC_CLR = 1;
endmodule
1
LAMPIRAN BKode Stimulus Simulasi
module fastADCDACstim;
// Inputs
reg clk;
reg rst_n;
reg MISO;
// Outputs
wire MOSI;
wire SCK;
wire AD_CONV;
wire AMP_CS;
wire DA_CS;
wire DAC_CLR;
wire [7:0] led_array;
wire SPI_SS_B;
wire SF_CE0;
wire FPGA_INIT_B;
// Instantiate the Unit Under Test (UUT)
fastDACADC uut (
.clk(clk),
.rst_n(rst_n),
.MISO(MISO),
.MOSI(MOSI),
.SCK(SCK),
.AD_CONV(AD_CONV),
.AMP_CS(AMP_CS),
.DA_CS(DA_CS),
.DAC_CLR(DAC_CLR),
.led_array(led_array),
2
.SPI_SS_B(SPI_SS_B),
.SF_CE0(SF_CE0),
.FPGA_INIT_B(FPGA_INIT_B)
);
initial begin
// Initialize Inputs
clk = 0;
rst_n = 0;
MISO = 1;
#40 rst_n = 1;
end
always begin
#10 clk = ~clk;
end
endmodule
1
LAMPIRAN CKode UCF (User Constraint File)
NET "led_array[7]" LOC = F9;
NET "led_array[6]" LOC = E9;
NET "led_array[5]" LOC = D11;
NET "led_array[4]" LOC = C11;
NET "led_array[3]" LOC = F11;
NET "led_array[2]" LOC = E11;
NET "led_array[1]" LOC = E12;
NET "led_array[0]" LOC = F12;
NET "AD_CONV" LOC = P11;
NET "SCK" LOC = U16;
NET "AMP_CS" LOC = N7;
NET "MOSI" LOC = T4;
NET "MISO" LOC = N10;
NET "clk" LOC = C9;
NET "clk" PERIOD = 20.0ns HIGH 40%;
NET "rst_n" LOC = L13;
NET "DAC_CLR" LOC = P8;
NET "rst_n" PULLUP;
# PlanAhead Generated physical constraints
NET "DA_CS" LOC = N8;
NET "FPGA_INIT_B" LOC = T3;
NET "SPI_SS_B" LOC = U3;
NET "SF_CE0" LOC = D16;
1
LAMPIRAN DDevice Utilization Summary