www.pudn.com > codeofvhdl2006.rar > DIVIDER.VHD
--divider.vhd n-bit divider library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all ; use work.components.all ; entity divider is generic ( n : integer := 7 ) ; port ( clock : in std_logic ;--clock s : in std_logic ;--start operation la : in std_logic ;--load of dividend eb: in std_logic ;--enable(load) of divisor dataa : in std_logic_vector(n-1 downto 0) ;--dividend datab : in std_logic_vector(n-1 downto 0) ;--divisor r : buffer std_logic_vector(n-1 downto 0) ;--remainder q : buffer std_logic_vector(n-1 downto 0) ;--quotient done : out std_logic ) ;--done operation end divider ; architecture behavior of divider is type state_type is ( s1, s2, s3 ) ;--state declaration signal y : state_type ;--state definition signal zero : std_logic ;--one bit zero signal cout : std_logic ;--subtractor carry-out signal z : std_logic ;--detecter of zero signal ea : std_logic ;--enable of dividend signal rsel : std_logic ;--selected line of register r's multiplexer signal lr : std_logic ;--load of quotient signal er : std_logic ;--enable of quotient signal er0: std_logic ;--enable of rr0 register signal lc : std_logic ;--load of downcounter signal ec : std_logic ;--enable of downcounter signal r0 : std_logic ;--output of register a's multiplexer signal a : std_logic_vector(n-1 downto 0) ;--output of register a(dividend) signal b : std_logic_vector(n-1 downto 0) ;--output of register b(divisor) signal datar : std_logic_vector(n-1 downto 0) ;--parallel load of register r(remainder) signal sum : std_logic_vector(n downto 0) ;--sum of subtractor signal count : integer range 0 to n-1 ;--range of downcounter begin fsm_transitions: process ( clock ) begin if (clock'event and clock = '1') then case y is when s1 => if s = '0' then y <= s1 ; else y <= s2 ; end if ; when s2 => if z = '0' then y <= s2 ; else y <= s3 ; end if ; when s3 => if s = '1' then y <= s3 ; else y <= s1 ; end if ; end case ; end if ; end process ; fsm_outputs: process ( s, y, cout, z ) begin lr <= '0' ; er <= '0' ; er0 <= '0' ;--initialize value ea <= '0' ; done <= '0' ; rsel <= '0' ; case y is when s1 => er <= '1' ; if s = '0' then lr <= '1' ; if la = '1' then ea <= '1' ; else ea <= '0' ; end if ; else ea <= '1' ; er0 <= '1' ; end if ; when s2 => rsel <= '1' ; er <= '1' ; er0 <= '1' ; ea <= '1' ; if cout = '1' then lr <= '1' ; else lr <= '0' ; end if ; when s3 => done <= '1' ; end case ; end process ; -- define the datapath circuit zero <= '0' ; --divisor regb: regne generic map ( n => n ) port map ( datab, eb, clock, b ) ; --remainder shiftr: shiftlne generic map ( n => n ) port map ( datar, lr, er, r0, clock, r ) ; --flip-flop with multiplexer ff_r0: muxdff port map ( zero, a(n-1), er0, clock, r0 ) ; --dividend shifta: shiftlne generic map ( n => n ) port map ( dataa, la, ea, cout, clock, a ) ; q <= a ; --downcounter ec <= '1' ; lc <= not s; counter: downcnt generic map ( modulus => n+1 ) port map ( clock, ec, lc, count ) ; --nor gate zero detector z <= '1' when count = 0 else '0' ; --subtractor sum <= r & r0 + (not b +1) ; cout <= sum(n) ; --multiplexer of register r(remainder) datar <= (others => '0') when rsel = '0' else sum(n-1 downto 0) ; end behavior ;