Serial Adder vhdl design

2

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

Yaquenotengolasuficienteexperienciaendiseñoconreloj(exceptoenalgunoscasosdetonteríasqueheencontradoenlaweb,ydemanerasimilarenunregistro,dondeeldiseñoesbastanteparecido)tengoalgúnproblemaeneldiseño.

Comenzaríaconunregistro(nbit)unsumadorcompletoyluegounflipflopcomocomponentebásico.Elregistroyelflipflopdebenactualizarseycambiarparacadaciclodereloj,elsumadorcompletoescombinatorio,asíqueestábien.Sinembargo,noestoysegurodecómodeberíadiseñarsetodalaentidadparaelsumadorqueintentaríaconalgocomo

entityadderSerialisgeneric(n:natural);port(x,y:instd_logic_vector(n-1downto0);clk:instd_logic;z:outstd_logic_vector(n-1downto0));endentityadderSerial;

Laarquitecturainternameconfundemucho,yaqueenrealidadnosécómocomportarmeenlascosasdelasincronización...Aunnivelalto,diríaqueprobablementedeberíaserinclusouncontadorinternoquehagaunseguimientodecuándoestántodoslosbits.siendoprocesado.Peronoestoysegurodesiestaeslaformacorrectaderealizarestediseño,megustaríaestarlomáscercaposibledeldiagramaquepubliqué.

¿Algunasugerenciaparaundiseñotansimple?

Actualizar...

Bueno,aquítengomiprimerintentodediseño...Medividíentresprocesos,elprimerprocesoparamanejarlosregistrosdeentrada,elsegundoparamanejarelsumadorcompletoyelterceroparamanejarelregistroz,mesincronizoconunaseñalderelojycreoqueheescritounalistadesensibilidadcorrectaparacadaproceso.Lasseñalesdeentradatambiénsonclk,loadyclear.Clkeselreloj,lacargaesescribirelvalorx,yenlosregistros,mientrasqueborraresborrarlosregistrosyflipflop.Pleaaaaaaaaaasedarmecualquiercomentario!

libraryieee;useieee.std_logic_1164.all;useieee.std_logic_misc.all;useieee.numeric_std.all;entityserialAdderisgeneric(n:natural:=4);port(x:instd_logic_vector(n-1downto0);y:instd_logic_vector(n-1downto0);clk:instd_logic;load:instd_logic;clr:instd_logic;z:outstd_logic_vector(n-1downto0));endentityserialAdder;architecturearchofserialAdderissignalx_reg:std_logic_vector(n-1downto0);signaly_reg:std_logic_vector(n-1downto0);signalz_reg:std_logic_vector(n-1downto0);signalc_reg:std_logic;beginprocess(clk)is--handlingofregisters"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;
    
pregunta user8469759

1 respuesta

1

z: out std_logic_vector (n - 1 downto 0)); La salida debe ser std_logic, porque es una salida en serie

También, puede utilizar el operador + directamente a los std_logic_vectors. Solo agregue la biblioteca "ieee.std_logic_signed" Para que pueda escribir z_reg < = x + y;

si rising_edge (clk) entonces             si clr = '1' entonces - borra todos los registros y flip flop

            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;
    
respondido por el user186273

Lea otras preguntas en las etiquetas