1 -------------------------------------------------------------------------
\r
3 -- Filename: textmode_vga_v_sm_beh.vhd
\r
6 -- Short Description:
\r
7 -- ==================
\r
8 -- Behavioural implementation of the vertical VGA timing finite state machine
\r
10 -------------------------------------------------------------------------
\r
13 use ieee.std_logic_1164.all;
14 use ieee.numeric_std.all;
15 use work.math_pkg.all;
16 use work.textmode_vga_pkg.all;
18 architecture beh of textmode_vga_v_sm is
19 type TEXTMODE_VGA_V_SM_STATE_TYPE is
21 VSYNC_FIRST, VSYNC, VSYNC_NEXT,
22 VBACK_FIRST, VBACK, VBACK_NEXT,
23 VDATA_FIRST, VDATA, VDATA_NEXTLINE, VDATA_NEXTCHAR,
24 VFRONT_FIRST, VFRONT, VFRONT_NEXT
26 signal textmode_vga_v_sm_state, textmode_vga_v_sm_state_next : TEXTMODE_VGA_V_SM_STATE_TYPE;
27 signal vcnt, vcnt_next : integer range 0 to max(VSYNC_LINES, VBACK_LINES, VFRONT_LINES);
28 signal char_height_pixel_int, char_height_pixel_int_next : integer range 0 to CHAR_HEIGHT;
29 signal char_line_cnt_int, char_line_cnt_int_next : integer range 0 to LINE_COUNT;
31 char_height_pixel <= std_logic_vector(to_unsigned(char_height_pixel_int, log2c(CHAR_HEIGHT)));
32 char_line_cnt <= std_logic_vector(to_unsigned(char_line_cnt_int, log2c(LINE_COUNT)));
34 v_sm_next_state : process(textmode_vga_v_sm_state, is_eol, vcnt, char_height_pixel_int, char_line_cnt_int)
36 textmode_vga_v_sm_state_next <= textmode_vga_v_sm_state;
38 case textmode_vga_v_sm_state is
40 textmode_vga_v_sm_state_next <= VSYNC;
43 if vcnt = VSYNC_LINES - 1 then
44 textmode_vga_v_sm_state_next <= VBACK_FIRST;
46 textmode_vga_v_sm_state_next <= VSYNC_NEXT;
50 textmode_vga_v_sm_state_next <= VSYNC;
52 textmode_vga_v_sm_state_next <= VBACK;
55 if vcnt = VBACK_LINES - 1 then
56 textmode_vga_v_sm_state_next <= VDATA_FIRST;
58 textmode_vga_v_sm_state_next <= VBACK_NEXT;
62 textmode_vga_v_sm_state_next <= VBACK;
64 textmode_vga_v_sm_state_next <= VDATA;
67 if char_height_pixel_int = CHAR_HEIGHT - 1 then
68 if char_line_cnt_int = LINE_COUNT - 1 then
69 textmode_vga_v_sm_state_next <= VFRONT_FIRST;
71 textmode_vga_v_sm_state_next <= VDATA_NEXTCHAR;
74 textmode_vga_v_sm_state_next <= VDATA_NEXTLINE;
77 when VDATA_NEXTLINE =>
78 textmode_vga_v_sm_state_next <= VDATA;
79 when VDATA_NEXTCHAR =>
80 textmode_vga_v_sm_state_next <= VDATA;
82 textmode_vga_v_sm_state_next <= VFRONT;
85 if vcnt = VFRONT_LINES - 1 then
86 textmode_vga_v_sm_state_next <= VSYNC_FIRST;
88 textmode_vga_v_sm_state_next <= VFRONT_NEXT;
92 textmode_vga_v_sm_state_next <= VFRONT;
94 end process v_sm_next_state;
96 v_sm_output : process(textmode_vga_v_sm_state, vcnt, char_height_pixel_int, char_line_cnt_int)
101 char_height_pixel_int_next <= char_height_pixel_int;
102 char_line_cnt_int_next <= char_line_cnt_int;
104 case textmode_vga_v_sm_state is
112 vcnt_next <= vcnt + 1;
118 vcnt_next <= vcnt + 1;
121 char_height_pixel_int_next <= 0;
122 char_line_cnt_int_next <= 0;
125 when VDATA_NEXTLINE =>
127 char_height_pixel_int_next <= char_height_pixel_int + 1;
128 when VDATA_NEXTCHAR =>
130 char_height_pixel_int_next <= 0;
131 char_line_cnt_int_next <= char_line_cnt_int + 1;
137 vcnt_next <= vcnt + 1;
139 end process v_sm_output;
141 sync : process(sys_clk, sys_res_n)
143 if sys_res_n = '0' then
144 textmode_vga_v_sm_state <= VSYNC_FIRST;
146 char_height_pixel_int <= 0;
147 char_line_cnt_int <= 0;
148 elsif rising_edge(sys_clk) then
149 textmode_vga_v_sm_state <= textmode_vga_v_sm_state_next;
151 char_height_pixel_int <= char_height_pixel_int_next;
152 char_line_cnt_int <= char_line_cnt_int_next;
155 end architecture beh;