TA147

Ejecicios y trabajos prácticos de la materia Taller de Sistemas Digitales (TA147)
Index Commits Files Refs
vhdl/dev/multiplier/multiplier.vhd (1552B)
   1 library ieee;
   2 use ieee.std_logic_1164.all;
   3 use ieee.numeric_std.all;
   4 
   5 entity multiplier is
   6     generic(N : natural := 4);
   7     port(
   8         op_A : in  std_logic_vector(N-1 downto 0);
   9         op_B : in  std_logic_vector(N-1 downto 0);
  10         load : in  std_logic;
  11         clk  : in  std_logic;
  12         res  : out std_logic_vector(2*N-1 downto 0));
  13 end entity;
  14 
  15 architecture multiplier_arq of multiplier is
  16 
  17     signal B_in, P_in, aux              : std_logic_vector(N-1 downto 0);
  18     signal A_out, B_out, P_out, sum_out : std_logic_vector(N-1 downto 0);
  19     signal C_out : std_logic;
  20 
  21 begin
  22 
  23     A_reg : entity work.reg(reg_arq)
  24     generic map(N => N)
  25     port map(
  26         D   => op_A,
  27         clk => clk,
  28         rst => '0',
  29         ena => '1',
  30         Q   => A_out);
  31 
  32     B_reg : entity work.reg(reg_arq)
  33     generic map(N => N)
  34     port map(
  35         D   => B_in,
  36         clk => clk,
  37         rst => '0',
  38         ena => '1',
  39         Q   => B_out);
  40 
  41     P_reg : entity work.reg(reg_arq)
  42     generic map(N => N)
  43     port map(
  44         D   => P_in,
  45         clk => clk,
  46         rst => load,
  47         ena => '1',
  48         Q   => P_out);
  49 
  50     adder : entity work.adder(adder_arq)
  51     generic map(N => N)
  52     port map(
  53         A     => P_out,
  54         B     => aux,
  55         C_in  => '0',
  56         res   => sum_out,
  57         C_out => C_out);
  58 
  59     P_in <= C_out & sum_out(N-1 downto 1);
  60     B_in <= op_B when load = '1' else sum_out(0) & B_out(N-1 downto 1);
  61     aux <= A_out when B_out(0) = '1' else (others => '0');
  62     res <= P_out & B_out;
  63 
  64 end architecture;