This is an old revision of the document!
Tema are ca scop exersarea lucrului cu noțiunile de Verilog folosite pentru proiectarea circuitelor secvențiale.
Implementați în Verilog un circuit secvențial sincron care prelucrează imagini RGB (cu trei canale de culoare, fiecare pe 8 biți). Imaginile au dimensiunea de 64×64 de elemente, în care fiecare element are 24 de biți (8 biți 'R', 8 biți 'G' și 8 biți 'B').
Indiferent de formatul în care sunt stocate, imaginile digitale sunt compuse din pixeli (vezi Fig. 1 și 2). Fiecare pixel din imaginea astfel formată este un număr care reprezintă culoarea pe acea unitate. În cazul imaginilor alb-negru un pixel este stocat pe 8 biți, deci poate lua valori între 0 (reprezentând culoarea negru) și 255 (reprezentând alb), toate valorile intermediare reprezentând tonuri de gri.
Figurile 1 și 2 au provenit din urmatoarele surse:
Pentru această temă, noi vom folosi imagini RGB în care un pixel este stocat pe 3 canale (Red - Green - Blue), fiecare canal reprezentând saturația culorii respective, stocată pe 8 biți. Imaginea finală este obținută prin compunerea valorilor din cele trei canale. Puteți citi mai multe despre spațiul de culoare RGB aici.
Click aici pentru informații despre cum se folosește matricea de convoluție
Fiecare pixel din imaginea nouă reprezintă rezultatul aplicării matricei de convoluție pe pixelii corespunzători din imaginea care se dorește a fi modificată. Astfel, pentru a calcula valoarea pixelului de pe poziția [i, j], vom lua în considerare matricea 3×3 din jurul acestei poziții și vom înmulți element cu element matricea obținută cu cea de convoluție (în același mod în care ați efectua înmulțirea element cu element în Matlab). Pixelul de pe poziția [i, j] din imaginea nouă va fi dat de suma acestor 9 valori.
Pentru mai multe detalii, citiți informațiile de aici.
Automatele cu stări finite care vor modela comportamentul general trebuie implementate în modulul process, având interfața:
module process( input clk, // clock input [23:0] in_pix, // valoarea pixelului de pe pozitia [in_row, in_col] din imaginea de intrare (R 23:16; G 15:8; B 7:0) output [5:0] row, col, // selecteaza un rand si o coloana din imagine output out_we, // activeaza scrierea pentru imaginea de iesire (write enable) output [23:0] out_pix, // valoarea pixelului care va fi scrisa in imaginea de iesire pe pozitia [out_row, out_col] (R 23:16; G 15:8; B 7:0) output mirror_done, // semnaleaza terminarea actiunii de oglindire (activ pe 1) output gray_done, // semnaleaza terminarea actiunii de transformare in grayscale (activ pe 1) output filter_done // semnaleaza terminarea actiunii de aplicare a filtrului de sharpness (activ pe 1) );
Funcționalitatea modulului process este următoarea:
module image( input clk, // clock input[5:0] row, // selectează un rând din imagine input[5:0] col, // selectează o coloană din imagine input we, // write enable (activează scrierea în imagine la rândul și coloana date) input[23:0] in, // valoarea pixelului care va fi scris pe poziția dată output[23:0] out // valoarea pixelului care va fi citit de pe poziția dată );
* Fiecare „pixel” din imagine este de dimensiunea 3 bytes (1 byte pentru fiecare canal). * Imaginile sunt mărginite. Pentru aplicărea filtrului pe pixelii aflați în marginea imaginii se vor lua în considerare doar pixelii din imediata vecinătate. Tot ce iese în afara imaginii va fi egal cu 0. * Semnalele mirror_done, gray_done și filter_done trebuie să mențină valoarea HIGH timp de un ciclu de ceas pentru a putea fi luate în considerare de tester. În acest ciclu de ceas nu veți face alte procesări și nu veți începe rezolvarea următorului task. * Nu este permisă cache-uirea matricei întregi (citerea matricei și salvarea acesteia în cadrul modulului pentru procesare ulterioară). Puteți, în schimb, sa cache-uiți până la 6 rânduri dacă aveți nevoie. Această cache-uire va fi explicată apoi în cadrul readme-ului (motivul folosirii).
alta)
=
) și non-blocante (⇐
).wire x; // semnalul x
)Punctajul inițial al checker-ului nu reprezintă punctajul final al temei. Acesta va fi acordat de către asistent, în urma analizei individuale a fiecărei implementări.
Dacă tema primește 0 puncte pe platforma vmchecker, se pot acorda maxim 2 pct pentru ideea de implementare, la latitudinea asistentului. Ideea și motivele pentru care nu funcționează trebuie documentate temeinic în README și/sau comentarii. Temele care au erori de compilare vor fi notate cu 0 puncte.