Sunteți pe pagina 1din 7

Circuite Integrate Digitale

http://arh.pub.ro/lab/cid1

Generator de semnal. Osciloscopul.


Implementare in Verilog si sinteza. Introducere Unele aplicatii au nevoie de un semnal de ceas cu o frecventa mai mica decat cea a ceasului principal al unui circuit(in cazul laboratorului este vorba de oscilatorul de 50 MHz de pe placa FPGA). Daca un semnal are frecventa de 50MHz, atunci el are perioada de 20ns (f=1/T). Daca dublam perioada unui semnal(trecem de la 20ns la 40ns), atunci injumatatim frecventa semnalului(trecem de la 50MHz la 25Mhz). Daca marim perioada de X ori (T= Ti*X), micsoram frecventa de X ori(f=fi/X). module div_freq( // divizor de clock sau divizor de frecventa input reset, input clock, input[23:0] factor, // factor de divizare a frecventei output reg freq_out // ffreq_out=fclock/(2+2*factor) ); reg [23:0] count; always @ (posedge clock or posedge reset) begin if (reset) begin freq_out <= 0; count <= 0; end else if (count == factor) begin freq_out <= ~freq_out; count <= 0; end else count <= count + 1; end endmodule

1/7

Circuite Integrate Digitale

http://arh.pub.ro/lab/cid1

1. Generator de impulsuri de frecventa variabila


In acest laborator vom implementa un circuit care va genera un impuls cu o frecventa data de utilizator prin intermediul switch-urilor SW7-SW0. Acest circuit este prezentat schematic in figura de mai jos.
SW7 SW0
8

rese t

generator de impulsuri

cloc k

out Semnalul de iesire out are forma ca in figura de mai jos, unde tN este dat de numarul format din switchurile SW7-SW0:

clock

out tN

Schema detaliata a generatorului de impulsuri este data in figura de mai jos:

clock(50MHz)

SW7 - SW0

reset

div_freq
25kHz

factor in 8'b0

numarator
load 8

comparator

out

2/7

Circuite Integrate Digitale

http://arh.pub.ro/lab/cid1

Pentru ca impulsul generat sa poata fi observat pe osciloscoapele din laborator, in modulul numarator s-a implementat si un divizor de ceas, care realizeaza prin registrul clk un clock de 25 kHz, din ceasul original de 50 Mhz. Codul verilog pentru generatorul de impulsuri este mai jos:

module generator_de_impulsuri ( input reset, input clock, input[7:0] sw, output out ); wire[7:0] numar; wire clk; div_freq divizor_frecventa1 ( .reset(reset), .clock(clock), // frecventa clock = 50 Mhz = 50 000kHz .factor(24'd999), .freq_out(clk) // frecventa clk = frecv clock/(2+2*999)=25kHz ); numarator numarator1 (.reset (reset), // numarator pe 8 biti .clock (clk), .load(out), .in(8'b0), .out (numar) ); comparator comparator1(.a(sw), .b(numar), .equals(out) ); endmodule // generator_de_impulsuri module comparator ( input[7:0] a, input[7:0] b, output equals ); assign equals = (a==b); endmodule // comparator module numarator ( input reset, input clock, input load, input[7:0] in, // cand load este 1, ncarcam in n numarator 3/7

Circuite Integrate Digitale

http://arh.pub.ro/lab/cid1

output reg [7:0] out ); always @ (posedge clock or posedge reset) begin if (reset) begin out <= 0; end else begin if (load) out <= in; else out <= out +1; end end endmodule // numarator 8 biti
Sa se faca sinteza circuitului dupa cum urmeaza:

intrarea reset trebuie asignata la BTN0; intrarea clock se leaga la generatorul ceas extern(P77) intrarea sw trebuie asignata la SW7 SW0 iesirea out trebuie asignata la P49 si vizualizata pe osciloscop.

Spartan 3 (vezi placa) T9 (vezi placa) N11

La intrarea osciloscopului sunt conectate 3 cabluri. Pe fiecare dintre ele este scris un numar care reprezinta numarul pinului FPGA-ului la care este conectat. In acest exemplu o sa avem nevoie doar de canalul 1 al osciloscopului (P59). In sectiunea source a osciloscopului se vor seta CH1 si LINE ca in figura de mai jos:

4/7

Circuite Integrate Digitale

http://arh.pub.ro/lab/cid1

2. Generator de impulsuri cu factorul de umplere variabil


In mod asemanator se poate construi un modul in care factorul de umplere al semnalului generat se poate modifica din switch-urile SW7-SW0. Modulul verilog este prezentat mai jos:

module pulse_width_modulation ( input reset, input clock, input[7:0] sw, output reg out ); reg[7:0] counter; always @(posedge clock or posedge reset) begin if (reset) begin counter <= 0; out <= 0; end else begin counter <= counter + 1; if(counter < sw) begin out <= 1; end else begin out <= 0; end end end endmodule
Sa se faca sinteza circuitului dupa cum urmeaza: Spartan 3 (vezi placa) T9 (vezi placa) N11

intrarea reset trebuie asignata la BTN0; intrarea clock se leaga la generatorul ceas extern (P77) intrarea sw trebuie asignata la SW7 SW0 iesirea out trebuie asignata la P49 si vizualizata pe osciloscop.

3. Transmisia seriala sincrona a datelor.


Deseori, pentru a realiza o comunicare intre doua module (sau device-uri) se foloseste comunicatia seriala. Cea mai simpla interfata seriala e formata din doua fire: un semnal de ceas si unul de date. Mai jos aveti codul verilog pentru un modul de transmisie seriala cu urmatoarele caracteristici: transmite periodic o secventa stabilita formata din 8 biti

5/7

Circuite Integrate Digitale


http://arh.pub.ro/lab/cid1

primii biti sunt 010 (pentru a recunoaste usor secvanta pe ecranul osciloscopului) ceilalti 5 biti sunt date utile (se incarca de la switch-urile SW4-SW0) transmite un semnal de clock (ck) pentru a valida fiecare bit de date transmite un semnal de date (data) pentru fiecare bit de date transmite un semnal de sincronizare (sync) care are un singur scop: sa sincronizeze osciloscopul cu semnalele de date si ceas

module serial ( input reset, input clock, input[4:0] sw, output reg sync, output reg ck, output reg data ); reg[18:0] counter; always@(posedge clock or posedge reset) begin if (reset) begin sync <= 0; ck <= 0; data <= 0; counter <= 0; end else begin sync <= counter[18]; ck <= counter[15]; data <= {sw[4:0], 3'b010} >> counter[18:16]; counter <= counter + 1; end end endmodule //{} este concatenare de biti --> sw[4] sw[3] sw[2] sw[1] sw[0] 0 1 0
MSB LSB

data -->> 0 1 0 Sa se faca sinteza circuitului dupa cum urmeaza:

sw[0] sw[1]

sw[2]

sw[3]

sw[4]

Spartan 3 intrarea reset trebuie asignata la BTN0; (vezi placa) intrarea clock se leaga la generatorul ceas extern(P77) T9 intrarea sw trebuie asignata la SW4 SW0 (vezi placa) iesirea sync trebuie asignata la pinul P47(sincronizarea externa a osciloscopului) P10 iesirea ck trebuie asignata la P48(canalul 2 al osciloscopului) si vizualizata pe osciloscop T3 iesirea data trebuie asignata la P49(canalul 1 al osciloscopului) si vizualizata pe osciloscop N11

6/7

Circuite Integrate Digitale

http://arh.pub.ro/lab/cid1

Pentru a vizualiza forma de unda a semnalelor ck si data pe osciloscop trebuie sa folosim un semnal sync care trigereaza sincronizarea externa a osciloscopului. In sectiunea source a osciloscopului se vor seta EXT si EXT ca in figura de mai jos:

ATENTIE: In acest laborator se va folosi osciloscopul. Este foarte indicata reamintirea utilizarii osciloscopului:

http://www.comm.pub.ro/curs/metc/platf/lab2.pdf module test_modelsim; reg clock, rst; wire sgn_out; //tipar pentru simulare in Modelsim

4. Exercitii pentru laborator:


1. Sa se modifice modulul de transmisie seriala astfel incat atata timp cat se apasa butonul BTN1, secventa de start sa fie 3'b101(in starea neapasat sa fie tot 3'b010). 2. Realizati un modul care sa genereze un semnal al carui factor de umplere sa fie setat din primele 4 switch-uri, iar frecventa sa fie setata din ultimele 4 switch-uri.

7/7

Sugestii/nemultumiri/comentarii legate de platforma: lab@arh.pub.ro

initial begin clock = 0; forever #2 clock = ~clock; end initial begin rst = 1; #5 rst =0; end //aici se introduc instantele de module si alte modificari de parametri endmodule

S-ar putea să vă placă și