布斯乘法器.txt
上传用户:easylife05
上传日期:2013-03-21
资源大小:42k
文件大小:5k
源码类别:

VHDL/FPGA/Verilog

开发平台:

C/C++

  1. -- Booth Multiplier
  2. -- This file contains all the entity-architectures for a complete
  3. -- k-bit x k-bit Booth multiplier.
  4. -- the design makes use of the new shift operators available in the VHDL-93 std
  5. -- this design passes the Synplify synthesis check
  6. -- download from: www.fpga.com.cn & www.pld.com.cn
  7. ----------------------------------------------------------------------
  8. --top level design unit
  9. library IEEE;
  10. use IEEE.Std_logic_1164.all;
  11. ENTITY booth_multiplier IS
  12.      GENERIC(k : POSITIVE := 7); --input number word length less one
  13.      PORT(multiplicand, multiplier : IN BIT_VECTOR(k DOWNTO 0);
  14.         clock : IN BIT; product : INOUT BIT_VECTOR((2*k + 1) DOWNTO 0));
  15. END booth_multiplier;
  16. ARCHITECTURE structural OF booth_multiplier IS
  17. SIGNAL mdreg, adderout, carries, augend, tcbuffout : BIT_VECTOR(k DOWNTO 0);
  18. SIGNAL mrreg : BIT_VECTOR((k + 1) DOWNTO 0);
  19. SIGNAL adder_ovfl : BIT;
  20. SIGNAL comp ,clr_mr ,load_mr ,shift_mr ,clr_md ,load_md ,clr_pp ,load_pp ,shift_pp : BIT;
  21. SIGNAL boostate : NATURAL RANGE 0 TO 2*(k + 1);
  22. BEGIN
  23. PROCESS --main clocked process containing all sequential elements
  24. BEGIN
  25.         WAIT UNTIL (clock'EVENT AND clock = '1');
  26.         --register to hold multiplicand during multiplication
  27.         IF clr_md = '1' THEN
  28.                 mdreg <= (OTHERS => '0');
  29.         ELSIF load_md = '1' THEN
  30.                 mdreg <= multiplicand;
  31.         ELSE
  32.                 mdreg <= mdreg;
  33.         END IF;
  34.                 
  35.         --register/shifter to product pair of bits used to control adder
  36.         IF clr_mr = '1' THEN
  37.                 mrreg <= (OTHERS => '0');
  38.         ELSIF load_mr = '1' THEN
  39.                 mrreg((k + 1) DOWNTO 1) <= multiplier;
  40.                 mrreg(0) <= '0';
  41.         ELSIF shift_mr = '1' THEN
  42.                 mrreg <= mrreg SRL 1;
  43.         ELSE
  44.                 mrreg <= mrreg;
  45.         END IF;
  46.                 
  47.         --register/shifter accumulates partial product values
  48.         IF clr_pp = '1' THEN
  49.                 product <= (OTHERS => '0');
  50.         ELSIF load_pp = '1' THEN
  51.                 product((2*k + 1) DOWNTO (k + 1)) <= adderout; --add to top half
  52.                 product(k DOWNTO 0) <= product(k DOWNTO 0);  --refresh bootm half
  53.         ELSIF shift_pp = '1' THEN
  54.                 product <= product SRA 1; --shift right with sign extend
  55.         ELSE
  56.                 product <= product;
  57.         END IF;
  58. END PROCESS;
  59. --adder adds/subtracts partial product to multiplicand
  60. augend <= product((2*k+1) DOWNTO (k+1));
  61. addgen : FOR i IN adderout'RANGE 
  62.         GENERATE
  63.                 lsadder : IF i = 0 GENERATE
  64.                         adderout(i) <= tcbuffout(i) XOR augend(i) XOR comp;
  65.                         carries(i) <= (tcbuffout(i) AND augend(i)) OR
  66.                                       (tcbuffout(i) AND comp) OR
  67.                                       (comp AND augend(i));
  68.                         END GENERATE;
  69.                 otheradder : IF i /= 0 GENERATE
  70.                         adderout(i) <= tcbuffout(i) XOR augend(i) XOR carries(i-1);
  71.                         carries(i) <= (tcbuffout(i) AND augend(i)) OR
  72.                                       (tcbuffout(i) AND carries(i-1)) OR
  73.                                       (carries(i-1) AND augend(i));
  74.                         END GENERATE;
  75.         END GENERATE;
  76.         --twos comp overflow bit
  77.         adder_ovfl <= carries(k-1) XOR carries(k);
  78. --true/complement buffer to generate two's comp of mdreg
  79. tcbuffout <= NOT mdreg WHEN (comp = '1') ELSE mdreg;
  80. --booth multiplier state counter
  81. PROCESS BEGIN  
  82.         WAIT UNTIL (clock'EVENT AND clock = '1');
  83.         IF boostate < 2*(k + 1) THEN boostate <= boostate + 1;
  84.         ELSE boostate <= 0;
  85.         END IF;
  86. END PROCESS;
  87. --assign control signal values based on state 
  88. PROCESS(boostate)
  89. BEGIN
  90.         --assign defaults, all registers refresh
  91.         comp <= '0';
  92.         clr_mr <= '0';
  93.         load_mr <= '0';
  94.         shift_mr <= '0';
  95.         clr_md <= '0';
  96.         load_md <= '0';
  97.         clr_pp <= '0';
  98.         load_pp <= '0';
  99.         shift_pp <= '0';
  100.         IF boostate = 0 THEN
  101.                 load_mr <= '1';
  102.                 load_md <= '1';
  103.                 clr_pp <= '1';
  104.         ELSIF boostate MOD 2 = 0 THEN   --boostate = 2,4,6,8 ....
  105.                 shift_mr <= '1';
  106.                 shift_pp <= '1';
  107.         ELSE    --boostate = 1,3,5,7......
  108.                 IF mrreg(0) = mrreg(1) THEN
  109.                         NULL; --refresh pp
  110.                 ELSE
  111.                         load_pp <= '1'; --update product        
  112.                 END IF;
  113.                 comp <= mrreg(1);       --subract if mrreg(1 DOWNTO 0) ="10"
  114.         END IF;
  115. END PROCESS;
  116. END structural;