VHDL之Serial-Parallel Multiplier

1  Serial-parallel multiplier

  Figure 12.1 shows the RTL diagram of a serial-parallel multiplier. One of the input vectors (a) is applied serially to the circuit (one bit at a time, starting from the LSB), while the other (b) is applied in parallel (all bits simultaneously). Say that a has M bits, while b has N. Then, after all M bits of a have been presented to the system, a string of M ‘0’s must follow, in order to complete the (M þ N)-bit output product.

  VHDL之Serial-Parallel Multiplier

  This system is pipelined, and is constructed using AND gates, full-adder units, plus registers (flip-flops). Each unit of the pipeline (except the leftmost one) requires one adder and two registers, plus an AND gate to compute one of the inputs. Thus for an M x N multiplier, O(N) of such units are required.

 

2  VHDL

  1) and_2.vhd

 1 library IEEE;

 2 use ieee.std_logic_1164.all;

 3 

 4 entity and_2 is

 5 port

 6 (

 7     a, b:    in    std_logic;

 8     y:        out    std_logic

 9 );

10 end and_2;

11 

12 architecture sim of and_2 is

13 begin

14     y    <=    a and b;

15 

16 end sim;

  2) reg.vhd

 1 library IEEE;

 2 use ieee.std_logic_1164.all;

 3 

 4 entity reg is 

 5 port

 6 (

 7     d, clk, rst:    in    std_logic;

 8     q:                out std_logic

 9 );

10 end reg;

11 

12 architecture sim of reg is 

13 begin

14     process(clk, rst)

15     begin    

16         if (rst = '1') then q <= '0';

17         elsif (clk'event and clk = '1') then q <= d;

18         end if;

19     end process;

20     

21 end sim;

  3) fau.vhd

 1 library IEEE;

 2 use ieee.std_logic_1164.all;

 3 

 4 entity fau is 

 5 port

 6 (

 7     a, b, cin:    in    std_logic;

 8     s, cout:    out    std_logic

 9 );

10 end fau;

11 

12 architecture sim of fau is 

13 begin

14     s <= a xor b xor cin;

15     cout <= (a and b) or (a and cin) or (b and cin);

16 

17 end sim;    

  4)  pipe

 1 library IEEE;

 2 use ieee.std_logic_1164.all;

 3 

 4 library work;

 5 use work.my_components.all;

 6 

 7 entity pipe is 

 8 port

 9 (

10     a, b, clk, rst: in    std_logic;

11     q:                out    std_logic

12 );

13 end pipe;

14 

15 architecture sim of pipe is 

16     signal s, cin, cout: std_logic;

17 begin

18     U1: component fau port map(a, b, cin, s, cout);

19     U2: component reg port map(cout, clk, rst, cin);

20     U3: component reg port map(s, clk, rst, q);

21 end sim;

  5) my_components.vhd

 1 library IEEE;

 2 use ieee.std_logic_1164.all;

 3 

 4 package my_components is

 5 

 6 component and_2 is 

 7 port

 8 (

 9     a, b:    in    std_logic;

10     y:        out    std_logic

11 );

12 end component;

13 

14 component fau is 

15 port

16 (

17     a, b, cin:    in    std_logic;

18     s, cout:    out std_logic

19 );

20 end component;

21 

22 component reg is 

23 port

24 (

25     d, clk, rst:    in    std_logic;

26     q:                out    std_logic

27 );

28 end component;

29 

30 component pipe is 

31 port

32 (

33     a, b, clk, rst:    in    std_logic;

34     q:                out std_logic

35 );

36 end component;

37 

38 end my_components;

 

  6) multiplier.vhd

 1 library IEEE;

 2 use ieee.std_logic_1164.all;

 3 

 4 library work;

 5 use work.my_components.all;

 6 

 7 entity multiplier is 

 8 port

 9 (

10     a, clk, rst:    in    std_logic;

11     b:                in    std_logic_vector(3 downto 0);

12     prod:            out std_logic

13 );

14 end multiplier;

15 

16 architecture sim of multiplier is 

17     signal and_out, reg_out: std_logic_vector(3 downto 0);

18 begin

19     U1: component and_2 port map(a, b(3), and_out(3));

20     U2:    component and_2 port map(a, b(2), and_out(2));

21     U3: component and_2 port map(a, b(1), and_out(1));

22     U4: component and_2 port map(a, b(0), and_out(0));

23     U5: component reg port map(and_out(3), clk, rst, reg_out(3));

24     U6: component pipe port map(and_out(2), reg_out(3), clk, rst, reg_out(2));

25     U7: component pipe port map(and_out(1), reg_out(2), clk, rst, reg_out(1));

26     U8: component pipe port map(and_out(0), reg_out(1), clk, rst, reg_out(0));

27     

28     prod <= reg_out(0);

29     

30 end sim;

 

你可能感兴趣的:(RIA)