Я моделировал интерфейс VGA на плате DE0. У меня есть следующая модель для 640х480 дисплей, который обновляет на 60Hz:VGA-интерфейс VHDL
Основная модель:
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
USE IEEE.numeric_std.ALL;
ENTITY VGA is
PORT (clk : IN std_logic; -- demo had 2 bit vector
vga_hs, vga_vs : OUT std_logic;
vga_r, vga_g, vga_b : OUT std_logic_vector(3 DOWNTO 0));
END ENTITY VGA;
ARCHITECTURE A1 OF VGA IS
SIGNAL rst, clk25 : std_logic; -- rst only resets pixel clock
BEGIN
SYNC1 : ENTITY work.sync(A1)
PORT MAP (clk25, vga_hs, vga_vs, vga_r, vga_g, vga_b);
CLK_25 : ENTITY work.PLL(rtl)
PORT MAP (clk, rst, clk25);
END ARCHITECTURE A1;
Синхронизировать модель:
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
USE IEEE.numeric_std.ALL;
ENTITY SYNC IS
PORT(
clk : IN std_logic;
h_sync, v_sync : OUT std_logic;
r, g, b : OUT std_logic_vector(3 DOWNTO 0)
);
END ENTITY SYNC;
ARCHITECTURE A1 OF SYNC IS
SIGNAL h_pos: integer RANGE 0 TO 800:=0;
SIGNAL v_pos : integer RANGE 0 TO 520:=0;
BEGIN
TIMING :PROCESS(clk) IS
BEGIN
IF rising_edge(clk) THEN
IF (h_pos = 480 or v_pos = 280) THEN -- middle of the screen is pic res/2 + (FP + sync + BP)
r <= (OTHERS => '1');
g <= (OTHERS => '1');
b <= (OTHERS => '1');
ELSE
r <= (OTHERS => '0');
g <= (OTHERS => '0');
b <= (OTHERS => '0');
END IF;
IF (h_pos < 800) THEN
h_pos <= h_pos + 1;
ELSE
h_pos <= 1;
IF (v_pos < 520) THEN
v_pos <= v_pos + 1;
ELSE
v_pos <= 1;
END IF;
END IF;
IF (h_pos > 16 and h_pos < 112) THEN -- H_POS between end of FP and the end of H_SYNC
h_sync <= '0'; -- H_SYNC needs to stay low during display
ELSE
h_sync <= '1';
END IF;
IF (v_pos > 8 and v_pos < 10) THEN --V_POS between end of FP and the end of V_SYNC
v_sync <= '0'; -- V_SYNC needs to stay low during display
ELSE
v_sync <= '1';
END IF;
IF ((h_pos > 0 and h_pos < 160) or (v_pos > 0 and v_pos < 40)) THEN--During all of SYNC i.e FP + SYNC + BP colour signals stay low
r <= (OTHERS => '0');
g <= (OTHERS => '0');
b <= (OTHERS => '0');
END IF;
END IF;
END PROCESS TIMING;
END ARCHITECTURE A1;
----------Amendments made to model 09/02 13:42----------
Другой прямой Инстанциация для PLL генерируется из Quartus II так ли кажется, хорошо работает .. спасибо г-н Zilmer :). Модель отлично компилируется. Я загружаю его в DE0. Затем подключите его к монитору и ничего не получите на дисплее. Он должен отображать крест в центре экрана. Дисплей, который я использую, - это Samsung с разрешением 1920x1080. Это остановит мою модель от отображения чего-нибудь? Или я допустил явную ошибку в своей модели. Я изменил некоторые стандартные временные значения, чтобы соответствовать обновлению на 60 Гц с 25Mz clk. Спасибо D
Просьба предоставить тестовый стенд для объекта SYNC, чтобы можно было легко проверить время! Я думаю, что этот вопрос следует задать по электротехнике. –
Привет, Martin, я обновил модель с несколькими изменениями целых значений для h_pos и v_pos. Это видно из модели. Кроме того, и самое главное изменение в выражении IF (я никогда не знал, что вы можете вложить инструкцию IF, добавляющую инструкцию ELSE!) Ну, модель компилируется, и на этот раз я получаю свой samsung 1920x1080, чтобы сказать мне, что это не оптимальный режим! ... Когда я пытаюсь моделировать модель в ModSim, опция имитации моего VGA-файла не является тем, что там есть файл, но значок расширения отсутствует. Надеюсь, это имеет смысл, и спасибо за ответ. – hoboBob
. Пожалуйста, проверьте данные вашего монитора, чтобы проверить, поддерживается ли ваш видеорежим. –