2dc7155b3fe019dc47aa4fd3f78ba670ee084db2
[mw/milkymist.git] / cores / vgafb / doc / vgafb.tex
1 \documentclass[a4paper,11pt]{article}
2 \usepackage{fullpage}
3 \usepackage[latin1]{inputenc}
4 \usepackage[T1]{fontenc}
5 \usepackage[normalem]{ulem}
6 \usepackage[english]{babel}
7 \usepackage{listings,babel}
8 \lstset{breaklines=true,basicstyle=\ttfamily}
9 \usepackage{graphicx}
10 \usepackage{moreverb}
11 \usepackage{url}
12 \usepackage{amsmath}
13
14 \title{VGA framebuffer}
15 \author{S\'ebastien Bourdeauducq}
16 \date{October 2009}
17 \begin{document}
18 \setlength{\parindent}{0pt}
19 \setlength{\parskip}{5pt}
20 \maketitle{}
21 \section{Specifications}
22 The VGA framebuffer core enables a system-on-chip to support a VGA video output with the picture read from a memory framebuffer.
23 The core directly drives a 3-channel 8-bit digital to analog converter and the horizontal and vertical synchronization signals.
24 The framebuffer is read with a 4x64 FastMemoryLink (FML) master; and a CSR interface is implemented for configuring the video output.
25
26 \section{Registers}
27 \subsection{Control register, offset 0x00}
28 This register enables or disables the video output by setting or clearing the reset bit 0. At reset, the default value is 0x1.
29
30 \subsection{Horizontal video parameters, offsets 0x04, 0x08, 0x0c and 0x10}
31 Those registers set respectively:
32 \begin{itemize}
33 \item the horizontal size of the active video area (the horizontal resolution)
34 \item the position of the beginning of the horizontal sync pulse in the scan line, in pixel clocks
35 \item the position of the end of the horizontal sync pulse in the scan line, in pixel clocks
36 \item the total length of the horizontal scan line minus one, in pixels
37 \end{itemize}
38 The default values are for the standard VGA resolution of 640x480 at 60Hz with a 25MHz pixel clock.
39
40 \subsection{Vertical video parameters, offsets 0x14, 0x18, 0x1c and 0x20}
41 Those registers set respectively:
42 \begin{itemize}
43 \item the vertical size of the active video area (the vertical resolution)
44 \item the position of the beginning of the vertical sync pulse. The unit is the horizontal scan line.
45 \item the position of the end of the vertical sync pulse. Same unit as above.
46 \item the total count of horizontal scan lines minus one. Same unit as above.
47 \end{itemize}
48 The default values are for the standard VGA resolution of 640x480 at 60Hz with a 25MHz pixel clock.
49
50 \subsection{DMA control registers, offsets 0x24, 0x28 and 0x2c}
51 The register 0x24 defines the base address of the framebuffer. That framebuffer is basic progressive scan buffer using the RGB565 pixel format.
52
53 When register 0x24 is written, the framebuffer address is not updated immediately. Instead, the VGA core waits for the end of the vertical active video area and only starts fetching data from the new framebuffer at the beginning of the next frame. This enables the use of multiple framebuffers without any tearing or flickering artifacts. The address from which the core is currently reading data is available in register 0x28.
54 When registers 0x24 and 0x28 have different values, a framebuffer address change is pending. When they have the same values, the frame being displayed is the latest that was asked for.
55
56 The framebuffer must be aligned to the start of a FML burst ($\frac{4 \cdot 64}{8}$ bytes).
57
58 Register 0x2c defines the number of FML bursts required to fill a complete screen. This is typically set to:
59 \[
60 \frac{\text{horizontal resolution} \cdot \text{vertical resolution} \cdot 16}{4 \cdot 64}
61 \]
62
63 The screen resolution must be set so that this number is integer. This is the case with common VGA resolutions.
64
65 \section{Connections}
66 The pixel clock is not generated internally and must be fed to the core using the \verb!vga_clk! port. No relationship is expected with the system clock (the two domains are entirely independent). That pixel clock should also be fed to the synchronous DAC.
67
68 The other ports should be self-explanatory.
69
70 \end{document}