BAB 4 PERANCANGAN ARSITEKTUR INVERSE-CABAC
Bab ini membahas perancangan arsitektur Inverse-CABAC. Perancangan arsitektur CABAC meliputi perancangan datapath, unit kontrol, dan timing diagram. 4.1
Struktur Umum Inverse-CABAC
Input untuk Inverse-CABAC adalah nilai bitstream, sedangkan outputnya adalah nilai bit yang telah di-decode. Input bitstream dimasukkan ke dalam sistem bila sinyal start_dec bernilai “1”. Dengan demikian rancangan untuk modul InverseCABAC ini dapat direpresentasikan sebagai suatu black-box seperti terlihat pada gambar berikut.
Gambar 4.1 Input dan Output Inverse-CABAC
Dari hasil analisis fungsi Inverse-CABAC yang telah dilakukan pada perancangan awal, datapath Inverse-CABAC dapat dibangun dari modul init context, buffer stream, unit arithmetic decoding (Arcod dan Bypass), serta register untuk proses update nilai range dan offset. Saat input sinyal start_dec bernilai “1”, maka sinyal ini akan mengaktifkan modul init context dan buffer stream untuk menulis nilai input bitstream ke RAM (initRAM pada buffer stream) dan memulai proses inisialisasi yang dibutuhkan sebelum proses decoding dapat dijalankan. Nilai inisialisasi yang dibutuhkan untuk memulai proses decoding kemudian akan
35
disimpan pada register range dan offset. Diagram blok untuk rancangan InverseCABAC ditunjukkan pada gambar 4.2. Updated offset and range
Updated context_model
Decoded bit Init Context
context_model
Arcod Offset Range Register
input bitstream
Buffer Stream
Bypass
Decoded bit
bitstream
Gambar 4.2 Diagram Blok Inverse CABAC
4.2
Perancangan Buffer Stream
Proses pertama pada modul inverse CABAC adalah penyimpanan bitstream pada buffer. Bitstream yang disimpan akan digunakan untuk nilai awal offset dan proses update nilai offset pada proses binary decoding. Jumlah maksimum bitstream yang dibutuhkan untuk proses satu buah macroblock, pada perancangan ini, adalah 664 bit. Dari keseluruhan bitstream tersebut, 9 data pertama akan dijadikan nilai awal offset, sedangkan bitstream lainnya akan digunakan untuk proses decoding. Unit penyimpanan bitstream diimplementasikan dengan menggunakan RAM sedangkan bagian unit kontrol diimplementasikan dengan FSM. Diagram blok modul buffer stream ini dapat dilihat pada gambar 4.3.
36
Gambar 4.3 Diagram Blok Buffer Stream
4.2.1
Blok RAM
Blok RAM yang digunakan untuk menyimpan nilai bitstream, pada perancangan ini berukuran 664x1 bit. Akses pada blok RAM ditentukan oleh sinyal kontrol RAM_we untuk akses penulisan, dan sinyal kontrol RAM_ce untuk akses pembacaan data. Penulisan data bitstream ke RAM dilakukan selama 664 clock cycle, secara berurutan sebagai proses inisialisasi, sedangkan pembacaan nilai bitstream dilakukan hanya saat ada request dari unit binary decoding. Data yang dibaca dari RAM digunakan untuk proses decoding pada blok arcod dan bypass. Penghitungan alamat untuk akses ke RAM dilakukan oleh address counter pada unit kontrol. Sinyal kontrol dan alamat untuk akses ke RAM ini dihasilkan oleh unit kontrol buffer stream. 4.2.2
Unit Kontrol Buffer Stream
Unit kontrol buffer stream diimplementasikan dengan menggunakan FSM, dengan state seperti ditunjukkan gambar 4.4.
37
Gambar 4.4 State Transition Unit Kontrol Buffer Stream
Proses pertama pada unit buffer stream adalah penulisan data bitstream dari port input ke RAM. Tahap ini disebut state WRITE_STREAM. Penulisan bitstream dimulai setelah sinyal status start_buff bernilai “1”. Penulisan bitstream berlangsung
selama
664 clock cycle. Dengan demikian selama state
WRITE_STREAM, kontrol RAM_we bernilai “1”. Tahap berikutnya, setelah proses penulisan nilai bitstream ke RAM selesai, adalah READ_INIT. Pada tahap ini, 9 data pertama bitstream, dibaca secara berturutturut dari blok RAM untuk kemudian dibentuk menjadi sebuah data parallel. Data parallel ini akan digunakan sebagai nilai awal offset. Proses pembentukan data parallel dilakukan dengan menggunakan rangkaian shift-register 9-bit seperti yang terlihat pada gambar 4.5. Dengan demikian pada state READ_INIT, nilai sinyal kontrol RAM_ce akan bernilai “1”.
38
Gambar 4.5 Arsitektur Shift Register untuk Pembentukan Nilai Awal Offset
Timing diagram untuk proses shifting ditunjukkan gambar berikut:
Gambar 4.6 Timing Diagram Proses Pembentukan Nilai Awal Offset
Tahap terakhir pada blok buffer stream adalah pembacaan data dari RAM untuk proses decoding. Data yang dibaca dari RAM ini, digunakan oleh blok arcod untuk proses renormalisasi nilai offset, dan digunakan oleh blok bypass untuk update nilai range dan offset. Dengan demikian sinyal kontrol untuk pembacaan data dari RAM, RAM_ce, ditentukan berdasarkan request dari blok arcod dan bypass, yaitu sinyal renorm dan bypass_enable. Pembentukan sinyal RAM_ce pada state READ_STREAM dapat dilihat pada gambar 4.7.
39
renorm D-FF RAM_ce
bypass_enable D-FF
Gambar 4.7 Pembentukan Sinyal RAM_ce
Proses transisi state pada FSM ditentukan oleh sinyal status end_count, yang dihasilkan dari nilai maksimum counter. Nilai counter ini juga dijadikan sebagai alamat untuk akses ke blok RAM. Arsitektur counter untuk masing-masing state diimplementasikan oleh sebuah counter, berupa shared-hardware. Karena counter yang digunakan berupa shared-hardware untuk semua state, maka nilai awal dan nilai maksimum akan berbeda untuk masing-masing state. Nilai awal dan nilai maksimum counter untuk masing-masing state ditunjukkan tabel berikut : Tabel 4.1 Parameter Counter pada Unit Kontrol Buffer Stream
State WRITE_STREAM READ_INIT READ_STREAM
4.3
Nilai Awal 0 0 9
Nilai Maksimum 663 8 663
Perancangan Init Context
Bersamaan dengan proses penyimpanan bitstream, dilakukan juga proses penghitungan nilai state dan MPS awal untuk setiap context index. Proses penghitungan nilai awal state dan MPS ini dilakukan oleh blok Init Context. Blok Init Context, secara umum terdiri atas: unit ROM, yang digunakan untuk menyimpan context index; unit RAM context, untuk menyimpan nilai context
40
model, dan unit kontrol untuk pengaturan keseluruhan proses. Secara umum struktur bagian init context digambarkan dalam diagram blok unit seperti ditunjukkan gambar berikut :
Gambar 4.8 Blok Diagram Init Context
Proses pada blok Init Context dikontrol dengan menggunakan FSM, seperti ditunjukkan pada gambar 4.9.
Gambar 4.9 State Unit Kontrol Blok Init Context
41
Proses pada blok Init Context diawali saat sinyal start_context = ‘1’. Proses pertama pada blok Init Context, yaitu state WRITE_INIT, adalah proses penulisan nilai awal context model ke memory RAM Context. Nilai context model ini didapat dari perhitungan yang dilakukan oleh blok Init Context Core. Arsitektur blok Init Context Core tersebut dapat dilihat pada gambar berikut: qROM MAX MIN Logic
ROM_cntx_data
mQ4
FF
mQ4_reg
FF
data_ROM_en ROM_indx_data
MPS
calculated ste_mps
mQn
add_in_en
FF
FF FF
data_ROM_en qp_indx_data
add_in_en
add_out_en
ste
FF
ste_mps
ste_mps_en
n12
Gambar 4.10 Arsitektur Blok Init Context Core
Input untuk proses perhitungan nilai context model ini adalah nilai parameter kuantisasi dari ROM index, dan nilai m dan n dari ROM context. Nilai context model yang dihitung pada perancangan ini sebanyak 844 buah. Dengan memperhatikan kompleksitas blok Init Context Core, maka penghitungan setiap nilai context model dirancang dalam 5-stage pipeline. Dengan demikian diharapkan combinational delay dapat dikurangi, sehingga desain yang dihasilkan dapat bekerja pada frekuensi yang lebih tinggi. Tahapan pipeline pada blok Init Context Core adalah sebagai berikut: •
Tahap 1 Pada tahap ini, dilakukan pembacaan data dari ROM index dan ROM context. Keluaran dari ROM index dan ROM context digunakan sebagai input multiplier pada penghitungan context model tahap 2. Pembacaan data ROM index hanya dilakukan pada alamat pertama saja. Pembacaan data ROM context dilakukan secara berturut-turut sebanyak 844 kali untuk setiap penghitungan nilai context model.
42
•
Tahap 2 Pada tahap kedua dilakukan proses perkalian antara data ROM context dan data ROM index. Data ROM index yang digunakan untuk proses perkalian berukuran 8-bit, yang diambil dari ROM_index_data [15:8], sedangkan data ROM context yang digunakan diambil dari ROM_context_data [7:0].
•
Tahap 3 Pada tahap ketiga dilakukan penjumlahan antara hasil perkalian pada tahap 2 dengan nilai ROM_index_data [7:0].
•
Tahap 4 Pada tahap ini dilakukan operasi pembentukan nilai awal state dan MPS.
•
Tahap 5 Pada tahap ini data context model sudah valid dan dapat ditulis ke RAM context. Proses penulisan dilakukan sebanyak data context model yang dihitung, yaitu 844 buah. Dengan demikian penulisan data ke RAM dilakukan setiap 5 clock cycle. Sehingga total proses untuk penghitungan inisialisasi context model adalah 4220 clock cycle.
Setelah proses perhitungan nilai awal context model selesai, yang ditandai dengan aktifnya sinyal end_init, maka proses berikutnya adalah pembacaan memory RAM Context untuk proses arithmetic decoding. Tahap ini dinamakan state READ_MEM. Pembacaan memory RAM Context ini dilakukan berdasarkan alamat yang didapat dari nilai 9 bit terakhir dari keluaran ROM index. Setelah data dari RAM Context dibaca, maka proses decoding dapat dilakukan. Proses decoding dilakukan berdasarkan mode yang didapat dari 2 bit pertama keluaran ROM index, yaitu normal, bypass, dan terminate seperti terlihat pada tabel 4.2. Proses ini selesai setelah sinyal arcod_done atau bypass_done aktif.
43
Tabel 4.2 Mode Decoding
ROM_index [9:8] 00 01 10 11
Mode Decoding Normal Bypass Terminate Initial
Jika yang aktif adalah sinyal arcod_done maka tahap berikutnya adalah penulisan nilai update context model ke RAM Context (state WRITE_MEM). Dengan demikian, pembacaan RAM Context berikutnya dapat dilakukan. Jika yang aktif adalah sinyal bypass_done maka nilai update context model tidak perlu ditulis dan pembacaan RAM Context berikutnya dapat dilakukan (state READ_MEM). Gambar 4.11 mengilustrasikan sinyal-sinyal yang mempengaruhi perpindahan state pada blok Init Context.
reset clock start_cntx end_init arcod_done bypass_done arcode_psate
IDLE
READ_MEM
WRITE_INIT
DECODE
WRITE_MEM
READ_MEM
DECODE
READ_MEM
DECODE
RAM_ce RAM_we addr_count
0
…
843
1
Gambar 4.11 Timing Diagram Proses Init Context
44
2
3
4.4
Perancangan Blok Arithmetic Decoding
Proses binary decoding dikelompokkan menjadi mode Normal, Bypass, dan Terminate. Berdasarkan kesamaan pada pemrosesan data, perancangan unit binary decoding dipisahkan menjadi dua bagian, yaitu blok arcod dan bypass. Blok arcod digunakan untuk melakukan proses decoding untuk mode Normal dan Terminate, sedangkan blok bypass digunakan untuk melakukan proses decoding pada mode Bypass. 4.4.1
Arcod
Proses binary decoding di blok arcod mencakup proses peng-update-an nilai range dan offset serta proses renormalisasi nilai range bila diperlukan. Proses decoding dilakukan selama sinyal arcod_enable aktif, yang dihasilkan dari blok init context. Blok diagram unit arcod ditunjukkan gambar 4.12. arcod bitstream ste_mps_in range_in offset_in
decout_bit Arcod Core
offset_out
arcod_enable normal_mode
ste_mps_new range_out
renorm Arcod Control
terminate_mode
Gambar 4.12 Blok Diagram Arcod
45
arcod_done
4.4.1.1 Unit Update Nilai Range dan Offset Tahap pertama dari proses decoding adalah pembacaan nilai rLPS dan nilai state berdasarkan masukan nilai range dan offset. Nilai range dan offset merupakan data 16-bit yang dibaca dari register offset range. Nilai masukan range dan state digunakan sebagai alamat untuk ROM_rLPS dan ROM_state. Alamat untuk ROM_rLPS dibentuk dari nilai range_in[7:6] dan nilai ste_mps_in[6:1], sedangkan alamat untuk ROM_state dibentuk langsung dari nilai ste_mps_in[6:1]. Gambar
4.13
mengilustrasikan
pembentukan
alamat
untuk
pembacaan
ROM_rLPS dan ROM_state.
Gambar 4.13 Struktur ROM rLPS dan ROM state
Data dari ROM rLPS digunakan untuk update nilai range dan offset. Nilai update range diambil dari selisih nilai masukan range_in dan data rLPS atau langsung berupa data rLPS. Jika nilai sel_rng bernilai “1”, nilai update range yang dipilih adalah data rLPS. Sebaliknya, jika bernilai sel_rng “0” maka dipilih selisih nilai range_in dan data rLPS. Pada proses decoding mode Terminate, nilai rLPS selalu bernilai 2, sedangkan untuk mode normal nilai rLPS merupakan keluaran ROM rLPS. Arsitektur bagian proses update nilai range ditunjukkan oleh gambar 4.14.
46
Gambar 4.14 Arsitektur Proses Update Nilai Range
Untuk proses update nilai offset, nilai yang diambil dapat berupa selisih nilai masukan offset_in dan output substractor nilai masukan range_in dan data rLPS, atau nilai masukan offset_in langsung. Nilai offset_in dipilih sebagai nilai update offset jika sel_offs bernilai “1”. Sebaliknya, jika sel_offs bernilai “0” maka dipilih selisih nilai masukan offset_in dan output substractor nilai masukan range_in dan data rLPS . Arsitektur untuk proses update nilai offset ditunjukkan oleh gambar 4.15.
Gambar 4.15 Arsitektur Proses Update Nilai Offset
Proses update nilai offset dan range dilakukan bersama-sama, oleh karena itu, proses pengurangan nilai range_in dan data rLPS dapat dilakukan oleh satu buah unit substractor. Dengan demikian arsitektur akhir untuk proses update range dan offset dapat dilihat pada gambar 4.16.
47
0
offset_in[15:0]
offs_o[15:0] 1
range_in[15:0] 16'd2
1
{8'd0, rLPS_data[7:0]}
0
sel_offs
0
sel_rLPS
rng_o[15:0]
1
sel_rng
Gambar 4.16 Arsitektur Proses Update Nilai Offset dan Range
4.4.1.2 Renormalisasi Nilai Range dan Offset Nilai update range sebelum ditulis ke register akan dicek dulu untuk menentukan apakah perlu dilakukan renormalisasi atau tidak. Secara struktural, arsitektur rangkaian untuk proses renormalisasi nilai range dan offset dapat dilihat pada gambar 4.17 dan gambar 4.18.
Gambar 4.17 Arsitektur Shift Register untuk Renormalisasi Nilai Range
Gambar 4.18 Arsitektur Shift Register untuk Renormalisasi Nilai Offset
48
4.4.1.3 Unit Update Nilai State dan MPS Selain proses update nilai range dan offset, pada blok arcod juga dilakukan proses update ste_mps. Nilai update ste_mps terdiri dari dua bagian, yaitu nilai update state dan nilai update MPS. Nilai update state diambil dari keluaran ROM_state. Jika nilai sel_ste bernilai “1” nilai update state adalah ROM_state_data[5:0], sedangkan
jika
nilai
sel_ste
bernilai
“1”
nilai
update
state
adalah
ROM_state_data[11:6]. Nilai update MPS diperoleh dari nilai berdasarkan nilai masukan MPS atau inversi masukan MPS. Jika nilai sel_mps bernilai “1” nilai update MPS adalah inversi nilai masukan MPS, sedangkan jika nilai sel_mps bernilai “0” nilai update MPS sama dengan nilai masukan MPS. Arsitektur untuk proses update state dan MPS ditunjukkan gambar berikut:
Gambar 4.19 Arsitektur Proses Update Nilai State dan MPS
49
4.4.1.4 Unit Decoding Bit Proses decoding pada blok arcod, ditentukan oleh nilai sel_decout_bit. Nilai output bit yang di-decode ditunjukkan dalam tabel berikut: Tabel 4.3 Pemilihan Hasil Decoding untuk Blok Arcod
sel_decout_bit 00 01 10 11
decout_bit ste_mps_in [0] !ste_mps_in [0] 1’b0 1’b1
4.4.1.5 Unit Kontrol Arcod Bagian unit kontrol untuk blok arcod diimplementasikan dengan menggunakan FSM, seperti ditunjukkan gambar berikut.
Gambar 4.20 State Transition Unit Kontrol Blok Arcod
50
Bagian unit kontrol serta untuk proses sinkronisasi pipeline blok arcod core dan menghasilkan sinyal-sinyal kontrol yang dibutuhkan untuk multiplexer pada bagian arcod core. Proses pipeline dilakukan untuk proses update nilai range dan nilai offset. ARCOD_STAGE1, merupakan tahap pembacaan data dari ROM_rLPS dan ROM_state. Pada state ARCOD_STAGE2 sampai ARCOD_STAGE4 dilakukan proses update nilai range dan offset. Dengan demikian setiap proses update nilai range dan offset dilakukan dalam 3 clock cycle. Dari proses update, dihasilkan nilai-nilai status untuk proses decoding. Sinyal status yang dihasilkan adalah : •
offs_high_valid Sinyal status offs_high_valid merupakan sinyal status yang menunjukkan nilai offset input lebih besar dari selisih nilai output substractor nilai masukan range_in dan data rLPS. Dengan kata lain nilai status offs_high_valid dapat diperoleh dari inversi nilai MSB bit output pengurangan tahap kedua pada proses update nilai offset.
•
range_low_valid Sinyal status range_low_valid merupakan sinyal status yang menunjukkan bahwa nilai range dari proses update masih lebih kecil dari 0x0100. Nilai ini akan digunakan untuk menentukan apakah proses renormalisasi diperlukan atau tidak.
•
state_zero Sinyal status state_zero dihasilkan untuk meunjukkan bahwa data yang terbaca dari ROM state bernilai nol. Status state_zero diperlukan untuk pemilihan nilai update MPS.
Sinyal-sinyal status yang dihasilkan oleh blok arcod core selama proses update ini, digunakan oleh unit kontrol arcod, untuk menghasilkan sinyal kontrol multiplexer
51
pada arcod core. Sinyal-sinyal kontrol multiplxer yang diperlukan oleh blok arcod core, sebagaimana telah disebutkan pada bagian sebelumnya, adalah sebagai berikut : •
sel_rLPS sinyal kontrol sel_rLPS merupakan sinyal kontrol yang digunakan untuk memilih data keluaran dari ROM rLPS. Nilai sinyal sel_rLPS ditentukan oleh mode decoding, yaitu bernilai “1” saat mode Terminate. Untuk sinkronisasi pipeline sinyal sel_rLPS akan dihasilkan saat state FSM berada pada ARCOD_STAGE2.
•
sel_offs Sinyal kontrol sel_offs digunakan untuk pemilihan nilai update offset. Nilai sel_offs akan bernilai “1” jika nilai offs_high_valid bernilai “1” dan mode decoding normal.
•
sel_rng Sinyal kontrol sel_rng digunakan untuk pemilihan nilai update range. Nilai sel_offs akan bernilai “1” jika nilai offs_high_valid bernilai “1” dan mode decoding normal.
•
sel_ste Sinyal kontrol sel_ste digunakan untuk pemilihan nilai update state. Nilai sel_ste akan bernilai “1” jika nilai offs_high_valid bernilai “1”.
•
sel_mps Sinyal kontrol sel_mps digunakan untuk pemilihan nilai update state. Nilai sel_ste akan bernilai “1” jika nilai offs_high_valid bernilai “1” dan nilai state_zero bernilai “1”.
•
sel_decout_bit Sinyal kontrol sel_decout_bit digunakan untuk menuntukan bit yang didecode, sebagai keluaran blok arcod. Nilai sel_decout_bit, merupakan sinyal kontrol 2-bit didapat dari gabungan nilai mode decoding dan nilai offset_high_valid.
52
Proses blok arcod secara timing dapat digambarkan sebagai berikut :
Gambar 4.21 Timing Diagram Blok Arcod
4.4.2
Bypass
Pada proses decoding mode bypass hanya dilakukan proses update nilai offset. Proses update pada nilai range, state dan MPS tidak dilakukan. Diagram blok proses decoding pada mode bypass digambarkan sebagai berikut.
Gambar 4.22 Blok Diagram Unit Bypass
Proses update nilai offset pada mode bypass membutuhkan bitstream. Nilai update offset diambil dari selisih nilai masukan offset yang dikali dengan dua dan ditambah bitstream dengan nilai masukan range atau langsung dari nilai masukan offset yang dikali dengan dua dan ditambah bitstream. Proses update nilai range dan offset pada unit bypass dilakukan dengan arsitektur seperti yang diperlihatkan pada gambar 4.23.
53
bitstream 0
offset_in
1
offset_new
range_in offs_high_valid
range_new 1'b0
0
1'b1
1
decout_bit
Gambar 4.23 Arsitektur Proses Update Nilai Offset
Dari keluaran substractor dapat ditentukan nilai offs_high_valid untuk menentukan nilai update offset dan nilai output bit yang di-decode. Cara penentuan nilai offs_high_valid ini sama dengan cara penentuan nilai offs_high_valid pada blok arcod. Jika nilai offs_high_valid bernilai “1” maka nilai update offset, offset_new, adalah output substractor, dan bit yang di-decode bernilai “1”. Sebaliknya, jika offs_high_valid bernilai “0” maka nilai update offset, offset_new, adalah nilai offset yang dikalikan dua dan ditambah bitstream, dan bit yang di-decode bernilai “0”. Blok substractor juga akan mengeluarkan sinyal status bypass_done, untuk menunjukkan bahwa proses decoding selesai dilakukan. Nilai bypass_done ini digunakan untuk sinkronisasi dengan blok-blok lainnya seperti Init Context dan Offset Range Register. Sinyal-sinyal kontrol dari blok bypass dihasilkan berdasarkan kondisi state dari FSM, yaitu pada state BYPASS_OUTPUT. Bagian unit kontrol untuk blok bypass diimplementasikan dengan menggunakan FSM, seperti ditunjukkan pada gambar 4.24.
54
Gambar 4.24 State Transiton Decoding Mode Bypass
4.5
Perancangan Offset dan Range Register
Blok register ini digunakan untuk menyimpan nilai akhir offset dan range dari setiap proses decoding. Nilai offset dan range yang tersimpan di register ini akan digunakan sebagai nilai awal offset dan range proses decoding berikutnya.
Gambar 4.25 Arsitektur Register Offset dan Range
55
Karena nilai offset dan range yang ditulis pada register ini dapat berasal dari blok arcod atau blok bypass, maka diperlukan multiplexer untuk pemilihan nilai offset dan range yang akan ditulis. Arsitektur untuk register offset dan range ini dapat dilihat pada gambar 4.25. Pemilihan input multiplexer ditentukan oleh sinyal arcod_done. Jika nilai arcod_done “1”, maka data offset dan range dari proses arcod yang akan dipilih. Penulisan nilai offset dan range dikontrol oleh sinyal kontrol offs_range_we, yang merupakan hasil operasi OR antara sinyal arcod_done dan bypass_done.
56