Research Article

Modules for Pipelined Mixed Radix FFT Processors

Algorithm 1

library IEEE;
use IEEE.STD_LOGIC_1164.all, IEEE.STD_logic_arith.all;
entity DFT3 is
  port(
  CLK: in STD_LOGIC;
  START: in STD_LOGIC;
  DRI: in std_logic_vector(15 downto 0);
  DII: in std_logic_vector(15 downto 0);
  DRO: out std_logic_vector(17 downto 0);
  DIO: out std_logic_vector(17 downto 0));
end DFT3;
architecture synt of DFT3 is
 signal S1r,S2r,S3r,S5r,S6r,R1r,R2r: signed(17 downto 0);
 signal S1i,S2i,S3i,S5i,S6i,R1i,R2i: signed(17 downto 0);
 signal S4r,S4i: signed(17 downto 0);
 signal CYC: natural range 0 to 3;
begin
CNTRL:process(CLK) begin
  if rising_edge(CLK) then
   if START =1 then
    CYC<=0;
   else
    if CYC =2 then
     CYC <=0;
    else
     CYC <=CYC +1;
    end if;
   end if;
  end if;
 end process;
CALC: process(CLK) begin
  if rising_edge(CLK) then
 case CYC is
when 0 =>
  S1r<= signed(SXT(DRI, S1rlength));
  S1i<= signed(SXT(DII, S1Ilength));
  S2r<=S1r − S2r;
  S2i<=S1i − S2i;
  R2r<= S1r;
  R2i<= S1i;
  S4r<= SHR(S3r, "010") − R1r;
  S4i<= SHR(S3i, "010") − R1i;
  S5r<=R1r − SHR(S4r, "011");
  S5i<=R1i − SHR(S4i, "011");
  S6r<= R2r − S5i;
  S6i<= R2i + S5r;
when 1 =>
  S1r<= S1r + signed(DRI);
  S1i<= S1i + signed(DII);
  R2r<= S2r;
  R2i<= S2i;
  S3r<= S1r − signed(DRI);
  S3i<= S1i − signed(DII);
  S5r<=S5r + SHR(S4r, "1010");
  S5i<=S5i + SHR(S4i, "1010");
  S6r<=R2r;
  S6i<=R2i;
when others=> 
  S1r<= S1r + signed(DRI);
  S1i<= S1i + signed(DII);
  S2r<= S1r + SHR(S1r, "001");
  S2i<= S1i + SHR(S1i, "001");
  S3r<= SHR(S3r, "010") − S3r;
  S3i<= SHR(S3i, "010") − S3i;
  S4r<= S3r + SHR(S3r, "0100");        
  S4i<= S3i + SHR(S3i, "0100");
  R1r<=S3r;
  R1i<=S3i;
  S6r<= R2r + S5i;
  S6i<= R2i − S5r;
end case;
 end if;
end process;
DRO<= std_logic_vector(S6r);
DIO<= std_logic_vector(S6i);
end synt;