Diseño vhdl del sumador en serie

Tengo un problema de diseño en VHDL con un sumador serial. El diagrama de bloques está tomado de un libro.

ingrese la descripción de la imagen aquí

Como no soy lo suficientemente hábil en el diseño con reloj (excepto algunas chancletas tontas que encontré en la web, y de manera similar un registro, donde el diseño es más o menos el mismo), tengo un problema en el diseño.

Comenzaría con un registro (n bit) un sumador completo y luego un flip flop como componente básico. El registro y el flip flop deben actualizarse y cambiar para cada ciclo de reloj, el sumador completo es combinatorio, por lo que está bien. Sin embargo, no estoy seguro de cómo se debe diseñar toda la entidad para el sumador. Intentaría con algo como

entity adderSerial is
  generic(n : natural);
  port(x, y : in std_logic_vector(n - 1 downto 0);
       clk : in std_logic;
       z : out std_logic_vector(n - 1 downto 0));
end entity adderSerial;

La arquitectura interna me confunde mucho ya que en realidad no sé cómo comportarme en el tema de la sincronización... En un nivel alto, diría que probablemente internamente debería haber incluso un contador que probablemente realice un seguimiento de cuándo se procesan todos los bits. Pero no estoy seguro de si esta es la forma correcta de realizar este diseño, me gustaría mantenerme lo más cerca posible del diagrama que publiqué.

¿Alguna sugerencia para un diseño tan simple?

Actualizar...

Bien, aquí tengo mi primer intento para el diseño... Lo dividí en tres procesos, el primero para manejar los registros de entrada, el segundo para manejar el sumador completo y el tercero para manejar el registro z, sincronizo con una señal de reloj y pienso He escrito una lista de sensibilidad correcta para cada proceso. Las señales de entrada también son clk, load y clear. Clk es el reloj, load es escribir el valor x,y en los registros mientras que clear es borrar registros y flip flop. ¡Por favor, dame algún comentario!

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_misc.all;
use ieee.numeric_std.all;

entity serialAdder is
    generic(n : natural := 4);
    port(x : in std_logic_vector(n - 1 downto 0);
         y : in std_logic_vector(n - 1 downto 0);
         clk : in std_logic;
         load : in std_logic;
         clr : in std_logic;
         z : out std_logic_vector(n - 1 downto 0));
end entity serialAdder;

architecture arch of serialAdder is
    signal x_reg : std_logic_vector(n - 1 downto 0);
    signal y_reg : std_logic_vector(n - 1 downto 0);
    signal z_reg : std_logic_vector(n - 1 downto 0);
    signal c_reg : std_logic;
begin
    process(clk) is --handling of registers "x" and "y", synchronous
    begin

        if rising_edge(clk) then
            if clr = '1' then --clear all the registers, and flip flop
                x_reg <= (others => '0');
                y_reg <= (others => '0');
                c_reg <= '0';
                z_reg <= (others => '0');
            elsif load = '1' then
                x_reg <= x;
                y_reg <= y;
            else --execute sum
                x_reg <= '0' & x_reg(n - 1 downto 1); --right input register shift
                y_reg <= '0' & y_reg(n - 1 downto 1);       

                --full adder logic      
                z_reg <= (x_reg(0) xor y_reg(0) xor c_reg) & z_reg(n - 1 downto 1); --right shift and adding a new bit
                c_reg <= (c_reg and x_reg(0)) or (c_reg and y_reg(0)) or (x_reg(0) and y_reg(0)); --carry update
            end if;
        end if;
    end process;

    z <= z_reg; --update of the output

end architecture arch;
Probablemente debería poner una señal de reinicio para los registros y flip flop también, si necesito realizar una nueva suma.
¿Por qué no comenzar con el sumador completo y trabajar desde allí? ¿Cómo vas a hacer el sumador completo?
Ya tengo un sumador completo, quiero decir implementado, también implementé un sumador de acarreo de ondulación. Pero creo que en este diseño el problema real es la sincronización de todos los subcomponentes.
Todo debe estar sincronizado, por lo que solo es cuestión de realizar una nueva adición en cada ciclo de reloj. ¿Tu FA tiene una entrada clk?
Quiero decir... el diseño que creo que encajaría mejor con el problema es un modelado estructural del sistema, esto seguro. De lo contrario, podría probar una especie de comportamiento sin ningún subcomponente y ver si el código que saldría sería más simple o no.
En realidad no tiene estímulos de reloj... ¿qué podría pasar sin el reloj?
Ok, tomémoslo de otra manera ... trato de escribir un solo componente, eventualmente coloco otra publicación para corregirla, luego volveré aquí para completar esta publicación.
Ok, he diseñado un par de cosas con reloj (específicamente un flip flop y un registro de desplazamiento...). Ahora estaba vagando por esto ... En la multiplicación en serie, ¿debería implementarse un contador para tener en cuenta la cantidad de ciclos de reloj necesarios para completar la suma?
Hola chicos... pueden echarle un vistazo a mi diseño y decirme que les parece?

Respuestas (1)

z : fuera std_logic_vector(n - 1 hasta 0)); La salida debe ser std_logic, porque es una salida serial

Además, puede usar el operador + directamente en std_logic_vectors. Simplemente agregue la biblioteca "ieee.std_logic_signed" para que pueda escribir z_reg <= x+y;

if rise_edge(clk) entonces si clr = '1' entonces --borra todos los registros y voltea

            c_reg <= '0';
            z_reg <= (others => '0');
        elsif load = '1' then
            z_reg <= x + y;

        else --execute sum       

            --full adder logic      
            z <=  z_reg(0);
            z_reg <= '0'& z_reg(n-1 downto 1);
        end if;
    end if;
¿Por qué usaría el +operador de todos modos si el propósito fuera implementar un sumador de todos modos?
@ user8469759 ¿por qué usaría VHDL para describir las puertas?
Entonces tiene un módulo sumador y debe integrarlo para generar un sumador en serie
¿Cuáles son los puertos de su módulo sumador?
@DonFusili, no es lo mismo... realmente no lo es.
@ user186273 Además, ¿por qué sugiere declarar la salida como std_logic, dado que la salida se almacenará en el registro de salida, es cómo se genera esa salida que se implementa en serie?