Enteros a distancia o sin rango en VHDL

4

Mi propósito es almacenar valores de 0 a 3. Desde el punto de vista de la síntesis, ¿cuál de los siguientes será más eficiente en el área cuando se codifica en VHDL?

  1. señal a: entero;
  2. señal a: rango entero 0 a 3;

¿La primera opción ocupa un registro de 32 bits dentro de FPGA?

    
pregunta MITU RAJ

1 respuesta

5

Depende, pero casi siempre es preferible especificar el rango.

Para ilustrar, considera este ejemplo:

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

entity naturals is 
    Port ( clk    : in  std_logic;
           rst    : in  std_logic;
           count  : out std_logic_vector(2 downto 0));
end naturals;

architecture behavioral of naturals is
    signal count_intern : natural := 0;
begin
    count <= std_logic_vector(to_unsigned(count_intern, count'length));
    process(clk)
    begin
        if (rising_edge(clk)) then
            if (rst = '1') then
                count_intern <= 0;
            elsif (count_intern = 5) then
                count_intern <= 0;
            else
                count_intern <= count_intern + 1;
            end if;
        end if;
    end process;
end behavioral;

Este es un contador simple que va de 0 a 5. Su simulación se ve así:

Sinembargo,nolimitélaseñalcount_intern,porloqueinternamenteesde31bits(losenterossonde32bits,losnaturalesson31).Aunqueenrealidadsolousolos3bitsmásbajos,los31terminanenlasoperacionesdesumaycomparación.¿Porqué?Porqueenelinicio,elvalorinicialdecount_internnoestádefinido.Porejemplo,podríacomenzarconunvalorde7,momentoenelqueelcontadoraumentaráhastaquelos31bitssellenenysedesbordena0.Lainicialización(a0)queproporcionéenElcódigo,soloseaplicaalasimulación,esignoradoporelsintetizador.

Elesquemadepost-síntesis,porlotanto,seveasí:

Medoycuentadequelaimagenesdemasiadograndeparadistinguirsusdetalles,peroeseeselpunto.Esundesastre;yparauncircuitomuysencillo.

Ahora,vamosareemplazarlalíneaúnica:

  

señalcount_intern:natural:=0;

con

  

señalcount_intern:rangonatural0a5:=0;


Sinprueba,lasimulaciónesexactamentelamisma.Sinembargo,elesquemadepost-síntesisahoraseresuelveen:

Dehecho,losresultadosdeestosepuedenconfirmarinclusodespuésdelaimplementación,donderealmentecuenta:

Sinlimitarelrangonatural:

Conlímitederango:

Note la diferencia en los flip-flops utilizados.

Aunque utilicé los productos naturales aquí, esto (por supuesto) se extiende también a los enteros.

Los resultados de la implementación pueden variar. Aquí estoy usando la configuración predeterminada en Vivado 2015. De cualquier manera, el punto es: es más seguro y preferible especificar siempre el rango.

    
respondido por el Blair Fonville

Lea otras preguntas en las etiquetas