##// END OF EJS Templates
Few fixes....
Few fixes. Whole LFR simulation WIP.

File last commit:

r682:c53e1b6b3045 default
r682:c53e1b6b3045 default
Show More
fft_components.vhd
165 lines | 4.9 KiB | text/x-vhdl | VhdlLexer
/ lib / lpp / dsp / lpp_fft / fft_components.vhd
--------------------------------------------------------------------------------
-- Copyright 2007 Actel Corporation. All rights reserved.
-- ANY USE OR REDISTRIBUTION IN PART OR IN WHOLE MUST BE HANDLED IN
-- ACCORDANCE WITH THE ACTEL LICENSE AGREEMENT AND MUST BE APPROVED
-- IN ADVANCE IN WRITING.
-- Revision 3.0 April 30, 2007 : v3.0 CoreFFT Release
-- Package: fft_components.vhd
-- Description: CoreFFT
-- Core package
-- Rev: 0.1 8/31/2005 12:54PM VD : Pre Production
--
--
--------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.all;
USE IEEE.numeric_std.all;
USE std.textio.all;
USE IEEE.STD_LOGIC_TEXTIO.all;
package FFT_COMPONENTS is
CONSTANT gPTS : integer:=256; --Number of FFT points
CONSTANT gLOGPTS : integer:=8; --Log2(PTS)
CONSTANT gLOGLOGPTS : integer:=3; --Stage counter width
-------------------------------------------------
CONSTANT gWSIZE : integer:=16; -- FFT bit resolution; length of a re or im sample
CONSTANT gTWIDTH : integer:=16; -- Twiddle, sin or cos bit resolution
CONSTANT gHALFPTS : integer:=gPTS/2; -- Num of FFT points (PTS) divided by 2
CONSTANT gDWIDTH : integer:=2*gWSIZE; -- width of a complex input word,
CONSTANT gTDWIDTH : integer:=2*gTWIDTH; -- width of a complex twiddle factor
CONSTANT gRND_MODE : integer:=1; -- enable product rounding
CONSTANT gSCALE_MODE : integer:=0; -- scale mode
CONSTANT gInBuf_RWDLY : integer:=12;
function to_logic ( x : integer) return std_logic;
function to_logic ( x : boolean) return std_logic;
FUNCTION to_integer( sig : std_logic_vector) return integer;
function to_integer( x : boolean) return integer;
function maskbar (barn, bar_enable,dma_reg_bar,dma_reg_loc : integer) return integer;
function anyfifo (bar0, bar1, bar2, bar3, bar4, bar5 : integer) return integer;
FUNCTION reverse (x :IN std_logic_vector) RETURN bit_vector;
FUNCTION reverseStd(x :IN std_logic_vector) RETURN std_logic_vector;
COMPONENT counter
GENERIC (
WIDTH : integer := 7;
TERMCOUNT : integer := 127 );
PORT (
clk, nGrst, rst, cntEn : IN std_logic;
tc : OUT std_logic;
Q : OUT std_logic_vector(WIDTH-1 DOWNTO 0));
END COMPONENT;
COMPONENT bcounter
GENERIC (
WIDTH : integer := 7);
PORT (
clk, nGrst, rst, cntEn : IN std_logic;
Q : OUT std_logic_vector(WIDTH-1 DOWNTO 0) );
END COMPONENT;
COMPONENT edgeDetect
GENERIC (
INPIPE :integer := 0; --if (INPIPE==1) insert input pipeline reg
FEDGE :integer := 0);--If FEDGE==1 detect falling edge, else-rising edge
PORT (
clk, clkEn, edgeIn : IN std_logic;
edgeOut : OUT std_logic);
END COMPONENT;
end FFT_COMPONENTS;
package body FFT_COMPONENTS is
function to_logic ( x : integer) return std_logic is
variable y : std_logic;
begin
if x = 0 then
y := '0';
else
y := '1';
end if;
return y;
end to_logic;
function to_logic( x : boolean) return std_logic is
variable y : std_logic;
begin
if x then
y := '1';
else
y := '0';
end if;
return(y);
end to_logic;
-- added 081805
function to_integer(sig : std_logic_vector) return integer is
variable num : integer := 0; -- descending sig as integer
begin
for i in sig'range loop
if sig(i)='1' then
num := num*2+1;
else -- use anything other than '1' as '0'
num := num*2;
end if;
end loop; -- i
return num;
end function to_integer;
function to_integer( x : boolean) return integer is
variable y : integer;
begin
if x then
y := 1;
else
y := 0;
end if;
return(y);
end to_integer;
function maskbar (barn, bar_enable,dma_reg_bar,dma_reg_loc : integer) return integer is
begin
if ( dma_reg_loc>= 2 and barn=dma_reg_bar) then
return(0);
else
return(bar_enable);
end if;
end maskbar;
function anyfifo ( bar0, bar1, bar2, bar3, bar4, bar5 : integer) return integer is
begin
if ( bar0=2 or bar1=2 or bar2=2 or bar3=2 or bar4=2 or bar5=2) then
return(1);
else
return(0);
end if;
end anyfifo;
FUNCTION reverse (x :IN std_logic_vector)
RETURN bit_vector IS
VARIABLE i : integer;
VARIABLE reverse : bit_vector(x'HIGH DOWNTO x'LOW);
BEGIN
FOR i IN x'range LOOP
reverse(i) := To_bit( x(x'HIGH - i));
END LOOP;
RETURN(reverse);
END FUNCTION reverse;
FUNCTION reverseStd (x :IN std_logic_vector)
RETURN std_logic_vector IS
VARIABLE i : integer;
VARIABLE reverse : std_logic_vector(x'HIGH DOWNTO x'LOW);
BEGIN
FOR i IN x'range LOOP
reverse(i) := x(x'HIGH - i);
END LOOP;
RETURN(reverse);
END FUNCTION reverseStd;
end FFT_COMPONENTS;