From 069ad23481f4e7e9c95f189405b7c3a6e0f0307c Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 9 Mar 2015 22:16:19 +0100 Subject: [PATCH] Butterfly in Funktion ausgelagert --- fft_inst.tie | 63 +++++++++++++++++++++++++++------------------------- 1 file changed, 33 insertions(+), 30 deletions(-) diff --git a/fft_inst.tie b/fft_inst.tie index 0ca83be..4aebf7a 100644 --- a/fft_inst.tie +++ b/fft_inst.tie @@ -195,41 +195,44 @@ operation FFT_twiddle {out AR wr, out AR wi, in AR j, in BR shift, in BR inverse operation FFT_calc {inout FFT_reg data, in AR wr, in AR wi, in AR shift} {} { - wire [15:0] fri = data[63:48]; - wire [15:0] frj = data[47:32]; - wire [15:0] fii = data[31:16]; - wire [15:0] fij = data[15:0]; + assign data = FFT_butterfly(data, wr, wi, shift); +} + +function [63:0] FFT_butterfly ([63:0] data, [15:0] wr, [15:0] wi, [0:0] shift) { - // TODO semantic for hardware implementation - // TODO shared functions - // TODO ersetzen durch TIEmac - wire [31:0] tr1 = TIEmul(wr, frj, 1'b1); - wire [15:0] tr1s = tr1[30:15]; - wire [31:0] tr2 = TIEmul(wi, fij, 1'b1); - wire [15:0] tr2s = tr2[30:15]; - wire [15:0] tr = TIEadd(tr1s, ~tr2s, 1'b1); + // operands real parts + wire [15:0] r1 = data[63:48]; + wire [15:0] r2 = data[47:32]; - wire [31:0] ti1 = TIEmul(wr, fij, 1'b1); - wire [15:0] ti1s = ti1[30:15]; - wire [31:0] ti2 = TIEmul(wi, frj, 1'b1); - wire [15:0] ti2s = ti2[30:15]; - wire [15:0] ti = TIEadd(ti1s, ti2s, 1'b0); + // operands imaginary parts + wire [15:0] i1 = data[31:16]; + wire [15:0] i2 = data[15:0]; - wire [15:0] qr = TIEmux(shift[0], fri, {fri[15], fri[15:1]}); - wire [15:0] qi = TIEmux(shift[0], fii, {fii[15], fii[15:1]}); + // odd real part + wire [31:0] oddr1 = TIEmul(wr, r2, 1'b1); + wire [15:0] oddr1s = oddr1[30:15]; + wire [31:0] oddr2 = TIEmul(wi, i2, 1'b1); + wire [15:0] oddr2s = oddr2[30:15]; + wire [15:0] oddr = TIEadd(oddr1s, ~oddr2s, 1'b1); - // TODO multiple add - wire [15:0] frio = TIEadd(qr, tr, 1'b0); - wire [15:0] frjo = TIEadd(qr, ~tr, 1'b1); - wire [15:0] fiio = TIEadd(qi, ti, 1'b0); - wire [15:0] fijo = TIEadd(qi, ~ti, 1'b1); + // odd imaginary part + wire [31:0] oddi1 = TIEmul(wr, i2, 1'b1); + wire [15:0] oddi1s = oddi1[30:15]; + wire [31:0] oddi2 = TIEmul(wi, r2, 1'b1); + wire [15:0] oddi2s = oddi2[30:15]; + wire [15:0] oddi = TIEadd(oddi1s, oddi2s, 1'b0); - assign data = { - frio, - frjo, - fiio, - fijo - }; + // even parts + wire [15:0] evenr = TIEmux(shift[0], r1, {r1[15], r1[15:1]}); + wire [15:0] eveni = TIEmux(shift[0], i1, {i1[15], i1[15:1]}); + + // final result + wire [15:0] resr1 = TIEadd(evenr, oddr, 1'b0); + wire [15:0] resr2 = TIEadd(evenr, ~oddr, 1'b1); + wire [15:0] resi1 = TIEadd(eveni, oddi, 1'b0); + wire [15:0] resi2 = TIEadd(eveni, ~oddi, 1'b1); + + assign FFT_butterfly = { resr1, resr2, resi1, resi2 }; } ////////////////////////////////////////////////////////////////////////////