Например TDA7294

Форум РадиоКот • Просмотр темы - FIFO external Sram
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Вс сен 21, 2025 10:03:15

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: FIFO external Sram
СообщениеДобавлено: Чт сен 24, 2015 14:50:10 
Нашел транзистор. Понюхал.
Аватар пользователя

Зарегистрирован: Ср окт 07, 2009 12:27:03
Сообщений: 190
Откуда: Tver
Рейтинг сообщения: 0
Привет друзья!
Хочу реализовать модуль асинхронного 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


_________________
Я мог бы изменить весь Мир, но бог зажал исходники :(


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ 1 сообщение ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y