ASAP调度算法(as soon as possible)又称作尽可能早调度算法,将所有操作赋于最早可能调度到的控制步。其基本思想是:将控制数据流图看作有向图(忽略控制数据流图中的传输结点,将操作结点、起始结点和终止结点作为有向图的结点,数据相关边作为有向图的有向边),然后对该有向图进行正向分层排序。算法的主要步骤如下:
  (1) 计算各结点的入度(对应于操作的操作数个数);
  (2) 置起始结点为当前结点,将其标识值置为0;
  (3) 删除与当前结点相连的所有有向边,计算相应结点的入度;
  (4) 若结点的入度为0,将其加入队列,置其标识值为当前结点标识值加1;
  (5) 若队列非空,则从队列中取一结点为当前结点,转(3);
  (6) 各操作所调度到的控制步对应于结点的标识值,算法结束。
  ALAP调度算法(as late as possible)又称作尽可能迟调度算法,将所有操作赋于最迟可能调度到的控制步。其基本思想与ASAP调度算法类似,不同之处在于:ALAP调度算法是对有向图进行反向的分层排序。算法的主要步骤如下:
  (1) 计算个结点的出度(对应于操作输出变量的引用次数);
  (2) 置终止结点为当前结点,将其标识值置为0,置层数为0;
  (3) 删除与当前结点相连的所有有向边,计算相应结点的出度;
  (4) 若结点的出度为0,将其加入队列,置其标识值为当前结点标识值加1,置层数为当前结点标识值加1;
  (5) 若队列非空,则从队列中取一结点为当前结点,转(3);
  (6) 各操作所调度到的控制步对应于层数与相应结点标识值的差,算法结束。

   求解微分方程: y'+ 3xy' + 3y = 0
  使用迭代算法求解该方程,其VHDL描述示于图5.13。经过编译与转换等处理后,得到diffeq的控制数据流图,经简化后示于图5.14。假设乘法操作需要2个控制步才能完成,而加法、减法和比较操作都只需要1个控制步即可完成。图5.15和图5.16 分别给出了diffeq的ASAP与ALAP调度算法的调度结果。

          图5.13 diffeq的描述
   use
std.all
   entity diffeq is
    port ( xin, yin, uin: in integer;
       xout, yout: out integer);
    generic ( a, d : integer);
   end diffeq;


   architeture diffeq of diffeq is
   begin
    process( xin, yin, uin )
     variable x, y, u : integer;
     variable x1, y1, u1 : integer;
    begin
     x := xin;   y := yin;  u := uin;
     while ( x < a ) loop
      x1 := x + d;
      y1 := y + u * d;
      u1 := u - ( 3 * x * u * d ) - ( 3 * y * d );
     end loop;
     xout <= x;   yout <= y;
    end process;
   end diffeq;