| Форум РадиоКот https://radiokot.ru/forum/ |
|
| FIFO external Sram https://radiokot.ru/forum/viewtopic.php?f=60&t=121338 |
Страница 1 из 1 |
| Автор: | Uragan90 [ Чт сен 24, 2015 14:50:10 ] |
| Заголовок сообщения: | FIFO external Sram |
Привет друзья! Хочу реализовать модуль асинхронного 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 из 1 | Часовой пояс: UTC + 3 часа |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|


