помогите еще раз пожалуйста, не могу разобраться упираюсь ли я в теоретический пик, или есть какое-то решение...
Есть оцифровщик, который валит по 8 лвдс на ужасной скорости данные. Надо их собрать и распараллелить, послав по 56 ногам, но, уже в 3.5 раза медленнее. Хочу потренироваться на кошках, то есть, например, на одной терасиковской борде DE2.
У оцифровщика есть два клока: фрейм и дата клоки, фрейм работает на частоте Х по двум фронтам, а дата клок - на скорости Х*3.5 по двум фронтам. В пике Х=125МГц, сейчас мои кошки тренируются на Х=800/7МГц, то есть около 114МГц при датаклоке 400МГц.
Пытаюсь скомпилить функцию, и не вписываюсь по Fast 1200mV Minimum Pulse Width со слаком в -0.4нс, в Slow все в порядке.
Понимаю, что если уронить частоту до 98МГц, то все получиться, но вдруг можно работать на большей частоте? У меня и так оцифровщик на 125МГц расчитан, и для меня падение с 125 до 98 МГц уже будет существенным. Вдруг я что-то не так делаю, не так с данными по двум фронтам работаю, и что-то не понимаю, посоветуйте, пожалуйтса!
Код
module Input(ClkFrame, ClkData, In, ClkFirst, OutData);
input ClkFrame /*800/7MHz*/, ClkData /*400MHz*/, ClkFirst /*800/7MHz output clock*/;
input [7:0] In /* input data on both fronts with 400MHz*/;
output reg [13:0] OutData[0:3] /* output data on both fronts with 800/7MHz */;
// Memory ////////////////////////////
reg [2:0] ShiftInd[0:7];
reg [2:0] OutPos;
reg [1:0] InPos;
reg [55:0] FIFO1[0:3], FIFO2[0:3];
reg [13:0] AllIn[0:7];
reg [55:0] AllInDM[0:3];
reg OldState0, OldState1;
// Main Activity ////////////////////
initial
begin
ShiftInd[0]=5;
ShiftInd[1]=4;
ShiftInd[2]=1;
ShiftInd[3]=1;
ShiftInd[4]=1;
ShiftInd[5]=1;
ShiftInd[6]=1;
ShiftInd[7]=6;
end
always @(posedge ClkFirst)
begin
OutPos<=OutPos+1;
{OutData[0], OutData[1], OutData[2], OutData[3]}<=(OutPos[0])?FIFO1[OutPos[2:1]]:FIFO2[OutPos[2:1]];
end
always @(negedge ClkData)
begin
for(int j=0; j<8; j++)
begin
AllIn[j][0]<=In[j];
for(int i=0; i<14; i+=2)
AllIn[j][i+2]<=AllIn[j][i];
end
if(ClkFrame!=OldState0)
begin
OldState0<=ClkFrame;
AllInDM[0]<={AllIn[0], AllIn[2], AllIn[4], AllIn[6]};
AllInDM[2]<=AllInDM[0];
end
end
always @(posedge ClkData)
begin
for(int j=0; j<8; j++)
begin
AllIn[j][1]<=In[j];
for(int i=1; i<14; i+=2)
AllIn[j][i+2]<=AllIn[j][i];
end
if(ClkFrame!=OldState1)
begin
OldState1<=ClkFrame;
AllInDM[1]<={AllIn[1], AllIn[3], AllIn[5], AllIn[7]};
AllInDM[3]<=AllInDM[1];
end
end
always @(negedge ClkFrame) FIFO1[InPos]<=AllInDM[2];
always @(posedge ClkFrame)
begin
FIFO2[InPos]<=AllInDM[3];
InPos<=(InPos)?InPos+1:ShiftInd[OutPos];
end
endmodule
input ClkFrame /*800/7MHz*/, ClkData /*400MHz*/, ClkFirst /*800/7MHz output clock*/;
input [7:0] In /* input data on both fronts with 400MHz*/;
output reg [13:0] OutData[0:3] /* output data on both fronts with 800/7MHz */;
// Memory ////////////////////////////
reg [2:0] ShiftInd[0:7];
reg [2:0] OutPos;
reg [1:0] InPos;
reg [55:0] FIFO1[0:3], FIFO2[0:3];
reg [13:0] AllIn[0:7];
reg [55:0] AllInDM[0:3];
reg OldState0, OldState1;
// Main Activity ////////////////////
initial
begin
ShiftInd[0]=5;
ShiftInd[1]=4;
ShiftInd[2]=1;
ShiftInd[3]=1;
ShiftInd[4]=1;
ShiftInd[5]=1;
ShiftInd[6]=1;
ShiftInd[7]=6;
end
always @(posedge ClkFirst)
begin
OutPos<=OutPos+1;
{OutData[0], OutData[1], OutData[2], OutData[3]}<=(OutPos[0])?FIFO1[OutPos[2:1]]:FIFO2[OutPos[2:1]];
end
always @(negedge ClkData)
begin
for(int j=0; j<8; j++)
begin
AllIn[j][0]<=In[j];
for(int i=0; i<14; i+=2)
AllIn[j][i+2]<=AllIn[j][i];
end
if(ClkFrame!=OldState0)
begin
OldState0<=ClkFrame;
AllInDM[0]<={AllIn[0], AllIn[2], AllIn[4], AllIn[6]};
AllInDM[2]<=AllInDM[0];
end
end
always @(posedge ClkData)
begin
for(int j=0; j<8; j++)
begin
AllIn[j][1]<=In[j];
for(int i=1; i<14; i+=2)
AllIn[j][i+2]<=AllIn[j][i];
end
if(ClkFrame!=OldState1)
begin
OldState1<=ClkFrame;
AllInDM[1]<={AllIn[1], AllIn[3], AllIn[5], AllIn[7]};
AllInDM[3]<=AllInDM[1];
end
end
always @(negedge ClkFrame) FIFO1[InPos]<=AllInDM[2];
always @(posedge ClkFrame)
begin
FIFO2[InPos]<=AllInDM[3];
InPos<=(InPos)?InPos+1:ShiftInd[OutPos];
end
endmodule
Спасибо
ИИВ