📄 stratixii_ddr_phy.vhd
字号:
dqs_datain_l => dqs_datain_l, dll_delayctrlout => sub_wire0, dqinclk => sub_wire1, dqsundelayedout => sub_wire2, dqs_padio => dqs_padio );END RTL;library ieee;use ieee.std_logic_1164.all;library grlib;use grlib.stdlib.all;library techmap;use techmap.gencomp.all;library altera_mf;use altera_mf.altera_mf_components.all;-------------------------------------------------------------------- STRATIX2 DDR PHY -----------------------------------------------------------------------------------------------------------------entity stratixii_ddr_phy is generic (MHz : integer := 100; rstdelay : integer := 200; dbits : integer := 16; clk_mul : integer := 2 ; clk_div : integer := 2); port ( rst : in std_ulogic; clk : in std_logic; -- input clock clkout : out std_ulogic; -- system clock lock : out std_ulogic; -- DCM locked ddr_clk : out std_logic_vector(2 downto 0); ddr_clkb : out std_logic_vector(2 downto 0); ddr_clk_fb_out : out std_logic; ddr_clk_fb : in std_logic; ddr_cke : out std_logic_vector(1 downto 0); ddr_csb : out std_logic_vector(1 downto 0); ddr_web : out std_ulogic; -- ddr write enable ddr_rasb : out std_ulogic; -- ddr ras ddr_casb : out std_ulogic; -- ddr cas ddr_dm : out std_logic_vector (dbits/8-1 downto 0); -- ddr dm ddr_dqs : inout std_logic_vector (dbits/8-1 downto 0); -- ddr dqs ddr_ad : out std_logic_vector (13 downto 0); -- ddr address ddr_ba : out std_logic_vector (1 downto 0); -- ddr bank address ddr_dq : inout std_logic_vector (dbits-1 downto 0); -- ddr data addr : in std_logic_vector (13 downto 0); -- data mask ba : in std_logic_vector ( 1 downto 0); -- data mask dqin : out std_logic_vector (dbits*2-1 downto 0); -- ddr input data dqout : in std_logic_vector (dbits*2-1 downto 0); -- ddr input data dm : in std_logic_vector (dbits/4-1 downto 0); -- data mask oen : in std_ulogic; dqs : in std_ulogic; dqsoen : in std_ulogic; rasn : in std_ulogic; casn : in std_ulogic; wen : in std_ulogic; csn : in std_logic_vector(1 downto 0); cke : in std_logic_vector(1 downto 0) );end;architecture rtl of stratixii_ddr_phy issignal vcc, gnd, dqsn, oe, lockl : std_logic;signal ddr_clk_fb_outr : std_ulogic;signal ddr_clk_fbl, fbclk : std_ulogic;signal ddr_rasnr, ddr_casnr, ddr_wenr : std_ulogic;signal ddr_clkl, ddr_clkbl : std_logic_vector(2 downto 0);signal ddr_csnr, ddr_ckenr, ckel : std_logic_vector(1 downto 0);signal clk_0ro, clk_90ro, clk_180ro, clk_270ro : std_ulogic;signal clk_0r, clk_90r, clk_180r, clk_270r : std_ulogic;signal clk0r, clk90r, clk180r, clk270r : std_ulogic;signal locked, vlockl, ddrclkfbl : std_ulogic;signal clk4, clk5 : std_logic;signal ddr_dqin : std_logic_vector (dbits-1 downto 0); -- ddr datasignal ddr_dqout : std_logic_vector (dbits-1 downto 0); -- ddr datasignal ddr_dqoen : std_logic_vector (dbits-1 downto 0); -- ddr datasignal ddr_adr : std_logic_vector (13 downto 0); -- ddr addresssignal ddr_bar : std_logic_vector (1 downto 0); -- ddr addresssignal ddr_dmr : std_logic_vector (dbits/8-1 downto 0); -- ddr addresssignal ddr_dqsin : std_logic_vector (dbits/8-1 downto 0); -- ddr dqssignal ddr_dqsoen : std_logic_vector (dbits/8-1 downto 0); -- ddr dqssignal ddr_dqsoutl : std_logic_vector (dbits/8-1 downto 0); -- ddr dqssignal dqsdel, dqsclk : std_logic_vector (dbits/8-1 downto 0); -- ddr dqssignal da : std_logic_vector (dbits-1 downto 0); -- ddr datasignal dqinl : std_logic_vector (dbits-1 downto 0); -- ddr datasignal dllrst : std_logic_vector(0 to 3);signal dll0rst : std_logic_vector(0 to 3);signal mlock, mclkfb, mclk, mclkfx, mclk0 : std_ulogic;signal gndv : std_logic_vector (dbits-1 downto 0); -- ddr dqssignal pclkout : std_logic_vector (5 downto 1);signal ddr_clkin : std_logic_vector(0 to 2);signal dqinclk : std_logic_vector (dbits/8-1 downto 0); -- ddr dqssignal dqsoclk : std_logic_vector (dbits/8-1 downto 0); -- ddr dqssignal dqsnv : std_logic_vector (dbits/8-1 downto 0); -- ddr dqsconstant DDR_FREQ : integer := (MHz * clk_mul) / clk_div;component altdqs_stxii generic (width : integer := 2; period : string := "10000ps"); PORT ( dqs_datain_h : IN STD_LOGIC_VECTOR (width-1 downto 0); dqs_datain_l : IN STD_LOGIC_VECTOR (width-1 downto 0); inclk : IN STD_LOGIC ; oe : IN STD_LOGIC_VECTOR (width-1 downto 0); outclk : IN STD_LOGIC_VECTOR (width-1 downto 0); dll_delayctrlout : OUT STD_LOGIC_VECTOR (5 DOWNTO 0); dqinclk : OUT STD_LOGIC_VECTOR (width-1 downto 0); dqs_padio : INOUT STD_LOGIC_VECTOR (width-1 downto 0); dqsundelayedout : OUT STD_LOGIC_VECTOR (width-1 downto 0) );END component;type phasevec is array (1 to 3) of string(1 to 4);type phasevecarr is array (10 to 13) of phasevec;constant phasearr : phasevecarr := ( ("2500", "5000", "7500"), ("2273", "4545", "6818"), -- 100 & 110 MHz ("2083", "4167", "6250"), ("1923", "3846", "5769")); -- 120 & 130 MHztype periodtype is array (10 to 13) of string(1 to 6);constant periodstr : periodtype := ("9999ps", "9090ps", "8333ps", "7692ps");begin oe <= not oen; vcc <= '1'; gnd <= '0'; gndv <= (others => '0'); mclk <= clk;-- clkout <= clk_270r; -- clkout <= clk_0r when DDR_FREQ >= 110 else clk_270r; clkout <= clk_90r when DDR_FREQ > 120 else clk_0r; clk0r <= clk_270r; clk90r <= clk_0r; clk180r <= clk_90r; clk270r <= clk_180r; dll : altpll generic map ( operation_mode => "NORMAL", inclk0_input_frequency => 1000000/MHz, inclk1_input_frequency => 1000000/MHz, clk4_multiply_by => clk_mul, clk4_divide_by => clk_div, clk3_multiply_by => clk_mul, clk3_divide_by => clk_div, clk2_multiply_by => clk_mul, clk2_divide_by => clk_div, clk1_multiply_by => clk_mul, clk1_divide_by => clk_div, clk0_multiply_by => clk_mul, clk0_divide_by => clk_div, clk3_phase_shift => phasearr(DDR_FREQ/10)(3), clk2_phase_shift => phasearr(DDR_FREQ/10)(2), clk1_phase_shift => phasearr(DDR_FREQ/10)(1) -- clk3_phase_shift => "6250", clk2_phase_shift => "4167", clk1_phase_shift => "2083"-- clk3_phase_shift => "7500", clk2_phase_shift => "5000", clk1_phase_shift => "2500" ) port map ( inclk(0) => mclk, inclk(1) => gnd, clk(0) => clk_0r, clk(1) => clk_90r, clk(2) => clk_180r, clk(3) => clk_270r, clk(4) => clk4, clk(5) => clk5, locked => lockl); rstdel : process (mclk, rst, lockl) begin if rst = '0' then dllrst <= (others => '1'); elsif rising_edge(mclk) then dllrst <= dllrst(1 to 3) & '0'; end if; end process; rdel : if rstdelay /= 0 generate rcnt : process (clk_0r) variable cnt : std_logic_vector(15 downto 0); variable vlock, co : std_ulogic; begin if rising_edge(clk_0r) then co := cnt(15); vlockl <= vlock; if lockl = '0' then cnt := conv_std_logic_vector(rstdelay*DDR_FREQ, 16); vlock := '0'; else if vlock = '0' then cnt := cnt -1; vlock := cnt(15) and not co; end if; end if; end if; if lockl = '0' then vlock := '0'; end if; end process; end generate; locked <= lockl when rstdelay = 0 else vlockl; lock <= locked; -- Generate external DDR clock-- fbclkpad : altddio_out generic map (width => 1)-- port map ( datain_h(0) => vcc, datain_l(0) => gnd,-- outclock => clk90r, dataout(0) => ddr_clk_fb_out); ddrclocks : for i in 0 to 2 generate clkpad : altddio_out generic map (width => 1, INTENDED_DEVICE_FAMILY => "STRATIX") port map ( datain_h(0) => vcc, datain_l(0) => gnd, outclock => clk90r, dataout(0) => ddr_clk(i)); clknpad : altddio_out generic map (width => 1, INTENDED_DEVICE_FAMILY => "STRATIX") port map ( datain_h(0) => gnd, datain_l(0) => vcc, outclock => clk90r, dataout(0) => ddr_clkb(i)); end generate; csnpads : altddio_out generic map (width => 2, INTENDED_DEVICE_FAMILY => "STRATIX") port map ( datain_h => csn(1 downto 0), datain_l => csn(1 downto 0), outclock => clk0r, dataout => ddr_csb(1 downto 0)); ckepads : altddio_out generic map (width => 2, INTENDED_DEVICE_FAMILY => "STRATIX") port map ( datain_h => ckel(1 downto 0), datain_l => ckel(1 downto 0), outclock => clk0r, dataout => ddr_cke(1 downto 0)); ddrbanks : for i in 0 to 1 generate ckel(i) <= cke(i) and locked; end generate; rasnpad : altddio_out generic map (width => 1, INTENDED_DEVICE_FAMILY => "STRATIX") port map ( datain_h(0) => rasn, datain_l(0) => rasn, outclock => clk0r, dataout(0) => ddr_rasb); casnpad : altddio_out generic map (width => 1, INTENDED_DEVICE_FAMILY => "STRATIX") port map ( datain_h(0) => casn, datain_l(0) => casn, outclock => clk0r, dataout(0) => ddr_casb); wenpad : altddio_out generic map (width => 1, INTENDED_DEVICE_FAMILY => "STRATIX") port map ( datain_h(0) => wen, datain_l(0) => wen, outclock => clk0r, dataout(0) => ddr_web); dmpads : altddio_out generic map (width => dbits/8, INTENDED_DEVICE_FAMILY => "STRATIX") port map ( datain_h => dm(dbits/8*2-1 downto dbits/8), datain_l => dm(dbits/8-1 downto 0), outclock => clk0r, dataout => ddr_dm ); bapads : altddio_out generic map (width => 2) port map ( datain_h => ba, datain_l => ba, outclock => clk0r, dataout => ddr_ba ); addrpads : altddio_out generic map (width => 14) port map ( datain_h => addr, datain_l => addr, outclock => clk0r, dataout => ddr_ad ); -- DQS generation dqsnv <= (others => dqsn); dqsoclk <= (others => clk90r); altdqs0 : altdqs_stxii generic map (dbits/8, periodstr(DDR_FREQ/10)) port map (dqs_datain_h => dqsnv, dqs_datain_l => gndv(dbits/8-1 downto 0), inclk => clk270r, oe => ddr_dqsoen, outclk => dqsoclk, dll_delayctrlout => open, dqinclk => dqinclk, dqs_padio => ddr_dqs, dqsundelayedout => open ); -- Data bus dqgen : for i in 0 to dbits/8-1 generate qi : altddio_bidir generic map (width => 8, oe_reg =>"REGISTERED", INTENDED_DEVICE_FAMILY => "STRATIXII") port map ( datain_l => dqout(i*8+7 downto i*8), datain_h => dqout(i*8+7+dbits downto dbits+i*8), inclock => dqinclk(i), --clk270r, outclock => clk0r, oe => oe, dataout_h => dqin(i*8+7 downto i*8), dataout_l => dqin(i*8+7+dbits downto dbits+i*8), --dqinl(i*8+7 downto i*8), padio => ddr_dq(i*8+7 downto i*8)); end generate; dqsreg : process(clk180r) begin if rising_edge(clk180r) then dqsn <= oe; end if; end process; oereg : process(clk0r) begin if rising_edge(clk0r) then ddr_dqsoen(dbits/8-1 downto 0) <= (others => not dqsoen); end if; end process;end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -