S
shyamsundar
Guest
HI EVERYBODY И. пытается писать код для FIFO и получил Этот пример из сети.Теперь надо было написано TESTBENCH для этого и в функциональном МОДЕЛИРОВАНИЕ чата не могут получить чтения и записи указателями обновляется.Может ли кто помочь решить эту проблему?
Модуль fifo2 (CLK, RST, FR, FW, данные, OUT);
Параметр fifo_width = 8, fifo_depth = 16, ptr_width = 4;
ввод CLK, RST, FR, FW;
вход [fifo_width-1: 0] данные;
Мощность [fifo_width-1: 0] Out;
Проволока полный, пустой;
Целое J;
REG [fifo_width-1: 0] Out;
REG [ptr_width-1: 0] WP;
REG [ptr_width-1: 0] RP;
REG [fifo_width-1: 0] стек [fifo_depth-1: 0];
REG [ptr_width-1: 0] fifo_count;
/***********************************************
Если это запись, поставить данные на
ввод автобуса в месте, на которое указывает
FIFO Напишите указателю
************************************************/
Всегда @ (posedge CLK)
начинать
если (FW) начать
Стек [WP] <= данные;
конец
конец
/***********************************************
Если это читать получить данные, которые в
Место, на которое указывает читать указатели
и поместить ее в выходной шины
************************************************/
Всегда @ (posedge CLK)
начинать
если (FR) начать
Выйти <= стек [RP];
конец
конец
/************************************************
Прирост записи указателя на каждом писать и
читать указатели на каждом чтении
************************************************/
Всегда @ (posedge CLK)
если (RST)
WP <= 0;
еще
WP <= (FW)?РГ 1: РГ;
Всегда @ (posedge CLK)
если (RST)
RP <= 0;
еще
RP <= (FR)?RP 1: RP;/*********************************************
FIFO Увеличение счетчика на каждом писать и
декремент на каждом чтении
**********************************************/
Всегда @ (posedge CLK)
начинать
если (РСТ) начала
fifo_count <= 0;
конец
ELSE BEGIN
случай ((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
конец
конец
/ / присвоить fifo_hf = (fifo_count> = 4);
/ / присвоить fifo_he = (fifo_count <= 4);
назначить пусто = (fifo_count == 0);
назначить полной = (fifo_count> = fifo_depth);
ENDMODULE / / из FIFO//----------------------------- Испытательный стенд ----------------- ------------------------------
Модуль fifo_tb;
Параметр fifo_width = 8, fifo_depth = 16, ptr_width = 4;
р CLK, RST, FR, FW;
REG [fifo_width-1: 0] данные;
проволоки [fifo_width-1: 0] Out;
Проволока полный, пустой;
Целое ч;
REG [ptr_width-1: 0] WP = 0, Мп = 0;
REG [ptr_width-1: 0] РП = 0;
REG [fifo_width-1: 0] тет [fifo_depth-1: 0];
REG [ptr_width-1: 0] fifo_count;
fifo2 F1 (CLK, RST, FR, FW, данные, OUT);
первоначальный
начинать
CLK = 1'b1;
RST = 1'b1;
$ readmemb ( "stimuli_fifo.txt", MEM);
H = $ FOPEN ( "result_fifo.txt");
RST # 20 = 1'b0;
конец
всегда
# 5 = ~ CLK CLK;
первоначальный
начинать
# 30 FW = 1'b1;
# 30 FR = 1'b1;
# 120 FW = 1'b0;
# 10 FR = 1'b0;
конец
Всегда @ (posedge CLK)
начинать
если (FW)
начинать
Data = Mem [MP];
MP MP = 1; / / Увеличение Mem ИНДЕКС
если (полная)
$ DISPLAY ( "FIFO Overflow");
Else If (пусто)
$ DISPLAY ( "буфер FIFO");
конец
конец
Всегда @ (posedge CLK)
начинать
$ DISPLAY ( "Out =% D, данные =% D", то данные);
$ DISPLAY ( "fifo_count =% D", fifo_count);
fdisplay $ (H, "Out =% D", OUT);
конец
ENDMODULE [/ QUOTE] [/ CODE]
Модуль fifo2 (CLK, RST, FR, FW, данные, OUT);
Параметр fifo_width = 8, fifo_depth = 16, ptr_width = 4;
ввод CLK, RST, FR, FW;
вход [fifo_width-1: 0] данные;
Мощность [fifo_width-1: 0] Out;
Проволока полный, пустой;
Целое J;
REG [fifo_width-1: 0] Out;
REG [ptr_width-1: 0] WP;
REG [ptr_width-1: 0] RP;
REG [fifo_width-1: 0] стек [fifo_depth-1: 0];
REG [ptr_width-1: 0] fifo_count;
/***********************************************
Если это запись, поставить данные на
ввод автобуса в месте, на которое указывает
FIFO Напишите указателю
************************************************/
Всегда @ (posedge CLK)
начинать
если (FW) начать
Стек [WP] <= данные;
конец
конец
/***********************************************
Если это читать получить данные, которые в
Место, на которое указывает читать указатели
и поместить ее в выходной шины
************************************************/
Всегда @ (posedge CLK)
начинать
если (FR) начать
Выйти <= стек [RP];
конец
конец
/************************************************
Прирост записи указателя на каждом писать и
читать указатели на каждом чтении
************************************************/
Всегда @ (posedge CLK)
если (RST)
WP <= 0;
еще
WP <= (FW)?РГ 1: РГ;
Всегда @ (posedge CLK)
если (RST)
RP <= 0;
еще
RP <= (FR)?RP 1: RP;/*********************************************
FIFO Увеличение счетчика на каждом писать и
декремент на каждом чтении
**********************************************/
Всегда @ (posedge CLK)
начинать
если (РСТ) начала
fifo_count <= 0;
конец
ELSE BEGIN
случай ((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
конец
конец
/ / присвоить fifo_hf = (fifo_count> = 4);
/ / присвоить fifo_he = (fifo_count <= 4);
назначить пусто = (fifo_count == 0);
назначить полной = (fifo_count> = fifo_depth);
ENDMODULE / / из FIFO//----------------------------- Испытательный стенд ----------------- ------------------------------
Модуль fifo_tb;
Параметр fifo_width = 8, fifo_depth = 16, ptr_width = 4;
р CLK, RST, FR, FW;
REG [fifo_width-1: 0] данные;
проволоки [fifo_width-1: 0] Out;
Проволока полный, пустой;
Целое ч;
REG [ptr_width-1: 0] WP = 0, Мп = 0;
REG [ptr_width-1: 0] РП = 0;
REG [fifo_width-1: 0] тет [fifo_depth-1: 0];
REG [ptr_width-1: 0] fifo_count;
fifo2 F1 (CLK, RST, FR, FW, данные, OUT);
первоначальный
начинать
CLK = 1'b1;
RST = 1'b1;
$ readmemb ( "stimuli_fifo.txt", MEM);
H = $ FOPEN ( "result_fifo.txt");
RST # 20 = 1'b0;
конец
всегда
# 5 = ~ CLK CLK;
первоначальный
начинать
# 30 FW = 1'b1;
# 30 FR = 1'b1;
# 120 FW = 1'b0;
# 10 FR = 1'b0;
конец
Всегда @ (posedge CLK)
начинать
если (FW)
начинать
Data = Mem [MP];
MP MP = 1; / / Увеличение Mem ИНДЕКС
если (полная)
$ DISPLAY ( "FIFO Overflow");
Else If (пусто)
$ DISPLAY ( "буфер FIFO");
конец
конец
Всегда @ (posedge CLK)
начинать
$ DISPLAY ( "Out =% D, данные =% D", то данные);
$ DISPLAY ( "fifo_count =% D", fifo_count);
fdisplay $ (H, "Out =% D", OUT);
конец
ENDMODULE [/ QUOTE] [/ CODE]