----------------------------------------------------------------------------------
-- Company: University of Connecticut
-- Engineer: Igor Senderovich
-- 
-- Create Date:    10:22:64 09/24/2007 
-- Design Name:    Multiplexed Registers for DAC voltage values
-- Module Name:    Reg64x8bit_wPrim - Behavioral 
-- Description:    64 x 8bit muxed register bank using Xilinx primitives
--		   to avoid use of regular logic slices.
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

library UNISIM;
use UNISIM.VComponents.all;

entity Reg64x8bit_wPrim is
    Port ( Clk : in  STD_LOGIC;
           Rst : in  STD_LOGIC;
           Wr : in  STD_LOGIC;
           Addri : in  STD_LOGIC_VECTOR (5 downto 0);
           Addro : in  STD_LOGIC_VECTOR (5 downto 0);
           D : in  STD_LOGIC_VECTOR (7 downto 0);
           Q : out  STD_LOGIC_VECTOR (7 downto 0)
	 );
end Reg64x8bit_wPrim;

architecture Behavioral of Reg64x8bit_wPrim is

    component Reg16x8bit_wPrim is
      Port ( iClk : in  STD_LOGIC;
             En : in  STD_LOGIC;
             Addri : in  STD_LOGIC_VECTOR (3 downto 0);
             Addro : in  STD_LOGIC_VECTOR (3 downto 0);
             D : in  STD_LOGIC_VECTOR (7 downto 0);
             Q : out  STD_LOGIC_VECTOR (7 downto 0)
	   );
    end component;

    signal En : STD_LOGIC_VECTOR (3 downto 0);
    signal Q0,Q1,Q2,Q3 : STD_LOGIC_VECTOR (7 downto 0);
    signal iClk : STD_LOGIC;

begin

    iClk <= not Clk;
    En(0) <= Wr when Addri(5 downto 4)="00" else '0';
    En(1) <= Wr when Addri(5 downto 4)="01" else '0';
    En(2) <= Wr when Addri(5 downto 4)="10" else '0';
    En(3) <= Wr when Addri(5 downto 4)="11" else '0';
	
    r0:  Reg16x8bit_wPrim port map (Clk, En(0), Addri(3 downto 0), Addro(3 downto 0), D, Q0);
    r1:  Reg16x8bit_wPrim port map (Clk, En(1), Addri(3 downto 0), Addro(3 downto 0), D, Q1);
    r2:  Reg16x8bit_wPrim port map (Clk, En(2), Addri(3 downto 0), Addro(3 downto 0), D, Q2);
    r3:  Reg16x8bit_wPrim port map (Clk, En(3), Addri(3 downto 0), Addro(3 downto 0), D, Q3);

    Q <= Q0 when Addro(5 downto 4)="00" else 
	 Q1 when Addro(5 downto 4)="01" else 
	 Q2 when Addro(5 downto 4)="10" else 
	 Q3 when Addro(5 downto 4)="11";

end Behavioral;


----------------------------------------------------------------------------------
-- Company: University of Connecticut
-- Engineer: Igor Senderovich
-- 
-- Create Date:    10:22:64 09/24/2007 
-- Design Name:    Multiplexed Registers for DAC voltage values
-- Module Name:    Reg16x8bit_wPrim - Behavioral 
-- Description:	   16 x 8bit muxed register bank using Xilinx primitives
--		   to avoid use of regular logic slices.
----------------------------------------------------------------------------------


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

library UNISIM;
use UNISIM.VComponents.all;

entity Reg16x8bit_wPrim is
    Port ( iClk : in  STD_LOGIC;
           En : in  STD_LOGIC;
           Addri : in  STD_LOGIC_VECTOR (3 downto 0);
           Addro : in  STD_LOGIC_VECTOR (3 downto 0);
           D : in  STD_LOGIC_VECTOR (7 downto 0);
           Q : out  STD_LOGIC_VECTOR (7 downto 0)
	 );
end Reg16x8bit_wPrim;

architecture Behavioral of Reg16x8bit_wPrim is
	
begin

	reg1bit_0 : RAM16X1D generic map (INIT => X"0000")
	port map (WCLK => iClk, WE => En, DPO => Q(0), D => D(0),
		A0 => Addri(0),A1 => Addri(1),A2 => Addri(2),A3 => Addri(3),
		DPRA0 => Addro(0),DPRA1 => Addro(1),
		DPRA2 => Addro(2),DPRA3 => Addro(3));

	reg1bit_1 : RAM16X1D generic map (INIT => X"0000")
	port map (WCLK => iClk, WE => En, DPO => Q(1), D => D(1),
		A0 => Addri(0),A1 => Addri(1),A2 => Addri(2),A3 => Addri(3),
		DPRA0 => Addro(0),DPRA1 => Addro(1),
		DPRA2 => Addro(2),DPRA3 => Addro(3));

	reg1bit_2 : RAM16X1D generic map (INIT => X"0000")
	port map (WCLK => iClk, WE => En, DPO => Q(2), D => D(2),
		A0 => Addri(0),A1 => Addri(1),A2 => Addri(2),A3 => Addri(3),
		DPRA0 => Addro(0),DPRA1 => Addro(1),
		DPRA2 => Addro(2),DPRA3 => Addro(3));

	reg1bit_3 : RAM16X1D generic map (INIT => X"0000")
	port map (WCLK => iClk, WE => En, DPO => Q(3), D => D(3),
		A0 => Addri(0),A1 => Addri(1),A2 => Addri(2),A3 => Addri(3),
		DPRA0 => Addro(0),DPRA1 => Addro(1),
		DPRA2 => Addro(2),DPRA3 => Addro(3));

	reg1bit_4 : RAM16X1D generic map (INIT => X"0000")
	port map (WCLK => iClk, WE => En, DPO => Q(4), D => D(4),
		A0 => Addri(0),A1 => Addri(1),A2 => Addri(2),A3 => Addri(3),
		DPRA0 => Addro(0),DPRA1 => Addro(1),
		DPRA2 => Addro(2),DPRA3 => Addro(3));

	reg1bit_5 : RAM16X1D generic map (INIT => X"0000")
	port map (WCLK => iClk, WE => En, DPO => Q(5), D => D(5),
		A0 => Addri(0),A1 => Addri(1),A2 => Addri(2),A3 => Addri(3),
		DPRA0 => Addro(0),DPRA1 => Addro(1),
		DPRA2 => Addro(2),DPRA3 => Addro(3));

	reg1bit_6 : RAM16X1D generic map (INIT => X"0000")
	port map (WCLK => iClk, WE => En, DPO => Q(6), D => D(6),
		A0 => Addri(0),A1 => Addri(1),A2 => Addri(2),A3 => Addri(3),
		DPRA0 => Addro(0),DPRA1 => Addro(1),
		DPRA2 => Addro(2),DPRA3 => Addro(3));

	reg1bit_7 : RAM16X1D generic map (INIT => X"0000")
	port map (WCLK => iClk, WE => En, DPO => Q(7), D => D(7),
		A0 => Addri(0),A1 => Addri(1),A2 => Addri(2),A3 => Addri(3),
		DPRA0 => Addro(0),DPRA1 => Addro(1),
		DPRA2 => Addro(2),DPRA3 => Addro(3));

end Behavioral;
