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

Subversion Repositories funbase_ip_library

[/] [funbase_ip_library/] [trunk/] [TUT/] [ip.hwp.accelerator/] [dctqidct/] [1.0/] [hdl/] [common_da/] [Serial_adder.vhd] - Rev 145

Compare with Previous | Blame | View Log

------------------------------------------------------------------------------
-- Author               : Timo Alho
-- e-mail               : timo.a.alho@tut.fi
-- Date                 : 14.06.2004 14:08:22
-- File                 : Serial_adder.vhd
-- Design               : 
------------------------------------------------------------------------------
-- Description  : Serial adder. Consist of one full adder and register for
-- carrybit.
------------------------------------------------------------------------------
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_arith.ALL;
 
ENTITY Serial_adder IS
   PORT( 
      clk     : IN     std_logic;
      in0     : IN     std_logic;   --serial data input 0
      in1     : IN     std_logic;   --serial data input 1
      rst_n   : IN     std_logic;
      start   : IN     std_logic;   --start (ignores carrybit)
      sum_out : OUT    std_logic    --serial data outuput
   );
 
-- Declarations
 
END Serial_adder ;
 
--
ARCHITECTURE rtl OF Serial_adder IS
 
  SIGNAL carry_bit_r : std_logic;       --register, where carry bit is stored
  SIGNAL carry_bit   : std_logic;       --internal signal for carry bit
  SIGNAL sum         : std_logic;       --internal signal for sum
BEGIN
 
  clocked : PROCESS (clk, rst_n)
  BEGIN  -- PROCESS clocked
    IF rst_n = '0' THEN                 -- asynchronous reset (active low)
      carry_bit_r <= '0';
 
    ELSIF clk'event AND clk = '1' THEN  -- rising clock edge
      carry_bit_r <= carry_bit;
    END IF;
  END PROCESS clocked;
 
  calc : PROCESS (start, carry_bit_r, in0, in1)
 
    VARIABLE temp1 : std_logic_vector(1 DOWNTO 0);
    VARIABLE temp2 : std_logic_vector(2 DOWNTO 0);
 
  BEGIN  -- PROCESS calc
    IF (start = '1') THEN
      temp1 := in0 & in1;
      CASE temp1 IS
        WHEN "00"   =>
          sum       <= '0';
          carry_bit <= '0';
        WHEN "01"   =>
          sum       <= '1';
          carry_bit <= '0';
        WHEN "10"   =>
          sum       <= '1';
          carry_bit <= '0';
        WHEN OTHERS =>
          sum       <= '0';
          carry_bit <= '1';
      END CASE;
 
    ELSE
      temp2 := carry_bit_r & in0 & in1;
      CASE temp2 IS
        WHEN "000"  =>
          sum       <= '0';
          carry_bit <= '0';
        WHEN "001"  =>
          sum       <= '1';
          carry_bit <= '0';
        WHEN "010"  =>
          sum       <= '1';
          carry_bit <= '0';
        WHEN "011"  =>
          sum       <= '0';
          carry_bit <= '1';
        WHEN "100"  =>
          sum       <= '1';
          carry_bit <= '0';
        WHEN "101"  =>
          sum       <= '0';
          carry_bit <= '1';
        WHEN "110"  =>
          sum       <= '0';
          carry_bit <= '1';
        WHEN OTHERS =>
          sum       <= '1';
          carry_bit <= '1';
      END CASE;
    END IF;
 
  END PROCESS calc;
 
  sum_out <= sum;
 
 
END rtl;
 
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

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