Помогайте коллективным разумом, вроде изменил доступ к массиву до двухпортового, но все еще не компилится... Через 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
-
- Ругается то что не может разместить в блочную память. У тебя используется асинхронное чтение. Вот тут: Ruslan(1504 знак., 03.04.2010 00:26 - 00:30)
- Вот пример из help-а кварутса. Ruslan(705 знак., 03.04.2010 00:33)
- Еще одно замечание. Везде упоминается 400 Мгц. Сомневаюсь что такой частоте можно будет запустить ОЗУ в 3-м циклоне. - Ruslan(03.04.2010 06:03 - 17:52)
- Вот пример из help-а кварутса. Ruslan(705 знак., 03.04.2010 00:33)
- Ругается то что не может разместить в блочную память. У тебя используется асинхронное чтение. Вот тут: Ruslan(1504 знак., 03.04.2010 00:26 - 00:30)