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 + -
显示快捷键?