Problemas al ejecutar el código Picoblaze

2

Estoy ejecutando un código picoblaze simple donde estoy usando dos direcciones y enviando un estroboscopio alto en ambas direcciones, el código de ensamblaje no tiene bucle, por lo que técnicamente mi código debería ejecutarse SOLAMENTE una vez, pero la señal alta en las direcciones que Estoy usando viene continuamente. Utilicé un osciloscopio para comprobar la salida. Estoy publicando la lógica de pegamento y el código pico. Estoy usando una placa fpga Spartan3 Xc3s1000-4fg456.

¿Alguien aquí tiene alguna idea de lo que estoy haciendo mal aquí? Aquí está el código pico

;**************************************************************************************
; OUT Port definition
;**************************************************************************************
CONSTANT sx1,           16
CONSTANT sx2,           20
;**************************************************************************************
; Special Register usage
;***********************************************************************************
NAMEREG SE,     TEMP1
NAMEREG SD,     TEMP2

OUTPUT  TEMP1,      sx1
OUTPUT  TEMP2,      sx2

Y el código vhdl para la lógica del pegamento es

 library IEEE;
 use IEEE.STD_LOGIC_1164.ALL;
 use IEEE.NUMERIC_STD.ALL;


entity Glue_Logic is
PORT    (
        CLK         :IN         STD_LOGIC;
        RESET       :IN         STD_LOGIC;
        DATA_IN_P   :IN         STD_LOGIC_VECTOR(7 DOWNTO 0);
        PORT_ADDR   :IN         STD_LOGIC_VECTOR(7 DOWNTO 0);

        PORT_OUT1   :OUT        STD_LOGIC_VECTOR(7 DOWNTO 0);
        PORT_OUT2   :OUT        STD_LOGIC_VECTOR(7 DOWNTO 0)
        );
end Glue_Logic;

architecture Behavioral of Glue_Logic is

signal port_out1_s          :STD_LOGIC_VECTOR   (7 downto 0);
signal port_out2_s          :STD_LOGIC_VECTOR   (7 downto 0);

begin

                            PORT_OUT1   <= port_out1_s; 
                            PORT_OUT2   <= port_out2_s; 

process(reset, clk)

begin
    if (reset = '1') then
        port_out1_s                 <= (others => '0');
        port_out2_s                 <= (others => '0');

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

        case (port_addr) is

            when x"16"          =>

                port_out2_s             <=      x"01";

            when x"20"          =>

                port_out1_s             <=      x"01";

            when others     =>

                port_out1_s             <= (others => '0');
                port_out2_s             <= (others => '0');


            end case;
end if;
end process;
end Behavioral;
    
pregunta alexhilton

1 respuesta

1

El problema es que su programa realmente no termina. Después de que hayas ejecutado tus dos instrucciones, el picoblaze continuará ejecutándose. Eventualmente, el puntero de instrucción se sobrepasará y su programa se reiniciará desde la dirección cero.

Necesitas una forma de detener tu picoblaze. Puede hacer esto agregando lógica adicional a la puerta del reloj o poniendo un bucle sin fin al final de su código como este:

;**************************************************************************************
; OUT Port definition
;**************************************************************************************
    CONSTANT sx1,           16
    CONSTANT sx2,           20
;**************************************************************************************
; Special Register usage
;***********************************************************************************
    NAMEREG SE,     TEMP1
    NAMEREG SD,     TEMP2

    OUTPUT  TEMP1,      sx1
    OUTPUT  TEMP2,      sx2

End:
    JUMP    End
    
respondido por el Nils Pipenbrinck

Lea otras preguntas en las etiquetas