📄 pci_oc.vhd
字号:
-- end if;-- v.wb.cab_o := '0'; v.ahbslv.hburst := ahbsi.hburst; v.ahbslv.htrans := ahbsi.htrans; if ahbsi.haddr(31 downto 16) = "1010000000000000" then -- 0xA000 v.ahbslv.adr_o := "0000000000000000" & ahbsi.haddr(15 downto 0); else v.ahbslv.adr_o := ahbsi.haddr; --0xa0010000-0xfffffffc end if; if (ahbsi.hsel and ahbsi.hready and ahbsi.htrans(1)) = '1' then-- if ahbsi.hsize = "010" then --word v.ahbslv.hready := '0'; v.ahbslv_state := strobe; v.ahbslv.we_o := ahbsi.hwrite;-- end if; --ahbsi.hsize = word end if; --ahbsi.hsel = '1' when strobe => v.ahbslv_state := respond; v.ahbslv.mdat_o := ahbsi.hwdata; --write specific v.ahbslv.mdat_i := wbmi.mdat_i; vstb_o := '1'; v.ahbslv.ack_i := wbmi.ack_i; v.ahbslv.rty_i := wbmi.rty_i; v.ahbslv.hready := '0'; if r.ahbslv.hburst = "001" then v.wb.cab_o := '1';-- v.ahbslv.hburst := ahbsi.hburst; end if; when respond => if r.ahbslv.ack_i = '1' then v.ahbslv_state := idle; v.ahbslv.hrdata := r.ahbslv.mdat_i; --read specific elsif r.ahbslv.rty_i = '1' then v.ahbslv_state := rty; v.ahbslv.hready := '0'; v.ahbslv.hresp := hresp_retry; else vstb_o := '1'; --fix v.ahbslv.hready := '0'; v.ahbslv.mdat_i := wbmi.mdat_i; --read specific v.ahbslv.ack_i := wbmi.ack_i; v.ahbslv.rty_i := wbmi.rty_i; end if; if (r.wb.cab_o = '1' and ahbsi.htrans(0) = '0') then v.wb.cab_o := '0'; end if;-- if not r.ahbslv.hburst = "001" then -- v.wb.cab_o := '0';-- end if; when rty => v.ahbslv_state := doreturn; when doreturn => v.ahbslv_state := idle; v.ahbslv.hresp := hresp_okay; when others => null; end case;-------------------------------------------------------------------------------- v.wb.stb_i := wbsi.stb_i; v.wb.we_i := wbsi.we_i; v.ahbmst.adr_i := wbsi.adr_i(31 downto 0); v.ahbmst.sdat_i := wbsi.sdat_i; v.rdata := dmao.rdata; vstart := '0'; v.ahbmst.ack_o := '0'; case r.ahbmst_state is when idle => if r.wb.stb_i = '1' then v.ahbmst_state := req; end if; when req => if dmao.active = '1' and dmao.ready = '1' then v.ahbmst.ack_o := '1'; v.ahbmst_state := respond; else vstart := '1'; end if; when respond => v.ahbmst_state := idle; when others => null; end case;---------------------------------------------------------------------------------------------------------------------------------------------------------------- if apbi.psel = '1' then-- if apbi.pwrite = '1' then-- case apbi.paddr(7 downto 0) is-- when "00000000" =>-- v.AHB2WBCtrl := apbi.pwdata;-- when others => Null;-- end case;-- else-- case apbi.paddr(3 downto 0) is-- when "0000" =>-- vprdata := r.AHB2WBCtrl;-- when others => Null;-- end case;-- end if;-- end if; if rst = '0' then v.ahbslv_state := idle; v.ahbslv.hresp := hresp_okay; v.ahbslv.hready := '1'; v.ahbslv.adr_o := (others => '0'); v.ahbslv.hrdata := (others => '0'); v.ahbslv.mdat_o := (others => '0'); v.ahbslv.mdat_i := (others => '0'); v.ahbslv.ack_i := '0'; v.ahbslv.rty_i := '0'; v.ahbslv.we_o := '0'; v.ahbmst_state := idle; v.ahbmst.adr_i := (others => '0'); v.ahbmst.ack_o := '0'; v.ahbmst.sdat_i := (others => '0'); v.rdata := (others => '0');-- v.AHB2WBCtrl := (others => '0'); v.wb.cab_o := '0'; end if; wbmo.adr_o <= r.ahbslv.adr_o;-- if is_x(v.ahbslv.mdat_o) then-- wbmo.mdat_o <= (others => '0');-- else wbmo.mdat_o <= v.ahbslv.mdat_o;-- end if; wbmo.we_o <= r.ahbslv.we_o; wbmo.stb_o <= vstb_o; ahbso.hready <= r.ahbslv.hready; ahbso.hresp <= r.ahbslv.hresp; wbmo.cab_o <= v.wb.cab_o;-- if is_x(v.ahbslv.hrdata) then-- ahbso.hrdata <= (others => '0');-- else ahbso.hrdata <= v.ahbslv.hrdata;-- end if; ahbso.hsplit <= (others => '0'); dmai.address <= r.ahbmst.adr_i;-- if is_x(r.ahbmst.sdat_i) then-- dmai.wdata <= (others => '0');-- else dmai.wdata <= r.ahbmst.sdat_i;-- end if; dmai.start <= vstart; dmai.burst <= '0'; dmai.write <= r.wb.we_i; dmai.size <= "10"; wbso.ack_o <= r.ahbmst.ack_o; wbso.sdat_o <= r.rdata; wbso.rty_o <= '0'; apbo.prdata <= (others => '0'); pcio.pci_cbe3_en_n <= cbe_en(3); pcio.pci_cbe2_en_n <= cbe_en(2); pcio.pci_cbe1_en_n <= cbe_en(1); pcio.pci_cbe0_en_n <= cbe_en(0);-- pcio.pci_serr_en_n <= '0'; pcio.pci_lock_en_n <= '1';-- pcio.pci_req_en_n <= '1'; ocrst <= not rst; irq <= '0'; rin <= v; end process comb; regs : process(clk) begin if rising_edge(clk) then r <= rin; end if; end process; ahbmst0 : ahbmst port map (rst, clk, dmai, dmao, ahbmi, ahbmo); oc : pci_bridge32 port map ( PCI_CLK_i => pci_clk, PCI_AD_oe_o => pcio.pci_aden_n, PCI_AD_i => pcii.pci_adin, PCI_AD_o => pcio.pci_adout, PCI_CBE_oe_o => cbe_en, PCI_CBE_i => pcii.pci_cbein_n, PCI_CBE_o => pcio.pci_cbeout_n, PCI_RST_oe_o => Open, --not host PCI_RST_i => pcii.pci_rst_in_n, PCI_RST_o => Open, --not host PCI_INTA_oe_o => pcio.pci_int_en_n, PCI_INTA_i => highbits(0), PCI_INTA_o => pcio.pci_int_out_n, PCI_REQ_oe_o => pcio.pci_req_en_n, PCI_REQ_o => pcio.pci_req_out_n, PCI_GNT_i => pcii.pci_gnt_in_n, PCI_FRAME_oe_o => pcio.pci_frame_en_n, PCI_FRAME_i => pcii.pci_frame_in_n, PCI_FRAME_o => pcio.pci_frame_out_n, PCI_IRDY_oe_o => pcio.pci_irdy_en_n, PCI_IRDY_i => pcii.pci_irdy_in_n, PCI_IRDY_o => pcio.pci_irdy_out_n, PCI_IDSEL_i => pcii.pci_idsel_in, PCI_DEVSEL_oe_o => pcio.pci_devsel_en_n, --FIX PCI_DEVSEL_i => pcii.pci_devsel_in_n, PCI_DEVSEL_o => pcio.pci_devsel_out_n, PCI_TRDY_oe_o => pcio.pci_trdy_en_n, --FIX PCI_TRDY_i => pcii.pci_trdy_in_n, PCI_TRDY_o => pcio.pci_trdy_out_n, PCI_STOP_oe_o => pcio.pci_stop_en_n, --FIX PCI_STOP_i => pcii.pci_stop_in_n, PCI_STOP_o => pcio.pci_stop_out_n, PCI_PAR_oe_o => pcio.pci_par_en_n, PCI_PAR_i => pcii.pci_par_in, PCI_PAR_o => pcio.pci_par_out, PCI_PERR_oe_o => pcio.pci_perr_en_n, PCI_PERR_i => pcii.pci_perr_in_n, PCI_PERR_o => pcio.pci_perr_out_n, PCI_SERR_oe_o => pcio.pci_serr_en_n, PCI_SERR_o => pcio.pci_serr_out_n, -- SYSCON Signals WB_CLK_I => clk, WB_RST_I => ocrst, WB_RST_O => Open, WB_INT_I => lowbits(0),--negated and propagated to inta_out WB_INT_O => Open, --FIX -- WISHBONE slave interface WBS_ADR_I => wbmo.adr_o, WBS_DAT_I => wbmo.mdat_o, WBS_DAT_O => wbmi.mdat_i, WBS_SEL_I => highbits(3 downto 0), WBS_CYC_I => highbits(0), WBS_STB_I => wbmo.stb_o, WBS_WE_I => wbmo.we_o, WBS_CAB_I => wbmo.cab_o, WBS_ACK_O => wbmi.ack_i, WBS_RTY_O => wbmi.rty_i, WBS_ERR_O => Open, -- WISHBONE master interface WBM_ADR_O => wbsi.adr_i, WBM_DAT_I => wbso.sdat_o, WBM_DAT_O => wbsi.sdat_i, WBM_SEL_O => Open, WBM_CYC_O => Open, WBM_STB_O => wbsi.stb_i, WBM_WE_O => wbsi.we_i, WBM_CAB_O => Open, WBM_ACK_I => wbso.ack_o, WBM_RTY_I => wbso.rty_o, WBM_ERR_I => lowbits(0) );end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -