示例#1
0
def fft(clk, s0, s1, valid, num_stages):
    for stage in reversed(list(range(num_stages))):
        m = 2**stage

        #generate constants
        twiddles = [i/(2*m) for i in range(m)]
        twiddles = [exp(-2.0j*pi*i) for i in twiddles]
        twiddle_type = Complex(SFixed(s0.i.subtype.bits+2, s0.i.subtype.bits))

        #butterfly
        s0, s1 = s0+s1, s0-s1
        s0 = delay(clk, s0, 1)
        s1 = delay(clk, s1, 1)
        valid = delay(clk, valid, 1)

        #rotate
        if stage:
            count, _ = counter(clk, 0, m//2-1, 1, valid)
            s1 = s1 * twiddle_type.rom(count, *twiddles)
            s0 = delay(clk, s0, 1)
            s1 = delay(clk, s1, 1)
            valid = delay(clk, valid, 1)

            #reorder
            s0, s1, valid = reorder(clk, s0, s1, valid, stage)

    return bit_reverse_order(clk, s0, s1, valid, 2**(num_stages-1))