Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateCC sharp
CalculatoareCorel drawDot netExcelFox proFrontpageHardware
HtmlInternetJavaLinuxMatlabMs dosPascal
PhpPower pointRetele calculatoareSqlTutorialsWebdesignWindows
WordXml


STRUCTURI COMBINATIONALE MSI IMPLEMENTATE IN VERILOG

windows



+ Font mai mare | - Font mai mic



Structuri combinaTionale MSI implementate In verilog



Scopul lucrarii

Descrierea structurala si comportamentala a principalelor structuri combinationale de uz general in limbajul Verilog si intelegerea functionarii lor prin testare cu ajutorul simulatorului Veriwell.

2. Aparate necesare

- calculator compatibil Pentium

- sistem de operare Windows 95 sau superior

- programul VeriWell 2.0, produs de Wellspring Solutions, versiunea freeware, disponibila pe Internet

3. Consideratii teoretice

Circuitele combinationale MSI (Medium Scale Integration) de uz general sunt multiplexorul (MUX), decodificatorul (DCD) si demultiplexorul (DMUX). Memoria ROM (Read Only Memory) este tot o structura combinationala. De obicei, este de mari dimensiuni si atunci este considerata o structura LSI (Large Scale Integration), dar poate fi considerata si o structura MSI atunci cand este de mici dimensiuni.

Multiplexorul este un circuit care permite transmiterea datelor de la una din cele cai de intrare la o singura cale de iesire. Selectia unei anumite intrari de date se face prin aplicarea unui cod binar pe n linii de intrare, linii care se numesc intrari de selectie. Reprezentarea unui multiplexor pentru n = 4 este data in figura 3.1. Descrierea comportamentala a circuitului poate fi urmatoarea:

module mux16_1(out, in, sel);

input[3:0] sel; // intrarile de selectie

input[15:0] in; // intrarile de date

output out; // iesirea, care este una dintre intrarile selectate

assign out = in[sel]; // selectia se face prin atribuire

endmodule

Fig. 3.1 Multiplexor cu 4 intrari de selectie si 16 intrari de date

Fig. 3.2 Multiplexor cu o intrare de selectie si 2 intrari de date si modelul lui Verilog

Se pot face si alte descrieri comportamentale folosind, de exemplu, instructiunile if sau case. In figura 3.2 s-a exemplificat modelul unui multiplexor cu n = 1 care foloseste instructiunea if. Un exemplu de folosire a instructiunii case tot pentru n = 4 este dat mai jos, dar se vede ca modelul este mult prea complicat:

module mux16_1(out, in, sel);

input[3:0] sel;

input[15:0] in;

output out;

reg out; // se fac atribuiri lui out

always @(sel) case (sel)  // de cate ori se modifica intrarea de selectie, se // recalculeaza out

4'b0000: out = in[0];

4'b0001: out = in[1];

4'b0010: out = in[2];

4'b0011: out = in[3];

4'b0100: out = in[4];

4'b0101: out = in[5];

4'b0110: out = in[6];

4'b0111: out = in[7];

4'b1000: out = in[8];

4'b1001: out = in[9];

4'b1010: out = in[10];

4'b1011: out = in[11];

4'b1100: out = in[12];

4'b1101: out = in[13];

4'b1110: out = in[14];

4'b1111: out = in[15];

endcase

endmodule

Pentru testarea circuitului, este imposibil sa generam toate combinatiile posibile pe cele 20 intrari combinationale. Acceptam un vector de date de intrare cunoscut, de exemplu 1110010110000011, si verificam cum se face comutarea cailor de intrare prin modificarea vectorului de selectie. Registrul sel devine de fapt un numarator, care este incrementat la fiecare 10 unitati de timp:

module test_mux;

reg[3:0] sel;

reg[15:0] in;

wire out;

initial #330 $stop; // simularea se opreste la t = 330

initial begin sel = 4'b0; // se initializeaza registrul sel

in = 16'b1110010110000011;

forever #10 sel = sel + 1;

end

mux16_1 dut(out, in, sel);

initial begin $vw_dumpvars;

$monitor('Time=%0d out=%b', $time, dut.out);

end

endmodule

Demultiplexorul este un circuit care realizeaza functia inversa celei de multiplexare, permitand transmiterea datelor de pe o singura cale de intrare pe una din cele cai de iesire. Selectia liniilor de iesire se face prin aplicarea unui cod binar pe n linii de intrare, care devin acum intrari de selectie. Descrierea circuitului si simularea functionarii lui se poate face ca si in cazul multiplexorului.

Decodificatorul este un circuit care transforma un cod de intrare in alt cod de iesire. Decodificatorul binar-zecimal identifica un cod binar de intrare prin activarea unei singure linii de iesire. Daca circuitul are n variabile binare de intrare, atunci numarul liniilor de iesire este Figura 3.3 exemplifica acest circuit pentru cazul n = 2.

Un alt exemplu este decodificatorul BCD-7segmente, care transforma codurile binare ale celor 10 cifre zecimale de la 0 la 9 intr-un cod pe 7 biti. Aceste 7 iesiri pot comanda segmentele unui element de afisare care ne permite sa vizualizam comod cifra afisata (figura 3.4). Tabelul de adevar al circuitului este prezentat in figura 3.5. Descrierea circuitului se poate face cu ajutorul instructiunii case, iar modulul pentru testarea circuitului poate fi urmatorul:

module test_trans;

reg[3:0] counter;

wire[6:0] segments;

initial #22 $stop;

initial begin counter = 0;

forever #1 counter = counter + 1;

end

seven_seg dut(segments, counter);

initial $monitor('time=%0d input=%b output=%b',

$time, counter, dut.segments);

endmodule

Fig. 3.3 Decodificatorul binar-zecimal si tabelul lui de adevar pentru n=2

Fig. 3.4 Afisajul cu 7 segmente si notatiile folosite

Fig. 3.5 Decodificatorul BCD-7segmente si tabelul lui de adevar

Se poate observa ca pentru combinatiile care nu au fost precizate explicit in instructiunea case (intrarile 10, 11, , 15) se ia ultima valoare din instructiunea case Deci pentru orice combinatie BCD interzisa, se va afisa tot " 9 ". Acest lucru se poate evita printr-o linie suplimentara in tabelul de adevar.

Memoria ROM este tot un convertor de cod format dintr-un decodificator si un codificator. Spre deosebire de decodificator, ea este o structura programabila, deci continutul ei poate fi modificat de utilizator prin programarea memoriei, iar apoi numai citit pentru o aplicatie oarecare. Si decodificatorul BCD-7segmente din exemplul anterior poate fi implementat cu o memorie ROM. Solutia este functionala, dar este de obicei mai scumpa si mai lenta.

Informatia din memoria ROM este organizata matricial, avand un numar de cuvinte care au o lungime stabilita ca numar de biti pe cuvant. Fiecare cuvant poate fi selectat printr-un cod binar aplicat pe intrarile de adresa ale memoriei. De exemplu, circuitul din figura 3.6 este o memorie ROM cu organizarea de 8 cuvinte a cate 4 biti fiecare. Daca mem.dat este un fisier care contine cei 32 biti de date, amplasati pe 8 linii si 4 coloane, atunci citirea datelor din memorie se poate face cu urmatorul modul:

module testmemory;

reg [3:0] memory [7:0];

integer index;

initial begin

$readmemb('mem.dat', memory);

for(index = 0; index < 8; index = index + 1)

$display('memory[%d] = %b', index[4:0], memory[index]);

end

endmodule

Toate circuitele s-au prezentat functional, fara alte intrari de validare a datelor la iesire (ENABLE OUTPUT ENABLE), pentru simplitatea descrierilor.

Fig. 3.6 Memorie ROM si tabelul ei de adevar

4. Modul de lucru

Se lanseaza in executie VeriWell 2.0, se deschide proiectul mux1.prj si se vizualizeaza fisierele componente mux1.v si test_mux1.v. Faceti simularea circuitului si verificati ca nu aveti erori. Vizualizati formele de unda, folosind fereastra wavefile.vwf. Modificati fisierele proiectului, dar salvati-le cu alte nume intr-un subdirector nou, creat de dumneavoastra, si reluati simularile pentru cazurile n = 3 si n = 2. Incercati modelul prezentat in figura 3.2 pentru n = 1. Formulati o descriere structurala pentru acest ultim caz si refaceti simularile.

Se deschide proiectul bcd_7seg.prj si se vizualizeaza fisierele componente bcd_7seg.v si test_bcd_7seg.v. Faceti simularea circuitului si verificati ca nu aveti erori. Vizualizati formele de unda, folosind fereastra wavefile.vwf. Comentati rezultatele obtinute.

Descrierea comportamentala a unui decodificator binar-zecimal cu 4 intrari de selectie si cu iesirea activa pe 1 logic este data in urmatorul modul:

module dec4_16(out, sel);

input[3:0] sel;

output[15:0] out;

assign out = 16'b1 << sel;

endmodule

Descrierea structurala a aceluiasi circuit este data in urmatorul modul:

module dec4_16(out, sel);

input[3:0] sel;

output[15:0] out;

wire w0, w1, w2, w3, nw0, nw1, nw2, nw3;

not not_3(nw3, sel[3]),

not_2(nw2, sel[2]),

not_1(nw1, sel[1]),

not_0(nw0, sel[0]),

buf_3(w3, nw3),

buf_2(w2, nw2),

buf_1(w1, nw1),

buf_0(w0, nw0);

and and_15(out[15], w3, w2, w1, w0),

and_14(out[14], w3, w2, w1, nw0),

and_13(out[13], w3, w2, nw1, w0),

and_12(out[12], w3, w2, nw1, nw0),

and_11(out[11], w3, nw2, w1, w0),

and_10(out[10], w3, nw2, w1, nw0),

and_09(out[09], w3, nw2, nw1, w0),

and_08(out[08], w3, nw2, nw1, nw0),

and_07(out[07], nw3, w2, w1, w0),

and_06(out[06], nw3, w2, w1, nw0),

and_05(out[05], nw3, w2, nw1, w0),

and_04(out[04], nw3, w2, nw1, nw0),

and_03(out[03], nw3, nw2, w1, w0),

and_02(out[02], nw3, nw2, w1, nw0),

and_01(out[01], nw3, nw2, nw1, w0),

and_00(out[00], nw3, nw2, nw1, nw0);

endmodule

Verificati cele doua modele prin simulare in mediul VeriWell. Comparati cele doua modele din punct de vedere al complexitatii lor. Folosind modelul structural desenati schema logica cu porti a decodificatorului prezentat.

Descrieti comportamental un demultiplexor cu 3 intrari de selectie. Semnalul aplicat la intrare este un semnal de ceas cu perioada de 20 unitati de timp. El trebuie sa fie vizualizat la diferite iesiri ale demultiplexorului, in functie de codul de selectie aplicat pe intrari. Verificati prin simulare functionarea circuitului. Generarea semnalului periodic se poate face cu urmatoarea secventa:

initial begin

clock = 1'b0;

forever #10 clock = ~clock;

end

Analizati urmatorul modul Verilog. Explicati ce face programul si rulati-l in mediul VeriWell pentru a verifica functionarea lui:

module fileDemo;

integer handle, channels, index, rand;

reg [7:0] memory [15:0];

initial begin

handle = $fopen('mem.dat');

channels = handle | 1;

$display('Generating contents of file mem.dat');

$fdisplay(channels, '@2');

for(index = 0; index < 14; index = index + 1) begin

rand = $random;

$fdisplay(channels, '%b', rand[12:5]);

end

$fclose(handle);

$readmemb('mem.dat', memory);

display('nContents of memory array');

or(index = 0; index < 16; index = index + 1)

$displayb(memory[index]);

end

endmodule



Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 2107
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved