Запутался с FIFO, подскажите, пожалуйста, как лучше Дано: стартер борда с Циклон3 EP3C25. Имеется внутри модуль, который генерит с заданной частотой данные примерно такого вида:
output MyClock; // клок, 50MHz всегда (может быть в диапазоне 20-100МГц, но всегда один и тот же)
output DataAvailable; // 1 если сейчас данные имеются, и 0, если в массиве Data ничего нет,
// в среднем данные имеются только около 1% от тика
output [63:0] Data; // сами данные
Эти данные хочется сохранять во внутреннюю память и желательно во всю (ее ведь 600кбит в этом циклоне?), запоминать номер клока, и потом переправлять либо во внутреннюю DRAM (ее там 32МБайта) либо по двум портам как по сети.
Похоже мне нужен FIFO, но Альтеровский родной fifo чуть-чуть не подходит, так как он не запоминает время прихода сигнала.
Я попробовал написать самопальное FIFO, но оно даже не компилится, так как кончается память в синтезе...
Посоветуйте, пожалуйста, что здесь можно поправить, и на что надо обратить внимание!
Спасибо
Игорь
Сам текст моего FIFO:
module FIFO_With_Timer(MyClock, DataAvailable, InData, OutClock, OutData);
input MyClock; // клок, 50MHz всегда (может быть в диапазоне 20-100МГц, но всегда один и тот же)
input DataAvailable; // 1 если сейчас данные имеются, и 0, если в массиве Data ничего нет,
// в среднем данные имеются только около 1% от тика
input [63:0] InData; // сами данные
input OutClock; // клок для приема данных из буфера, около 1МГц
output [127:0] OutData; // =0, если данных в этом циклическом FIFO буфере нет вообще
reg [127:0] OutData;
reg [11:0] BeginPos; // позиция, куда записывать данные
reg [11:0] EndPos; // позиция, откуда считывать данные
// (пока проверки на переполнение нет!!!, по сути данных, если переполнение
// случилось, ну и ладно, потеряю один блок в 4096 данных)
reg [127:0] Data [0:4095]; // циклический массив данных, для FIFO
reg [63:0] CurTime; // счетчик тиков MyClock
reg [127:0] Temp; // временный массив
initial
begin
BeginPos=0;
EndPos=0;
CurTime=0;
end
always @(posedge MyClock)
begin
begin
Temp[127:64]<=InData;
Temp[63:0]<=CurTime;
CurTime<=CurTime+1;
end
if(DataAvailable)
begin
Data[BeginPos]<=Temp;
BeginPos<=BeginPos+1;
end
end
always @(posedge OutClock)
begin
if(BeginPos!=EndPos)
begin
OutData<=Data[EndPos];
EndPos<=EndPos+1;
end
else
OutData=0;
end
endmodule
PS: редактировал это сообщение чтобы по красивее расположить комментарии