나는 스파르탄 3E 보드 용 VGA 컨트롤러 용 VHDL 코드를 작성했습니다. 이 코드는 아래 코드에서 리셋 및 clk 프로세스없이 원활하게 시뮬레이션되고 작동합니다. 그러나 프로세스 (reset, clk)를 삽입 한 후 h_count 및 v_count 카운터는 계산을 중지하고 시뮬레이션에서 정의되지 않은 XXXXX로 구동됩니다. 나는 어디로 잘못 가고있어. 이 코드는 clk, reset 프로세스 (굵게 표시된 주석 처리)없이 완벽하게 작동합니다. 또한 코드를 harware에서도 테스트했습니다.VHDL : 과정에서 CLK 및 RESET 사용 방법
VGA 컨트롤러
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;
코드를 다시 포맷하여 다른 모든 라인이 일치하지 않도록 할 수 있습니까? 들여 쓰기를해야합니다! –