/src/video.v
module munch(
input wire [6:0] counter,
input wire [6:0] hpos,
input wire [6:0] vpos,
output wire [2:0] level
);
wire [6:0] munch;
assign munch[0] = (vpos ^ (counter - 0)) == hpos;
assign munch[1] = (vpos ^ (counter - 1)) == hpos;
assign munch[2] = (vpos ^ (counter - 2)) == hpos;
assign munch[3] = (vpos ^ (counter - 3)) == hpos;
assign munch[4] = (vpos ^ (counter - 4)) == hpos;
assign munch[5] = (vpos ^ (counter - 5)) == hpos;
assign munch[6] = (vpos ^ (counter - 6)) == hpos;
assign level = (munch[0] ? 7 :
(munch[1] ? 6 :
(munch[2] ? 5 :
(munch[3] ? 4 :
(munch[4] ? 3 :
(munch[5] ? 2 :
(munch[6] ? 1 :
0)))))));
endmodule
module chargen(
input wire [9:0] x,
input wire [9:0] y,
input wire [3:0] character,
input wire [9:0] hpos,
input wire [9:0] vpos,
output wire pixel
);
wire [9:0] charmap [14:0];
wire [9:0] segments;
/* digits 0-9
assign charmap[0] = 10'b0000111111;
assign charmap[1] = 10'b0000000110;
assign charmap[2] = 10'b0001011011;
assign charmap[3] = 10'b0001001111;
assign charmap[4] = 10'b0001100110;
assign charmap[5] = 10'b0001101101;
assign charmap[6] = 10'b0001111101;
assign charmap[7] = 10'b0000000111;
assign charmap[8] = 10'b0001111111;
assign charmap[9] = 10'b0001101111;
*/
assign charmap[0] = 10'b0000000000; // space
assign charmap[1] = 10'b0001110111; // A
assign charmap[2] = 10'b0000111001; // C
assign charmap[3] = 10'b0001111001; // E
assign charmap[4] = 10'b0001110110; // H
assign charmap[5] = 10'b0110110000; // K
assign charmap[6] = 10'b0000111000; // L
assign charmap[7] = 10'b0001110011; // P
assign charmap[8] = 10'b0101110011; // R
assign charmap[9] = 10'b0001101101; // S
assign charmap[10] = 10'b1000000001; // T
assign charmap[11] = 10'b0100100110; // V
assign charmap[12] = 10'b1000001111; // D
assign charmap[13] = 10'b0010110000; // Y
assign charmap[14] = 10'b0000111111; // O
assign segments = charmap[character];
assign pixel = (segments[0] && hpos >= x && hpos <= x + 50 && vpos == y)
| (segments[1] && hpos == x + 50 && vpos >= y && vpos <= y + 50)
| (segments[2] && hpos == x + 50 && vpos >= y + 50 && vpos <= y + 100)
| (segments[3] && hpos >= x && hpos <= x + 50 && vpos == y + 100)
| (segments[4] && hpos == x && vpos >= y + 50 && vpos <= y + 100)
| (segments[5] && hpos == x && vpos >= y && vpos <= y + 50)
| (segments[6] && hpos >= x && hpos <= x + 50 && vpos == y + 50)
| (segments[7] && hpos >= x && hpos <= x + 50 && vpos >= y && vpos <= y + 50
&& (y - vpos) == (hpos - (x + 50)))
| (segments[8] && hpos >= x && hpos <= x + 50 && vpos >= y + 50 && vpos <= y + 100
&& ((y + 50) - vpos) == (x - hpos))
| (segments[9] && hpos == x + 25 && vpos >= y && vpos <= y + 100);
endmodule
parameter C_sp = 4'd0;
parameter C_A = 4'd1;
parameter C_C = 4'd2;
parameter C_E = 4'd3;
parameter C_H = 4'd4;
parameter C_K = 4'd5;
parameter C_L = 4'd6;
parameter C_P = 4'd7;
parameter C_R = 4'd8;
parameter C_S = 4'd9;
parameter C_T = 4'd10;
parameter C_V = 4'd11;
parameter C_D = 4'd12;
parameter C_Y = 4'd13;
parameter C_O = 4'd14;
module text(
input wire [9:0] x,
input wire [9:0] y,
input wire [23:0] str,
input wire [9:0] hpos,
input wire [9:0] vpos,
output wire pixel
);
wire [3:0] str_chars [5:0];
wire [2:0] h_dist = (hpos - x) >> 6;
wire [2:0] char_idx = h_dist;
wire chargen_pixel;
assign {
str_chars[5], str_chars[4], str_chars[3], str_chars[2],
str_chars[1], str_chars[0]
} = str;
chargen chargen(
.x(x + char_idx * 10'd64),
.y(y),
.character(str_chars[char_idx]),
.hpos(hpos),
.vpos(vpos),
.pixel(chargen_pixel)
);
assign pixel = hpos >= x && hpos < x + (6 * 64) ? chargen_pixel : 0;
endmodule
module text_sequencer(
input wire [1:0] selector,
input wire [9:0] hpos,
input wire [9:0] vpos,
input wire [1:0] stage,
input wire [3:0] stage_timer,
output wire pixel
);
wire [23:0] words [6:0];
wire [2:0] word_select;
assign words[0] = {C_sp, C_sp, C_sp, C_T, C_A, C_E};
assign words[1] = {C_sp, C_P, C_E, C_E, C_L, C_S};
assign words[2] = {C_sp, C_sp, C_K, C_C, C_A, C_H};
assign words[3] = {C_T, C_A, C_E, C_P, C_E, C_R};
assign words[4] = {C_sp, C_Y, C_D, C_A, C_E, C_R};
assign words[5] = {C_sp, C_sp, C_sp, C_sp, C_K, C_O};
assign words[6] = {C_sp, C_sp, C_E, C_V, C_A, C_R};
assign word_select = (stage > 0 ? {stage == 3 && selector == 2'd2, selector} :
(stage_timer != 0 ? 3'd4 : 3'd5));
text text_gen(
.x(10'd100),
.y(10'd280),
.str(words[word_select]),
.hpos(hpos),
.vpos(vpos),
.pixel(pixel)
);
endmodule