S
shyamsundar
Guest
Hi everybody IM încearcă să scrie un cod pentru FIFO şi a luat acest eşantion din plasă.ACUM am scris O TESTBENCH pentru aceasta şi ÎN FUNCŢIONALE SIMULARE chat nu pot obţine citească şi să scrie indicatori actualizate.A putea anyone ajutã rezolva aceasta problema?
Modulul de fifo2 (CLK, RST, FR, FW, date, out);
parametru fifo_width = 8, fifo_depth = 16, ptr_width = 4;
CLK de intrare, RST, FR, FW;
intrare [fifo_width-1: 0] date;
ieşire [fifo_width-1: 0] out;
sârmă pline, goale;
j integer;
reg [fifo_width-1: 0] out;
reg [ptr_width-1: 0] WP;
reg [ptr_width-1: 0] RP;
reg [fifo_width-1: 0] stack [fifo_depth-1: 0];
reg [ptr_width-1: 0] fifo_count;
/***********************************************
Dacă aceasta este o scriere de acces, pune datele de pe
autobuz de intrare în locul indicat de către
FIFO scrie indicatorul
************************************************/
always @ (posedge CLK)
începe
în cazul în care (FW) începe
stiva [WP] <= de date;
final
final
/***********************************************
Dacă aceasta este o citeşte obţine date, care este în
locaţia indicată de indicatorul citit
şi pune-l pe autobuz de ieşire
************************************************/
always @ (posedge CLK)
începe
în cazul în care (FR) începe
out <= stiva [RP];
final
final
/************************************************
Increment scrie indicatorul pe fiecare scrie şi a
indicatorul citit pe fiecare citeşte
************************************************/
always @ (posedge CLK)
în cazul în care (RST)
WP <= 0;
alt
WP <= (FW)?WP 1: WP;
always @ (posedge CLK)
în cazul în care (RST)
rp <= 0;
alt
rp <= (FR)?RP 1: RP;/*********************************************
Increment FIFO contor pe fiecare scrie şi a
decrement pe fiecare citeşte
**********************************************/
always @ (posedge CLK)
începe
în cazul în care (RST) începe
fifo_count <= 0;
final
else begin
caz ((FW, fr))
2'b00: fifo_count <= fifo_count;
2'b01: fifo_count <= (fifo_count == 0)?fifo_depth: fifo_count - 1;
2'b10: fifo_count <= (fifo_count == fifo_depth)?0: fifo_count 1;
2'b11: fifo_count <= fifo_count;
endcase
final
final
/ / aloca fifo_hf = (fifo_count> = 4);
/ / aloca fifo_he = (fifo_count <= 4);
atribui gol = (fifo_count == 0);
atribuiţi complet = (fifo_count> = fifo_depth);
endmodule / / de FIFO//----------------------------- TEST BENCH ----------------- ------------------------------
fifo_tb modul;
parametru fifo_width = 8, fifo_depth = 16, ptr_width = 4;
reg CLK, RST, FR, FW;
reg [fifo_width-1: 0] date;
sârmă [fifo_width-1: 0] out;
sârmă pline, goale;
h integer;
reg [ptr_width-1: 0] WP = 0, mp = 0;
reg [ptr_width-1: 0] rp = 0;
reg [fifo_width-1: 0] MEM [fifo_depth-1: 0];
reg [ptr_width-1: 0] fifo_count;
fifo2 F1 (CLK, RST, FR, FW, date, out);
iniţial
începe
CLK = 1'b1;
RST = 1'b1;
$ readmemb ( "stimuli_fifo.txt", MEM);
h = $ fopen ( "result_fifo.txt");
# 20 RST = 1'b0;
final
întotdeauna
# 5 CLK = ~ CLK;
iniţial
începe
# 30 FW = 1'b1;
# 30 FR = 1'b1;
# 120 FW = 1'b0;
# 10 FR = 1'b0;
final
always @ (posedge CLK)
începe
în cazul în care (FW)
începe
de date = mem [MP];
MP MP = 1; / / Increment MEM INDEX
în cazul în care (complet)
Display $ ( "PREAPLIN FIFO");
else if (gol)
Display $ ( "UNDERFLOW FIFO");
final
final
always @ (posedge CLK)
începe
Display $ ( "out =% d, date =% d", afară, date);
Display $ ( "fifo_count =% d", fifo_count);
fdisplay $ (h, "out =% d", out);
final
endmodule [/ quote] [/ code]
Modulul de fifo2 (CLK, RST, FR, FW, date, out);
parametru fifo_width = 8, fifo_depth = 16, ptr_width = 4;
CLK de intrare, RST, FR, FW;
intrare [fifo_width-1: 0] date;
ieşire [fifo_width-1: 0] out;
sârmă pline, goale;
j integer;
reg [fifo_width-1: 0] out;
reg [ptr_width-1: 0] WP;
reg [ptr_width-1: 0] RP;
reg [fifo_width-1: 0] stack [fifo_depth-1: 0];
reg [ptr_width-1: 0] fifo_count;
/***********************************************
Dacă aceasta este o scriere de acces, pune datele de pe
autobuz de intrare în locul indicat de către
FIFO scrie indicatorul
************************************************/
always @ (posedge CLK)
începe
în cazul în care (FW) începe
stiva [WP] <= de date;
final
final
/***********************************************
Dacă aceasta este o citeşte obţine date, care este în
locaţia indicată de indicatorul citit
şi pune-l pe autobuz de ieşire
************************************************/
always @ (posedge CLK)
începe
în cazul în care (FR) începe
out <= stiva [RP];
final
final
/************************************************
Increment scrie indicatorul pe fiecare scrie şi a
indicatorul citit pe fiecare citeşte
************************************************/
always @ (posedge CLK)
în cazul în care (RST)
WP <= 0;
alt
WP <= (FW)?WP 1: WP;
always @ (posedge CLK)
în cazul în care (RST)
rp <= 0;
alt
rp <= (FR)?RP 1: RP;/*********************************************
Increment FIFO contor pe fiecare scrie şi a
decrement pe fiecare citeşte
**********************************************/
always @ (posedge CLK)
începe
în cazul în care (RST) începe
fifo_count <= 0;
final
else begin
caz ((FW, fr))
2'b00: fifo_count <= fifo_count;
2'b01: fifo_count <= (fifo_count == 0)?fifo_depth: fifo_count - 1;
2'b10: fifo_count <= (fifo_count == fifo_depth)?0: fifo_count 1;
2'b11: fifo_count <= fifo_count;
endcase
final
final
/ / aloca fifo_hf = (fifo_count> = 4);
/ / aloca fifo_he = (fifo_count <= 4);
atribui gol = (fifo_count == 0);
atribuiţi complet = (fifo_count> = fifo_depth);
endmodule / / de FIFO//----------------------------- TEST BENCH ----------------- ------------------------------
fifo_tb modul;
parametru fifo_width = 8, fifo_depth = 16, ptr_width = 4;
reg CLK, RST, FR, FW;
reg [fifo_width-1: 0] date;
sârmă [fifo_width-1: 0] out;
sârmă pline, goale;
h integer;
reg [ptr_width-1: 0] WP = 0, mp = 0;
reg [ptr_width-1: 0] rp = 0;
reg [fifo_width-1: 0] MEM [fifo_depth-1: 0];
reg [ptr_width-1: 0] fifo_count;
fifo2 F1 (CLK, RST, FR, FW, date, out);
iniţial
începe
CLK = 1'b1;
RST = 1'b1;
$ readmemb ( "stimuli_fifo.txt", MEM);
h = $ fopen ( "result_fifo.txt");
# 20 RST = 1'b0;
final
întotdeauna
# 5 CLK = ~ CLK;
iniţial
începe
# 30 FW = 1'b1;
# 30 FR = 1'b1;
# 120 FW = 1'b0;
# 10 FR = 1'b0;
final
always @ (posedge CLK)
începe
în cazul în care (FW)
începe
de date = mem [MP];
MP MP = 1; / / Increment MEM INDEX
în cazul în care (complet)
Display $ ( "PREAPLIN FIFO");
else if (gol)
Display $ ( "UNDERFLOW FIFO");
final
final
always @ (posedge CLK)
începe
Display $ ( "out =% d, date =% d", afară, date);
Display $ ( "fifo_count =% d", fifo_count);
fdisplay $ (h, "out =% d", out);
final
endmodule [/ quote] [/ code]