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
Нещодавно я написав коду для асинхронних 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