ASIC SoC2011. 5. 20. 09:50
최근에 보고 있는 책 중에서 FIR Filter의 설계를 최적화하는 과정에 대해서 기술한 부분이 있어서 별도로 정리한다.
FIR Filter라고 하면 뭐 어차피  MAC연산으로 대치할 수 있는데 여기서는  Xilinx Device라는 전제로 DSP48 Block을 사용하는 것을 목표로 한다. 따라서 설계 자체의 최적화라기 보다는 설계 코드 수정을 통해 Mapping의 최적화를 수행하는 것이다.

아래와 같은 FIR Filter를 설계해서 FPGA에 넣어서 비교해 본다.

이후에 DSP48용 코드로 변경하여서 FPGA에 넣어서 그 속도를 비교하는 것으로 진행한다.

FIR Filter는 8  TAB DF-I FIR Filter이고 그 모양은 아래와 같다.



 이 FIR Filter의 코드는 아래와 같다.  (전체 다 타이핑 하기 귀찮아서 간략화 시켰다.)


module fir_filter( 
   input clk;
   input signed [15;0] data_in ;
   output reg signed [15:0] data_out ;
);
 
parameter signed [15:0] b0 = 16'h2030 ;
parameter signed [15:0] b1 = 16'h10f1 ;
 ...
parameter signed [15:0] b7 = 16'hC13f;
 ....

always ( @posedge clk )
begin
    xn[0] <= data_in ;
    xn[1] <= xn[0]   ;
    xn[2] <= xn[1]   ;
    xn[3] <= xn[2]   ;
    xn[4] <= xn[3]   ;
    xn[5] <= xn[4]   ;
    xn[6] <= xn[5]   ;
    xn[7] <= xn[6]   ;
   data_out <= yn[30:15] ;
end

assign y[n] = xn[0] * b0 + xn[1] * b1 + xn[2] * b2 + xn[3] * b3 + xn[4] * b4 + xn[5] * b5 + xn[6] * b6 +  xn[7] * b7 ;

endmodule



그럼 이제 DSP48에 맞추어서 코딩을 수정하고 합성하여 본다.

DSP48의 performance를 높이기 위해서는 의외로 단순한 방법으로 효과를 얻을 수 있다.

코드를 아래와 같이 수정한다.

...
always@(posedge clk)
begin
    xn[0] <= data_in ;
   for( i = 0 ; i < 14 ; i = i+1 )
      xn[i+1] = xn[i] ;

   data_out <= yn[30:15] ;
end

always@(posedge clk)
begin
   prod[0] <= xn[0] * b0 ;
   prod[1] <= xn[2] * b1 ;
   prod[2] <= xn[4] * b2 ;
   prod[3] <= xn[6] * b3 ;
  ..
   prod[6] <= xn[12] * b6 ;
   prod[7] <= xn[14] * b7 ;
end
 
always@(posedge clk )
begin
    mac[0] <= prod[0] ;
    for( i = 0 ; i < 7 ; i=  i + 1 )
      mac[i+1] = mac[i] = prod[i+1] ;
end 

assign yn = mac[7];

end module

이것에 대한 합성 결과는 아래와 같다.


블럭의 내용상의 차이는 각 곱셈기 앞에서 2 Cycle F/F을 가지고 있고, 이후에 ADD 전에 다시 한 사이클의 F/F이 존재한다는 점이다.
최종적으로 이를 F/F으로 잘라내에서 정리하여 출력하게 된다.

각 계산 탭의 모양은 아래와 같이 된다.


따라서 핵심은 MUL과 ADD등의 각 Stage마다 F/F을 배치해서 사용하는 것이고 이 F/F은 DSP48에 있는것을 그대로 활용하는 것이다.


요컨데 위의 DSP48블럭내에 보이는 F/F (이경우 사각형으로 표시되어 있다.)을 최대한 활용하여서 회로를 Pipeline화 하여서 속도를 올리자는 것이 이 설계의 핵심이 된다. 그리고 그 모양도 DSP48의 내부 구조를 고려하여서 F/F을 배치하였다.

책에서는 DSP48을 고려하지 않을 경우 약 43 MHz정도 나오고, 고려한 경우 대략 528MHz까지 속도가 나온다. 
F/F을 넣고 안넣고에 따라서 속도가 약 12.2배 가량 난다.


 
Posted by GUNDAM_IM