Seleccione uno de los dos espacios de registro en VHDL

0

Quiero crear un sistema que consta de dos espacios de registro (A y B, consulte la figura a continuación). El propósito es permitir el cambio instantáneo de configuración. Cuando S = 0, los registros en A se seleccionarán para escritura (nueva configuración), y los registros en B se seleccionarán para lectura (configuración en ejecución). Cuando S = 1, lo contrario es cierto.

            +
            |
            |
    +-------v--------+ not(S)
    |  WRITE SELECT  <---+
    +----------------+
       |0        |1
       |         |
     +-v-+     +-v-+
     |   |     |   |
     | A |     | B |
     |   |     |   |
     +-+-+     +-+-+
       |         |
       |         |
    +--v---------v---+ S
    |  READ  SELECT  <---+
    +-------+--------+
            |
            |OUT
            v

Mi pregunta es sobre cómo codificar la selección de lectura en VHDL. Suponiendo un solo registro de configuración:

signal S : integer range 0 to 1;
type slv_ary_t is array (integer range <>) of standard_logic_vector(31 downto 0);
signal reg_space : slv_ary_t(1 downto 0)
signal OUT : standard_logic_vector(31 downto 0);

begin
-- What is the difference between this:
OUT <= reg_space(S);
-- and this
OUT <= reg_space(0) when S=0 else reg_space(1);

Mi entendimiento ahora es que esto resultará en el mismo hardware después de la síntesis. ¿Es eso correcto?

    
pregunta aproxp

2 respuestas

0

Sí , las dos afirmaciones son equivalentes.

Aquí está la prueba:

Considera este código

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

entity reg_select is
    Port ( clk : in  std_logic;
           sel : in  integer range 0 to 1;
           d   : in  std_logic_vector(31 downto 0);
           eq  : out std_logic );
end reg_select;

architecture behavioral of reg_select is

    type slv_ary_t is array (0 to 1) of std_logic_vector(31 downto 0);
    signal reg_space : slv_ary_t;

    signal qa : std_logic_vector(31 downto 0);
    signal qb : std_logic_vector(31 downto 0);
begin

    -- Write
    process(clk)
    begin
        if rising_edge(clk) then
            case sel is
                when 0 => reg_space(1) <= d;
                when 1 => reg_space(0) <= d;
            end case;
        end if;
    end process;

    -- Read
    qa <= reg_space(sel);
    qb <= reg_space(0) when sel=0 else reg_space(1);

    -- Compare
    eq <= '1' when qa=qb else '0';

end behavioral;

Aquí usamos qa y qb para mantener las dos declaraciones leídas. Luego, la señal eq se establece si son equivalentes.

Sin síntesis, el esquema RTL se ve así: Laseñaldeentradaselseleccionalosregistrosdelectura/escrituraapropiados,ylaslecturasdesalidasecomparan.Sinembargo,siobservaconatención,puedeverinmediatamentequelasseleccionesqayqbsonequivalentes.

Comopruebaadicional,miraloquesucededespuésdelasíntesis: Elsintetizadoreliminatodaslasseñalesdeentrada,yaquesevuelvenirrelevantes,ylasalidasefuerzaa1(enunaimplementaciónextrañadeCARRY4).Enotraspalabras,laherramientadesíntesisidentificaquelasalidaeqnorequiereningunadelasentradas,yaqueeqserá1independientementedelosvaloresdeentrada(comosemuestraenelsim):

Nota, tienes un error tipográfico en tu código: standard_logic_vector debería ser std_logic_vector

    
respondido por el Blair Fonville
0

Ambas variantes consumirán la misma cantidad de lógica, aunque el sintetizador puede enrutarlas de manera diferente.

    
respondido por el Humpawumpa

Lea otras preguntas en las etiquetas