Mal diseño del registro de desplazamiento

0

He intentado hacer un registro de turno por mi cuenta. La sintaxis es correcta, pero no estoy seguro de si esto podría ser un buen diseño ... comenté las afirmaciones que me preocupan ...

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

    entity ShiftRegister is
    generic(n : natural := 8);
    port(x : in std_logic_vector(n - 1 downto 0);
         clk : in std_logic;
     shift : in std_logic;
     w : in std_logic;
         y : out std_logic_vector(n - 1 downto 0));
end entity ShiftRegister;

architecture arch of ShiftRegister is
    signal y_int : std_logic_vector(n - 1 downto 0);
begin
    process(clk)
    begin
    if rising_edge(clk) then
        if w = '1' then
            y_int <= x;
        elsif shift = '1' then
            y_int(n - 2 downto 0) <= y_int(n - 1 downto 1);
            y_int(n - 1) <= '0';
        end if;
    end if;
    y <= y_int; 
    end process;
end architecture arch;
    
pregunta user8469759

1 respuesta

1

Tienes razón: no puedes leer desde un puerto out en VHDL.

Debe crear una variable interna que use para la lógica y luego asignar su valor al puerto de salida:

architecture arch of ShiftRegister is
    signal y_int : std_logic_vector(n - 1 downto 0);
begin
    process (clk)
    begin
        if rising_edge(clk) then
            if w = '1' then
                y_int <= x;
            else if shift = '1' then
                y_int(n - 2 downto 0) <= y_int(n - 1 downto 1);
                y_int(n - 1) <= '0';
            end if;
        end if;
    end process;

    y <= y_int;
end architecture arch;
    
respondido por el Dave Tweed

Lea otras preguntas en las etiquetas