Verilog src (много) нужен совет коллективного разума Всем привет, написал маленькую программу на верилоге, нужен совет коллективного разума, так как не понимаю, как реализовать одну конструкцию.
Смысл программы: на 8 ножек InData приходят данные, которые синхронизованы по InReady. Их я сохраняю локально в TempData, и на каждое данное вызываю проверку их нужности TestCondition. Данные в TempData крутятся по циклу где запомнено не более чем 256 последних данных.
Если они вдруг данные стали нужны (в TestCondition выставляется, что ResultCounter=MaxData), то эти данные начинают перекачевывать в Data, причем туда попадает не только первое данное, которое пришло после того, как TestCondition выполнился, но и все 256 предыдущих, которые сохранились в TempData.
Основная загвоздка у меня вот в чем: данных много идет, и мне необходимо выполянть сохранение данных всегда и вовремя, а вот последовательно выполненная процедура TestCondition занимает различное колличество времени.
Посоветуйте, пожалуйста, как мне законвейеризовать выполнение TestCondition? То есть я могу ее разбить на кучу последовательных блочков, которые можно законвейеризовать, но вот как эти блочки разместить, я не понимаю.
Спасибо
Игорь
Текст программы:
module My_First_Project (InData, InReady, OutData);
input [7:0] InData;
input InReady;
output [15:0] OutData;
reg [15:0] OutData;
parameter TempDataLenghtPower=8;
parameter MaxTempDataLenghtPower=TempDataLenghtPower-1;
parameter TempDataLenght=(1<<TempDataLenghtPower);
parameter MaxTempData=TempDataLenght-1;
parameter DataLenght=4*1024;
parameter MaxData=DataLenght-1;
reg [15:0] TempData [0:MaxTempData];
reg [15:0] Data [0:MaxData];
reg LocDataSwitch;
reg locres;
reg [MaxTempDataLenghtPower:0] CurCounter;
integer ResultCounter;
reg [15:0] LocData1;
reg [15:0] LocData2;
integer SumS1;
integer SumS2;
integer OldArg;
integer LevelP1;
integer LevelP2;
initial
begin
CurCounter=0;
LocDataSwitch=1'b0;
SumS1=1;
SumS2=1;
LevelP1=1;
LevelP2=1;
OldArg=0;
ResultCounter=-1;
end
always @(posedge InReady) begin
if (LocDataSwitch)
begin
fork // не все компилеры это понимают, на квартусе надо эту строку закомментировать
{LocData1[0], LocData1[2], LocData1[4], LocData1[6], LocData1[8], LocData1[10], LocData1[12], LocData1[14]}=InData;
TempData[CurCounter]=LocData2;
TestCondition(LocData2, TempData[CurCounter+1]);
join // не все компилеры это понимают, на квартусе надо эту строку закомментировать
end
else
begin
fork // не все компилеры это понимают, на квартусе надо эту строку закомментировать
{LocData2[0], LocData2[2], LocData2[4], LocData2[6], LocData2[8], LocData2[10], LocData2[12], LocData2[14]}=InData;
TempData[CurCounter]=LocData1;
TestCondition(LocData1, TempData[CurCounter+1]);
join // не все компилеры это понимают, на квартусе надо эту строку закомментировать
end
CurCounter=CurCounter+1;
end
always @(negedge InReady) begin
if (LocDataSwitch) begin
{LocData1[1], LocData1[3], LocData1[5], LocData1[7], LocData1[9], LocData1[11], LocData1[13], LocData1[15], LocDataSwitch}={InData, 1'b0};
end
else
begin
{LocData2[1], LocData2[3], LocData2[5], LocData2[7], LocData2[9], LocData2[11], LocData2[13], LocData2[15], LocDataSwitch}={InData, 1'b1};
end
end
function integer DivPow;
input Arg, Sh;
integer Arg;
integer Sh;
begin
if(Arg>0)
DivPow=(Arg>>Sh);
else
DivPow=-((-Arg)>>Sh);
end
endfunction
task TestCondition;
input Arg;
integer Arg;
input CurDataArg;
reg [15:0] CurDataArg;
integer x;
parameter Div1=6;
parameter Div2=5;
parameter Div3=2;
parameter Div4=2;
begin
x=DivPow(Arg*Arg, Div3);
SumS1=SumS1+DivPow(x*x-SumS1, Div1);
x=DivPow(Arg-OldArg, Div3);
SumS2=SumS2+DivPow(x*x-SumS2, Div1);
OldArg=Arg;
if(SumS1>LevelP1 && SumS2>LevelP2)
begin
LevelP1=DivPow(LevelP1+DivPow(SumS1, Div4)-LevelP1, Div2);
LevelP2=DivPow(LevelP2+DivPow(SumS2, Div4)-LevelP2, Div2);
if(ResultCounter==-1) ResultCounter=MaxData;
end
if(ResultCounter>=0)
begin
Data[ResultCounter]=CurDataArg;
ResultCounter=ResultCounter-1;
if(ResultCounter==0)
begin
// здесь мне бы хотелось послать эти данные по USB-Blaster но я пока не понял как это сделать, поэтому написал сяо на эту тему :)
for(x=0; x<MaxData; x=x+1)
begin
OutData=Data[x];
#1000;
end
ResultCounter=-1;
end
end
end
endtask
endmodule