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

VHDL/FPGA/Verilog

开发平台:

MultiPlatform

  1. --multiplier.vhd n-bit multiplier
  2. library ieee ;
  3. use ieee.std_logic_1164.all ;
  4. use ieee.std_logic_unsigned.all ;
  5. use work.components.all ;
  6. entity multiplier is
  7. generic ( n : integer := 7; nn : integer := 14 ) ;
  8. port (
  9.   clock : in std_logic ;--clock
  10.   la : in std_logic ;--load of multiplicand
  11.   lb : in std_logic ;--load of multiplier
  12.   s : in std_logic ;--start
  13.   dataa : in std_logic_vector(n-1 downto 0) ;--multiplicand
  14.   datab : in std_logic_vector(n-1 downto 0) ;--multiplier
  15.   p : buffer std_logic_vector(nn-1 downto 0) ;--porduct
  16.   done : out std_logic ) ;
  17. end multiplier ;
  18. architecture behavior of multiplier is
  19.   type state_type is ( s1, s2, s3 ) ;--state define
  20.   signal y : state_type ;--state declaration
  21.   signal psel: std_logic ;--select line of multiplexer
  22.   signal z : std_logic ;--detecter of zero 
  23.   signal ea : std_logic ;--enable of shift-left register(multiplicand)
  24.   signal eb : std_logic ;--enable of shift-right register(multiplier)
  25.   signal ep : std_logic ;--enable of product register
  26.   signal zero : std_logic ;--series input of shift
  27.   signal b : std_logic_vector(n-1 downto 0) ;--output of shift-right register
  28.   signal n_zeros : std_logic_vector(n-1 downto 0) ;--n-bit zero load into register with multiplicand
  29.   signal a : std_logic_vector(nn-1 downto 0) ;--output of shift-left register
  30.   signal ain : std_logic_vector(nn-1 downto 0) ;--input of shift-left regster
  31.   signal datap : std_logic_vector(nn-1 downto 0) ;--output of multiplexer 
  32.   signal sum : std_logic_vector(nn-1 downto 0) ;--sum of product and multiplicand
  33.   signal nn_zeros : std_logic_vector(nn-1 downto 0) ;--2*n-bit zero input to multiplicand
  34.   signal q : integer range 0 to n;--count of downcounter
  35.   signal ec : std_logic;--enable of downcounter
  36.   signal lc : std_logic;--load of downcounter
  37. begin
  38.   fsm_transitions: process ( clock )
  39.   begin
  40. if (clock'event and clock = '1') then
  41.       case y is
  42.     when s1 =>
  43.   if s = '0' then y <= s1 ; else y <= s2 ; end if ;
  44. when s2 =>
  45.   if z = '0' then y <= s2 ; else y <= s3 ; end if ;
  46. when s3 =>
  47.   if s = '1' then y <= s3 ; else y <= s1 ; end if ;
  48. end case ;
  49. end if ;
  50.   end process ;
  51.   fsm_outputs: process ( y, s, la, lb, b(0) )
  52.   begin
  53.     ep <= '0' ; ea <= '0' ; eb <= '0' ; done <= '0' ; psel <= '0';
  54.     case y is
  55.   when s1 =>
  56. ep <= '1' ;
  57. if s = '0' and la = '1' then ea <= '1' ; 
  58. else ea <= '0' ; end if ;
  59. if s = '0' and lb = '1' then eb <= '1' ; 
  60. else eb <= '0' ; end if ;
  61.   when s2 =>
  62. ea <= '1' ; eb <= '1' ; psel <= '1' ;
  63. if b(0) = '1' then ep <= '1' ; else ep <= '0' ; end if ;
  64.   when s3 =>
  65. done <= '1' ;
  66.   end case ;
  67. end process ;
  68.   -- define the datapath circuit
  69.   nn_zeros <= (others => '0' ) ;--2*n-bit zero
  70.   n_zeros <= (others => '0' ) ;--n-bit zero
  71.   zero <= '0' ;
  72.   ain <= n_zeros & dataa ;
  73.   shifta: shiftlne generic map ( n => nn )
  74. port map ( ain, la, ea, zero, clock, a ) ;
  75.   shiftb: shiftrne generic map ( n => n )
  76. port map ( datab, lb, eb, zero, clock, b ) ;
  77.   ec <= '1' ; lc <= not s;
  78.   count: downcnt generic map (n+1) port map(clock,ec,lc,q);
  79.   z <= '1' when q = 0 else '0' ;
  80.   sum <= a + p ;
  81.   -- define the 2n 2-to-1 multiplexers for datap
  82.   muxi: mux2to1 generic map ( n => nn ) 
  83.     port map ( nn_zeros, sum, psel, datap ) ;
  84.   regp: regne generic map ( n => nn )
  85. port map ( datap, ep, clock, p ) ;
  86. end behavior ;