costo entero de VHDL a conversión sin firma

0

El siguiente fragmento de código muestra una manipulación de variables de dos pasos:

1) Convierta un número entero en un número sin signo

2) Convierta un número sin signo en un std_logic_vector y extraiga un cierto número de bits superiores.

¿Podrían estos dos pasos consolidarse en uno solo? Es decir, ¿se trata simplemente de encasillamiento (conexiones de cable) o se trata de algún tipo de circuito temporizado que podría dar lugar a un problema?

signal integrator_inter_uns :  unsigned(20 downto 0):= (others => '0'); 

...
...

counter : process(CLK)
begin
 if clk'event and clk = '1' then

   -- oveflow
    if pwm_counter = N then
        pwm_counter <= 0;

    -- 1
    elsif pwm_counter = 1 then      
        pwm_counter <= pwm_counter + 1;

        integrator_inter_uns <= to_unsigned(integrator, integrator_inter_uns'length); -- 20 bit unsigned                            

    -- 2
    elsif pwm_counter = 2 then      
        pwm_counter <= pwm_counter + 1;

        data <= std_logic_vector(integrator_inter_uns(15 downto 0));
    -- 3
    elsif pwm_counter = 3 then      
        pwm_counter <= pwm_counter + 1;

        dac_input <= data;


else 
    pwm_counter  <= pwm_counter   + 1;

 end if;

end if;
end process;
    
pregunta SunnyBoyNY

2 respuestas

2

Sí, ciertamente puedes realizar dos conversiones en una sola declaración. Se sintetizarían a cables. PERO su fragmento de código tiene un comportamiento dependiente del estado que se perdería si combinara las conversiones. Algo está sucediendo con pwm_counter sobre el que no nos has hablado. Si ese comportamiento dependiente del estado es necesario, entonces necesitará un registro para mantener el valor intermedio, integrator_inter_uns .

    
respondido por el Elliot Alderson
2

No hay nada malo con

if rising_edge(clk) then
  dac_input <= std_logic_vector(to_unsigned(integrator, integrator_inter_uns'length))(15 downto 0);
end if;

y su implementación no "costará" nada, siempre y cuando tenga en cuenta que sus datos ahora llegan al puerto dac_input dos ciclos antes y que ahora verá cada cambio en la señal / variable del integrador en lugar de cada Nth cambio. (O al menos cada valor que fue válido durante el intervalo de tiempo de mantenimiento de la configuración alrededor de cada flanco ascendente).

Si aún desea el valor de cada ciclo de Nth clock:

if rising_edge(clk) then
  if pwm_counter = 1 then
    dac_input <= std_logic_vector(to_unsigned(integrator, integrator_inter_uns'length))(15 downto 0);
  end if;

  if pwm_counter = N then
    pwm_counter := 0;
  else
    pwm_counter := pwm_counter+1;
  end if;
end if;
    
respondido por el DonFusili

Lea otras preguntas en las etiquetas