Estoy reescribiendo un controlador VGA en (espero) una mejor manera; Tengo una señal "en blanco" lo que significa que el píxel actual está fuera del área visible, y tengo la sensación de que sería mejor dividir esa señal fuera del proceso de "procesamiento de píxeles" (¿condiciones de carrera?).
Estoy intentando traducir algo como esto:
-- Horizontal procedure:
h_proc : process(pix_clk)
begin
if(rising_edge(pix_clk)) then
-- counts the pixel clocks
h_cnt <= h_cnt + 1;
-- updates the blank signal (whether in visible area or not)
if(h_cnt <= HRES and v_cnt <= VRES) then
blank <= false;
-- generates synchronisation signals
else
blank <= true;
if(h_cnt > HRES+HFP and h_cnt < HRES+HFP+HSP) then
h_sync <= '0';
else
h_sync <= '1';
end if;
end if;
end if;
end process;
En esto:
blank <= false when h_cnt <= HRES and v_cnt <= VRES, else false;
-- And while I'm at it
h_sync <= '0' when h_cnt > HRES+HFP and h_cnt < HRES+HFP+HSP, else '1';
Pero acabo con un error de sintaxis. ¿No hay alguna forma de derivar la prueba en desigualdades tales como mayor o menor que fuera de los procesos?
Código modificado Dentro de la arquitectura:
-- blank is true outside of the visible area (where synchronisation pulses are sent and black is needed)
blank <= false when h_cnt <= HRES and v_cnt <= VRES else true;
-- Address of the pixel (block of memory containing the color of the pixel)
buffer_addr <= std_logic_vector(to_unsigned(h_cnt+v_cnt*HRES, buffer_addr'length))
when blank = false else (others => '0');
-- Colors returned correspond to the aimed pixel, but black if out of the visible area
R <= buffer_data(RDEPTH+GDEPTH+BDEPTH-1 downto GDEPTH+BDEPTH) when blank = false else (others => '0');
G <= buffer_data(GDEPTH+BDEPTH-1 downto BDEPTH) when blank = false else (others => '0');
B <= buffer_data(BDEPTH-1 downto 0) when blank = false else (others => '0');
-- Synchronisation pulses
h_sync <= '0' when h_cnt > HRES+HFP and h_cnt < HRES+HFP+HSP else '1';
v_sync <= '0' when v_cnt > VRES+VFP and v_cnt < VRES+VFP+VSP else '1';
-- Counter update procedure:
h_proc : process(pix_clk)
begin
if(rising_edge(pix_clk)) then
-- counts the pixel clocks, update the line counts and reset the counters when appropriate
if(h_cnt = HRES+HFP+HSP+HBP) then
h_cnt <= 0;
if(v_cnt = VRES+VFP+VSP+VBP) then
v_cnt <= 0;
else
v_cnt <= v_cnt + 1;
end if;
else
h_cnt <= h_cnt + 1;
end if;
end if;
end process;