Привет друзья!
Хочу реализовать модуль асинхронного FIFO на внешней SRAM микросхеме памяти. Суть в том что есть два чипа EPM570 и CY7C1041DV33. из этой связки стоит задача выжать нечто типа асинхронного фифо, кольцевой буфер памяти.
Написал код, но он хоть и работает, но работает через раз.
Помогите чем множите, буду признателен очень!!!!!!!!!!!!!
Может идеи какие есть или советы? За ранее спасибо!!!
Код:
module FIFO_SRAM(
input Reset,
input Wclk,
input Rclk,
input Rd,
input Wd,
output full,
output empty,
input [DATA-1:0] Din,
output reg [DATA-1:0] Dout,
output [ADDR-1:0] Addr_Sram,
inout [DATA-1:0] Data_Sram,
output nCS,
output nOE,
output nWE
);
parameter ADDR = 4; // Параметр разрядности Адреса SRAM
parameter DATA = 4; // Параметр разрядности Данных SRAM
//--- Счётчики адресов чтения и записи ----------
assign Addr_Sram = (Wd) ? write_addr[ADDR-1 : 0] : read_addr[ADDR-1 : 0];
reg [ADDR:0] read_addr=0;
always @(posedge Rclk) //По такту чтения
begin
if(Reset)
begin
read_addr <= 0;
end
else
begin
if (Rd) read_addr <= read_addr + 1'b1;
else read_addr <= read_addr;
end
end
//---
reg [ADDR:0] write_addr=0;
always @(posedge Wclk) //По такту записи
begin
if(Reset)
begin
write_addr <= 0;
end
else
begin
if (Wd) write_addr <= write_addr + 1'b1;
else write_addr <= write_addr;
end
end
//--- Абработка флагов заполненности ФИФО ----------
assign full = ((write_addr[ADDR-1:0] == read_addr[ADDR-1:0]) && (write_addr[ADDR] ^ read_addr[ADDR]))? 1'b1 : 1'b0; //Фифо полное
assign empty = ((write_addr[ADDR-1:0] == read_addr[ADDR-1:0]) && (!(write_addr[ADDR] ^ read_addr[ADDR])))? 1'b1 : 1'b0; //Фифо пустое
//--- Логика комутации данных ----------
wire [DATA-1 : 0] bus_data_out;
always@(posedge Wd or posedge Rd)
begin
Dout <= bus_data_out; //При любом запросе пишим на выход
end
assign bus_data_out = (Wd & empty)? Din : 'bz ; //Если запись и фифо пустое то со входа пишем на прямую в выходной регистр
assign Data_Sram = (Wd & ~empty)? Din : 'bz ; //Если запись и в выходном регистре не пусто то заполняем SRAM
assign bus_data_out = (~Wd & Rd)? Data_Sram : 'bz ; //Если нет записи, но есть чтение то из SRAM в выходной регистр
assign nCS = ~(Wd | Rd); //Разрешение чипа SRAM
assign nOE = ~(Rd); //Чтение чипа SRAM
assign nWE = ~(Wd); //Запись чипа SRAM
endmodule