Chúng ta có thể làm một project màu mè một chút với video display, dùng Python để tạo font bitmap, và viết text hoặc load graphic lên display qua cổng RS-232. Xilinx kit ML506 sử dụng DVI, nhưng phần video horizontal / vertical sync chắc cũng không khác so với VGA interface. Có lẽ không cần thiết với VGA, nhưng chúng ta cần phải configure DVI controller qua bus I2C. Project này cần hai modules rất cơ bản, VGA / DVI timing generator, và I2C master.
Một I2C master vừa đủ xài chỉ cần 10 flip-flops, 9 SRL16 và một 8-to-1 multiplexer.
VGA / DVI timing generator rất dễ thực hiện, chỉ cần hai counter (vertical và horizontal) và một số phép so sánh để assert/de-assert sync.
Các thông số cho front-porch, back-porch, sync width / polarity, và pixel clock chúng ta có thể tìm được trên Video Control Panel (nên test xem monitor có support các thông số mà chúng ta muốn dùng hay là không).
Project này sẽ sử dụng 1024x768 resolution với refresh rate = 60 Hz.

Các thông số trên được save lại để dễ dàng hoán đổi resolution. Digital Clock Manager được sử dụng để tạo ra clock rate cần thiết (không cần thiết phải chính xác hoàn toàn). Clock đầu vào là 200MHz, cho nên để đạt được pixel clock = ~106.5MHz cho resolution 1440x900, chúng ta có thể lấy 200 / 32 * 17 như configuration bên trên.
Một I2C master vừa đủ xài chỉ cần 10 flip-flops, 9 SRL16 và một 8-to-1 multiplexer.
VGA / DVI timing generator rất dễ thực hiện, chỉ cần hai counter (vertical và horizontal) và một số phép so sánh để assert/de-assert sync.
Các thông số cho front-porch, back-porch, sync width / polarity, và pixel clock chúng ta có thể tìm được trên Video Control Panel (nên test xem monitor có support các thông số mà chúng ta muốn dùng hay là không).
Project này sẽ sử dụng 1024x768 resolution với refresh rate = 60 Hz.

Code:
type DVI_CONFIG_TYPE is record
width : integer;
h_fp : integer;
h_sync : integer;
h_bp : integer;
height : integer;
v_fp : integer;
v_sync : integer;
v_bp : integer;
h_polar : std_logic;
v_polar : std_logic;
pixel_clock : real;
clkfx_divide : integer;
clkfx_multiply : integer;
end record;
constant DVI_1440_900_60 : DVI_CONFIG_TYPE := (1440, 80, 152, 232, 900, 3, 6, 25, '0', '0', 106.5, 32, 17);
constant DVI_1024_768_60 : DVI_CONFIG_TYPE := (1024, 24, 136, 144, 768, 3, 6, 29, '0', '0', 65.0, 6, 2);
constant DVI_1024_768_70 : DVI_CONFIG_TYPE := (1024, 24, 136, 144, 768, 3, 6, 29, '0', '0', 75.0, 8, 3);
constant DVI_CONFIG : DVI_CONFIG_TYPE := DVI_1024_768_60;








Comment