DIVIDER.VHD
上传用户:dgjihui88
上传日期:2013-07-23
资源大小:43k
文件大小:3k
源码类别:

VHDL/FPGA/Verilog

开发平台:

MultiPlatform

  1. --divider.vhd n-bit divider
  2. library ieee;
  3. use ieee.std_logic_1164.all;
  4. use ieee.std_logic_unsigned.all ;
  5. use work.components.all ;
  6. entity divider is
  7. generic ( n : integer := 7 ) ;
  8. port (
  9.   clock : in std_logic ;--clock
  10.   s : in std_logic ;--start operation
  11.   la : in std_logic ;--load of dividend
  12.   eb: in std_logic ;--enable(load) of divisor
  13.   dataa : in std_logic_vector(n-1 downto 0) ;--dividend
  14.   datab : in std_logic_vector(n-1 downto 0) ;--divisor
  15.   r : buffer std_logic_vector(n-1 downto 0) ;--remainder
  16.   q : buffer std_logic_vector(n-1 downto 0) ;--quotient
  17.   done : out std_logic ) ;--done operation
  18. end divider ;
  19. architecture behavior of divider is
  20.   type state_type is ( s1, s2, s3 ) ;--state declaration
  21.   signal y : state_type ;--state definition
  22.   signal zero : std_logic ;--one bit zero
  23.   signal cout : std_logic ;--subtractor carry-out
  24.   signal z : std_logic ;--detecter of zero
  25.   signal ea : std_logic ;--enable of dividend
  26.   signal rsel : std_logic ;--selected line of register r's multiplexer
  27.   signal lr : std_logic ;--load of quotient
  28.   signal er : std_logic ;--enable of quotient
  29.   signal er0: std_logic ;--enable of rr0 register
  30.   signal lc : std_logic ;--load of downcounter
  31.   signal ec : std_logic ;--enable of downcounter
  32.   signal r0 : std_logic ;--output of register a's multiplexer
  33.   signal a : std_logic_vector(n-1 downto 0) ;--output of register a(dividend)
  34.   signal b : std_logic_vector(n-1 downto 0) ;--output of register b(divisor)
  35.   signal datar : std_logic_vector(n-1 downto 0) ;--parallel load of register r(remainder)
  36.   signal sum : std_logic_vector(n downto 0) ;--sum of subtractor
  37.   signal count : integer range 0 to n-1 ;--range of downcounter
  38. begin
  39.   fsm_transitions: process ( clock )
  40.   begin
  41.   if (clock'event and clock = '1') then
  42.   case y is
  43.   when s1 =>
  44. if s = '0' then y <= s1 ; else y <= s2 ; end if ;
  45.   when s2 =>
  46. if z = '0' then y <= s2 ; else y <= s3 ; end if ;
  47.   when s3 =>
  48. if s = '1' then y <= s3 ; else y <= s1 ; end if ;
  49.   end case ;
  50. end if ;
  51.   end process ;
  52.   fsm_outputs: process ( s, y, cout, z )
  53.   begin
  54. lr <= '0' ; er <= '0' ; er0 <= '0' ;--initialize value
  55. ea <= '0' ; done <= '0' ;
  56. rsel <= '0' ;
  57. case y is
  58.   when s1 =>
  59.   er <= '1' ;
  60.     if s = '0' then
  61.   lr <= '1' ; 
  62.   if la = '1' then ea <= '1' ; else ea <= '0' ; end if ;
  63. else
  64.   ea <= '1' ; er0 <= '1' ; 
  65. end if ;
  66.   when s2 =>
  67. rsel <= '1' ; er <= '1' ; er0 <= '1' ; ea <= '1' ;
  68. if cout = '1' then lr <= '1' ; else lr <= '0' ; end if ;
  69.   when s3 =>
  70. done <= '1' ;
  71. end case ;
  72.   end process ;
  73.   -- define the datapath circuit
  74.   zero <= '0' ;
  75.   --divisor
  76.   regb: regne generic map ( n => n )
  77. port map ( datab, eb, clock, b ) ;
  78.   --remainder
  79.   shiftr: shiftlne generic map ( n => n )
  80. port map ( datar, lr, er, r0, clock, r ) ;
  81.   --flip-flop with multiplexer
  82.   ff_r0: muxdff port map ( zero, a(n-1), er0, clock, r0 ) ;
  83.   --dividend
  84.   shifta: shiftlne generic map ( n => n )
  85. port map ( dataa, la, ea, cout, clock, a ) ;
  86.   q <= a ;
  87.   --downcounter
  88.   ec <= '1' ; lc <= not s;
  89.   counter: downcnt generic map ( modulus => n+1 ) 
  90. port map ( clock, ec, lc, count ) ;
  91.   --nor gate zero detector 
  92.   z <= '1' when count = 0 else '0' ;
  93.   --subtractor
  94.   sum <= r & r0 + (not b +1) ;
  95.   cout <= sum(n) ;
  96.   --multiplexer of register r(remainder) 
  97.   datar <= (others => '0') when rsel = '0' else sum(n-1 downto 0) ;
  98. end behavior ;