Запутался с 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 endmodulePS: редактировал это сообщение чтобы по красивее расположить комментарии