⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ddrsp.vhd

📁 free hardware ip core about sparcv8,a soc cpu in vhdl
💻 VHD
📖 第 1 页 / 共 2 页
字号:
	end if;      else        v.sdstate := wr2;	v.dqm := (others => '1'); --v.bdrive := '1';       end if;    when wr2 =>      v.sdstate := wr3; v.qdrive := '1';    when wr3 =>	v.sdstate := wr4a; v.qdrive := '1';    when wr4a =>        v.bdrive := '1'; 	v.rasn := '0'; v.sdwen := '0'; v.sdstate := wr4; v.qdrive := '1';    when wr4 =>      v.sdcsn := "11"; v.rasn := '1'; v.sdwen := '1';  v.qdrive := '0';      v.sdstate := wr5;    when wr5 =>      v.sdstate := sidle;    when rd1 =>      v.casn := '1'; v.sdstate := rd7;    when rd7 =>      v.sdstate := rd2;    when rd2 =>      v.sdstate := rd3;      if ahbsi.htrans /= "11" then v.rasn := '0'; v.sdwen := '0'; end if;      if v.sdwen = '0' then v.dqm := (others => '1'); end if;    when rd3 =>      v.sdstate := rd4; v.hready := '1'; v.casn := '1';      if r.sdwen = '0' then	v.rasn := '1'; v.sdwen := '1'; v.sdcsn := "11"; v.dqm := (others => '1');      elsif r.haddr(4 downto 2) = "000" then 	v.casn := '0'; v.burst := '1'; v.address(5) := '1';      end if;    when rd4 =>      v.hready := '1'; v.casn := '1';      if (ahbsi.htrans = "11") and (r.sdcsn /= "11") and	 (r.haddr(3 downto 2) = "11") and (r.burst = '1')      then	v.burst := '0';      elsif (ahbsi.htrans /= "11") or (r.sdcsn = "11") or	 (r.haddr(3 downto 2) = "11")      then        v.hready := '0'; v.dqm := (others => '1'); v.burst := '0';        if (r.sdcsn /= "11") then          if (ahbsi.htrans = "11") and (r.cfg.command(2) = '0') then 	    v.sdstate := act3;	  else v.rasn := '0'; v.sdwen := '0'; v.sdstate := rd5; end if;	else          if r.cfg.trp = '1' then v.sdstate := rd6; 	  else v.sdstate := sidle; end if;        end if;      end if;    when rd5 =>      if r.cfg.trp = '1' then 	v.sdstate := rd6;       else v.sdstate := sidle; end if;      v.sdcsn := (others => '1'); v.rasn := '1'; v.sdwen := '1'; v.dqm := (others => '1');    when rd6 =>      v.sdstate := sidle; v.dqm := (others => '1');      v.sdcsn := (others => '1'); v.rasn := '1'; v.sdwen := '1';    when others =>	v.sdstate := sidle;    end case;-- sdram commands    case r.cmstate is    when midle =>      if r.sdstate = sidle then        case r.cfg.command is        when CMD_PRE => -- precharge	    v.sdcsn := (others => '0'); v.rasn := '0'; v.sdwen := '0';	    v.address(12) := '1'; v.cmstate := active;        when CMD_REF => -- auto-refresh	  v.sdcsn := (others => '0'); v.rasn := '0'; v.casn := '0';          v.cmstate := active;        when CMD_EMR => -- load-ext-mode-reg	    v.sdcsn := (others => '0'); v.rasn := '0'; v.casn := '0'; 	    v.sdwen := '0'; v.cmstate := active;	    v.address(16 downto 2) := "010000000000000";        when CMD_LMR => -- load-mode-reg	    v.sdcsn := (others => '0'); v.rasn := '0'; v.casn := '0'; 	    v.sdwen := '0'; v.cmstate := active;--	    v.address(16 downto 2) := "000000" & r.cfg.dllrst & "0" & "01" & r.cfg.casdel & "0011";	    v.address(16 downto 2) := "000000" & r.cfg.dllrst & "0" & "01" & "00011";        when others => null;        end case;      end if;    when active =>      v.sdcsn := (others => '1'); v.rasn := '1'; v.casn := '1';       v.sdwen := '1'; v.cfg.command := "000";      v.cmstate := leadout; v.trfc := r.cfg.trfc;    when others =>      if r.trfc = "000" then v.cmstate := midle; end if;    end case;-- sdram init    case r.istate is    when iidle =>      if r.cfg.renable = '1' then        v.cfg.command := CMD_PRE; v.cfg.cke := '1'; v.cfg.dllrst := '1';	if r.cfg.cke = '1' then v.istate := pre; end if;      end if;    when pre =>      if r.cfg.command = "000" then        v.cfg.command := "11" & r.cfg.dllrst; 	if r.cfg.dllrst = '1' then v.istate := emode; else v.istate := lmode; end if;      end if;    when emode =>      if r.cfg.command = "000" then        v.istate := lmode; v.cfg.command := CMD_LMR;      end if;    when lmode =>      if r.cfg.command = "000" then	if r.cfg.dllrst = '1' then  	  if r.refresh(9 downto 8) = "00" then -- > 200 clocks delay            v.cfg.command := CMD_REF; v.istate := ref1;	  end if;	else 	  v.istate := finish; v.cfg.command := CMD_LMR;	  v.cfg.refon := '1'; v.cfg.renable := '0';	end if;      end if;    when ref1 =>      if r.cfg.command = "000" then        v.cfg.command := CMD_REF; v.cfg.dllrst := '0'; v.istate := ref2;       end if;    when ref2 =>      if r.cfg.command = "000" then        v.cfg.command := CMD_PRE; v.istate := pre;      end if;    when others =>      if r.cfg.renable = '1' then        v.istate := iidle; v.cfg.dllrst := '1';      end if;    end case;    if (ahbsi.hready and ahbsi.hsel(hindex) ) = '1' then      if ahbsi.htrans(1) = '0' then v.hready := '1'; end if;    end if;    if (r.hsel and r.hio and not r.hready) = '1' then v.hready := '1'; end if;-- second part of main fsm    case r.mstate is    when active =>      if v.hready = '1' then	v.mstate := midle;      end if;    when others => null;    end case;-- sdram refresh counter    if ((r.cfg.refon = '1') and (r.istate = finish)) or	(r.cfg.dllrst = '1')    then 	v.refresh := r.refresh - 1;        if (v.refresh(11) and not r.refresh(11))  = '1' then 	  v.refresh := r.cfg.refresh;	  if r.cfg.dllrst = '0' then v.cfg.command := "100"; end if;	end if;    end if;-- AHB register access    if (r.hsel and r.hio and r.hwrite and r.htrans(1)) = '1' then      v.cfg.refresh   :=  ahbsi.hwdata(11 downto 0);       v.cfg.cke       :=  ahbsi.hwdata(15);       v.cfg.renable   :=  ahbsi.hwdata(16);       v.cfg.dllrst    :=  ahbsi.hwdata(17);       v.cfg.command   :=  ahbsi.hwdata(20 downto 18);       v.cfg.csize     :=  ahbsi.hwdata(22 downto 21);       v.cfg.bsize     :=  ahbsi.hwdata(25 downto 23);       v.cfg.casdel    :=  ahbsi.hwdata(26);       v.cfg.trfc      :=  ahbsi.hwdata(29 downto 27);       v.cfg.trp       :=  ahbsi.hwdata(30);       v.cfg.refon     :=  ahbsi.hwdata(31);       v.refresh       :=  (others => '0');    end if;    regsd := (others => '0');    regsd(31 downto 15) := r.cfg.refon & r.cfg.trp & r.cfg.trfc &	 r.cfg.casdel & r.cfg.bsize & r.cfg.csize & r.cfg.command &	 r.cfg.dllrst & r.cfg.renable & r.cfg.cke;     regsd(11 downto 0) := r.cfg.refresh;     if (r.hsel and r.hio) = '1' then dout := regsd;    else dout := r.hrdata(31 downto 0); end if;    v.nbdrive := not v.bdrive;     if oepol = 1 then bdrive := r.nbdrive; vbdrive := (others => v.nbdrive);    else bdrive := r.bdrive; vbdrive := (others => v.bdrive);end if;     -- reset    if rst = '0' then      v.sdstate	      := sidle;       v.mstate	      := midle;       v.istate	      := finish;       v.cmstate	      := midle;       v.hsel	      := '0';      v.cfg.command   := "000";      v.cfg.csize     := conv_std_logic_vector(col-8, 2);      v.cfg.bsize     := conv_std_logic_vector(log2(Mbit/32), 3);      if MHz > 100 then v.cfg.casdel :=  '1'; else v.cfg.casdel :=  '0'; end if;      v.cfg.refon     :=  '0';      v.cfg.trfc      := conv_std_logic_vector(7*MHz/100-2, 3);      v.cfg.refresh   := conv_std_logic_vector(7800*MHz/1000, 12);      v.refresh       :=  (others => '0');      if pwron = 1 then v.cfg.renable :=  '1';      else v.cfg.renable :=  '0'; end if;      if MHz > 100 then v.cfg.trp := '1'; else v.cfg.trp := '0'; end if;      v.dqm	      := (others => '1');      v.sdwen	      := '1';      v.rasn	      := '1';      v.casn	      := '1';      v.hready	      := '1';      v.startsd       := '0';      v.cfg.dllrst    := '0';      v.cfg.cke       := '0';    end if;    ri <= v;     ribdrive <= vbdrive;         ahbso.hready  <= r.hready;    ahbso.hresp   <= r.hresp;    ahbso.hrdata  <= dout;    ahbso.hcache  <= not r.hio;  end process;  sdo.sdcke     <= (others => r.cfg.cke);  ahbso.hconfig <= hconfig;  ahbso.hirq    <= (others => '0');  ahbso.hindex  <= hindex;  regs : process(clk, rst) begin     if rising_edge(clk) then      r <= ri; rbdrive <= ribdrive;    end if;    if (rst = '0') then      r.sdcsn  <= (others => '1'); r.bdrive <= '1'; r.nbdrive <= '0';      r.cfg.cke <= '1';      if oepol = 0 then rbdrive <= (others => '1');      else rbdrive <= (others => '0'); end if;    end if;  end process;  sdo.address  <= ri.address;  sdo.bdrive   <= r.nbdrive when oepol = 1 else r.bdrive;  sdo.qdrive   <= not (ri.qdrive or r.nbdrive);   sdo.vbdrive  <= rbdrive;   sdo.sdcsn    <= ri.sdcsn;  sdo.sdwen    <= ri.sdwen;  sdo.dqm      <= "111111111111" & r.dqm;  sdo.rasn     <= ri.rasn;  sdo.casn     <= ri.casn;  sdo.data(31 downto 0) <= r.hwdata;-- pragma translate_off  bootmsg : report_version   generic map ("sdctrl" & tost(hindex) & 	": DDR266 controller rev " & tost(REVISION));-- pragma translate_onend;

⌨️ 快捷键说明

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