Modul 5: Desain Rangkaian Sekuensial - · PDF fileKegiatan praktikum ini bertujuan untuk...
Transcript of Modul 5: Desain Rangkaian Sekuensial - · PDF fileKegiatan praktikum ini bertujuan untuk...
Praktikum Sistem Digital LanjutPercobaan 5: Desain Rangkaian Sekuensial
1 Tujuan dan SasaranKegiatan praktikum ini bertujuan untuk membuat rangkaian yang menampilkan keluaran LED secara sekuensial yang dikontrol oleh pemutaran rotary-knob dan tombol push-button. Konsep yang ingin dipahami adalah rancangan rangkaian sekuensial menggunakan FSM (Finite State Machine). Kegiatan praktikum ini bertujuan untuk membuat generator sinyal clock yang dapat diatur keluaran frekuensinya.
Sasaran kegiatan praktikum adalah:
1. Praktikan dapat memahami rangkaian sekuensial menggunakan diagram Moore;
2. Praktikan dapat mengimplementasikan rancangan tersebut untuk mengontrol nyala LED secara sekuensial dengan pemutaran rotary-knob dan/atau tombol push-button;
3. Praktikan dapat menganalisis hasil implementasi;
4. Praktikan dapat menganalisis perilaku masukan-keluaran desain di board Starter Kit;
Sumber referensi yang bisa digunakan:
1. UG230: Spartan-3E FPGA Starter Kit Board User Guide, Xilinx, June 2008
2. Ken Chapman: Rotary Encoder Interface for Spartan-3E Starter Kit, Xilinx, 2006
3. Spartan-3E Starter Board Schematic, Digilent, Feb 2006
4. Xilinx ISE Design Suite 11 Software Manual, Xilinx, 2009
5. Verilog Tutorial (online): http://www.asic-world.com/verilog/veritut.html
2 Alat dan BahanAlat dan bahan yang digunakan adalah:
1. Board Starter Kit Spartan-3E berbasis Xilinx FPGA XC3S500E-4FG320C;
Modul (komponen) I/O yang akan digunakan dalam praktikum:
a) 4 buah tombol push-button (BTN North, BTN East, BTN South, BTN West);
b) 1 buah rotary-knob (ROT-A/B);
c) 8 buah LED (LD0-7);
d) Sumber clock 50MHz dan konektor SMA;
2. Kabel USB dengan konektor tipe-B;
3. Osiloskop digital;
4. Adaptor sumber daya DC 5 Volt;
5. Software Xilinx ISE Webpack 11.1;Dasar Teori
3 Dasar TeoriDi bab ini dijelaskan tentang rotary-encoder (di komponen rotary-knob), sumber clock di starter kit dan FSM (Finite State Machine). Penjelasan tentang komponen lain yang digunakan
telah dijabarkan di praktikum sebelumnya.
3.1 Rotary-Knob dan Enkoder Putar
Rotary-knob berisi tombol tekan dan enkoder putar yang digunakan sebagai masukan. Tombol tekan dan eknoder putar akan menghasilkan sinyal keluaran ROT_CENTER, ROT_A dan ROT_B (Gambar 1). Rotary-enkoder menggunakan sistem mekanik yang mungkin rentan terhadap bouncing. Untuk mengatasinya digunakan filter (Gambar 2).
Gambar 1: Tombol tekan dan enkoder putar di rotary-knob beserta sinyal-sinyal keluarannya (UG320, Ken Chapman)
Gambar 2: Bouncing dan hasil keluaran enkoder hasil dari filter (Ken Chapman)
3.2 Sumber Clock di Starter Kit
Dalam starter kit terdapat sumber clock on-board 50MHz. Selain itu, sumber clock juga bisa diperoleh dari eksternal melalui sebuah konektor tipe-SMA (CLK_SMA). Dalam praktikum, sumber clock akan menggunakan clock on-board 50MHz, sedangkan keluaran clock akan dilewatkan melalui konektor CLK_SMA untuk diukur frekuensinya dengan osilopkop (Gambar 3). Koneksi clock ini ditunjukkan dalam Gambar 4.
3.3 Finite State Machine (FSM)
Rangkaian sekuensial keluarannya tergantung dari masukannya saat itu dan masukan sebelumnya. Dalam rangkaian ini terdapat elemen penyimpan (storage) berupa flip-flop. Flip-flop dapat menyimpan 1-bit data masukan. Register n-bit tersusun atas n buah flip-flop, sehingga dapat menyimpan data masukan sejumlah n-bit.
Rangkaian sekuensial dapat disebut juga rangkaian FSM (finite state machine). Rangkaian sekuensial sinkron menggunakan sebuah clock untuk mengontrol operasinya. Rangkaian ini direalisasikan menggunakan logika kombinasional dan satu atau beberapa flip-flop. Model yang bisa digunakan adalah (Gambar 5):
1. model Moore: keluaran rangkaian tergantung hanya pada state (keadaan) rangkaian saat ini;
2. model Mealy: keluaran rangkaian tergantung pada state saat ini dan masukan utamanya;
Gambar 3: Sumber clock dan port keluaran clock yang akan digunakan dalam praktikum (Sumber: UG320)
Gambar 4: Koneksi sumber clock dan CLK_SMA serta definisi UCF
GNDVCC
IO12(E8)IO11(F8)
IO12 digunakan sebagai port CLK_OUT
IO10(C7)
IO9(D7)
4 Cara KerjaKegiatan praktikum dilakukan untuk memenuhi kebutuhan desain yang diinginkan. Setiap tahap dilakukan berdasarkan cara kerja yang diuraikan dalam Subbab 4.2. Hasil kegiatan praktikum yang ditandai dengan ikon dituliskan dalam Lembar Isian Kegiatan. Laporan akhir disusun dengan menyertakan hasil kegiatan praktikum.
4.1 Kebutuhan Desain
Desain yang akan diimplementasikan dalam praktikum ini adalah:
1. Enkoder putar (ROT_ENC), menghasilkan keluaran Out 2-bit yang menandakan arah putaran (0x: tidak ada pemutaran, 11: ke kiri, 10: ke kanan, lainnya: tidak ada putaran);
2. Pencacah asinkron up-down 3-bit (COUNT_3B) menghasilkan nilai keluaran 0-7 dari input tombol tekan (BTN_*) dan enkoder puter;
3. Clock divider (CLOCK_DIV) membagi frekuensi sinyal masukan clk (50MHz) berdasarkan nilai masukan pembaginya (div), seperti ditunjukkan dalam Tabel 1;
4. Indikator frekeunsi (CLOCK_STAT) berlaku seperti dekoder 3-to-8;
5. 2 buah debouncer tombol, yaitu DEBOUNCER_UP untuk BTN_EAST (Up) dan DEBOUNCER_DOWN untuk BTN_WEST (Down);
Desain tersebut dibuat sebagai modul dan akan diintegrasikan dalam satu top_module. Diagram blok top_module beserta koneksinya diperlihatkan dalam Gambar 6 dan Tabel 2.
Gambar 5: Model FSM: Moore dan Mealy
Gambar 6: Diagram blok sistem yang dirancangXC3S500E-4FG320C
NORTH
EAST
SOUTHWEST
ROT_A
BTN_NORTH
BTN_EAST
BTN_SOUTH
BTN_WEST
V4
H13
K17
D18
K18
F9
E9
D11
C11
F11
E11
E12
F12
LED<7>
LED<6>
LED<5>
LED<4>
LD7
LD6
LD5
LD4LED<3>
LED<2>
LED<1>
LED<0>
LD3
LD2
LD1
LD0
top_module
COUNT_3B
CLOCK_STAT
in[2:0]Out[2:0]Set
Reset
Up
Down
rlrot[1:0]
F9
E9
C11
F11
E11
E12
F12
Out[7:0]
ROT_Aclk
DEBOUNCER
CLK C9CLK
ROT_B G18ROT_B
CLK_SMACLKOUTA10
CLOCK_DIV
div[2:0] Clkout
clk
ROT_ENC
rot_Arot_B
rlrot[1:0]
2
3
clk
Clkout2
Next-state logic Current-state logic Output logic
4.2 Langkah Kerja
Kegiatan praktikum meliputi hal-hal sebagai berikut:
1. Menuliskan kode HDL untuk COUNT_3B, DEBOUNCER, ROT_ENC, CLOCK_STAT dan CLOCK_DIV sebagai modul. Masukkan modul tersebut dalam proyek desain_sekuensial;
2. Mengaplikasikan modul-modul tersebut dalam satu top_module (sekuensial_top);
3. Menambah file konstrain desain_sekuensial.ucf ;
4. Mensintesis dan mengimplementasikan sekuensial_top;
1. Melihat skematik RTL atau skematik teknologi;
2. Melihat utilisasi device yang digunakan oleh desain;
5. Membangkitkan file programming sekuensial_top.bit;
6. Memprogram file *.bit tersebut dan mengamati perilaku sistem;
Nama sinyal (top) top_modul Koneksi modul Keterangan
BTN_NORTH Set COUNT_3B Set frek ke max
BTN_WEST Down DEBOUNCER_DOWN Turunkan frekuensi
BTN_EAST Up DEBOUNCER_UP Naikkan frekuensi
BTN_SOUTH Reset COUNT_3B Reset frek ke min
ROT_A rot_A ROT_ENC Putar kanan: naikkan frekPutar kiri: turunkan frekROT_B rot_B ROT_ENC
CLK clk Semua, kecuali CLOCK_STAT Sumber clock
LED<7> Out[7] CLOCK_STAT
Indikator frekuensiLED[7] frekuensi paling
tinggi, sedangkan LED[0] frekuensi paling rendah
LED<6> Out[6] CLOCK_STAT
LED<5> Out[5] CLOCK_STAT
LED<4> Out[4] CLOCK_STAT
LED<3> Out[3] CLOCK_STAT
LED<2> Out[2] CLOCK_STAT
LED<1> Out[1] CLOCK_STAT
LED<0> Out[0] CLOCK_STAT
CLK_SMA Clkout CLOCK_DIV Keluaran clock
CLK_OUT Clkout2 CLOCK_DIV Buffer dari CLK_SMA
Tabel 2: Koneksi sinyal di top_module dengan FPGA
Nilai div masukan Pembagi Frekuensi keluaran
0 1 50 MHz
1 2 25 MHz
2 4 12,5 MHz
3 8 6,25 MHz
4 16 3,125 MHz
5 32 1,5625 MHz
6 64 781,25 kHz
7 128 390,625 kHz
Tabel 1: Nilai frekuensi keluaran CLK_DIV dari nilai masukan pembaginya
4.2.1 Membuat Proyek Baru
Langkah-langkah membuat proyek baru:
1. Pilih menu File→New Project (Alt+F W). Dialog pop-up New Project Wizard akan muncul. Ketikkan field Name dengan nama proyek (Format: <nama_kelompok>-Modul5-DesainSekuensial). Browse lokasi proyek/Location (folder $HOME_DIR/<nama_kelompok>). Isi field Description dengan penjelasan tentang proyek. Tipe source top-level menggunakan HDL
Tuliskan field Name, Location dan Description dalam lembar kegiatan;
2. Klik tombol Next. Jendela Device Properties muncul. Pilih Family (Spartan3E), Device (XC3S500E), Package (FG320) dan Speed (-4). Properti ini adalah device-dependent (Starter Kit menggunakan FPGA XC3S500E-4FG320C), jadi harus dimasukkan dengan benar. Set Preferred Language dengan Verilog
Catat field Family, Device, Package dan Speed ini dalam lembar kegiatan;
4.2.2 Menambah Modul Desain dan Konstrain
Modul yang perlu ditambahkan ada 5 buah, yaitu count_3b, debouncer, rot_enc, clock_stat dan clock_div. Langkah-langkahnya adalah sebagai berikut:
1. Buat modul-modul verilog seperti dalam Tabel 3. Masukkan dalam proyek;
2. Edit file count_3b.v, debouncer.v, rot_enc.v, clock_div.v dan clock_stat.v. Listing kode sumber HDL untuk semua desain modul ada dalam Lampiran;
(Tugas) Jelaskan perilaku tiap kode HDL tersebut. Gambarkan diagram dan tabel state dari modul count_3b menggunakan model Moore
(Tugas) Jelaskan kerja dari clock divider. Gambarkan diagram pewaktuan sinyal masukan dan keluaran dari modul clock_div
3. Tambahkan file konstrain desain_sekuensial.ucf. Isi file tersebut ada dalam Lampiran;
No Nama Modul Masukan Keluaran Keterangan
1. count_3b setresetup
downrlrot[1:0]
clk
y_out[2:0] Modifikasi dari count_1 (bab IV) dengan menghilangkan mode dan y_out menjadi 3 bit. Tambahan input rlrot 2-bit (R/L) untuk counting dari enkoder rotary
2. debouncer clkin_state
out_state Switch debouncer, sama dengan bab IV
3. rot_enc rot_Arot_B
clk
rlrot[1:0] Enkoder putar. rlrot menandakan putar kanan/kiri
4. clock_div div[2:0]clk
clk_outclk_out2
Pembagi frekuensi clock
5. clock_stat data_in[2:0] data_out[7:0] Display nilai frekuensi clock dalam simbol
Tabel 3: Nama modul-modul desain yang akan dibuat
4.2.3 Mengaplikasikan Modul dalam Desain (Top Module)
Ketiga modul tersebut di atas akan diaplikasikan dalam satu top_module (desain berbasis komponen). Langkah yang diperlukan adalah:
1. Buat top_module yang mengintegrasikan kedua modul tersebut dengan nama sekuensial_top. Definisi port masukan dan keluaran dari sekuensial_top ini ditunjukkan dalam Tabel 4;
2. Panggil ketiga modul dari sekuensial_top ini dan interkoneksikan port-portnya. Listing kode sumber HDL untuk sekuensial_top.v ada dalam Lampiran. Tampilan ISE setelah integrasi ditunjukkan dalam Gambar 7;
4.2.4 Sintesis dan Implementasikan Top Modul
Modul sekuensial_top akan disintesis dan diimplementasikan. Langkah-langkahnya adalah sebagai berikut:
1. Cek apakah modul sekuensial_top sudah menjadi top_module. Hanya top_module yang bisa disintesis dan diimplementasikan. Jika belum, klik kanan modul tersebut dan pilih 'Set as Top Module';
2. Bangkitkan skematik RTL dari sekuensial_top. Klik “View RTL Schematic” dari proses Synthesize dan juga “View Technology Schematic”. Tambahkan elemen yang tersedia
No Nama Modul Masukan Keluaran Keterangan
1. sekuensial_top BTN_NORTH, BTN_EAST,
BTN_SOUTH, BTN_WEST,
CLKROT_AROT_B
LED[7:0]CLK_SMACLK_OUT
Tabel 4: Nama port masukan dan keluaran di modul sekuensial_top.v
Gambar 7: Modul-modul yang diperlukan diintegrasikan ke sekuensial_top
dan klik tombol “Create Schematic”. Lihat blok dari elemen dan bagaimana isinya (rangkaian logikanya);
Simpan gambar blok elemen beserta rangkaian skematiknya dalam file gambar (dengan snapshot). Skematik ini beserta penjelasannya harus dilampirkan di laporan
(Tugas) Jelaskan perbedaan antara skematik RTL dan skematik teknologi (secara terminologi dan konseptual)
3. Sintesis dan implemen kombinasional_top dengan mengklik kanan proses “Implement Design” dan pilih “Rerun All”;
Lihat ringkasan laporan desain dari implementasi kombinasional_top tersebut dengan melihat tab Design Summary. Jika belum ada, klik menu Project→Design Summary/Report. Catat hasilnya untuk mengisi tabel utilisasi device di lembar kegiatan;
4.2.5 Memprogram FPGA dan Pengamatan Perilaku Sistem
Perilaku sistem diamati dengan melihat keluaran dari masukan yang diberikan. Keadaan keluaran ditunjukkan oleh LED dan sinyal gelombang CLK_OUT. Osiloskop digital (DS1052E) digunakan untuk melihat bentuk sinyal CLK_OUT. Channel yang digunakan untuk praktikum ini adalah CH1 (konsultasikan penggunaan osiloskop ini dengan asisten).
Langkah percobaan:
1. Bangkitkan file programming sekuensial_top.bit;
2. Jalankan Xilinx iMPACT jika belum dijalankan. Pastikan kabel USB telah terpasang di starter kit dan komputer;
3. Dari Xilinx iMPACT, klik ganda “Boundary Scan”. Kemudian klik kanan dan pilih Initialize Chain (Ctrl+I) untuk menginisialisasi Boundary Scan;
4. Yang diperlukan adalah mengkonfigurasi FPGA, sedangkan flash XCF04S dan CPLD XC2C64 dibiarkan bypass. Klik kanan device FPGA dan pilih “Assign New Configuration File”. Pilih file sekuensial_top.bit untuk diprogram ke FPGA. Nama file konfigurasi akan tampil di bawah device FPGA;
5. Sambungkan kabel osiloskop digital ke kanal CH1. Sinyal keluaran CLK_OUT diukur dari port IO12/E8. Sinyal CLK_OUT dapat diprobe dengan osiloskop dari port IO12 ini dan GND;
6. Klik kanan device FPGA dan pilih “Program” untuk mengkonfigurasi FPGA;
7. Nyalakan osiloskop. Klik tombol AUTO di osiloskop dan tombol Measure. Tombol Measure digunakan untuk melihat properti sinyal (misalnya frekuensi, periode, risetime, falltime, dll). Tampilkan semua properti sinyal dengan memilih “Display All”;
8. Perilaku keluaran dapat diamati dengan menekan tombol BTN_* (Set, Reset, Up, Down) dan memutar rotary knob untuk mendapatkan frekuensi sinyal CLK_OUT yang bersesuaian;
Amati perilaku sistem (dari keadaan LED dan sinyal yang ditunjukkan di osiloskop) dan isi tabel di lembar kegiatan;
Bandingkan frekuensi yang diperoleh dengan Tabel 1
4.3 Lampiran Kode HDL
Nama file modul bersesuaian dengan nama modulnya. File desain_sekuensial.ucf juga disertakan.
4.3.1 debouncer: debouncer.v
module debouncer( input clk, input in_state, output out_state );
parameter NBITS = 16;
reg [NBITS1:0] COUNT;reg PB_sync_0;reg PB_sync_1;reg PB_state;
always @(posedge clk) PB_sync_0 <= ~in_state;always @(posedge clk) PB_sync_1 <= PB_sync_0;
wire PB_idle = (PB_state==PB_sync_1);wire max_COUNT = &COUNT;
always @(posedge clk)begin
if (PB_idle) COUNT <= 0;else begin
COUNT <= COUNT + 1;if (max_COUNT) PB_state <= ~PB_state;
endend
assign out_state = PB_state;
endmodule
4.3.2 count_3b: count_3b.v
module count_3b( input set, input reset, input up, input down, input [1:0] rlrot, input clk, output [2:0] y_out );
parameter MAX_COUNT = 7;parameter ROT_RIGHT = 2'b11;parameter ROT_LEFT = 2'b10;
reg delay_up;reg delay_down;
reg [2:0] cur_state, next_state;reg [2:0] out_reg;
initial begincur_state = 3'b111; /*The lowest frequency*/
end
/*Current State Logic : Sequential*/always @(posedge clk)begin
delay_down <= down;delay_up <= up;if (reset==1) cur_state <= MAX_COUNT;
/*Reset, the lowest frequency*/else if (set==1) cur_state <= 0;
/*Set, the highest frequency*/else cur_state <= next_state;
end
/*Next state logic: combinational*/always @*begin if (((up==1) && (delay_up==0)) || (rlrot==ROT_RIGHT) )
/*increase freq will decrease div*/next_state = (cur_state==0)?0:cur_state1;
else if (((down==1) & (delay_down==0)) || (rlrot==ROT_LEFT))next_state = (cur_state==MAX_COUNT)?MAX_COUNT:cur_state+1;
else next_state = cur_state;end
/*Cur State & Output*/always @*begin
out_reg <= cur_state;end
assign y_out = out_reg;
endmodule
4.3.3 rot_enc: rot_enc.v
module rot_enc( input rot_A, input rot_B, input clk, output [1:0] rlrot );
reg rot_A_in;reg rot_B_in;reg [1:0] rot_in;
reg rot_q1;reg delay_rot_q1;reg rot_q2;
reg rot_event;reg rot_left;
/*Rotary filter*/always @(posedge clk)begin
rot_A_in <= rot_A;rot_B_in <= rot_B;rot_in <= {rot_B_in, rot_A_in};
case (rot_in)2'b00: begin
rot_q1 <= 0; rot_q2 <= rot_q2;end
2'b01: beginrot_q1 <= rot_q1; rot_q2 <= 0;
end2'b10: begin
rot_q1 <= rot_q1; rot_q2 <= 1; end
2'b11: begin rot_q1 <= 1; rot_q2 <= rot_q2;
enddefault: begin
rot_q1 <= rot_q1; rot_q2 <= rot_q2;end
endcaseend
/*Rotary direction*/always @(posedge clk)begin
delay_rot_q1 <= rot_q1;if ((rot_q1 == 1) && (delay_rot_q1 == 0))begin
rot_event <= 1; rot_left <= rot_q2;end else begin
rot_event <= 0; rot_left <= rot_left;end
end
assign rlrot = {rot_event, rot_left};
endmodule
4.3.4 clock_div: clock_div.v
module clock_div( input [2:0] div, input clk, output clk_out,
output clk_out2 /*is the same as clk_out*/ );
reg [6:0] clk_cnt;reg clk_out_reg;
always @(posedge clk)begin
clk_cnt <= clk_cnt + 1;end
always @(clk_cnt or div)begin
clk_out_reg <= (div==0)?clk:clk_cnt[div1];end
assign clk_out = clk_out_reg;assign clk_out2 = clk_out_reg;
endmodule
4.3.5 clock_stat: clock_stat.v
module clock_stat( input [2:0] data_in, output [7:0] data_out );/* // Procedural
reg [7:0] data_out_reg;always @(data_in)begin
case (data_in)3'b000: data_out_reg <= 8'b00000001;3'b001: data_out_reg <= 8'b00000010;3'b010: data_out_reg <= 8'b00000100;3'b011: data_out_reg <= 8'b00001000;3'b100: data_out_reg <= 8'b00010000;3'b101: data_out_reg <= 8'b00100000;3'b110: data_out_reg <= 8'b01000000;3'b111: data_out_reg <= 8'b10000000;
endcaseendassign data_out = data_out_reg
*/assign data_out = (8'b00000001 << data_in); /*Structural*/
endmodule
4.3.6 desain_sekuensial.ucf# Period constraint for 50MHz operationNET "CLK" PERIOD = 20.0ns HIGH 50%;# soldered 50MHz Clock.NET "CLK" LOC = "C9" | IOSTANDARD = LVTTL;NET "CLK_SMA" LOC = "A10" | IOSTANDARD = LVTTL;NET "CLK_OUT" LOC = "E8" | IOSTANDARD = LVTTL;## Koneksi tombol tekanNET "BTN_EAST" LOC = "H13" | IOSTANDARD = LVTTL | PULLDOWN ;NET "BTN_NORTH" LOC = "V4" | IOSTANDARD = LVTTL | PULLDOWN ;NET "BTN_SOUTH" LOC = "K17" | IOSTANDARD = LVTTL | PULLDOWN ;NET "BTN_WEST" LOC = "D18" | IOSTANDARD = LVTTL | PULLDOWN ;# Koneksi LEDNET "LED<7>" LOC = "F9" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;NET "LED<6>" LOC = "E9" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;NET "LED<5>" LOC = "D11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;NET "LED<4>" LOC = "C11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;NET "LED<3>" LOC = "F11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;NET "LED<2>" LOC = "E11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;NET "LED<1>" LOC = "E12" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;NET "LED<0>" LOC = "F12" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;# Koneksi RotaryKnob#NET "ROT_CENTER" LOC = "V16" | IOSTANDARD = LVTTL | PULLDOWN | CLOCK_DEDICATED_ROUTE = FALSE;NET "ROT_A" LOC = "K18" | IOSTANDARD = LVTTL | PULLUP ;NET "ROT_B" LOC = "G18" | IOSTANDARD = LVTTL | PULLUP ;