TA147

Ejecicios y trabajos prácticos de la materia Taller de Sistemas Digitales (TA147)
Index Commits Files Refs
commit 5bb0f1d09d6f974a431b8e7e7ca026efc4595d06
parent f18647bd49d642cca7c273f878d93178ecfef846
Author: Martin Klöckner <mjkloeckner@gmail.com>
Date:   Fri, 17 Apr 2026 01:07:06 -0300

Update `vhdl/dev/multiplier`

Diffstat:
Mvhdl/dev/adder_generic/adder_tb.vhd | 10+++++-----
Mvhdl/dev/multiplier/Makefile | 16+++++++++++-----
Mvhdl/dev/multiplier/adder.vhd | 14+++++++-------
Mvhdl/dev/multiplier/multiplier.vhd | 28++++++++++++++--------------
Mvhdl/dev/multiplier/multiplier_tb.vhd | 22+++++++++++++++-------
Mvhdl/dev/multiplier/reg.vhd | 8++++----
6 files changed, 56 insertions(+), 42 deletions(-)
diff --git a/vhdl/dev/adder_generic/adder_tb.vhd b/vhdl/dev/adder_generic/adder_tb.vhd
@@ -21,10 +21,10 @@ begin
     adder : entity work.adder(adder_arq)
     generic map(N => N)
     port map(
-      A       => sig_A,
-      B       => sig_B,
-      C_in    => sig_C_in,
-      res     => sig_res,
-      C_out  => sig_C_out);
+      A     => sig_A,
+      B     => sig_B,
+      C_in  => sig_C_in,
+      res   => sig_res,
+      C_out => sig_C_out);
 
 end architecture;
diff --git a/vhdl/dev/multiplier/Makefile b/vhdl/dev/multiplier/Makefile
@@ -1,21 +1,27 @@
-GHDL          = ghdl
+GHDL        = ghdl
+
 DEV_NAME      = multiplier
 TOP           = $(DEV_NAME)_tb
 TOP_SRC       = $(TOP).vhd
 SRCS          = reg.vhd adder.vhd multiplier.vhd
 WAVEFORM_FILE = $(TOP).vcd
 
+SIM_AFLAGS  = --std=93
+SIM_EFLAGS  = --std=93
+SIM_RFLAGS  = --std=93
+SIM_RUNOPTS = --vcd=$(WAVEFORM_FILE) --stop-time=1ms
+
 all: run
 
 analyze:
-    $(GHDL) -a $(SRCS)
-    $(GHDL) -a $(TOP_SRC)
+    $(GHDL) -a $(SIM_AFLAGS) $(SRCS)
+    $(GHDL) -a $(SIM_AFLAGS) $(TOP_SRC)
 
 elaborate: analyze
-    $(GHDL) -e $(TOP)
+    $(GHDL) -e $(SIM_EFLAGS) $(TOP)
 
 run: elaborate
-    $(GHDL) -r $(TOP) --vcd=$(WAVEFORM_FILE) --stop-time=1ms
+    $(GHDL) -r $(SIM_RFLAGS) $(TOP) $(SIM_RUNOPTS) 
 
 clean:
     rm -f *.o *.cf $(TOP) $(TOP).vcd
diff --git a/vhdl/dev/multiplier/adder.vhd b/vhdl/dev/multiplier/adder.vhd
@@ -3,16 +3,16 @@ use ieee.std_logic_1164.all;
 use ieee.numeric_std.all;
 
 entity adder is
-    generic(N : integer := 4); -- number of bits
+    generic(N : natural := 4); -- number of bits
     port(
         -- inputs
-        op_A  : in  std_logic_vector(N-1 downto 0);
-        op_B  : in  std_logic_vector(N-1 downto 0);
-        c_in  : in  std_logic;
+        A    : in  std_logic_vector(N-1 downto 0);
+        B    : in  std_logic_vector(N-1 downto 0);
+        C_in : in  std_logic;
 
         -- outputs
         res   : out std_logic_vector(N-1 downto 0);
-        c_out : out std_logic);
+        C_out : out std_logic);
 end entity;
 
 architecture adder_arq of adder is
@@ -21,8 +21,8 @@ architecture adder_arq of adder is
 
 begin
 
-    res_aux <= std_logic_vector(unsigned('0' & op_A & c_in) + unsigned('0' & op_B & '1'));
+    res_aux <= std_logic_vector(unsigned('0' & A & C_in) + unsigned('0' & B & '1'));
     res <= res_aux(N downto 1);
-    c_out <= res_aux(N+1);
+    C_out <= res_aux(N+1);
 
 end architecture;
diff --git a/vhdl/dev/multiplier/multiplier.vhd b/vhdl/dev/multiplier/multiplier.vhd
@@ -3,7 +3,7 @@ use ieee.std_logic_1164.all;
 use ieee.numeric_std.all;
 
 entity multiplier is
-    generic(N : natural := 8);
+    generic(N : natural := 4);
     port(
         op_A : in  std_logic_vector(N-1 downto 0);
         op_B : in  std_logic_vector(N-1 downto 0);
@@ -21,7 +21,7 @@ architecture multiplier_arq of multiplier is
 begin
 
     A_reg : entity work.reg(reg_arq)
-    generic map(N => 8)
+    generic map(N => N)
     port map(
         D   => op_A,
         clk => clk,
@@ -30,7 +30,7 @@ begin
         Q   => A_out);
 
     B_reg : entity work.reg(reg_arq)
-    generic map(N => 8)
+    generic map(N => N)
     port map(
         D   => B_in,
         clk => clk,
@@ -39,7 +39,7 @@ begin
         Q   => B_out);
 
     P_reg : entity work.reg(reg_arq)
-    generic map(N => 8)
+    generic map(N => N)
     port map(
         D   => P_in,
         clk => clk,
@@ -48,17 +48,17 @@ begin
         Q   => P_out);
 
     adder : entity work.adder(adder_arq)
-    generic map(N => 8)
+    generic map(N => N)
     port map(
-       op_A  => P_out,
-       op_B  => aux,
-       c_in  => '0',
-       res   => sum_out,
-       c_out => C_out);
+        A     => P_out,
+        B     => aux,
+        C_in  => '0',
+        res   => sum_out,
+        C_out => C_out);
 
-    in_P <= c_out & out_sum(N-1 downto 1);
-    in_B <= op_B when load = '1' else out_sum(0) & out_B(N-1 downto 1);
-    aux <= out_A when out_B(0) = '1' else (others => '0');
-    res <= out_P & out_B;
+    P_in <= C_out & sum_out(N-1 downto 1);
+    B_in <= op_B when load = '1' else sum_out(0) & B_out(N-1 downto 1);
+    aux <= A_out when B_out(0) = '1' else (others => '0');
+    res <= P_out & B_out;
 
 end architecture;
diff --git a/vhdl/dev/multiplier/multiplier_tb.vhd b/vhdl/dev/multiplier/multiplier_tb.vhd
@@ -7,25 +7,33 @@ end entity;
 
 architecture multiplier_tb_arq of multiplier_tb is
 
-    constant N : integer := 8;
+    constant N : natural := 4;
 
-    signal A    : std_logic_vector(N - 1 downto 0) := x"01";
-    signal B    : std_logic_vector(N - 1 downto 0) := x"02";
+    signal A    : std_logic_vector(N - 1 downto 0) := x"2";
+    signal B    : std_logic_vector(N - 1 downto 0) := x"3";
     signal load : std_logic := '1';
     signal clk  : std_logic := '0';
     signal res  : std_logic_vector(2*N-1 downto 0);
 
 begin
 
-    DUT : entity work.multiplier(multiplier_arq) 
+    multiplier : entity work.multiplier(multiplier_arq) 
     generic map(N => N)
     port map(
+
         op_A => A,
         op_B => B,
         load => load,
-        clk => clk,
-        res => res);
+        clk  => clk,
+        res  => res);
+
+    process(clk) is
+    begin
+
+        load <= '0' after 10 us;
+
+    end process;
 
-    clk <= not clk after 1 us;
+    clk <= not clk after 50 us;
 
 end architecture;
diff --git a/vhdl/dev/multiplier/reg.vhd b/vhdl/dev/multiplier/reg.vhd
@@ -6,10 +6,10 @@ entity reg is
     generic(N: integer:= 4);
     port(
         -- inputs
-        D   : in  std_logic_vector(N-1 downto 0);
-        clk : in  std_logic;
-        rst : in  std_logic;
-        ena : in  std_logic;
+        D   : in std_logic_vector(N-1 downto 0);
+        clk : in std_logic;
+        rst : in std_logic;
+        ena : in std_logic;
 
         -- outputs
         Q   : out std_logic_vector(N-1 downto 0)