Cómo asegurarse de que una operación cronometrada ocurra solo una vez en Vhdl

0

el título puede ser un poco confuso, pero lo que trato de hacer es tomar los datos del ram / modificarlos y volver a colocar esos datos en el ram. Quiero que todo esto suceda solo durante el tiempo de operación (Brillo / Contraste) cuando habilito el sistema en lugar de pasar una y otra vez hasta el punto en que los datos se deforman. Aquí está el código. Quiero que write_enable (que permite escribir en RAM) permanezca en 1 solo por el tiempo de operación (en una ventana a la que llamo cursor) y luego vuelva a 0, incluso si la habilitación es 1. Este es un procesamiento de imágenes y cambio el brillo y el contraste De la imagen en una ventana que llamo cursor. Este cambio debe ocurrir para todos los píxeles dentro del cursor solo una vez. Probé muchas cosas (mecanismo de control complejo) pero fallé debido al problema de eliminación de elementos no utilizados de vivado. No tengo ninguna idea de cómo hacerlo. ¿Cómo puedo construir tal mecanismo de control? Pongo recomendaciones (desde aquí / hasta aquí) para mostrar dónde ocurre este problema.

rst is input
clk and clk2 are different clock signals
done is signal
data_in_ram is ram input
output_of_operation is output of change of Brightness or contrast operation
data_rom is output of rom
PICTURE_WIDTH_HEIGHT is length of my square picture (250*250)
pos_x and pos_y are signals that denote pixel coordinates
cursor_pos_x and cursor_pos_y are upper-left coordinate of the window or cursor
length is length of the square window or cursor
clk is 25Mhz
clk2 is 50Mhz. this is chosen 50 due to ram's read latency(2 clock cycle)

El ram y la rom a continuación se construyen utilizando un generador de memoria de bloques.

Reading_Writing_Resetting_Ram: process(clk2,clk,rst) is
begin

    if rst = '1' then    
      done <= '0';
    elsif rising_edge(clk) then    
        if done = '0' then
            if address_rom < conv_std_logic_vector((PICTURE_WIDTH_HEIGHT*PICTURE_WIDTH_HEIGHT),16) then
                write_enable <= '1';
                data_in_ram <= data_rom;
                address_ram <= address_rom;
                address_rom <= address_rom + 1;
            else
                address_rom <= (others => '0');
                write_enable <= '0';
                done <= '1';
            end if;
            -------------------------------------part above is for resetting ram
        else --if done = '1' --From here    
            if ( pos_x >= cursor_pos_x ) and (pos_x < cursor_pos_x + length) and ( pos_y >= cursor_pos_y) and (pos_y < cursor_pos_y + length) then --if within cursor

                address_ram <=(conv_std_logic_vector((pos_x + pos_y*PICTURE_WIDTH_HEIGHT),16));
                data_in_ram <= output_of_operation;   

                if enable = '1' then    
                    write_enable <= '1';
                else    
                    write_enable <= '0';    
                end if; -- enable    
            else --if out of cursor -- to here
                -------------------------- part below is for reading from ram
                write_enable <= '0';

                if (pos_x < PICTURE_WIDTH_HEIGHT) and (pos_y <PICTURE_WIDTH_HEIGHT) and (pos_x >= 0) and (pos_y >= 0) then -- if within picture

                    address_ram <=(conv_std_logic_vector((pos_x + pos_y*PICTURE_WIDTH_HEIGHT),16));

                end if; 
            end if; 
        end if; 
    end if;    
end process;

Este código a continuación se usa para la segunda condición de write_enable pero vivado elimina estos componentes.

Adjusting_enable2: process(rst,clk,cursor_pos_x,cursor_pos_y,enable,cursor_mode,current_cursor_mode,c_cursor_pos_x,c_cursor_pos_y) is
begin
if (rst = '1') or (cursor_mode /= current_cursor_mode) or (c_cursor_pos_x /= cursor_pos_x) or (c_cursor_pos_y /= cursor_pos_y)  then

enable2 <= '1';
c_cursor_pos_x <= cursor_pos_x;
c_cursor_pos_y <= cursor_pos_y;
counter_for_enable2 <= 0;

elsif rising_edge(clk) then

if enable ='1' then

if counter_for_enable2 < PICTURE_WIDTH_HEIGHT*PICTURE_WIDTH_HEIGHT then

counter_for_enable2 <= counter_for_enable2 + 1;

else

enable2 <= '0';

end if;
end if;
end if;
end process;
    
pregunta runo

1 respuesta

0

Suponiendo que no haya (?) ... Creo que debería dibujar su diseño antes de escribir, obtendrá mucho más de la experiencia y sufrirá menos problemas como los que ha estado publicando ... no obstante, declaró :

  

Quiero que write_enable (que permite escribir en RAM) permanezca en 1 solo por el tiempo de operación (en una ventana a la que llamo cursor) y luego vuelva a 0 incluso si habilitar es 1

No estoy seguro de si soluciona tu problema general, pero en base a esta oración, se traduce en el cursor y habilitación AND'ing.

combinatoria: write_enable = cursor and enable;

dentro de un proceso cronometrado: write_enable <= cursor and enable;

    
respondido por el CapnJJ

Lea otras preguntas en las etiquetas