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;