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

📄 fpu.vhd

📁 Xilinx软核microblaze源码(VHDL)版本7.10
💻 VHD
📖 第 1 页 / 共 5 页
字号:
      signal ex_SignB_1 : std_logic;    signal ex_ExpB_1  : FPU_EXP_TYPE;    signal ex_MantB_1 : FPU_MANT_TYPE;      -- Stage 2    signal ex_MantA_Zero_2_cmb   : boolean;    signal ex_MantA_Zero_2_cmb_s : std_logic;    signal ex_MantB_Zero_2_cmb   : boolean;    signal ex_MantB_Zero_2_cmb_s : std_logic;    signal ex_ExpA_Zero_2_cmb    : boolean;    signal ex_ExpB_Zero_2_cmb    : boolean;    signal ex_ExpA_Ones_2_cmb    : boolean;    signal ex_ExpB_Ones_2_cmb    : boolean;    signal ex_Exp_AsubB_2_i      : Exp_Plus2_T;    signal ex_Exp_AsubB_2_cmb    : FPU_EXP_TYPE;    signal ex_Exp_BgtA_2_cmb       : boolean;    signal ex_Exp_Equal_2_cmb      : boolean;    signal ex_Exp_Equal_2_cmb_s    : std_logic;    signal ex_Exp_absAsubB_2_cmb_i : Exp_Plus2_T;    signal ex_Exp_absAsubB_2_cmb   : FPU_EXP_TYPE;      -- signal ex_Mant_AsubB_2_cmb : FPU_MANT_I_TYPE;    signal ex_Mant_BgtA_2_cmb        : boolean;    signal ex_Exp_Mant_Equal_2_cmb   : boolean;    signal ex_Exp_Mant_Equal_2_cmb_s : std_logic;      signal ex_absBgtA_2_cmb    : boolean;    signal ex_A_Zero_2_cmb     : boolean;    signal ex_B_Zero_2_cmb     : boolean;    signal ex_A_NaN_2_cmb      : boolean;    signal ex_B_NaN_2_cmb      : boolean;    signal mem_float_operation_2 : boolean;    signal mem_add_op_2          : boolean;    signal mem_sub_op_2          : boolean;    signal mem_cmp_op_2          : boolean;    signal mem_cmp_cond_2        : FPU_COND_TYPE;    signal mem_mul_op_2          : boolean;    signal mem_div_op_2          : boolean;    signal mem_sqrt_op_2         : boolean;    signal mem_flt_op_2          : boolean;    signal mem_int_op_2          : boolean;    signal mem_addsub_sel_2 : std_logic;      signal mem_SignA_2 : std_logic;    signal mem_SignB_2 : std_logic;      signal mem_MantA_2 : FPU_MANT_I_TYPE;    signal mem_MantB_2 : FPU_MANT_I_TYPE;      signal mem_Exp_absAsubB_2 : FPU_EXP_TYPE;      -- input types    signal mem_NanA_2    : boolean;    signal mem_NanB_2    : boolean;    signal mem_QNanA_2   : boolean;    signal mem_QNanB_2   : boolean;    signal mem_SNanA_2   : boolean;    signal mem_SNanB_2   : boolean;    signal mem_DeNormA_2 : boolean;    signal mem_DeNormB_2 : boolean;    signal mem_InfA_2    : boolean;    signal mem_InfB_2    : boolean;    signal mem_ZeroA_2   : boolean;    signal mem_ZeroB_2   : boolean;      signal mem_absAgtB_2   : boolean;    signal mem_Exp_Res_2   : Exp_Plus2_T;    signal mem_add_mant_2  : boolean;    signal mem_Res_Sign_2  : std_logic;      -- Comparisons    signal mem_cmp_eq_2    : boolean;    signal mem_cmp_lt_2    : boolean;    signal mem_cmp_gt_2    : boolean;    signal mem_cmp_un_2    : boolean;      -- Stage 3    signal mem_mul_op_3         : boolean;    signal mem_div_op_3         : boolean;    signal mem_sqrt_op_3        : boolean;    signal mem_flt_op_3        : boolean;    signal mem_int_op_3        : boolean;    signal mem_addsub_op_3      : boolean;    signal mem_Exp_AddSub_3_cmb : Exp_Plus2_T;    signal mem_Exp_Res_3        : Exp_Plus2_T;    signal mem_Res_Sign_3       : std_logic;    signal mem_Normal_Res_3     : boolean;    signal mem_Res_Type_3       : Result_T;    -- Stage 4     signal mem_mul_op_4           : boolean;    signal mem_div_op_4           : boolean;    signal mem_sqrt_op_4          : boolean;    signal mem_flt_op_4           : boolean;    signal mem_int_op_4           : boolean;    signal mem_addsub_zero_4      : boolean;    signal mem_addsub_op_4        : boolean;    signal mem_addsub_inc_exp_4   : boolean;    signal mem_addsub_sub_exp_4   : FPU_EXP_LS_TYPE;    signal mem_Normal_Res_4       : boolean;    signal mem_Res_Type_4         : Result_T;    signal mem_Exp_Res_4          : Exp_Plus2_T;    signal mem_Res_Sign_4         : std_logic;    signal mem_mant_div_res_4     : FPU_MANT_IGRS_TYPE;    signal mem_div_dec_exp_4      : boolean;    signal mem_sqrt_done     : rboolean;    signal mem_sqrt_exp_4    : FPU_EXP_TYPE;          signal mem_sqrt_result_4 : FPU_MANT_IGRS_TYPE;    signal mem_flt_done       : rboolean;    signal mem_flt_result_4   : FPU_MANT_IGRS_TYPE;    signal mem_flt_exp_4      : FPU_EXP_TYPE;    signal mem_int_done       : rboolean;    signal mem_int_done_early : rboolean;    signal mem_int_zero_3     : rboolean;    signal mem_int_inv_3      : rboolean;    signal mem_int_result_5   : DATA_TYPE;        -- Stage 5    signal mem_addsub_zero_5         : boolean;    signal mem_inc_exp_5_cmb         : boolean;    signal mem_mant_res_5_cmb        : FPU_MANT_IGRS_TYPE;    signal mem_mant_ls16_5_cmb       : std_logic;    signal mem_mant_addsub_res_5_cmb : FPU_MANT_IGRS_TYPE;    signal mem_mant_mul_res_5_cmb    : FPU_MANT_IGRS_TYPE;    signal mem_mul_inc_exp_5_cmb     : boolean;    signal mem_Exp_Res_5_cmb         : Exp_Plus2_T;    signal mem_exp_borrow_5_cmb      : boolean;    signal mem_exp_overflow_5_cmb    : boolean;    signal mem_exp_zero_5_cmb        : boolean;    signal mem_exp_ones_5_cmb        : boolean;    signal mem_round_up_5            : boolean;    signal mem_Normal_Res_5          : boolean;    signal mem_Res_Type_5            : Result_T;    signal mem_Res_Sign_5            : std_logic;    signal mem_Exp_Res_5             : Exp_Plus2_T;    signal mem_mant_res_5            : FPU_MANT_TYPE;    signal mem_mant_res_5_ones       : boolean;    signal mem_inc_exp_5             : boolean;      -- Stage 6    signal mem_cmp_op_6_cmb   : boolean;    signal mem_cmp_cond_6_cmb : FPU_COND_TYPE;    signal mem_cond_gt_6_cmb  : boolean;    signal mem_cond_eq_6_cmb  : boolean;    signal mem_cond_lt_6_cmb  : boolean;    signal mem_cond_un_6_cmb  : boolean;    signal mem_inc_exp_6_cmb           : boolean;    signal mem_mant_res_6_cmb          : FPU_MANT_TYPE;    signal mem_exp_res_6_cmb           : Exp_Plus2_T;    signal mem_exp_over_6_cmb          : boolean;    signal mem_rounding_overflow_6_cmb : boolean;    signal mem_res_sign_rst_6_cmb     : boolean;    signal mem_res_sign_set_6_cmb     : boolean;    signal mem_res_exp_rst_6_cmb      : boolean;    signal mem_res_exp_set_6_cmb      : boolean;    signal mem_res_mant_rst_msb_6_cmb : boolean;    signal mem_res_mant_rst_mid_6_cmb : boolean;    signal mem_res_mant_rst_lsb_6_cmb : boolean;    signal mem_res_mant_set_msb_6_cmb : boolean;    signal mem_res_mant_set_mid_6_cmb : boolean;    signal mem_res_mant_set_lsb_6_cmb : boolean;    signal mem_FPU_Flags_6_cmb        : FSR_TYPE;      -- FSR    signal mem_mts_fsr  : std_logic;    signal mem_op1      : FSR_TYPE;    signal mem_fsr_cmb  : FSR_TYPE;    signal wb_fsr_i     : FSR_TYPE;        signal mem_fpu_cmp_done   : boolean;    signal mem_fpu_div_done   : boolean;    signal mem_fpu_norm_delay : std_logic_vector(0 to 3);    signal mem_fpu_done_i     : rboolean;  -- FPU is done the next cycle    signal mem_fpu_stall_i    : rboolean;  -- FPU is stalling Mem Stage    signal mem_fpu_excep_i    : rboolean;    signal wb_fpu_excep_i     : rboolean;    signal mem_fpu_excep_early : rboolean;    signal mem_fpu_done_early  : rboolean;    signal mem_fpu_done_delay  : rboolean;    signal Block_FPU : boolean;    signal mem_not_sqrt_op : boolean;    signal mem_not_div_op  : boolean;  begin    ---------------------------------------------------------------------------    ---------------------------------------------------------------------------    --     --  Handling the control of the Pipeline    --     ---------------------------------------------------------------------------    ---------------------------------------------------------------------------    ----------------------------------------------    signal ex_sqrt_op : boolean;-------------------------------    -- EX Stage    -----------------------------------------------------------------------------    mem_not_sqrt_op <= MEM_Not_FPU_Instr or not(mem_sqrt_op_2);    mem_not_div_op  <= MEM_Not_FPU_Instr or not(mem_div_op_2);        Block_FPU <= true;        -- Decode the operation to perform    ex_add_op  <= Block_FPU and (EX_FPU_Op = FPU_OP_ADD_DEC);    ex_sub_op  <= Block_FPU and (EX_FPU_Op = FPU_OP_SUB_DEC);    ex_mul_op  <= Block_FPU and (EX_FPU_Op = FPU_OP_MUL_DEC);    ex_div_op  <= Block_FPU and (EX_FPU_Op = FPU_OP_DIV_DEC);    ex_cmp_op  <= Block_FPU and (EX_FPU_Op = FPU_OP_CMP_DEC);    ex_flt_op  <= Block_FPU and (EX_FPU_Op = FPU_OP_FLT_DEC) and (C_USE_FPU > 1);    ex_int_op  <= Block_FPU and (EX_FPU_Op = FPU_OP_INT_DEC) and (C_USE_FPU > 1);    ex_sqrt_op <= Block_FPU and (EX_FPU_Op = FPU_OP_SQRT_DEC) and (C_USE_FPU > 1);          -----------------------------------------------------------------------------    -- MEM_FPU_Norm_Delay_SRL16    -- Indicates the end of a FPU add/sub/mul operation    -----------------------------------------------------------------------------    MEM_FPU_Norm_Delay_SRL16 : process (Clk) is    begin -- process MEM_FPU_Norm_Delay_SRL16      if Clk'event and Clk = '1' then  -- rising clock edge        if (EX_PipeRun and EX_Start_FPU and not ex_div_op and not ex_cmp_op and not ex_sqrt_op and not ex_flt_op) then          mem_fpu_norm_delay(0) <= '1';        else          mem_fpu_norm_delay(0) <= '0';        end if;        -- Shift right        mem_fpu_norm_delay(1 to mem_fpu_norm_delay'right) <=          mem_fpu_norm_delay(0 to mem_fpu_norm_delay'right-1);      end if;    end process MEM_FPU_Norm_Delay_SRL16;    -----------------------------------------------------------------------------    -- MEM_FPU_Cmp_Done_DFF    -- FPU Compare Instruction is done    -----------------------------------------------------------------------------    MEM_FPU_Cmp_Done_DFF : process (Clk) is    begin -- process MEM_FPU_Cmp_Done_DFF      if Clk'event and Clk = '1' then  -- rising clock edge        if Reset = '1' then            mem_fpu_cmp_done <= false;        elsif EX_PipeRun then          mem_fpu_cmp_done <= ex_cmp_op and EX_Start_FPU;        else          mem_fpu_cmp_done <= false;        end if;      end if;    end process MEM_FPU_Cmp_Done_DFF;    -- This needs to be combinational    mem_fpu_done_early <= ((mem_fpu_norm_delay(mem_fpu_norm_delay'right) = '1') or                           mem_fpu_div_done or mem_fpu_cmp_done or mem_sqrt_done or mem_int_done or mem_flt_done);    Using_FPU_Exception_1 : if (C_FPU_EXCEPTION > 0) generate      Mem_FPU_Done_DFF: process (Clk) is      begin  -- process Mem_FPU_Done_DFF        if Clk'event and Clk = '1' then   -- rising clock edge          if Reset = '1' then             -- synchronous reset (active high)            mem_fpu_done_delay <= false;          else            mem_fpu_done_delay <= mem_fpu_done_early and mem_fpu_excep_early;          end if;        end if;      end process Mem_FPU_Done_DFF;      mem_fpu_done_i <= (mem_fpu_done_early and not mem_fpu_excep_early) or mem_fpu_done_delay;        end generate Using_FPU_Exception_1;    Not_Using_FPU_Exception_1 : if (C_FPU_EXCEPTION = 0) generate      mem_fpu_done_i <= mem_fpu_done_early;    end generate Not_Using_FPU_Exception_1;    MEM_FPU_Done <= mem_fpu_done_i;        -----------------------------------------------------------------------------    -- MEM_FPU_Stall_DFF    -- Indicates an FPU instruction stalled in the MEM stage    -----------------------------------------------------------------------------    MEM_FPU_Stall_DFF : process (Clk) is    begin -- process MEM_FPU_Stall_DFF      if Clk'event and Clk = '1' then  -- rising clock edge        if Reset = '1' then            mem_fpu_stall_i    <= false;        else          if (mem_fpu_norm_delay(mem_fpu_norm_delay'right-1) = '1') then            -- End of add/sub/mul            mem_fpu_stall_i    <= false;          elsif mem_fpu_div_done or mem_sqrt_done or mem_flt_done then            -- End of div            mem_fpu_stall_i    <= false;          end if;          if EX_PipeRun and EX_Start_FPU and not ex_cmp_op  then            mem_fpu_stall_i    <= true;          end if;        end if;      end if;    end process MEM_FPU_Stall_DFF;    -- Do not stall on the last cycle of an FPU divide instruction    MEM_FPU_Stall <= mem_fpu_excep_early or (mem_fpu_stall_i and not mem_fpu_div_done and not mem_sqrt_done and not mem_flt_done);    -- This shouldn't be necessary    ex_a <= EX_Op2;    ex_b <= EX_Op1;      -----------------------------------------------------------------------------    -- First stage    -- The operands and operations are coming from DFFs in MicroBlaze's pipeline    -----------------------------------------------------------------------------    -- FPU Instruction?    ex_not_fpu_instr_1 <= EX_Not_FPU_Instr;      -- Op_1    ex_fpu_op_1 <= EX_FPU_Op;      -- Sign    ex_SignA_1 <= ex_a(IEEE754_SINGLE_SIGN_POS);    ex_SignB_1 <= ex_b(IEEE754_SINGLE_SIGN_POS);

⌨️ 快捷键说明

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