mem_actel_gen.vhd

来自「The GRLIB IP Library is an integrated se」· VHDL 代码 · 共 663 行 · 第 1/2 页

VHD
663
字号
  wen <= not write; ren <= not rena;  x0 : if abits < 15 generate    b0 : for j in 0 to ntbl(abits)-1 generate      g0 : for i in 0 to (dbits-1)/9 generate        u0 : RAM256x9SST port map (          DO0 => q(j)(i*9+0), DO1 => q(j)(i*9+1), DO2 => q(j)(i*9+2),          DO3 => q(j)(i*9+3), DO4 => q(j)(i*9+4), DO5 => q(j)(i*9+5),           DO6 => q(j)(i*9+6), DO7 => q(j)(i*9+7), DO8 => q(j)(i*9+8),          DOS => open, RPE => open, WPE => open,          WADDR0 => wa(0), WADDR1 => wa(1), WADDR2 => wa(2),          WADDR3 => wa(3), WADDR4 => wa(4), WADDR5 => wa(5),          WADDR6 => wa(6), WADDR7 => wa(7),          RADDR0 => ra(0), RADDR1 => ra(1), RADDR2 => ra(2),          RADDR3 => ra(3), RADDR4 => ra(4), RADDR5 => ra(5),          RADDR6 => ra(6), RADDR7 => ra(7),          WCLKS => wclk, RCLKS => rclk,          DI0 => d(i*9+0), DI1 => d(i*9+1), DI2 => d(i*9+2),          DI3 => d(i*9+3), DI4 => d(i*9+4), DI5 => d(i*9+5),           DI6 => d(i*9+6), DI7 => d(i*9+7), DI8 => d(i*9+8),          RDB => ren, WRB => wen, RBLKB => renv(j), WBLKB => wenv(j),	  PARODD => gnd, DIS => gnd	);      end generate;    end generate;    rra(20 downto abits) <= (others => '0');    reg : process(rclk)    begin      if rising_edge(rclk) then        rra(abits-1 downto 0) <= raddr(abits-1 downto 0);        rra(7 downto 0) <= (others => '0');      end if;    end process;    ctrl : process(write, waddr, q, rra, rena, raddr)    variable we,z,re : std_logic_vector(63 downto 0);    variable wea,rea : std_logic_vector(63 downto 0);    begin      we := (others => '0'); z := (others => '0'); re := (others => '0');      wea := (others => '0'); rea := (others => '0');      wea(abits-1 downto 0) := waddr(abits-1 downto 0); wea(7 downto 0) := (others => '0');      rea(abits-1 downto 0) := raddr(abits-1 downto 0); wea(7 downto 0) := (others => '0');      z(dbits-1 downto 0) := 		q(conv_integer(rra(19 downto 8)))(dbits-1 downto 0);      we (conv_integer(wea(19 downto 8))) := write;      re (conv_integer(rea(19 downto 8))) := rena;      wenv <= not we; renv <= not re; dout <= z(dbits-1 downto 0);    end process;  end generate;-- pragma translate_off    unsup : if abits > 14 generate    x : process    begin      assert false      report  "Address depth larger than 14 not supported for ProAsic rams"      severity failure;      wait;    end process;  end generate;-- pragma translate_on  end;library ieee;use ieee.std_logic_1164.all;library gaisler;use gaisler.mem_actel.all;entity proasic_syncram is  generic ( abits : integer := 10; dbits : integer := 8 );  port (    clk      : in std_ulogic;    address  : in std_logic_vector((abits -1) downto 0);    datain   : in std_logic_vector((dbits -1) downto 0);    dataout  : out std_logic_vector((dbits -1) downto 0);    enable   : in std_ulogic;    write    : in std_ulogic   ); end;architecture rtl of proasic_syncram isbegin  u0 : proasic_syncram_2p generic map (abits, dbits)       port map (clk, enable, address, dataout, clk, address, datain, write);end;library ieee;use ieee.std_logic_1164.all;library gaisler;use gaisler.mem_actel.all;entity proasic3_syncram_dp is  generic ( abits : integer := 6; dbits : integer := 8 );  port (    clk1     : in std_ulogic;    address1 : in std_logic_vector((abits -1) downto 0);    datain1  : in std_logic_vector((dbits -1) downto 0);    dataout1 : out std_logic_vector((dbits -1) downto 0);    enable1  : in std_ulogic;    write1   : in std_ulogic;    clk2     : in std_ulogic;    address2 : in std_logic_vector((abits -1) downto 0);    datain2  : in std_logic_vector((dbits -1) downto 0);    dataout2 : out std_logic_vector((dbits -1) downto 0);    enable2  : in std_ulogic;    write2   : in std_ulogic   ); end;architecture rtl of proasic3_syncram_dp is  component proasic3_ram4k9 is  generic (abits : integer range 9 to 12 := 9; dbits : integer := 9);  port (    addra, addrb : in  std_logic_vector(abits -1 downto 0);    clka, clkb   : in  std_ulogic;    dia, dib     : in  std_logic_vector(dbits -1 downto 0);    doa, dob     : out std_logic_vector(dbits -1 downto 0);    ena, enb     : in  std_ulogic;    wea, web     : in  std_ulogic   );   end component;  constant dlen : integer := dbits + 9;  signal di1, di2, q1, q2 : std_logic_vector(dlen downto 0);  signal a1, a2 : std_logic_vector(12 downto 0);  signal en1, en2, we1, we2 : std_ulogic;begin  di1(dbits-1 downto 0) <= datain1; di1(dlen downto dbits) <= (others => '0');  di2(dbits-1 downto 0) <= datain1; di2(dlen downto dbits) <= (others => '0');  a1(abits-1 downto 0) <= address1; a1(12 downto abits) <= (others => '0');  a2(abits-1 downto 0) <= address1; a2(12 downto abits) <= (others => '0');  dataout1 <= q1(dbits-1 downto 0); q1(dlen downto dbits) <= (others => '0');  dataout2 <= q2(dbits-1 downto 0); q2(dlen downto dbits) <= (others => '0');  en1 <= not enable1; en2 <= not enable2;  we1 <= not write1; we2 <= not write2;  a9 : if (abits <= 9) generate    x : for i in 0 to (dbits-1)/9 generate      u0 : proasic3_ram4k9 generic map (9, 9) port map (        a1(8 downto 0), a2(8 downto 0), clk1, clk2, 	di1(i*9+8 downto i*9), di2(i*9+8 downto i*9),	q1(i*9+8 downto i*9), q2(i*9+8 downto i*9), 	en1, en2, we1, we2);    end generate;  end generate;  a10 : if (abits = 10) generate    x : for i in 0 to (dbits-1)/4 generate      u0 : proasic3_ram4k9 generic map (10, 4) port map (        a1(9 downto 0), a2(9 downto 0), clk1, clk2, 	di1(i*4+3 downto i*4), di2(i*4+3 downto i*4),	q1(i*4+3 downto i*4), q2(i*4+3 downto i*4), 	en1, en2, we1, we2);    end generate;  end generate;  a11 : if (abits = 11) generate    x : for i in 0 to (dbits-1)/2 generate      u0 : proasic3_ram4k9 generic map (11, 2) port map (        a1(10 downto 0), a2(10 downto 0), clk1, clk2, 	di1(i*2+1 downto i*2), di2(i*2+1 downto i*2),	q1(i*2+1 downto i*2), q2(i*2+1 downto i*2), 	en1, en2, we1, we2);    end generate;  end generate;  a12 : if (abits = 12) generate    x : for i in 0 to (dbits-1) generate      u0 : proasic3_ram4k9 generic map (12, 1) port map (        a1(11 downto 0), a2(11 downto 0), clk1, clk2, 	di1(i*1 downto i*1), di2(i*1 downto i*1),	q1(i*1 downto i*1), q2(i*1 downto i*1), 	en1, en2, we1, we2);    end generate;  end generate;-- pragma translate_off    unsup : if abits > 12 generate    x : process    begin      assert false      report  "Address depth larger than 12 not supported for ProAsic3 rams"      severity failure;      wait;    end process;  end generate;-- pragma translate_onend;library ieee;use ieee.std_logic_1164.all;library gaisler;use gaisler.mem_actel.all;entity proasic3_syncram_2p is  generic ( abits : integer := 8; dbits : integer := 32);  port (    rclk  : in std_ulogic;    rena  : in std_ulogic;    raddr : in std_logic_vector (abits -1 downto 0);    dout  : out std_logic_vector (dbits -1 downto 0);    wclk  : in std_ulogic;    waddr : in std_logic_vector (abits -1 downto 0);    din   : in std_logic_vector (dbits -1 downto 0);    write : in std_ulogic);end;architecture rtl of proasic3_syncram_2p is  component proasic3_ram4k9 is  generic (abits : integer range 9 to 12 := 9; dbits : integer := 9);  port (    addra, addrb : in  std_logic_vector(abits -1 downto 0);    clka, clkb   : in  std_ulogic;    dia, dib     : in  std_logic_vector(dbits -1 downto 0);    doa, dob     : out std_logic_vector(dbits -1 downto 0);    ena, enb     : in  std_ulogic;    wea, web     : in  std_ulogic   );   end component;  component proasic3_ram512x18  port (    addra, addrb : in  std_logic_vector(8 downto 0);    clka, clkb   : in  std_ulogic;    di           : in  std_logic_vector(17 downto 0);    do           : out std_logic_vector(17 downto 0);    ena, enb     : in  std_ulogic;    wea          : in  std_ulogic   );   end component;  constant dlen : integer := dbits + 18;  signal di1, q2, gnd : std_logic_vector(dlen downto 0);  signal a1, a2 : std_logic_vector(12 downto 0);  signal en1, en2, we1, vcc : std_ulogic;begin  vcc <= '1'; gnd <= (others => '0');  di1(dbits-1 downto 0) <= din; di1(dlen downto dbits) <= (others => '0');  a1(abits-1 downto 0) <= waddr; a1(12 downto abits) <= (others => '0');  a2(abits-1 downto 0) <= raddr; a2(12 downto abits) <= (others => '0');  dout <= q2(dbits-1 downto 0); q2(dlen downto dbits) <= (others => '0');  en1 <= not write; en2 <= not rena; we1 <= not write;  a8 : if (abits <= 8) generate    x : for i in 0 to (dbits-1)/18 generate      u0 : proasic3_ram512x18 port map (        a1(8 downto 0), a2(8 downto 0), wclk, rclk, 	di1(i*18+17 downto i*18), q2(i*18+17 downto i*18), 	en1, en2, we1);    end generate;  end generate;  a9 : if (abits = 9) generate    x : for i in 0 to (dbits-1)/9 generate      u0 : proasic3_ram4k9 generic map (9, 9) port map (        a1(8 downto 0), a2(8 downto 0), wclk, rclk, 	di1(i*9+8 downto i*9), gnd(8 downto 0),	open, q2(i*9+8 downto i*9), 	en1, en2, we1, vcc);    end generate;  end generate;  a10 : if (abits = 10) generate    x : for i in 0 to (dbits-1)/4 generate      u0 : proasic3_ram4k9 generic map (10, 4) port map (        a1(9 downto 0), a2(9 downto 0), wclk, rclk, 	di1(i*4+3 downto i*4), gnd(3 downto 0),	open, q2(i*4+3 downto i*4), 	en1, en2, we1, vcc);    end generate;  end generate;  a11 : if (abits = 11) generate    x : for i in 0 to (dbits-1)/2 generate      u0 : proasic3_ram4k9 generic map (11, 2) port map (        a1(10 downto 0), a2(10 downto 0), wclk, rclk, 	di1(i*2+1 downto i*2), gnd(1 downto 0),	open, q2(i*2+1 downto i*2), 	en1, en2, we1, vcc);    end generate;  end generate;  a12 : if (abits = 12) generate    x : for i in 0 to (dbits-1) generate      u0 : proasic3_ram4k9 generic map (12, 1) port map (        a1(11 downto 0), a2(11 downto 0), wclk, rclk, 	di1(i*1 downto i*1), gnd(0 downto 0),	open, q2(i*1 downto i*1), 	en1, en2, we1, vcc);    end generate;  end generate;-- pragma translate_off    unsup : if abits > 12 generate    x : process    begin      assert false      report  "Address depth larger than 12 not supported for ProAsic3 rams"      severity failure;      wait;    end process;  end generate;-- pragma translate_onend;library ieee;use ieee.std_logic_1164.all;library gaisler;use gaisler.mem_actel.all;entity proasic3_syncram is  generic ( abits : integer := 10; dbits : integer := 8 );  port (    clk      : in std_ulogic;    address  : in std_logic_vector((abits -1) downto 0);    datain   : in std_logic_vector((dbits -1) downto 0);    dataout  : out std_logic_vector((dbits -1) downto 0);    enable   : in std_ulogic;    write    : in std_ulogic   ); end;architecture rtl of proasic3_syncram issignal gnd : std_logic_vector(abits+dbits downto 0);begin  gnd <= (others => '0');  r2p  : if abits <= 8 generate     u0 : proasic3_syncram_2p generic map (abits, dbits)       port map (clk, enable, address, dataout, clk, address, datain, write);  end generate;  rdp  : if abits > 8 generate     u0 : proasic3_syncram_dp generic map (abits, dbits)         port map (clk, address, datain, dataout, enable, write,                    clk, gnd(abits-1 downto 0), gnd(dbits-1 downto 0), open, gnd(0), gnd(0));  end generate;end;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?