ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
4 декабря
187883 Топик полностью
IgorChem (02.04.2010 22:09 - 23:05, просмотров: 456) ответил IgorChem на Не компилится Verilog проект в квартусе. Вылетает с ошибкой Out of Memory (типа 2ГБ оперативки закончилось). Помогите,пожалуйста, разобраться.
Помогайте коллективным разумом, вроде изменил доступ к массиву до двухпортового, но все еще не компилится... Через 5 минут синтеза оборвал на 9%. Как я понимаю, загвоздка в двух сообщениях:
Info: Found 2 instances of uninferred RAM logic
     Info: RAM logic "RingData" is uninferred due to asynchronous read logic
     Info: RAM logic "TimeStep" is uninferred due to inappropriate RAM size
Warning: Cannot convert all sets of registers into RAM megafunctions when creating nodes;
         therefore the resulting number of registers remaining in design can cause longer
         compilation time or result in insufficient memory to complete Analysis and Synthesis
Текст проекта ниже. Сейчас я смог логически все преобразовать так, что после множества проверок я в ОДНОМ месте с тактом 50МГц пишу в циклический буфер RingData изредка приписывая в другой циклический массив TimeStep еще одно слово. По клоку на выход я выдаю информацию побитно из 80 битного массива CurShiftData во внешний мир. Если в массиве CurShiftData закончились данные, я, в зависимости от ситуации, беру их из одного из циклических буферов RingData или TimeStep. То есть к RingData и TimeStep я обращаюсь на запись с частотой 50МГц и 50КГц соответствено, а на чтение 1МГц и 1КГц. Клоки: InReady - 400МГц, OutClock - 1-10МГц. Помогите, пожалуйста, разобраться, что я опять сделал не так! PS: отредактировал текст ниже упростив его по максимому. Спасибо Игорь
module My_First_Project (InData, InReady, OutClock, OutData);
parameter MaxK=8;
parameter MaxN=MaxK*1024;
input  [7:0] InData;
input  InReady, OutClock;
output OutData;
reg    OutData;

reg signed [15:0] LocData1, aLD0, aLD1, aLD2, aLD3, aLD4;
reg signed [15:0] LD0, LD1, LD2, LD3, LD4;
reg [1:0] DeMuxCounter;
reg [7:0] Temp;

reg [63:0] H00, H01, H02, H03, H04, H05, H06, H07, H08, H09;
reg [63:0] H10, H11, H12, H13, H14, H15, H16, H17, H18, H19;
reg [63:0] H20, H21, H22, H23, H24, H25, H26, H27, H28, H29;
reg [63:0] H30, H31, H32, H33, H34, H35, H36, H37, H38, H39;

reg [63:0]      G01, G02, G03, G04, G05, G06, G07, G08, G09;
reg [63:0] G10, G11, G12, G13, G14, G15, G16, G17, G18, G19;
reg [63:0] G20, G21, G22, G23, G24, G25, G26, G27, G28, G29;
reg [63:0] G30, G31, G32, G33, G34, G35, G36, G37, G38, G39;

reg [15:0] NadoT;
reg [63:0] CurTime;
reg        NextStep;

reg [63:0] RingData [0:MaxN-1];
reg [63:0] TimeStep [0:MaxK-1];

reg [12:0] BeginPos;
reg [12:0] EndPos;

reg [79:0] CurShiftData;
reg [6:0]  CurPos;
reg EndPosSw;

initial
begin
  CurTime=0;
  NadoT=0;
  DeMuxCounter=0;
  BeginPos=0;
  EndPos=0;
  CurPos=79;
  EndPosSw=1;
end


always @(posedge InReady)
begin
  LocData1={InData[0], Temp[0], InData[1], Temp[1], InData[2], Temp[2], InData[3], Temp[3],
            InData[4], Temp[4], InData[5], Temp[5], InData[6], Temp[6], InData[7], Temp[7]};
end


always @(negedge InReady) Temp<=InData;


always @(LocData1)
begin
  if(DeMuxCounter)
  begin
    DeMuxCounter<=DeMuxCounter+1;
    {aLD0, aLD1, aLD2, aLD3, aLD4}<={aLD1, aLD2, aLD3, aLD4, LocData1};
    NextStep<=0;
  end
  else
  begin
    DeMuxCounter<=DeMuxCounter+1;
    {aLD0, aLD1, aLD2, aLD3, aLD4} <= {aLD1, aLD2, aLD3, aLD4, LocData1};
    {LD0, LD1, LD2, LD3, LD4} <= {aLD1, aLD2, aLD3, aLD4, LocData1};
    NextStep<=1;
  end
end


always @(posedge NextStep)
begin
  begin
    G39<=H38; G38<=H37; G37<=H36; G36<=H35; G35<=H34; G34<=H33; G33<=H32; G32<=H31; G31<=H30; G30<=H29;
    G29<=H28; G28<=H27; G27<=H26; G26<=H25; G25<=H24; G24<=H23; G23<=H22; G22<=H21; G21<=H20; G20<=H19;
    G19<=H18; G18<=H17; G17<=H16; G16<=H15; G15<=H14; G14<=H13; G13<=H12; G12<=H11; G11<=H10; G10<=H09;
    G09<=H08; G08<=H07; G07<=H06; G06<=H05; G05<=H04; G04<=H03; G03<=H02; G02<=H01; G01<=H00;

    if(NadoT)
    begin
      RingData[BeginPos]=H39;
      NadoT=NadoT-1;
      if((BeginPos&1023)==0) TimeStep[BeginPos[12:10]]=CurTime;
      BeginPos=BeginPos+1;
    end
  end
 
  begin
    CurTime<=CurTime+1;
  
    H39<=G39; H38<=G38; H37<=G37; H36<=G36; H35<=G35; H34<=G34; H33<=G33; H32<=G32; H31<=G31; H30<=G30;
    H29<=G29; H28<=G28; H27<=G27; H26<=G26; H25<=G25; H24<=G24; H23<=G23; H22<=G22; H21<=G21; H20<=G20;
    H19<=G19; H18<=G18; H17<=G17; H16<=G16; H15<=G15; H14<=G14; H13<=G13; H12<=G12; H11<=G11; H10<=G10;
    H09<=G09; H08<=G08; H07<=G07; H06<=G06; H05<=G05; H04<=G04; H03<=G03; H02<=G02; H01<=G01;
    H00<={LD1, LD2, LD3, LD4};

    if(LD1>=2000 && LD2>=2000 && LD3>=2000 && LD4>=2000)
    begin
      NadoT<=(NadoT&1023)+3072;
    end
  end
end

always @(posedge OutClock)
begin
  {CurShiftData[78:0], OutData}=CurShiftData;
  CurPos=CurPos-1;
  if(CurPos==0)
  begin
    CurPos=79;
    CurShiftData[79:64]=EndPos;
    if((EndPos&1023)==0 && EndPosSw)
    begin
      CurShiftData[63:0]=TimeStep[EndPos[12:10]];
      EndPosSw=0;
    end
    else
    begin
      CurShiftData[63:0]=RingData[EndPos];
      EndPosSw=1;
      EndPos=EndPos+1;
    end
  end
end
endmodule