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

📄 armiu.vhd

📁 arm vhdl rtl code,can synthesis
💻 VHD
📖 第 1 页 / 共 2 页
字号:
-- (nextaddr)  (clr)     (clr)     (clr)     (clr)     (clr)     (clr)     (clr)     (clr)
--   +----------+---------+---------+---------+---------+---------+-----+---+---------+---------------+
--   V          V         V         V         V         V         V     |   V         V               |
--  +---------+---------+---------+---------+---------+---------+-------+-+---------+---------+-------+-+
--  |IMSTG    |FESTG    |DESTG    |DRSTG    |RRSTG    |RSSTG    |EXSTG  | |DMSTG    |MESTG    |WRSTG  | |
--  |         |         |         |         |         |         | regbra+ |         |         |  wrbra+ |
--  |         |         |         |tundef-+ |         |         |       | |         |         |       | |
--  |         |   mexc+ |         |tswi  -+ |         |         |       | |         |  tdabrt-+tdabrt-+ |
--  | tprfch+-+-------+-+---------+-------+-+---------+---------+-------+ |         |         |       | |
--  +-------+-+-------+-+---------+-------+-+---------+---------+---------+---------+---------+-------+-+
--   / \    |         |                   V                                                           |   
--    |     |         |        pctrl.trap:+-----------------------------------------------------------+   
--    +-----+---------+-------------------+
--    (idle until wrbra)

    t.armiu_imstgi.flush_v := '0';
    t.armiu_festgi.flush_v := '0';
    t.armiu_destgi.flush_v := '0';
    t.armiu_drstgi.flush_v := '0';
    t.armiu_rrstgi.flush_v := '0';
    t.armiu_rsstgi.flush_v := '0';
    t.armiu_exstgi.flush_v := '0';
    t.armiu_dmstgi.flush_v := '0';
    t.armiu_mestgi.flush_v := '0';

    t.exclear := '0';
    t.wrclear := '0';
    if armiu_exstgo.flush_v = '1' then
      t.exclear := '1';
    end if;
    if armiu_wrstgo.toIM_branch_v = '1' then
      t.wrclear := '1';
    end if;

    -- reset
    if ( rst = '0' ) then
    end if;

    t.drid := armiu_drstgo.id;
    t.rrid := armiu_rrstgo.pctrl_r.insn.id;
    t.rsid := armiu_rsstgo.pctrl_r.insn.id;
    t.exid := armiu_exstgo.pctrl_r.insn.id;
    t.dmid := armiu_dmstgo.pctrl_r.insn.id;
    t.meid := armiu_mestgo.pctrl_r.insn.id;
    t.wrid := armiu_wrstgo.pctrl_r.insn.id;
    
    if t.exclear = '1' or t.wrclear = '1' then
      t.armiu_imstgi.flush_v := '1';
      t.armiu_festgi.flush_v := '1';
      t.armiu_destgi.flush_v := '1';
      if apc_is_flush(t.drid,t.exid) then
        t.armiu_drstgi.flush_v := '1';
      end if;
      if apc_is_flush(t.rrid,t.exid) then
        t.armiu_rrstgi.flush_v := '1';
      end if;
      if apc_is_flush(t.rsid,t.exid) then
        t.armiu_rsstgi.flush_v := '1';
      end if;
    end if;
    if t.wrclear = '1' then
      if apc_is_flush(t.exid,t.wrid) then
        t.armiu_exstgi.flush_v := '1';
      end if;
      if apc_is_flush(t.dmid,t.wrid) then
        t.armiu_dmstgi.flush_v := '1';
      end if;
      if apc_is_flush(t.meid,t.wrid) then
        t.armiu_mestgi.flush_v := '1';
      end if;
    end if;
    
    -- branch address
    t.addrvir := armiu_exstgo.alures_v;
    t.branch := '0';
    if armiu_exstgo.toIM_branch_v = '1' then
      t.addrvir := armiu_exstgo.alures_v;
      t.branch := '1';
    end if;
    if armiu_wrstgo.toIM_branch_v = '1' then
      t.addrvir := armiu_wrstgo.toIM_branchaddr_v;
      t.branch := '1';
    end if;
    t.armiu_imstgi.branch_v := t.branch;
    t.armiu_imstgi.addrvir_v := t.addrvir;


--                                            locking>|<
--  +---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+
--  |IMSTG    |FESTG    |DESTG    |DRSTG    |RRSTG    |RSSTG    |EXSTG    |DMSTG    |MESTG    |WRSTG    |
--  |         |         |         |         |         |         |take     |         |         |         |
--  |         |         |         |[undef]  |         |         |[undef]  |         |         |         |
--  |         |         |         |         |         |         |         |         |         |         |
--  |         |         |[insn]   |         |         |         |         |         |         |         |
--  +---------+---------++--------++--------+-+-------+---------+---------+---------+---------+-------+-+
--                       V         /\         /\                                                      V   
--                      ++--------++--------+-+-------+---------+---------+---------+---------+-------+-+           
--                      |         | ldc/stc | reg/lock|                                       |ldc/mrc| |         
--                      |         | ctrl    | stc/mcr |                                       |[reg] <+ |         
--                      |         | busy    |cpd-lock |                                       |commit   |                 
--                      |         |         |         |                                       |use id   | 
--                      +---------+---------+---------+                                       +---------+           
--                          FE        DEC       EX                                                                   
--                      |<  DRSTG.netxinsn controled >|
--  

    -- todo: check valid, not correct
    t.cpsyci.hold_r := hold;
    -- coprocessor: PR-DESTG -> CP-FESTG
    t.cpsyci.fromPRDE_insn := lmd_convert ( armiu_festgo.toDE_insn_r.insn, CFG_BO_INSN, CFG_BO_PROC );
    t.cpsyci.fromPRDE_valid := armiu_festgo.toDE_insn_r.valid;
    -- PR-DRSTG -> CP-DESTG
    t.cpsyci.fromPRDR_nextinsn_v := armiu_drstgo.nextinsn_v;
    t.cpsyci.fromPRDR_valid := armiu_destgo.toDR_insn_r.insn.valid;
    -- PR-RRSTG -> CP-EXSTG
    t.cpsyci.fromPRRR_valid := armiu_rrstgo.pctrl_r.valid;
    -- PR-WRSTG -> CP-WRSTG
    t.cpsyci.fromPRWR_data_v := armiu_wrstgo.toCPWR_crd_data_v;
    t.cpsyci.fromPRWR_valid := armiu_wrstgo.pctrl_r.valid;
    
    -- PR-DRSTG <- CP-DESTG
    t.armiu_drstgi.fromCPDE_busy := '0';
    t.armiu_drstgi.fromCPDE_last := '1';
    t.armiu_drstgi.fromCPDE_accept := '0';
    case armiu_destgo.toDR_insn_r.insn.insn(ACO_CPNUM_U downto ACO_CPNUM_D) is
      when "1111" =>                    -- sysctrl coprocessor
         -- PR-DRSTG <- CP-DESTG
         t.armiu_drstgi.fromCPDE_busy := cpsyco.CPDE_PRDR.busy;
         t.armiu_drstgi.fromCPDE_last := cpsyco.CPDE_PRDR.last;
         t.armiu_drstgi.fromCPDE_accept := cpsyco.CPDE_PRDR.accept;
      when others => null;
    end case;
    -- PR-RRSTG <- CP-EXSTG
    case armiu_rrstgo.pctrl_r.insn.insn(ACO_CPNUM_U downto ACO_CPNUM_D) is
      when "1111" =>                    -- sysctrl coprocessor
        -- PR-RRSTG <- CP-EXSTG
         t.armiu_rrstgi.fromCPEX_data := cpsyco.CPEX_PRRR.data;
         t.armiu_rrstgi.fromCPEX_lock := cpsyco.CPEX_PRRR.lock;
      when others => null;
    end case;
    
    c <= v;
    
    o <= t.o;
    armiu_imstgi <= t.armiu_imstgi;
    armiu_festgi <= t.armiu_festgi;
    armiu_destgi <= t.armiu_destgi;
    armiu_drstgi <= t.armiu_drstgi;
    armiu_rrstgi <= t.armiu_rrstgi;
    armiu_rsstgi <= t.armiu_rsstgi;
    armiu_exstgi <= t.armiu_exstgi;
    armiu_dmstgi <= t.armiu_dmstgi;
    armiu_mestgi <= t.armiu_mestgi;
    armiu_wrstgi <= t.armiu_wrstgi;
    cpsyci <= t.cpsyci;
    
    ici <= t.ici;
    dci <= t.dci;
    
    -- pragma translate_off
    vdbg := rdbg;
    vdbg.dbg := t;
    cdbg <= vdbg;
    -- pragma translate_on  
    
  end process p0;
    
  pregs : process (clk, c)
  begin
    if rising_edge(clk) then
      r <= c;
      -- pragma translate_off
      rdbg <= cdbg;
      -- pragma translate_on
    end if;
  end process;

  imstg0:  armiu_imstg port map ( rst, clk, armiu_imstgi, armiu_imstgo);
  festg0:  armiu_festg port map ( rst, clk, armiu_festgi, armiu_festgo);
  destg0:  armiu_destg port map ( rst, clk, armiu_destgi, armiu_destgo);
  drstg0:  armiu_drstg port map ( rst, clk, armiu_drstgi, armiu_drstgo);
  rrstg0:  armiu_rrstg port map ( rst, clk, clkn, armiu_rrstgi, armiu_rrstgo);
  rsstg0:  armiu_rsstg port map ( rst, clk, armiu_rsstgi, armiu_rsstgo);
  exstg0:  armiu_exstg port map ( rst, clk, armiu_exstgi, armiu_exstgo);
  dmstg0:  armiu_dmstg port map ( rst, clk, armiu_dmstgi, armiu_dmstgo);
  mestg0:  armiu_mestg port map ( rst, clk, armiu_mestgi, armiu_mestgo);
  wrstg0:  armiu_wrstg port map ( rst, clk, armiu_wrstgi, armiu_wrstgo);
  
  cpsys0:  armcp_sctrl port map ( rst, clk, cpsyci, cpsyco );

end rtl;

⌨️ 快捷键说明

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