Sunteți pe pagina 1din 6

Ministerul Educatiei al Republicii Moldova

Universitatea Tehnica a Moldovei


Facultatea Calculatoare, Informatica si Microelectronica
Catedra Microelectronica si Ingineria Biomedicala

Raport


Lucrarea de laborator nr.2


La Disciplina: Proiectarea sistemelor digitale


Tema: Automate functionale





A efectuat: st. gr. MN-111 Magariu Nicolae

A verificat: lect.super., Bragarenco Andrei





Chisinau 2014
Obiective :
Studiul structurii si functionalitatii unui automat functional
Implementarea in Verilog a automatului MULE_S si testarea lui

Problema :
Sa se proiecteze un automat functional , sistem de ordinul SO2. Mai concret, realizarea
unui inmultitor pe 4 biti, avind interfata din semnalul de clock, reset, load si ready (semnal de
generare), si intrarile A si B, iesirea va fi P (produsul).



A_in

Aaassasdadasd<<a A P

B_in P

ready
LD





A

x R





B




Listingul programului:

module MULE_S (ck, rst, A_in, B_in, LD, P, ready);

parameter WIDTH=4; // marimea pentru numerele de intrare si iesire

input ck, rst, LD; //semnale de clock, reset si load
input [WIDTH-1:0] A_in, B_in; //termenii de intrare la inmultire

output [2*WIDTH-1:0] P; //produsul de dimensiune de 2 ori mai amre ca termenii de intrare
output ready;//semnal de generare

reg [WIDTH-1:0] A, B; //registri pentru valorile de intrare
reg [2*WIDTH-1:0] P; //registri pentru datele de iesire
R f<<

f


R f>> R

assign ready=((A==0)||(B==0)); //generarea atunci cand macar un registru e 0
always@ (negedge ck or posedge rst) //front negativ pentru ck si pozitiv pentru reset

if(rst) //inititalizarea registrilor interni
begin
A<=0;
B<=0;
P<=0;
end
else
if(ready) //daca e generat semnalul de ready
begin
if(LD) //daca este semnalul de LD
begin
if(A_in>B_in) //daca numarul A e mai mare ca
numarul B
begin
A<=A_in; //in registru A se transmite valoarea A_in
B<=B_in; //in registru B se transmite valoarea B_in
end
else
begin
A<=B_in; // schimbarea acestor doua numere cu
locurile
B<=A_in; // pentru micsorarea nr. de tacturi
end
end
end
else
begin
if(B[0]==1) //daca primul bit al numarului este 1
P<=P+A; //produsului i se atribuie valoarea P + numarul A
else
P<=P+0; // Produsului i se atribuie valoarea P
A=A<<1; //deplasarea A cu un bit la stinga
B=B>>1; //deplasarea lui B cu un bit la dreapta, de fapt
eliminarea ultimului bit, cu care deacum am inmultit
end
endmodule

module MUL_tb ();

parameter WIDTH=4; //marimea numerilor

//date de intrare le pun ca registru
reg [WIDTH-1:0]A_in,B_in; //datele de intrare
reg ck,rst; //semnalul de reset si de ck
reg [WIDTH-1:0]OP1,OP2;
reg [2*WIDTH-1:0]rez; //produsul de marime de 2 ori mai mare
reg LD; //semnalul de incarcare

//datele de iesire le pun ca wire

wire [2*WIDTH-1:0]P; //datele de iesire,produsul
wire ready; //semnalul


//datele initiale de la care porneste
initial
begin
A_in=0;
B_in=0;
ck=0;
//LD pune in 1, cu intirziuere de 20 unitati de timp
#20 LD=1;
end

initial begin
rst=1;
#10 rst=0; //schimbarea nivelui rst cu intirziere
#20 rst=1;
end
always
ck=!ck; //alternarea semnalului de ck

initial begin
repeat(10)
begin
A_in=$random;
B_in=$random;
MUL_task (OP1,OP2,rez);
if(rez!=OP1*OP2) //daca rez nu este egal cu produsul op1 si op2
begin //afisam la ecran eroare
$display("Error");
$stop ;
end
else
//afisam la display ultima iteratie , rezultatul final.
$display("-------------> result:ck=%b,
rst=%b,A_in=%d,B_in=%d,P=%d,LD=%b,ready=%b",ck,rst,A_in,B_in,P,LD,ready);

end
end


task MUL_task;

input[WIDTH-1:0]OP1,OP2; //valorile de intrare de 4 biti

output[2*WIDTH-1:0]rez; //valoarea de iesire de 8 biti

begin
while(!ready) //atita timp kit nu este gata
@(posedge ck) //la frontul pozitiv ck
A_in=OP1; //A se atribuie la OP1
B_in=OP2; //B se atribuie la OP2
@(posedge ck); //frontul negativ ck
LD=1;
@(posedge ck);
LD=0;
while(!ready) //atita timp kit nu este gata
@(posedge ck)
rez=P; //rez se atribui la Produs
end
endtask

endmodule




Simularea in Leonardo:










Concluzie:
In urma efectuarii acestei lucrari de laborator am implementat un automat functional de inmultire
a doua numere de 4 biti in limbajul Verilog, astfel folosind si intarind cunostintele teoretice in
practica.
Am avut nevoie si de un program de simulare cum este Leonardo pentru a simula
programul propriuzis si a vedea marimea circuitelor. In acest program am gasit niste erori pe
care nu le-a gasit calculatorul de asemenea am obtinut si circuitul electric principial al schemei
noastre.In final avind un rezultat pe care lam asteptat.

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