OpenCores
URL https://opencores.org/ocsvn/mlite/mlite/trunk

Subversion Repositories mlite

[/] [mlite/] [trunk/] [vhdl/] [pipeline.vhd] - Diff between revs 122 and 128

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 122 Rev 128
Line 62... Line 62...
      pc_source, mem_source, a_source, b_source, c_source, c_source_reg,
      pc_source, mem_source, a_source, b_source, c_source, c_source_reg,
      reg_dest, reg_dest_reg, reg_dest_delay, c_bus)
      reg_dest, reg_dest_reg, reg_dest_delay, c_bus)
   variable pause_mult_clock : std_logic;
   variable pause_mult_clock : std_logic;
   variable freeze_pipeline  : std_logic;
   variable freeze_pipeline  : std_logic;
begin
begin
   if (pc_source /= from_inc4 and pc_source /= from_opcode25_0) or
   if (pc_source /= FROM_INC4 and pc_source /= FROM_OPCODE25_0) or
         mem_source /= mem_fetch or
         mem_source /= MEM_FETCH or
         (mult_func = mult_read_lo or mult_func = mult_read_hi) then
         (mult_func = MULT_READ_LO or mult_func = MULT_READ_HI) then
      pause_mult_clock := '1';
      pause_mult_clock := '1';
   else
   else
      pause_mult_clock := '0';
      pause_mult_clock := '0';
   end if;
   end if;
 
 
   freeze_pipeline := not (pause_mult_clock and pause_enable_reg) and pause_any;
   freeze_pipeline := not (pause_mult_clock and pause_enable_reg) and pause_any;
   pause_pipeline <= pause_mult_clock and pause_enable_reg;
   pause_pipeline <= pause_mult_clock and pause_enable_reg;
   rd_indexD <= rd_index_reg;
   rd_indexD <= rd_index_reg;
 
 
   if c_source_reg = c_from_alu then
   if c_source_reg = C_FROM_ALU then
      reg_dest_delay <= c_bus;        --delayed by 1 clock cycle via a_busD & b_busD
      reg_dest_delay <= c_bus;        --delayed by 1 clock cycle via a_busD & b_busD
   else
   else
      reg_dest_delay <= reg_dest_reg; --need to delay 1 clock cycle from reg_dest
      reg_dest_delay <= reg_dest_reg; --need to delay 1 clock cycle from reg_dest
   end if;
   end if;
   reg_destD <= reg_dest_delay;
   reg_destD <= reg_dest_delay;
 
 
   if reset = '1' then
   if reset = '1' then
      pause_enable_reg <= '1';
      a_busD <= ZERO;
 
      b_busD <= ZERO;
 
      alu_funcD <= ALU_NOTHING;
 
      shift_funcD <= SHIFT_NOTHING;
 
      mult_funcD <= MULT_NOTHING;
 
      reg_dest_reg <= ZERO;
 
      c_source_reg <= "000";
      rd_index_reg <= "000000";
      rd_index_reg <= "000000";
 
      pause_enable_reg <= '0';
   elsif rising_edge(clk) then
   elsif rising_edge(clk) then
      if freeze_pipeline = '0' then
      if freeze_pipeline = '0' then
         if (rs_index = "000000" or rs_index /= rd_index_reg) or
         if (rs_index = "000000" or rs_index /= rd_index_reg) or
            (a_source /= a_from_reg_source or pause_enable_reg = '0') then
            (a_source /= A_FROM_REG_SOURCE or pause_enable_reg = '0') then
            a_busD <= a_bus;
            a_busD <= a_bus;
         else
         else
            a_busD <= reg_dest_delay;  --rs from previous operation (bypass stage)
            a_busD <= reg_dest_delay;  --rs from previous operation (bypass stage)
         end if;
         end if;
 
 
         if (rt_index = "000000" or rt_index /= rd_index_reg) or
         if (rt_index = "000000" or rt_index /= rd_index_reg) or
               (b_source /= b_from_reg_target or pause_enable_reg = '0') then
               (b_source /= B_FROM_REG_TARGET or pause_enable_reg = '0') then
            b_busD <= b_bus;
            b_busD <= b_bus;
         else
         else
            b_busD <= reg_dest_delay;  --rt from previous operation
            b_busD <= reg_dest_delay;  --rt from previous operation
         end if;
         end if;
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.