在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
楼主: oldbeginner

开源软核学习笔记04(从10天实现处理器—OpenMIPS开发笔记找思路)——2014_1_19

[复制链接]
 楼主| 发表于 2014-1-28 07:03:22 | 显示全部楼层
*********************************
时序进程

*********************************

iu中还有个时序进程,
87.JPG

********************************
  reg : process (clk)
  begin
    if rising_edge(clk) then
                if(rst = '1') then
                        r.w.result <= (others => '0');
                        r.w.waddr  <= (others => '0');
                        r.w.wreg   <= '0';                       
      r.m.waddr <= (others => '0');
      r.m.wreg <= '0';
      r.m.result <= zero32;                                               
                        r.e.rd <= (others => '0');
                        r.e.wreg <= '0';
                        r.e.rfe1 <= '0';
                        r.e.rfe2 <= '0';
                        r.e.rfa1 <= (others => '0');
                        r.e.rfa2 <= (others => '0');
                        r.e.imm <= zero32;
                        r.e.aluop <= (others => '0');
                        r.e.alusel <= (others => '0');
                        r.e.cnt <= (others => '0');
                        r.e.inst_valid <= '1';               
                        r.e.reg1 <= zero32;
                        r.e.reg2 <= zero32;       
                        r.d.pc <= (others => '0');
                        r.d.inst <= zero32;                                       
                        r.f.pc <= "000000000000000000000000000000";                       
           else
                   r <= rin;                    
      end if;                  
    end if;
  end process;

end;
*******************************


比较好理解,就是赋值,大部分是0。

通过rin 这个信号变量,和comb 进程通信。
 楼主| 发表于 2014-1-29 12:06:07 | 显示全部楼层
****************************************
自顶向下的结构再复习

****************************************
尝试裁减MC8051的FSM和MEM 文件, 还是有些复杂的,和上层模块还有关联。因此还是把OpenMIPS的结构理清楚后,再裁减MC8051。

29.JPG

译码阶段的 iu 和 regfile

译码阶段.gif

译码阶段2.gif

rf_o 和 rf_i 还是容易搞混的,原因在于portmap 中起的名字是对调的,感觉不太好。
88.JPG

回写阶段

图片1.gif

回写阶段2.gif

上层结构
89.JPG

细化
90.JPG
 楼主| 发表于 2014-1-30 13:44:55 | 显示全部楼层
***********************************
对MC8051的初步裁减

***********************************
原本是打算非常精简,包含裁减信号和不用的功能(比如定时,通讯等),但这些功能涉及到很多变量,需要改protmap 和 component,这样反而本末倒置,把精力放在体力上,而不是内容学习上。

只裁减process内部的内容,process外的一概不看不理,感觉还是比较容易的,重点也能突出。

就以上节练习为例
******************************************************
mov 20h,#10h ;将10H 送入空间地址20H 处
mov a,#33h ;将地址20H 的值送入寄存器a
end
*****************************************************
内部大概是怎样的,
91.JPG

92.JPG

93.JPG

94.JPG

95.JPG

96.JPG

然后一步一步删减 control_fsm_rtl.vhd里面process中内容,再利用上节的方法 do mc8051_compile.do 和 do mc8051_sim.do 验证是否删除的合适。
例如,删除效果如下
***********************************************************
p_state: process (state,s_help,s_ti,s_ri,s_ie0,s_ie1,s_tf0,s_tf1,
                   s_bit_data,aludata_i,s_instr_category,s_inthigh,
                   s_intlow,acc,psw,s_intpre,s_intpre2,ie,ip,intblock_i)
  begin
    s_data_mux    <= "0000";            -- default values
    s_adr_mux     <= "0000";
    s_bdata_mux   <= "0000";
    alu_cmd_o     <= OFF;
    s_regs_wr_en  <= "000";
    s_help_en     <= "0000";
    s_help16_en   <= "00";
    s_helpb_en    <= '0';
    s_pc_inc_en   <= "0000";
    s_inthigh_en  <= '0';
    s_intlow_en   <= '0';
    s_intpre2_en  <= '0';
    s_inthigh_d   <= '0';
    s_intlow_d    <= '0';
    s_intpre2_d   <= '0';
    s_adrx_mux    <= "00";
    s_wrx_mux     <= '0';
    s_nextstate   <= FETCH;
    s_ext0isr_d   <= '0';
    s_ext1isr_d   <= '0';
    s_ext0isrh_d  <= '0';
    s_ext1isrh_d  <= '0';
    s_ext0isr_en  <= '0';
    s_ext1isr_en  <= '0';
    s_ext0isrh_en <= '0';
    s_ext1isrh_en <= '0';

    if state=STARTUP then
      -- Power up wait cycle
      NULL;
    else
      -- begin of starting the interrupt procedure
                                                      -- saving the old adress
     
       -- end of starting interrupt procedure

        case s_instr_category is
          ---------------------------------------------------------------------
          when IC_MOV_A_D =>            -- MOV A, direct
            if state=FETCH then
              s_pc_inc_en <= "0001";    -- increment program-counter
              s_nextstate <= EXEC1;
            elsif state=EXEC1 then
              s_adr_mux <= "1000";      -- address = rom_data_i
              s_nextstate <= EXEC2;
            elsif state=EXEC2 then
              s_data_mux <= "0100";     -- data = s_reg_data
              s_regs_wr_en <= "010";    -- write ACC
              s_pc_inc_en <= "0001";    -- increment program-counter
              s_nextstate <= FETCH;
            end if;

          ---------------------------------------------------------------------

          when IC_MOV_D_DATA =>         -- MOV direct, #data
            if state=FETCH then
              s_pc_inc_en <= "0001";    -- increment program-counter
              s_nextstate <= EXEC1;
            elsif state=EXEC1 then
              s_help_en <= "0001";      -- save direct adress
              s_pc_inc_en <= "0001";    -- increment program-counter
              s_nextstate <= EXEC2;
            elsif state=EXEC2 then
              s_adr_mux <= "1010";      -- address = help
              s_data_mux <= "0101";     -- data = rom_data_i
              s_regs_wr_en <= "100";    -- write one byte
              s_pc_inc_en <= "0001";    -- increment program-counter
              s_nextstate <= FETCH;
            end if;

          ---------------------------------------------------------------------

          when IC_NOP =>              -- NOP
            s_pc_inc_en <= "0001";    -- increment program-counter
            s_nextstate <= FETCH;

          ---------------------------------------------------------------------

          when others =>
            s_nextstate <= FETCH;
        end case;
      end if;

  end process p_state;
**************************************************
其中,类似s_ext0isr_d  这样的信号都可以删除,这里保留的原因是:对函数之外的都不理。

同样,也可以对control_mem_rtl.vhd 采用同样方法裁减,
mem有好多过程,比较复杂,可以完全删除一些,另外一些可以局部删除。

通过上面不停地删除测试,执行过程逐渐清晰,(当然对我这样的初学者可以这样麻烦地练习)。
发表于 2014-4-27 11:21:26 | 显示全部楼层
很给力!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

×

小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-24 09:23 , Processed in 0.019579 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表