qusetion на асинхронні FIFO

H

Hover

Guest
Привет, все

Нещодавно я написав коду для асинхронних FIFO.
Нижче наведений мій код:Код:

Модуль asyn_FIFO (Data_out, FIFO_full, FIFO_empty, Data_in, write_clk, read_clk, write_to_FIFO, read_from_FIFO, скидання);Параметр FIFO_width = 8;

Параметр FIFO_height = 8;

Параметр FIFO_ptr_width = 3;Потужність [FIFO_width-1: 0] Data_out;

вихідний FIFO_full;

вихідний FIFO_empty;вхід [FIFO_width-1: 0] Data_in;

введення write_clk;

введення read_clk;

введення write_to_FIFO;

введення read_from_FIFO;

введення RESET;REG [FIFO_ptr_width-1: 0] write_addr, read_addr;

REG [FIFO_width-1: 0] Data_out;

REG [FIFO_width-1: 0] FIFO [FIFO_height-1: 0];Дріт read_synch;

Дріт write_synch;

дроту [FIFO_width-1: 0] Data_middle;Integer I;призначити FIFO_full = ((write_addr == read_addr) & & (write_to_FIFO == 1));

призначити FIFO_empty = ((write_addr == read_addr) & & (read_from_FIFO == 1));Завжди @ (posedge write_clk або posedge скидання)

якщо (скинути) почати

write_addr <= 3'b000;

для (i = 0; i <= FIFO_height-1; I = I 1)

FIFO <= 8'b0000_0000;

кінець

Else If ((write_synch )&&(! FIFO_full)) почати

FIFO [write_addr] <= Data_middle;

write_addr <= write_addr 1;

кінецьЗавжди @ (posedge read_clk або posedge скидання)

якщо (скинути) почати

read_addr <= 3'b000;

Data_out <= 8'b0000_0000;

кінець

ELSE BEGIN

If ((read_synch )&&(! FIFO_empty)) почати

Data_out <= FIFO [read_addr];

read_addr <= read_addr 1;

кінець

кінецьsynchronizer_write S1 (Data_middle, write_synch, write_clk, write_to_FIFO, скидання, Data_in);

synchronizer_read S2 (read_synch, read_from_FIFO, read_clk, скидання);ENDMODULEМодуль synchronizer_write (Data_out, write_synch, CLK, Data_valid, скидання, Data_in);Параметр Data_width = 8;Потужність [Data_width-1: 0] Data_out;

вихідний write_synch;введення CLK;

введення RESET;

введення Data_valid;

вхід [Data_width-1: 0] Data_in;р Data_valid_synch;

р write_synch;

REG [Data_width-1: 0] Data_out;Завжди @ (posedge CLK або posedge скидання)

якщо (скинути) почати

Data_valid_synch <= 0;

write_synch <= 0;

кінець

ELSE BEGIN

Data_valid_synch <= Data_valid;

write_synch <= Data_valid_synch;

кінецьЗавжди @ (posedge CLK або posedge скидання)

якщо (скинути)

Data_out <= 8'b0000_0000;

ELSE BEGIN

якщо (write_synch)

Data_out <= Data_in;

кінецьENDMODULEМодуль synchronizer_read (read_synch, read_from_FIFO, CLK, скидання);вихідний read_synch;

введення read_from_FIFO;

введення CLK;

введення RESET;р meta_synch, read_synch;Завжди @ (posedge CLK або posedge скидання)

якщо (скинути) почати

meta_synch <= 0;

read_synch <= 0;

кінець

ELSE BEGIN

meta_synch <= read_from_FIFO;

read_synch <= meta_synch;

кінецьENDMODULE
 
Я боюся, що ви cann't додати "Count <= кол-1" під кодом "write_addr <= write_addr 1" і "Граф <= кол-1" під кодом "read_addr <= read_addr-1".Якщо ви це зробите, раси будуть виникати стан і призводить до помилки.
Загальний спосіб реалізації asynchorous FIFO є використання коду Грея для запису адрес і прочитав адресу.Тоді ви можете порівняти дві адреси, щоб знати, чи є FIFO є повним або порожнім.

 

Welcome to EDABoard.com

Sponsor

Back
Top