📄 hs.vhd
字号:
v.dq_dqs_oe := '0'; if v.cnt = v.use_bl then v.cmdDone(v.cur_ahb) := v.cur_buf(v.cur_ahb); if v.begin_write = '0' then -- No new write is following v.sync_adr(v.cur_ahb) := (v.cur_buf(v.cur_ahb)+1) & "00"; v.cnt := 0; v.rwstate := idle; else -- New write is following v.sync_adr(v.cur_ahb) := (v.cur_buf(v.cur_ahb)+1) & "00"; if v.use_bl = 2 then v.sync_adr(v.use_ahb) := (v.use_buf +1) & "00"; else v.sync_adr(v.use_ahb) := v.use_buf & "01"; end if; v.cur_buf(v.use_ahb) := v.use_buf; v.cur_ahb := v.use_ahb; v.cnt := 2; end if; else v.cnt := v.cnt +2; if v.cnt = v.use_bl then v.sync_adr(v.cur_ahb) := (v.cur_buf(v.cur_ahb)+1) & "00"; else v.sync_adr(v.cur_ahb) := v.sync_adr(v.cur_ahb)+1; end if; end if; -- Read when r => v.cmdDone(v.cur_ahb) := v.cur_buf(v.cur_ahb); if v.use_cas = '0' then -- Cas 2 or 3 v.sync_wdata((2*dqsize)-1 downto 0) := dq1_i & dq2_i; else -- Cas 2.5 v.sync_wdata((2*dqsize)-1 downto 0) := dq2_i & dq1del_i; end if; if v.cnt = v.use_bl then if v.begin_read = '0' then v.sync_write := "00"; v.sync_adr(v.cur_ahb) := (v.cur_buf(v.cur_ahb)+1) & "00"; v.cnt := 0; v.rwstate := idle; else v.sync_adr(v.cur_ahb) := (v.cur_buf(v.cur_ahb)+1) & "00"; v.cnt := 2; v.cur_ahb := v.use_ahb; v.cur_buf(v.use_ahb) := v.use_buf; v.sync_adr(v.use_ahb) := v.use_buf & "00"; if v.use_ahb = 0 then v.sync_write := "01"; else v.sync_write := "10"; end if; end if; else v.cnt := v.cnt +2; v.sync_adr(v.cur_ahb) := v.sync_adr(v.cur_ahb) +1; end if; end case; -- Calculate and set data mask if v.use_ml+1 < v.cnt then v.dm1_o := (others => '1'); v.dm2_o := (others => '1'); elsif v.use_ml+1 = v.cnt then v.dm1_o(dmsize-1 downto 0) := hssi.dsramso(v.use_ahb).dataout2((2*dqsize+dmsize)-1 downto (2*dqsize)); v.dm2_o := (others => '1'); else v.dm1_o(dmsize-1 downto 0) := hssi.dsramso(v.use_ahb).dataout2((2*dqsize+dmsize)-1 downto (2*dqsize)); v.dm2_o(dmsize-1 downto 0) := hssi.dsramso(v.use_ahb).dataout2((2*dqsize+2*dmsize)-1 downto (2*dqsize+dmsize)); end if; --------------------------------------------------------------------------------- Register and reset if rst = '0' then v.cbufstate := no_cmd; v.cmdstate := idle; v.rwstate := idle; v.cur_buf := (others => (others => '1')); v.cur_ahb := 0; v.use_bl := 4; v.use_ml := 2; v.use_buf := (others => '1'); v.use_cas := '0'; v.rw_cmd := CMD_NOP; v.rw_bl := 4; v.rw_cas := 2; v.next_bl := 4; v.next_ml := 2; v.next_buf := (others => '1'); v.next_cas := "00"; v.next_adr := (others => '0'); v.next_cs := "11"; v.next_cmd := CMD_NOP; v.set_cmd := CMD_NOP; v.set_adr := (others => '0'); v.set_cs := "00"; v.set_cke := '0'; v.hs_busy := '0'; v.cmdDone := (others => (others => '1')); v.begin_read := '0'; v.begin_write := '0'; v.dq_dqs_oe := '1'; v.w_ce := '0'; v.r_ce := '0'; v.cnt := 0; v.holdcnt := 0; v.r2wholdcnt:= 0; v.act2precnt:= 0; v.wait_time := 10; v.readwait := (others => '0'); v.writewait := (others => '0'); v.dm1_o := (others => '1'); v.dm2_o := (others => '1'); v.dqs1_o := '0'; v.sync_adr := (others => (others => '0')); v.sync_write := "00"; v.sync_wdata := (others => '0'); end if; rwri <= v; -- Combinatiorial outputs hsso.hs_busy <= v.hs_busy; dqs1_o <= v.dqs1_o; dqs2_o <= '0'; hsso.dsramsi(0).address2 <= v.sync_adr(0); hsso.dsramsi(0).write2 <= v.sync_write(0); hsso.dsramsi(0).datain2 <= v.sync_wdata; hsso.dsramsi(1).address2 <= v.sync_adr(1); hsso.dsramsi(1).write2 <= v.sync_write(1); hsso.dsramsi(1).datain2 <= v.sync_wdata;end process;--------------------------------------------------------------------------------- Clocked processes-- CLK0, Main registerrwclk : process(clk0) begin if rising_edge(clk0) then rwr <= rwri; -- Registered outputs r_ce <= rwri.r_ce; w_ce <= rwri.w_ce; hsso.cmdDone <= rwri.cmdDone; dm1_o <= rwri.dm1_o((dmsize-1) downto 0); dm2_o <= rwri.dm2_o((dmsize-1) downto 0); -- Registers dq1del_i <= dq1_i; dq1_o <= hssi.dsramso(rwri.use_ahb).dataout2(dqsize-1 downto 0); dq2_o <= hssi.dsramso(rwri.use_ahb).dataout2((2*dqsize)-1 downto dqsize); end if;end process; ---- CLK270, Drives output enable signal--oeclk : process(rst, clk270)-- begin-- if rst = '0' then-- hsso.ddsi.dq_dqs_oe <= '1';-- elsif rising_edge(clk270) then-- hsso.ddsi.dq_dqs_oe <= rwri.dq_dqs_oe;-- end if;-- end process;-- CLK0, Drives control signals cmdclk : process(clk0) begin if rising_edge(clk0) then hsso.ddsi.control <= rwri.set_cmd; hsso.ddsi.adr <= rwri.set_adr((adrbits-3) downto 0); hsso.ddsi.ba <= rwri.set_adr((adrbits-1) downto (adrbits-2)); hsso.ddsi.cs <= rwri.set_cs; hsso.ddsi.cke <= rwri.set_cke; end if; end process; vcc <= '1'; gnd <= '0'; data_in <= hssi.ddso.dq((dqsize-1) downto 0); hsso.ddsi.dq((dqsize-1) downto 0) <= data_out; hsso.ddsi.dqs((strobesize-1) downto 0) <= strobe_out; hsso.ddsi.dm((dmsize-1) downto 0) <= mask_out; dqot : if dqsize < maxdqsize generate hsso.ddsi.dq((maxdqsize-1) downto dqsize) <= (others => '-'); end generate; dqsot : if strobesize < maxstrobesize generate hsso.ddsi.dqs((maxstrobesize-1) downto strobesize) <= (others => '-'); end generate; dmot : if dmsize <= maxdmsize generate hsso.ddsi.dm((maxdmsize-1) downto dmsize) <= (others => '-'); end generate;--------------------------------------------------------------------------------- DDR IO registers------------------------------------------------------------------------------- -- Input and Output DQ dqio : for i in 0 to (dqsize-1) generate in1 : ddr_ireg generic map( tech => tech) port map( Q1 => dq1_i(i), Q2 => dq2_i(i), C1 => clk0, C2 => clk180, CE => vcc, --r_ce, D => data_in(i), R => gnd, S => gnd); out1 : ddr_oreg generic map( tech => tech) port map( Q => data_out(i), C1 => clk180, C2 => clk0, CE => vcc, --w_ce, D1 => dq1_o(i), D2 => dq2_o(i), R => gnd, S => gnd); dq_tri : ddr_oreg generic map( tech => tech) port map( Q => hsso.ddsi.dq_oe(i), C1 => clk180, C2 => clk0, CE => vcc, --w_ce, D1 => rwri.dq_dqs_oe, D2 => rwri.dq_dqs_oe, R => gnd, S => gnd); end generate; -- output DQS dqsio : for i in 0 to (strobesize-1) generate dqso : ddr_oreg generic map( tech => tech) port map( Q => strobe_out(i), C1 => clk270, C2 => clk90, CE => vcc, D1 => dqs1_o, D2 => dqs2_o, R => gnd, S => gnd); dqso_tri : ddr_oreg generic map( tech => tech) port map( Q => hsso.ddsi.dqs_oe(i), C1 => clk270, C2 => clk90, CE => vcc, --w_ce, D1 => rwri.dq_dqs_oe, D2 => rwri.dq_dqs_oe, R => gnd, S => gnd); end generate; -- Output DM dmo : for i in 0 to (dmsize-1) generate U4 : ddr_oreg generic map( tech => tech) port map( Q => mask_out(i), C1 => clk180, C2 => clk0, CE => vcc, --w_ce, --write_ce D1 => dm1_o(i), D2 => dm2_o(i), R => gnd, S => gnd); end generate; end rtl;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -