registro de desplazamiento universal

1

Estoy diseñando un registro de desplazamiento universal de 4 bits en VHDL.

También estoy usando el software Xilinx para simular el código VHDL.

Me las arreglé para escribir el código que, al revisarlo un par de veces, parece que no tiene errores (entiendo que a veces el código puede compilarse con éxito, pero de hecho habría algunos problemas que no son tan obvios).

el código:

entity USR is
Port ( clk : in  STD_LOGIC;
       rst : in  STD_LOGIC;
       sir : in  STD_LOGIC;
       sil : in  STD_LOGIC;
       d : in  STD_LOGIC_VECTOR (3 downto 0);
       q : out  STD_LOGIC_VECTOR (3 downto 0);
       s : in  STD_LOGIC_VECTOR (1 downto 0));
end USR;

architecture Behavioral of USR is
signal temp: std_logic_vector(3 downto 0);

begin
process(rst,clk,s,d,sir,sil)

    begin

    if rst='1' then
    temp<= "0000";
    q<= "0000";

    elsif (clk='1' and clk'event) then

        case s is
        -- PARALLEL LOAD 
        when "11" =>
        temp <= d;
        q <= temp;

        -- SHIFT LEFT       [0] [0] [0] [0]
        --                  [0] [0] [0] [sil]
        when "01" =>
        temp <= d;
        temp(3 downto 1) <= temp(2 downto 0);
        temp(0) <= sil;
        q <= temp;

        -- SHIFT RIGHT      [0] [0] [0] [0]
        --                [sir] [0] [0] [0]
        when "10" => 
        temp <= d;
        temp(2 downto 0) <= temp(3 downto 1);
        temp(3) <= sir;
        q <= temp;

        -- HOLD
        when "00" =>
        temp <= temp;
        q <= temp;

        when others => null;

        end case;
    end if;
end process;    

end Behavioral;

Intenté ejecutar esto en el simulador ISE de Xilinx, pero cuando simulo la forma de onda, parece que no hay cambios en las salidas.

Comomuestralaimagenanterior,cuandos="11", las salidas q deberían ser las mismas que las entradas d como

when "11" =>
temp <= d;
q <= temp;

Por lo tanto, la temperatura de la señal se asigna con la entrada dy luego a la salida q se le asigna la temperatura de la señal.

Teóricamente, algo como esto debería mostrar que las salidas q son las mismas que la entrada d

No puedo encontrar una solución para esto o afecta a todos los modos (s = 00, 01, 10, 11) que no muestran cambios en la salida.

¿Hay algo que me perdí?

    
pregunta Kuroro

2 respuestas

1

Solo probé tu código SIN CAMBIAR y para mí funciona.

Utilizando Xilinx Vivado 2017.2.

    
respondido por el Oldfart
1

Lo verifiqué en modelsim 6.5, 10.4 y iSim 14.7. Dio las formas de onda esperadas según su código. Así que parece que es un problema de simulador aquí o un error en la forma en que simulaste este diseño. Tu simulador nunca entra en tu bloque de reloj. Compruebe rising_edge (clk) en lugar de clk = 1 clk'event. Hay problemas conocidos entre estos dos constructos en algunos simuladores. También intente utilizar otros simuladores.

Sin embargo, tengo algunas sugerencias en su código.

1) El proceso solo necesita clk y rst en la lista confidencial, ya que el resto son señales síncronas según su código.

2)

  

temp < = d;

     

q < = temp;

"En teoría, algo como esto debería mostrar que las salidas q son las mismas que las de la entrada d"

Si tu intención es esa, entonces NO . Esto no es c / c ++. En VHDL, esto se llama programación de señales. Cuando escriba este fragmento de código, se deducirán dos flip-flops conectados espalda con espalda. Uno para temp y otro para Q. Si temp se actualiza en un borde de reloj con el valor de D. ESTA VALOR de temp se captura SOLAMENTE en el siguiente borde mediante el flip-flop para QIe, el valor de temp se asigna a Q solo en el siguiente borde del reloj.

3)

  

temp < = temp

Esto es innecesario y no tiene significado. Usted puede dejar de lado. El valor de Cz temp ya está retenido por el flip-flop.

    
respondido por el MITU RAJ

Lea otras preguntas en las etiquetas