CID Aplicatii 1

De la WikiLabs

In aceasta sesiune de aplicatii, vom invata cum sa generam semnale digitale cu ajutorul limbajului Verilog. Generarea de semnale este utilizata in testarea prin simulare a circuitelor digitale. Semnalele generate sunt injectate la intrarea circuitului, observandu-se apoi cum se modifica starea iesirilor acestuia.

Notiuni si cunostinte necesare

Exemplul 1: Generarea a doua semnale digitale de 1 bit

Sa se genereze doua semnale digitale de 1 bit, care sa aiba urmatoarea variatie in timp (unitatea de timp este de 1ns):

CID Aplicatii1 ex1.svg

`timescale 1ns/1ps     // setam unitatea de timp la 1ns, cu o precizie de 1ps

module waveform1();    // modulul nu are nicio intrare si nicio iesire. Semnalele de test generate sunt semnale interne ale modulului de test.

reg a, b;              // cele doua semnale de test sunt modificate intr-un bloc de tip initial si trebuie declarate ca elemente de tip reg.

initial begin
    $monitor("time = %2d, a = %b, b=%b", $time, a, b);  // monitorizam in consola starea semnalelor a si b
       a = 0;          // semnalul a va avea valoarea 0 la momentul initial de timp (la momentul t = 0)
       b = 0;          // semnalul b va avea valoarea 0 la momentul initial de timp (la momentul t = 0)
    #1 a = 1;          // dupa 1ns de la momentul initial, a se face 1
    #1 b = 1;          // dupa 2ns de la momentul initial, b se face 1
    #1 a = 0;          // dupa 3ns de la momentul initial, a se face 0
       b = 0;          // dupa 3ns de la momentul initial, b se face 0
    #2 $stop();        // simularea este oprita
end

endmodule              // incheiem descrierea modulului de generare de semnale digitale

Exemplul 2: Generarea unui semnal periodic de 1 bit

Sa se genereze un semnal digital periodic de 1 bit, cu perioada egala cu 2ns:

CID Aplicatii1 ex2.svg

`timescale 1ns/1ps     // setam unitatea de timp la 1ns, cu o precizie de 1ps

module waveform2();    // modulul se numeste waveform2 si nu are nicio intrare si nicio iesire

reg clock;             // semnalul de test se va modifica intr-un bloc initial, asadar este declarat de tip reg

initial begin
    clock = 0;                   // valoarea initiala a semnalului va fi 0 (la momentul t = 0)
    forever #1 clock = ~clock;   // forever indica faptul ca ce urmeaza se va repeta intr-o bucla continua. 
                                 // La trecea unui timp egal cu unitatea de timp definita, semnalul clock isi va nega valoarea
end

initial begin
    #20 $stop();       // La 20 de unitati de timp (aici, 20 ns), simularea se va opri. 
                       // Punem $stop intr-un bloc separat, deoarece forever blocheaza blocul initial in care se afla
                       // Toate blocurile initial incep la acelasi moment de timp (t = 0) si au efect in paralel
end

endmodule

Exemplul 3: Generarea unui semnal digital de 8 biti aliniat la fronturile crescatoare ale unui semnal de ceas

Sa se genereze un semnal digital de 8 biti aliniat la fronturile crescatoare ale unui semnal de ceas, ce are perioada de 2ns:

CID Aplicatii1 ex3.svg

`timescale 1ns/1ps                // setam unitatea de timp la 1ns, cu o precizie de 1ps

module waveform3();               // numele modulului este waveform3 si nu are nicio intrare si nicio iesire.

reg clock;                        // clock isi va modifica intr-un bloc initial, asadar este declarat de tip reg
reg [7:0] data;                   // data are 8 biti isi va modifica intr-un bloc initial, asadar este declarat de tip reg

integer i;                        // i este un index ce va fi folosit in blocul for si este declarat de tip integer

initial begin
    $monitor("time = %2d, count = %b", $time, data); // monitorizam in consola starea semnalelor a si b
    data = 0;                     // valoarea initiala (la momentul t = 0) a lui data este 0
    for(i=0;i<10;i=i+1) begin     // instructiunea for determina repetarea secventei urmatoare de 10 ori
        @(posedge clock)          // se asteapta frontul crescator al clock
        data = i;                 // la fiecare front crescator al clock, data ia valoarea lui i
    end
    #2 $stop();                   // dupa un timp egal cu doua unitati de timp de la ultima actualizare a lui data, simularea se opreste
end

initial begin
    clock = 0;                    // valoarea initiala (la momentul t = 0) a lui clock este 0 
    forever #1 clock = ~clock;    // La trecea unui timp egal cu unitatea de timp definita, semnalul clock isi va nega valoarea
end

endmodule

Exercitii suplimentare

1. Generati doua semnale digitale a si b de 1 bit, astfel incat sa se formeze cu ele toate cele 4 combinatii posibile:

   t = 0ns: a = 0, b = 0
   t = 1ns: a = 0, b = 1
   t = 2ns: a = 1, b = 0
   t = 3ns: a = 1, b = 1

2. Generati un semnal digital clock cu dimensiunea de 1 bit si perioada de 2ns si un semnal digital data, cu dimensiunea de 4 biti, aliniat la fronturile crescatoare ale semnalului clock. Semnalul data va varia astfel: 0, 1, 2, 3, 0, 1, 2 ,3, 0, 1 ... . Opriti simularea dupa ce semnalul data a realizat 4 variatii complete (s-a generat secventa 0, 1, 2, 3 de 4 ori).