OpenCores
URL https://opencores.org/ocsvn/fft_fir_filter/fft_fir_filter/trunk

Subversion Repositories fft_fir_filter

[/] [fft_fir_filter/] [trunk/] [rtl/] [ram1x_2.vhd] - Rev 2

Compare with Previous | Blame | View Log

---------------------------------------------------------------------
----                                                             ----
----  FFT Filter IP core                                         ----
----                                                             ----
----  Authors: Anatoliy Sergienko, Volodya Lepeha                ----
----  Company: Unicore Systems http://unicore.co.ua              ----
----                                                             ----
----  Downloaded from: http://www.opencores.org                  ----
----                                                             ----
---------------------------------------------------------------------
----                                                             ----
---- Copyright (C) 2006-2010 Unicore Systems LTD                 ----
---- www.unicore.co.ua                                           ----
---- o.uzenkov@unicore.co.ua                                     ----
----                                                             ----
---- This source file may be used and distributed without        ----
---- restriction provided that this copyright statement is not   ----
---- removed from the file and that any derivative work contains ----
---- the original copyright notice and the associated disclaimer.----
----                                                             ----
---- THIS SOFTWARE IS PROVIDED "AS IS"                           ----
---- AND ANY EXPRESSED OR IMPLIED WARRANTIES,                    ----
---- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED                  ----
---- WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT              ----
---- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.        ----
---- IN NO EVENT SHALL THE UNICORE SYSTEMS OR ITS                ----
---- CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,            ----
---- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL            ----
---- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT         ----
---- OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,               ----
---- DATA, OR PROFITS; OR BUSINESS INTERRUPTION)                 ----
---- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,              ----
---- WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT              ----
---- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING                 ----
---- IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,                 ----
---- EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.          ----
----                                                             ----
---------------------------------------------------------------------
 
library IEEE;
use IEEE.std_logic_1164.all;  
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
 
entity RAM1X_2 is	
	generic(width : INTEGER;
		n:INTEGER;	  -- 6,7,8,9,10,11
		v2:INTEGER:=1);  
	port (
		CLK: in STD_LOGIC;
		RST: in STD_LOGIC; 
		CE: in STD_LOGIC;
		WE: in STD_LOGIC;                    
		INITOVERF:    in STD_LOGIC;    
		ADDRW: in STD_LOGIC_VECTOR (n downto 0);  
		ADDRR: in STD_LOGIC_VECTOR (n downto 0);  
		SEL: in STD_LOGIC;									  -- 0 -fromDIRE,DIIM, 1 - DMRE,DMIM
		RESRAM:  in STD_LOGIC;   
		DIRE: in STD_LOGIC_VECTOR (width-1 downto 0);
		DIIM: in STD_LOGIC_VECTOR (width-1 downto 0);
		DMRE: in STD_LOGIC_VECTOR (width-1 downto 0);
		DMIM: in STD_LOGIC_VECTOR (width-1 downto 0);  
		OVERF:out  STD_LOGIC;
		DORE: out STD_LOGIC_VECTOR (width-1 downto 0);
		DOIM: out STD_LOGIC_VECTOR (width-1 downto 0)
		);
end RAM1X_2;
 
 
architecture RAM1X of RAM1X_2 is		 
 
	component RAMB4_S1_S1 is
		port (
			CLKA,CLKB: in STD_LOGIC;
			RSTA,RSTB: in STD_LOGIC;
			ENA,	ENB: in STD_LOGIC;
			WEA,	WEB: in STD_LOGIC;
			ADDRA,ADDRB: in STD_LOGIC_VECTOR (11 downto 0);
			DIA,DIB: in STD_LOGIC;
			DOA,DOB: out STD_LOGIC	);		 
	end component;
	component RAMB4_S2_S2 is
		port (
			CLKA,	CLKB,RSTA,RSTB,ENA,ENB,WEA,WEB: in STD_LOGIC;
			ADDRA,ADDRB: in STD_LOGIC_VECTOR (10 downto 0);
			DIA,DIB: in STD_LOGIC_VECTOR (1 downto 0);	   	
			DOA,DOB: out STD_LOGIC_VECTOR (1 downto 0)
			);
	end component;   
	component RAMB4_S4_S4 is
		port (
			CLKA,	CLKB,RSTA,RSTB,ENA,ENB,WEA,WEB: in STD_LOGIC;
			ADDRA,ADDRB: in STD_LOGIC_VECTOR (9 downto 0);
			DIA,DIB: in STD_LOGIC_VECTOR (3 downto 0);	   
			DOA,DOB: out STD_LOGIC_VECTOR (3 downto 0)
			);
	end component; 
	component RAMB4_S8_S8 is
		port (
			CLKA,	CLKB,RSTA,RSTB,ENA,ENB,WEA,WEB: in STD_LOGIC;
			ADDRA,ADDRB: in STD_LOGIC_VECTOR (8 downto 0);
			DIA,DIB: in STD_LOGIC_VECTOR (7 downto 0);	
			DOA,DOB: out STD_LOGIC_VECTOR (7 downto 0)
			);
	end component;
	component RAMB4_S16_S16 is
		port (
			CLKA,CLKB,RSTA,RSTB,ENA,ENB,WEA,WEB: in STD_LOGIC;
			ADDRA,ADDRB: in STD_LOGIC_VECTOR (7 downto 0);
			DIA,DIB	 : in STD_LOGIC_VECTOR (15 downto 0);
			DOA,DOB: out STD_LOGIC_VECTOR (15 downto 0)
			);
	end component;	  
	component   RAMB16_S18_S18 is
		port (DIA    : in STD_LOGIC_VECTOR (15 downto 0);
			DIB    : in STD_LOGIC_VECTOR (15 downto 0);
			DIPA    : in STD_LOGIC_VECTOR (1 downto 0);
			DIPB    : in STD_LOGIC_VECTOR (1 downto 0);
			ENA    : in STD_ULOGIC;
			ENB    : in STD_ULOGIC;
			WEA    : in STD_ULOGIC;
			WEB    : in STD_ULOGIC;
			SSRA   : in STD_ULOGIC;
			SSRB   : in STD_ULOGIC;
			CLKA   : in STD_ULOGIC;
			CLKB   : in STD_ULOGIC;
			ADDRA  : in STD_LOGIC_VECTOR (9 downto 0);
			ADDRB  : in STD_LOGIC_VECTOR (9 downto 0);
			DOA    : out STD_LOGIC_VECTOR (15 downto 0);
			DOB    : out STD_LOGIC_VECTOR (15 downto 0);
			DOPA    : out STD_LOGIC_VECTOR (1 downto 0);
			DOPB    : out STD_LOGIC_VECTOR (1 downto 0)
			); 
	end	component;
 
	--constant zeros: STD_LOGIC_VECTOR (width-iwidth-1 downto 0):=(others=>'0');
	signal EN,A10 : STD_LOGIC;        
	signal DIREi,DIIMi:    STD_LOGIC_VECTOR (width-1 downto 0);
	signal ADDRA8,ADDRB8:  STD_LOGIC_VECTOR (7 downto 0);
	signal ADDRA9,ADDRB9:  STD_LOGIC_VECTOR (8 downto 0);
	signal ADDRA10,ADDRB10:  STD_LOGIC_VECTOR (9 downto 0);
	signal ADDRA11,ADDRB11:  STD_LOGIC_VECTOR (10 downto 0);
	signal ADDRA12,ADDRB12:  STD_LOGIC_VECTOR (11 downto 0);
	signal	WE0,WE1,WEB,over:STD_LOGIC;
	Signal DIAR,DIB,DOA,DOBR,DOBR0,DOBR1:  STD_LOGIC_VECTOR (17 downto 0);
	Signal DIAI,DOBI,DOBI0,DOBI1:  STD_LOGIC_VECTOR (17 downto 0);
 
 
begin	
	--Writing at ADDRW address
	--	Reading at ADDRR address
 
	EN <= '1';		
	DIB<=(others=>'0');
	RDI:process(CLK,RST)
	begin
		if RST='1' then  
			DIREi<=(others=>'0');     
			DIIMi<=(others=>'0');
		elsif CLK='1' and CLK'event then
			if CE='1' then         
				DIREi<=DIRE;
				DIIMi<=DIIM;
			end if;
		end if;
	end process;
	--	DIREi<=DIRE;
	--				DIIMi<=DIIM;
 
 
	--	Virtex:if V2=0 generate
	--		ZEROD:	  for i in  width to 15 generate																	
	--			DIAR(i)<='0';	
	--			DIAI(i)<='0';	
	--		end generate;
	--		
	--		DIB<=(others=>'0');					  
	--		WEB<='0';
	--		
	--		RAMD256:	if 	 n=4 or n=5 or n=6 or n=7 or n=8 generate		
	--			EMPTYA4:if n=4 generate
	--				ADDRA8(7 downto 4) <= "0000";			
	--				ADDRB8(7 downto 4) <= "0000";
	--			end generate;	  
	--			
	--			EMPTYA5:if n=5 generate
	--				ADDRA8(7 downto 5) <= "000";			
	--				ADDRB8(7 downto 5) <= "000";
	--			end generate;	 
	--			
	--			EMPTYA6:if n=6 generate
	--				ADDRA8(6) <= '0';			
	--				ADDRB8(6) <= '0';	 
	--				ADDRA8(7) <= '0';			
	--				ADDRB8(7) <= '0';
	--			end generate;	   
	--			EMPTYA7:if n=7 generate
	--				ADDRA8(7) <= '0';			
	--				ADDRB8(7) <= '0';
	--			end generate;	
	--			
	--			ADDRA8(n-1 downto 0)<=ADDRW(n-1 downto 0);
	--			ADDRB8(n-1 downto 0)<=ADDRR(n-1 downto 0);
	--			
	--			
	--			RAM256_R:  RAMB4_S16_S16	
	--			port map(CLKA => CLK,CLKB => CLK,RSTA => RST,RSTB => RST,
	--				ENA => EN,ENB => EN,
	--				WEA =>WE,WEB => WEB,
	--				DOA => DOA, DOB => DOBR, 
	--				ADDRA => ADDRA8, ADDRB => ADDRB8,
	--				DIA => DIAR, DIB => DIB);		
	--			
	--			RAM256_I:  RAMB4_S16_S16	
	--			port map(CLKA => CLK,CLKB => CLK,RSTA => RST,RSTB => RST,
	--				ENA => EN,ENB => EN,
	--				WEA =>WE,WEB => WEB,
	--				DOA => DOA, DOB => DOBI, 
	--				ADDRA => ADDRA8, ADDRB => ADDRB8,
	--				DIA => DIAI, DIB => DIB);			
	--		end generate;							 
	--		
	--		RAMD512:	if 	  n=9 generate		
	--			
	--			ADDRA9(n-1 downto 0)<=ADDRW(n-1 downto 0);
	--			ADDRB9(n-1 downto 0)<=ADDRR(n-1 downto 0);
	--			
	--			RAMD9:for i in 0 to 1 generate
	--				
	--				RAM512_R:  RAMB4_S8_S8	
	--				port map(CLKA => CLK,CLKB => CLK,RSTA => RST,RSTB => RST,
	--					ENA => EN,ENB => EN,
	--					WEA =>WE,WEB => WEB,
	--					DOA => DOA(8*i+7 downto 8*i), DOB => DOBR(8*i+7 downto 8*i), 
	--					ADDRA => ADDRA9, ADDRB => ADDRB9,
	--					DIA => DIAR(8*i+7 downto 8*i), DIB => DIB(8*i+7 downto 8*i));		
	--				
	--				RAM512_I:  RAMB4_S8_S8	
	--				port map(CLKA => CLK,CLKB => CLK,RSTA => RST,RSTB => RST,
	--					ENA => EN,ENB => EN,
	--					WEA =>WE,WEB => WEB,
	--					DOA => DOA(8*i+7 downto 8*i), DOB => DOBI(8*i+7 downto 8*i), 
	--					ADDRA => ADDRA9, ADDRB => ADDRB9,
	--					DIA => DIAI(8*i+7 downto 8*i), DIB => DIB(8*i+7 downto 8*i));		
	--				
	--			end generate;   
	--			
	--		end generate;		
	--		
	--		RAMD1024:	if 	  n=10 generate		
	--			
	--			ADDRA10(n-1 downto 0)<=ADDRW(n-1 downto 0);
	--			ADDRB10(n-1 downto 0)<=ADDRR(n-1 downto 0);
	--			
	--			RAMD10:for i in 0 to 3 generate
	--				
	--				RAM1024_R:  RAMB4_S4_S4	
	--				port map(CLKA => CLK,CLKB => CLK,RSTA => RST,RSTB => RST,
	--					ENA => EN,ENB => EN,
	--					WEA =>WE,WEB => WEB,
	--					DOA => DOA(4*i+3 downto 4*i), DOB => DOBR(4*i+3 downto 4*i), 
	--					ADDRA => ADDRA10, ADDRB => ADDRB10,
	--					DIA => DIAR(4*i+3 downto 4*i), DIB => DIB(4*i+3 downto 4*i));		
	--				
	--				RAM1024_I:  RAMB4_S4_S4	
	--				port map(CLKA => CLK,CLKB => CLK,RSTA => RST,RSTB => RST,
	--					ENA => EN,ENB => EN,
	--					WEA =>WE,WEB => WEB,
	--					DOA => DOA(4*i+3 downto 4*i), DOB => DOBI(4*i+3 downto 4*i), 
	--					ADDRA => ADDRA10, ADDRB => ADDRB10,
	--					DIA => DIAI(4*i+3 downto 4*i), DIB => DIB(4*i+3 downto 4*i));		
	--				
	--			end generate;	
	--		end generate;
	--		
	--		RAMD2048:	if 	  n=11 generate		
	--			
	--			ADDRA11(n-1 downto 0)<=ADDRW(n-1 downto 0);
	--			ADDRB11(n-1 downto 0)<=ADDRR(n-1 downto 0);
	--			RAMD11:for i in 0 to 7 generate
	--				
	--				RAM2048_R:  RAMB4_S2_S2	
	--				port map(CLKA => CLK,CLKB => CLK,RSTA => RST,RSTB => RST,
	--					ENA => EN,ENB => EN,
	--					WEA =>WE,WEB => WEB,
	--					DOA => DOA(2*i+1 downto 2*i), DOB => DOBR(2*i+1 downto 2*i), 
	--					ADDRA => ADDRA11, ADDRB => ADDRB11,
	--					DIA => DIAR(2*i+1 downto 2*i), DIB => DIB(2*i+1 downto 2*i));	
	--				
	--				RAM2048_I:  RAMB4_S2_S2	
	--				port map(CLKA => CLK,CLKB => CLK,RSTA => RST,RSTB => RST,
	--					ENA => EN,ENB => EN,
	--					WEA =>WE,WEB => WEB,
	--					DOA => DOA(2*i+1 downto 2*i), DOB => DOBI(2*i+1 downto 2*i), 
	--					ADDRA => ADDRA11, ADDRB => ADDRB11,
	--					DIA => DIAI(2*i+1 downto 2*i), DIB => DIB(2*i+1 downto 2*i));	    			
	--				
	--			end generate;
	--		end generate;
	--	end generate;
 
	RAMD512v2:	if 	  n<=9 and v2=1 generate
		DIB<=(others=>'0');					  
		WEB<='0';
		ADDRB10(n downto 0)<=ADDRR(n downto 0);
 
		DIAR( width-1 downto 0)<= DMRE;
		DIAI( width-1 downto 0)<=DMIM;
 
		ADDRA10(n downto 0)<=ADDRW(n downto 0); 
		ADDRA10(9 downto n+1)<=(others=>'0');	
		ADDRB10(n downto 0)<=ADDRR(n downto 0);
		ADDRB10(9 downto n+1)<=(others=>'0');	
 
 
		-- Working RAMs		
		RAM1024_R:   RAMB16_S18_S18	 --Re -part
		port map (	     
			CLKA => CLK,  CLKB => CLK,SSRA => RST,SSRB => RESRAM,
			WEA  => WE, WEB  => WEB,ENA  => EN,ENB  => EN,  
			DIPA => DIAR(17 downto 16),
			DIPB => DIB(17 downto 16),
			DIA  => DIAR(15 downto 0),
			DIB  => DIB(15 downto 0),
			ADDRA => ADDRA10,
			ADDRB => ADDRB10,
			DOPA => open,--DOA2(17 downto 16),
			DOPB => DOBR(17 downto 16),
			DOA  => open,--DOA2(15 downto 0),
			DOB  => DOBR(15 downto 0)); 
 
		RAM1024_I:   RAMB16_S18_S18	 
		port map (	     
			CLKA => CLK,  CLKB => CLK,SSRA => RST,SSRB =>  RESRAM,
			WEA  => WE, WEB  => WEB,ENA  => EN,ENB  => EN,  
			DIPA => DIAI(17 downto 16),
			DIPB => DIB(17 downto 16),
			DIA  => DIAI(15 downto 0),
			DIB  => DIB(15 downto 0),
			ADDRA => ADDRA10, ADDRB => ADDRB10,
			DOPA => open,--DOA2(17 downto 16),
			DOPB => DOBI(17 downto 16),
			DOA  => open,--DOA2(15 downto 0),
			DOB  => DOBI(15 downto 0));
	end generate;
 
	RAMD1024v2:	if 	  n=10 and v2=1 generate	
		DIB<=(others=>'0');					  
		WEB<='0';
 
		ADDRB10<=ADDRR(n-1 downto 0);
		ADDRA10<=ADDRW(n-1 downto 0); 
 
		DIAR( width-1 downto 0)<= DMRE;
		DIAI( width-1 downto 0)<=DMIM;
 
		WE0<=WE when ADDRW(n)='0' else '0';
		WE1<=WE when ADDRW(n)='1' else '0';
 
 
		-- Working RAMs		
		RAM1024_R0:   RAMB16_S18_S18	 --Re -part
		port map (	     
			CLKA => CLK,  CLKB => CLK,SSRA => RST,SSRB =>  RESRAM,
			WEA  => WE0, WEB  => WEB,ENA  => EN,ENB  => EN,  
			DIPA => DIAR(17 downto 16),
			DIPB => DIB(17 downto 16),
			DIA  => DIAR(15 downto 0),
			DIB  => DIB(15 downto 0),
			ADDRA => ADDRA10,
			ADDRB => ADDRB10,
			DOPA => open,--DOA2(17 downto 16),
			DOPB => DOBR0(17 downto 16),
			DOA  => open,--DOA2(15 downto 0),
			DOB  => DOBR0(15 downto 0)); 
 
		RAM1024_I0:   RAMB16_S18_S18	 
		port map (	     
			CLKA => CLK,  CLKB => CLK,SSRA => RST,SSRB =>  RESRAM,
			WEA  => WE0, WEB  => WEB,ENA  => EN,ENB  => EN,  
			DIPA => DIAI(17 downto 16),
			DIPB => DIB(17 downto 16),
			DIA  => DIAI(15 downto 0),
			DIB  => DIB(15 downto 0),
			ADDRA => ADDRA10, ADDRB => ADDRB10,
			DOPA => open,--DOA2(17 downto 16),
			DOPB => DOBI0(17 downto 16),
			DOA  => open,--DOA2(15 downto 0),
			DOB  => DOBI0(15 downto 0));	 
 
		RAM1024_R1:   RAMB16_S18_S18	 --Re -part
		port map (	     
			CLKA => CLK,  CLKB => CLK,SSRA => RST,SSRB => RESRAM,
			WEA  => WE1, WEB  => WEB,ENA  => EN,ENB  => EN,  
			DIPA => DIAR(17 downto 16),
			DIPB => DIB(17 downto 16),
			DIA  => DIAR(15 downto 0),
			DIB  => DIB(15 downto 0),
			ADDRA => ADDRA10,
			ADDRB => ADDRB10,
			DOPA => open,--DOA2(17 downto 16),
			DOPB => DOBR1(17 downto 16),
			DOA  => open,--DOA2(15 downto 0),
			DOB  => DOBR1(15 downto 0)); 
 
		RAM1024_I1:   RAMB16_S18_S18	 
		port map (	     
			CLKA => CLK,  CLKB => CLK,SSRA => RST,SSRB => RESRAM,
			WEA  => WE1, WEB  => WEB,ENA  => EN,ENB  => EN,  
			DIPA => DIAI(17 downto 16),
			DIPB => DIB(17 downto 16),
			DIA  => DIAI(15 downto 0),
			DIB  => DIB(15 downto 0),
			ADDRA => ADDRA10, ADDRB => ADDRB10,
			DOPA => open,--DOA2(17 downto 16),
			DOPB => DOBI1(17 downto 16),
			DOA  => open,--DOA2(15 downto 0),
			DOB  => DOBI1(15 downto 0));
 
		TA:process(CLK,RST)begin
			if RST='1' then
				A10<='0';
			elsif rising_edge(CLK) then
				A10<=ADDRR(n);
			end if;
		end process;
 
		DOBR<=DOBR0 when A10='0' else DOBR1;
		DOBI<=DOBI0 when A10='0' else DOBI1;
 
	end generate;	
 
 
	TOVERFR:process(CLK,RST,DIAR,DIAI)
	begin  
		over<=  (DIAI( width-1) xor  DIAI( width-2)) or (DIAI( width-1) xor  DIAI( width-3)) 
		or (DIAR( width-1) xor  DIAR( width-2)) or (DIAR( width-1) xor  DIAR( width-3));
 
		if RST='1' then 
			OVERF<='0';
		elsif CLK='1' and CLK'event then
			if CE='1' then     
				if  INITOVERF='1' then
					OVERF<='0';
				elsif over='1' and WE='1' then
					OVERF<='1';
				end if;
			end if;
		end if;
	end process;
 
 
 
	DORE<=DOBR(width-1 downto 0)when SEL='0' else DIREi;  
	DOIM<=DOBI(width-1 downto 0)when SEL='0' else DIIMi;
 
 
 
end RAM1X;
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.