jemas963852741 发表于 2010-4-27 15:56:11

求ssram读写控制资料

求ssram读写控制资料 求ssram读写控制资料 求ssram读写控制资料 求ssram读写控制资料

NJ8888 发表于 2010-4-27 16:12:08

这SSRAM容量上 价格上 性能上有优势吗

jemas963852741 发表于 2010-4-27 19:28:08

回复【1楼】888888888888
-----------------------------------------------------------------------

没办法,我正在学习,板上用的是ssram

nono2000 发表于 2011-2-2 03:02:23

--
--
--        S S R A Mi n t e r f a c e
--
-- various components for ssrams
--

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;

package SSRAM is
        component ssram_conn is
        generic(
                DWIDTH        : positive := 16;
                AWIDTH : positive := 18
        );
        port (
                clk : in std_logic;
                A : in unsigned(AWIDTH -1 downto 0);
                Din : in std_logic_vector(DWIDTH -1 downto 0);
                Dout : out std_logic_vector(DWIDTH -1 downto 0);
                rw : in std_logic;
                bw : in std_logic_vector((DWIDTH/8) downto 0) := (others => '0');

                ssramA : out unsigned(AWIDTH -1 downto 0);
                ssramD : inout std_logic_vector(DWIDTH -1 downto 0);
                ssramRW : out std_logic;
                ssramBW : out std_logic_vector((DWIDTH/8) downto 0)
        );
        end component ssram_conn;

        component cs_ssram is
        generic(
                DWIDTH : positive := 16;
                AWIDTH : positive := 18
        );
        port (
                clk : in std_logic;
                clk_div2 : in std_logic;                -- clk divided by 2

                p0_A : in unsigned(AWIDTH -1 downto 0);
                p0_Din : in std_logic_vector(DWIDTH -1 downto 0);
                p0_Dout : out std_logic_vector(DWIDTH -1 downto 0);
                p0_rw : in std_logic;
                p0_bw : in std_logic_vector((DWIDTH/8) downto 0) := (others => '0');

                p1_A : in unsigned(AWIDTH -1 downto 0);
                p1_Din : in std_logic_vector(DWIDTH -1 downto 0);
                p1_Dout : out std_logic_vector(DWIDTH -1 downto 0);
                p1_rw : in std_logic;
                p1_bw : in std_logic_vector((DWIDTH/8) downto 0) := (others => '0');

                ssramA : out unsigned(AWIDTH -1 downto 0);
                ssramD : inout std_logic_vector(DWIDTH -1 downto 0);
                ssramRW : out std_logic;
                ssramBW : out std_logic_vector((DWIDTH/8) downto 0)
        );
        end component cs_ssram;

end package SSRAM;

--
--
-- SSRAM cycle shared memory implementation
--
-- ssram can be accessed by 2 ports at clk_div2 frequency. SSRAM operates at clk frequency
-- clk_div2 is actually a clk_en signal (no extra clock-domain)
--
-- read command: data valid after 3 clk_div2 cycles
-- 1) set address, RW = '1' (read command)
-- 2) present address/RW to ssram
-- 3) ssram presents data
-- 4) data (p0_dout/p1_dout) valid
-- 5) take/use data
--
-- note: p0_dout Tsu = 1 clk_div2 cycle
--       p1_dout Tsu = 1 clk cycle (so half of p0_dout Tsu)

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;

entity cs_ssram is
        generic(
                DWIDTH : positive := 16;
                AWIDTH : positive := 18
        );
        port (
                clk : in std_logic;
                clk_div2 : in std_logic;                -- clk divided by 2

                p0_A : in unsigned(AWIDTH -1 downto 0);
                p0_Din : in std_logic_vector(DWIDTH -1 downto 0);
                p0_Dout : out std_logic_vector(DWIDTH -1 downto 0);
                p0_rw : in std_logic;
                p0_bw : in std_logic_vector((DWIDTH/8) downto 0) := (others => '0');

                p1_A : in unsigned(AWIDTH -1 downto 0);
                p1_Din : in std_logic_vector(DWIDTH -1 downto 0);
                p1_Dout : out std_logic_vector(DWIDTH -1 downto 0);
                p1_rw : in std_logic;
                p1_bw : in std_logic_vector((DWIDTH/8) downto 0) := (others => '0');

                ssramA : out unsigned(AWIDTH -1 downto 0);
                ssramD : inout std_logic_vector(DWIDTH -1 downto 0);
                ssramRW : out std_logic;
                ssramBW : out std_logic_vector((DWIDTH/8) downto 0)
        );
end entity cs_ssram;

architecture structural of cs_ssram is
        component ssram_conn is
        generic(
                DWIDTH        : positive;
                AWIDTH : positive
        );
        port (
                clk : in std_logic;
                A : in unsigned(AWIDTH -1 downto 0);
                Din : in std_logic_vector(DWIDTH -1 downto 0);
                Dout : out std_logic_vector(DWIDTH -1 downto 0);
                rw : in std_logic;
                bw : in std_logic_vector((DWIDTH/8) downto 0) := (others => '0');

                ssramA : out unsigned(AWIDTH -1 downto 0);
                ssramD : inout std_logic_vector(DWIDTH -1 downto 0);
                ssramRW : out std_logic;
                ssramBW : out std_logic_vector((DWIDTH/8) downto 0)
        );
        end component ssram_conn;

        signal A : unsigned(AWIDTH -1 downto 0);
        signal Din : std_logic_vector(DWIDTH -1 downto 0);        -- from SSRAMs
        signal Dout : std_logic_vector(DWIDTH -1 downto 0);        -- towards SSRAMs
        signal BW : std_logic_vector((DWIDTH/8) downto 0);
        signal RW : std_logic;
begin

        -- mux address / data-in / rw / bw
        gen_muxs: process (clk)
                variable iA : unsigned(AWIDTH -1 downto 0);
                variable iDout : std_logic_vector(DWIDTH -1 downto 0);
                variable iRW : std_logic;
                variable iBW : std_logic_vector((DWIDTH/8) downto 0);
        begin
                if (clk_div2 = '0') then
                        iA := p0_A;
                        iDout := p0_Din;
                        iRW := p0_rw;
                        for n in 0 to (DWIDTH/8) loop
                                iBW(n) := p0_bw(n);
                        end loop;
                else -- clk_div2 = '1'
                        iA := p1_A;
                        iDout := p1_Din;
                        iRW := p1_rw;
                        for n in 0 to (DWIDTH/8) loop
                                iBW(n) := p1_bw(n);
                        end loop;
                end if;

                if (clk'event and clk = '1') then
                        A <= iA;
                        Dout <= iDout;
                        RW <= iRW;
                        BW <= iBW;       
                end if;
        end process gen_muxs;

        -- instert ssram IO controller
        ssram_io_ctrl: ssram_conn generic map (DWIDTH => DWIDTH, AWIDTH => AWIDTH)
                        port map (clk, A, Dout, Din, RW, bw, ssramA, ssramD, ssramRW, ssramBW);

        -- demux data from ssram
        demux_din: process(clk)
        begin
                if (clk'event and clk = '1') then
                        if (clk_div2 = '1') then        -- switched
                                p0_Dout <= Din;
                        else
                                p1_Dout <= Din;
                        end if;
                end if;
        end process demux_din;

end architecture structural; -- of cs_ssram

--
--
--        SSRAM physical connection (IO) controller
--
--
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;

entity ssram_conn is
        generic(
                DWIDTH        : positive := 16;
                AWIDTH : positive := 18
        );
        port (
                clk : in std_logic;
                A : in unsigned(AWIDTH -1 downto 0);
                Din : in std_logic_vector(DWIDTH -1 downto 0);
                Dout : out std_logic_vector(DWIDTH -1 downto 0);
                rw : in std_logic;
                bw : in std_logic_vector((DWIDTH/8) downto 0) := (others => '0');

                ssramA : out unsigned(AWIDTH -1 downto 0);
                ssramD : inout std_logic_vector(DWIDTH -1 downto 0);
                ssramRW : out std_logic;
                ssramBW : out std_logic_vector((DWIDTH/8) downto 0)
        );
end entity ssram_conn;

architecture structural of ssram_conn is
        signal dD, ddD, dddD : std_logic_vector(DWIDTH -1 downto 0);
        signal dsel, ddsel : std_logic;
        signal dddSel : std_logic_vector(DWIDTH -1 downto 0);
        attribute preserve_signal : boolean;
        attribute preserve_signal of dddSel: signal is true;        -- instruct compiler to leave these signals
        attribute preserve_signal of dddD: signal is true;
begin
        process(clk, dddD, dddSel)
        begin
                if(clk'event and clk = '1') then
                        -- compensate ssram pipeline delay
                        dD <= Din;                                                -- present address / rw
                        ddD <= dD;                                                -- ssram takes address / rw over
                        dddD <= ddD;                                        -- present data
                        dsel <= not RW;
                        ddsel <= dsel;

                        for n in 0 to (DWIDTH -1) loop
                                dddsel(n) <= ddsel;
                        end loop;

                        Dout <= ssramD;
                        ssramA <= A;
                        ssramRW <= RW;
                        ssramBW <= BW;
                end if;

                for n in 0 to (DWIDTH -1) loop
                        if (dddSel(n) = '1') then
                                ssramD(n) <= dddD(n);
                        else
                                ssramD(n) <= 'Z';
                        end if;
                end loop;

        end process;
end architecture structural; -- of ssram_conn
页: [1]
查看完整版本: 求ssram读写控制资料