ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
5 мая
183858
IgorChem (04.03.2010 09:52 - 12:42, просмотров: 9199)
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