Spartan 3E kartı için VGA denetleyicisi için VHDL kodu yazdım. Kod, aşağıdaki kodda sıfırlama ve clk işlemi olmaksızın iyi çalışır ve çalışır. Ancak işlemi (reset, clk) ekledikten sonra h_count ve v_count sayaçlarının sayımını durdurur ve simülasyonda undefined olan XXXXX'e sürülür. Nerede yanlış gidiyorum. Kod, clk olmadan mükemmel bir şekilde çalışır, sıfırlama işlemi (kalın olarak yorumlanmıştır), ayrıca koddaki yazılımları da test ettim.VHDL: CLK ve RESET işlemi nasıl kullanılır?
VGA Denetleyicisi
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity vga_controller is
port(clk : inout std_logic;
clk_50 : in std_logic;
hsync, vsync : out std_logic;
video_on : out std_logic;
x_pos, y_pos : out std_logic_vector(9 downto 0);
sw : in std_logic_vector(2 downto 0) := "100";
rgb : out std_logic_vector(2 downto 0)
);
end vga_controller;
architecture Behavioral of vga_controller is
signal h_count, v_count : unsigned(9 downto 0) := (others => '0');
begin
-- Frequency divider to get 25 MHz clk from 50 MHz clock of Spartan 3E **
freq_dividr : entity work.t_ff port map(clk_50, clk);
-- If i remove this process everyting works fine. Why ????**
process(clk, reset)
begin
if reset = '1' then
h_count <= (others => '0');
v_count <= (others => '0');
video_on <= '0';
elsif clk'event and clk = '1' then
h_count <= h_count;
v_count <= v_count;
end if;
end process;
process(clk) -- Process for horizontal counter
begin
if clk'event and clk = '1' then
if h_count = 799 then
h_count <= (others => '0');
else
h_count <= h_count + 1;
end if;
end if;
end process;
process(clk) -- Process for vertical counter
begin
if clk'event and clk = '1' and h_count = 799 then
if v_count = 524 and h_count = 799 then
v_count <= (others => '0');
else
v_count <= v_count + 1;
end if;
end if;
end process;
hsync <= '0' when (h_count >= 656 and h_count <= 751) else '1';
vsync <= '0' when (v_count >= 490 and v_count <= 491) else '1';
video_on <= '1' when (h_count <= 649 and v_count <= 479) else '0';
rgb <= sw when (h_count <= 649 and v_count <= 479) else "000";
x_pos <= std_logic_vector(h_count);
y_pos <= std_logic_vector(v_count);
end Behavioral;
Lütfen kodunuzu yeniden biçimlendirebilir misiniz, bu yüzden diğer tüm satırları alamadı mı? Ve girintileri olması gerektiği şekilde yerleştirin! –