VHDL – Incremento con uno (unsigned)

Estoy tratando de hacer un código que se incrementará el entrante bits con uno. Quiero usar dos segmentos de código de estilo, pero el problema aquí es que los bits no llegar a la salida. Alguna idea? Gracias!

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.numeric_std.ALL;


entity increment1 is
    port(
        from_ASMD_State_reg : in std_logic_vector(7 downto 0);
        reset, clk : in std_logic;
        to_mux : out std_logic_vector(7 downto 0)
    );
end increment1;

architecture Behavioral of increment1 is
--signal count : unsigned(7 downto 0);
signal r_reg : unsigned(7 downto 0);
signal r_next : unsigned(7 downto 0);
begin
process(clk, reset)
begin
    if(reset = '1') then
        to_mux <= (others => '0');
    elsif(clk'event and clk = '1') then
        r_reg <= r_next;
    end if;
end process;

r_next <= r_reg + 1;

to_mux <= std_logic_vector(r_reg);

end Behavioral;

Después de algunos ajustes en el código, parece que ahora funciona!

architecture Behavioral of increment1 is
signal r_reg : unsigned(7 downto 0);
signal r_inc : unsigned(7 downto 0);
begin
process(clk, reset, r_reg)
begin
    r_reg <= unsigned(from_ASMD_State_reg);

    if(reset = '1') then
        r_reg <= (others => '0');
    elsif(clk'event and clk = '1') then
        r_reg <= r_inc;
    end if;
end process;

r_inc <= r_reg + 1;

to_mux <= std_logic_vector(r_inc);

end Behavioral;
  • El from_ASMD_State_reg no se utiliza en el módulo, por lo que si es que la entrada al incremento, a continuación, utilizarlo para empezar. También, tenga en cuenta que to_mux es impulsadas en el proceso, y fuera del proceso, y tal múltiples controladores no puede sintetizar, y es probable que se generen X en la simulación; la intención es, probablemente, la unidad de r_reg en el proceso. Por último, se puede hacer sin r_next si r_reg + 1 se utiliza directamente en el proceso de expresión.
  • Gracias por la respuesta. Sólo me preguntaba cómo debo usar from_ASMD_State_reg para empezar? Debería establecer el r_reg a from_ASMD_State_reg? Y donde debo hacerlo? 🙂
  • Realmente depende de la funcionalidad que se desea implementar, asi que para empezar a hacer una especificación por ejemplo, una tabla, que muestra la salida que se espera para los diferentes valores de entrada, y en ese proceso es probable que usted entiende lo que la funcionalidad debe implementar en el diseño.
  • Hice algunos cambios, y pega el código a mi post. Puede usted por favor, eche un vistazo a mi código y ver si todavía tengo algo estúpido en mi código? 🙂
  • Usted probablemente no debería ser la asignación a r_reg dentro del proceso, pero fuera de la if bloque.
InformationsquelleAutor user2466860 | 2014-11-12

2 Kommentare

  1. 2

    su código actualizado es casi correcto, pero no del todo. Si todo lo que quiero hacer es incrementar y registrar un valor, todo lo que necesitas es este:

    architecture Behavioral of increment1 is
    begin
    
      r_inc <= unsigned(from_ASMD_State_reg) + 1;
    
      process (clk, reset)
      begin
        if(reset = '1') then
            r_reg <= (others => '0');
        elsif(clk'event and clk = '1') then
            r_reg <= r_inc;
        end if;
      end process;
    
      to_mux <= std_logic_vector(r_reg);
    
    end Behavioral;

    (nota: editado el anterior para fijar una asignación de error y reordenar las instrucciones para hacer el deseado «de dos segmentos de estilo» más obvio)

    Son usted seguro de que «funciona» con la asignación a r_reg dentro de su proceso, pero fuera de si el bloque? Han tratado de sintetizar, o sólo simular?

    Optimizaciones:

    • Usted puede deshacerse de r_inc poniendo el incremento de la declaración directamente en el r_reg asignación en el proceso.
    • Usted puede deshacerse de r_reg por su sustitución por to_mux en el proceso y el encasillamiento.

    Usted no necesita todos los intermedios de las señales para esta operación. Si usted necesita de ellos para otras funciones que desea agregar, siéntase libre de mantenerlos, pero tenga en cuenta que los puertos pueden ser utilizados en estas operaciones, no hay necesidad de asignar a otra señal.

    La versión simplificada de la asignación en su proceso sería:

    to_mux <= std_logic_vector(unsigned(from_ASMD_State_reg) + 1);

    Es apenas vale la pena hacer un componente separado para hacer esto, pero usted puede, por supuesto.

    • +1 para los últimos 3 líneas
    • Muchas gracias! Mantener el buen trabajo 🙂
  2. 0

    Cuando se crea un flip-flop (para almacenar un valor) poner sólo se restablece y el reloj en la sensibilidad a la lista:

    process(clk, reset)
    begin
    
        if(reset = '1') then
           r_reg <= (others => '0');
        elsif(clk'event and clk = '1') then
           r_reg <= r_inc;
        end if;
    end process;

    Si from_ASMD_State_reg toma su valor cuando se restablece es 1, se puede insertar directamente como valor de reset:

    process(clk, reset)
    begin
    
        if(reset = '1') then
           r_reg <= unsigned(from_ASMD_State_reg);
        elsif(clk'event and clk = '1') then
           r_reg <= r_inc;
        end if;
    end process;

    De lo contrario, usted tiene que escribir de otra manera. Antes de que usted necesita saber cuando se va fuera de reset:Se puede escribir de modo que sólo si el from_ASMD_State_reg de la señal no se restablece por la señal de reset.
    r_reg <=

    signal finish_reset    : std_logic;
    signal finish_reset_d  : std_logic;
    
    process(clk, reset)
    begin
    
        if (reset = '1') then
           finish_reset   <= '0';
           finish_reset_d <= '0';
        elsif (clk'event and (clk = '1')) then
           finish_reset_d <= finish_reset;
           finish_reset   <= '1';
        end if;
    
    end process;

    y, a continuación, utilizar esta nueva señal para inicializar el contador:

     process(clk, reset)
     begin
    
         if (reset = '1') then
            r_reg <= (others => '0');
         elsif (clk'event and (clk = '1')) then
    
             if ((finish_reset = '1') and (finish_reset_d = '0')) then
                r_reg <= unsigned(from_ASMD_State_reg);
             else
                r_reg <= r_inc;
             end if;
    
         end if;
    
     end process;

    Donde r_inc es cómo se escribió:

    r_inc <= r_reg + 1;
    
    to_mux <= std_logic_vector(r_inc);

    Una última cosa: normalmente, el reset se activa baja (restablece cuando reset = ‘0’ y no, cuando es ‘1’).

    • +1, aunque me gusta lógica positiva para reset 🙂
    • Esto es demasiado complejo, y parece poco probable a lograr el objetivo de la pregunta. ¿Por qué te carga r_reg sólo inmediatamente después de reiniciar?
    • Me carga r_reg después de reiniciar, porque normalmente todas las señales de reset durante el reinicio, a continuación, normalmente también from_ASMD_State_reg la pérdida de su valor. Esta estructura es el incremento de la de 1 de cada pulso (cómo en el código original). Por supuesto, si acabo de volver de +1 una vez que es posible simplificar mucho.
    • El código original fue muy claro, así que se deduce de la redacción de la pregunta («incremento de la entrantes bits con uno») que el objetivo era solo un simple incremento. Tal vez el OP puede ofrecer algunas aclaraciones.
    • Si sólo necesita para incrementar la vez, el flip-flop con r_reg no es útil debido a que nunca se lee. Al hacerlo, la arquitectura se puede simplificar a una sola línea: to_mux <= std_logic_vector(unsigned(from_ASMD_State_reg) + 1);
    • Muy agradecido por la explicación! 🙂

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea