VHDL: a + b + carry_in crea dos sumadores en lugar de usar carry en el sumador existente

1

Quiero agregar A, B y el acarreo. Esto se debe hacer usando solo un sumador grande. Pero cuando veo el circuito generado, hay un sumador adicional para el acarreo. ¿Cómo puedo resolver este problema?

Imagen:

Código:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity adder is
    port(
        a, b : in unsigned(3 downto 0);
        result : out unsigned(3 downto 0);
        clk : in STD_LOGIC;
        cin : in integer
    );
end entity;
architecture behavioral of adder is
    signal a_r, b_r, result_r : unsigned(3 downto 0);
    signal cin_r : integer;
begin
    process(clk)
    begin
        if rising_edge(clk) then
            a_r <= a;
            b_r <= b;
            cin_r <= cin;
            result_r <= a_r + b_r + to_unsigned(cin_r, 4);
        end if;
        result <= result_r;
    end process;
end behavioral;
    
pregunta gilianzz

3 respuestas

1

¿Por qué son cin y cin_r del tipo integer ? ¡Puedes ver en la vista RTL de Altera que está intentando sintetizar una señal de 32 bits de ancho!

Normalmente, un sumador VHDL tomaría dos entradas unsigned o signed del ancho apropiado y la entrada cin de tipo std_logic o una señal similar de un bit de ancho. Intente cambiar los dos integer s por std_logic s y ver si el result_r <= a_r + b_r + ("" & cin_r); (sugerido por el usuario8352) puede inferir correctamente un sumador con un arrastre.

Además, su sumador no parece manejar correctamente el desbordamiento / acarreo.

    
respondido por el user2943160
0

Para resolver este problema, debe cambiar cin y cin_r a STD_LOGIC. La linea

result_r <= a_r + b_r + to_unsigned(cin_r, 4);

se convierte en

result_r <= a_r + b_r + ("" & cin_r);

El nuevo código es:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity adder is
    port(
        a, b : in unsigned(3 downto 0);
        result : out unsigned(3 downto 0);
        clk, cin : in STD_LOGIC
    );
end entity;
architecture behavioral of adder is
    signal a_r, b_r, result_r : unsigned(3 downto 0);
    signal cin_r : STD_LOGIC;
begin
    process(clk)
    begin
        if rising_edge(clk) then
            a_r <= a;
            b_r <= b;
            cin_r <= cin;
            result_r <= a_r + b_r + ("" & cin_r);
        end if;
        result <= result_r;
    end process;
end behavioral;
    
respondido por el gilianzz
0

Todas las respuestas actuales son de mal diseño. a byc deben ser todos enteros o sin signo. Definir correctamente los rangos resolverá el problema.

O cin y cin_r se convierten

unsigned(0 downto 0)

y a y b permanecen como están ahora o tú pones

a : natural range 0 to 7
b : natural range 0 to 7
a_r : natural range 0 to 7
b_r : natural range 0 to 7
cin : natural range 0 to 1
cin_r : natural range 0 to 1
    
respondido por el DonFusili

Lea otras preguntas en las etiquetas