Wednesday, February 23, 2011

Some notes on sysgen FFT

The FFT is an efficient implementation of a linear transformation, it takes an N-point vector of complex data and returns an N-point vector of complex data. In Matlab it is as simple as
y = fft(x);

In sysgen we have to worry about certain other inputs (and outputs) as shown in Fig. 1 below.
Fig. 1: Xilinx Sysgen FFT block showing the various inputs and outputs
I will go over some (not all) relevant inputs, their types and how they are used:
  • The input data xn_re and xn_im can be a signed data type S.(S-1), from 8 to 34 bits wide inclusive. 
  • The start signal must be driven by a Bool, pulsed or set high at the start of a frame. 
  • Bool fwd_inv = 0 if inverse transform, 1 if forward transform.
  • Bool fwd_inv_we when asserted high loads the transform type from fwd_inv for the next input frame
  • scale_sch: scaling schedule (more on this later)
  • Bool scale_sch_we: when asserted high loads the scale_sch for the next input frame

Lets now discuss the non-obvious outputs
  • Bool rfd active high after start signal is asserted and till xk_index (output index) reaches N-1.
  • Bool busy active high when block is processing data
  • Bool dv : data valid signal for output
  • Bool edone, done: active high one sample period before and when frame processing and ready for output respectively.
If we double click on the block, we get a bunch of configuration options. On the Basic tab, I choose Transform Length of 1024, pipelined_streaming_io (all other settings are defaults). Under Advanced tab, we choosed Scaled, Convergent Rounding, Natural Order and check the overflow ovflo pin. 




No comments: