ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
5 мая
184330
IgorChem (08.03.2010 14:18 - 15:39, просмотров: 775)
Запутался с 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: редактировал это сообщение чтобы по красивее расположить комментарии