This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
resources:char_drawer [2019/07/11 15:18] jgoeders created |
resources:char_drawer [2019/11/01 16:41] (current) jgoeders |
||
---|---|---|---|
Line 1: | Line 1: | ||
======The CharDrawer Module====== | ======The CharDrawer Module====== | ||
+ | |||
+ | This module is used to draw strings of characters to the display, one pixel at a time. The module accepts only upper case characters (A-Z), digits (0-9) and space (" "). A null character (0) will not be drawn, and all other ASCII values are drawn as a solid rectangle. | ||
+ | |||
+ | There are several different ways to construct strings in SystemVerilog. For example, the following are all equivalent: | ||
+ | |||
+ | <code SystemVerilog> | ||
+ | logic [39:0] char_string; | ||
+ | assign char_string = "HELLO"; | ||
+ | </code> | ||
+ | |||
+ | |||
+ | <code SystemVerilog> | ||
+ | logic [39:0] char_string; | ||
+ | assign char_string = 40'h48454C4C4F; | ||
+ | </code> | ||
+ | |||
+ | <code SystemVerilog> | ||
+ | logic [39:0] char_string; | ||
+ | assign char_string = {"H", "E", "L", "L", "O"}; | ||
+ | </code> | ||
+ | |||
+ | <code SystemVerilog> | ||
+ | logic [39:0] char_string; | ||
+ | assign char_string = {8'h48, 8'h45, 8'h4C, 8'h4C, 8'h4F}; | ||
+ | </code> | ||
+ | |||
+ | ^ Module Name = CharDrawer ^^^^ | ||
+ | ^ Parameter ^ Default Value ^ Description ^^ | ||
+ | | MAX_CHARS | 16 |The length of the string that the module can display. || | ||
+ | ^ Port Name ^ Direction ^ Width ^ Description ^ | ||
+ | | clk | Input | 1 | 100 MHz Clock | | ||
+ | | reset | Input | 1 | Active-high reset | | ||
+ | | enable| Input | 1 | Raise this signal to start drawing. The drawing will continue until finished. To draw a new string you must lower and then raise this signal. | | ||
+ | | done | Output | 1 | Active-high, indicating that the string is done drawing | | ||
+ | | x_in | Input | 9 | Top-left x-coordinate of drawing region | | ||
+ | | y_in | Input | 8 | Top-left y-coordinate of drawing region | | ||
+ | | string_in | Input | MAX_CHARS * 8 | ASCII character string to draw, most-significant byte is drawn first. | | ||
+ | | x_out | Output| 9 | x-Coordinate of pixel to draw | | ||
+ | | y_out| Output | 8 | y-Coordinate of pixel to draw | | ||
+ | |||
+ | Click the link below to download the CharDrawer.sv file. | ||
+ | |||
+ | <file Verilog CharDrawer.sv> | ||
+ | module CharDrawer # ( | ||
+ | parameter MAX_CHARS = 16 | ||
+ | )( | ||
+ | input wire logic clk, // Clock | ||
+ | input wire logic reset, // Active-high reset | ||
+ | input wire logic enable, // Start drawing | ||
+ | output logic done, // Done drawing | ||
+ | input wire logic [8:0] x_in, // Top-left (x,y) | ||
+ | input wire logic [7:0] y_in, | ||
+ | input wire logic [(MAX_CHARS * 8) - 1:0] string_in, // ASCII character string to draw | ||
+ | // MSB is drawn first | ||
+ | output logic [8:0] x_out, // Output (x,y) of pixel to draw | ||
+ | output logic [7:0] y_out, | ||
+ | output logic draw_en // Active-high enable of drawing | ||
+ | ); | ||
+ | |||
+ | localparam CHAR_COLS = 5; | ||
+ | localparam CHAR_ROWS = 5; | ||
+ | |||
+ | logic [8:0] x; // Track top-left (x,y) of current character to draw | ||
+ | logic [7:0] y; | ||
+ | |||
+ | // ROM to lookup pixel map of each character, row by row | ||
+ | logic [8:0] pixel_rom_addr; // { 5 bits of char_id, see table below, 3 bits for row #} | ||
+ | logic [4:0] pixel_rom_out; // row of pixel data, output from ROM | ||
+ | logic [4:0] pixel_row; // Shift register populated with row of pixel data, then shifted out as it is drawn | ||
+ | |||
+ | // ROM to lookup width of each character | ||
+ | logic [5:0] width_rom_addr; // char_id | ||
+ | logic [2:0] width_rom_out; // width of character | ||
+ | logic [2:0] char_width; // width of character, saved to register | ||
+ | |||
+ | // char_id | ||
+ | // ------- | ||
+ | // 0-25 = A-Z | ||
+ | // 26-35 = 0-9 | ||
+ | // 36 = " " (space) | ||
+ | // 37 = all unsported characters, except null (0) which is not printed | ||
+ | |||
+ | logic [7:0] char_idx; // Index of character being drawn, starts at MAX_CHARS-1, decrements to 0 | ||
+ | logic [2:0] col_idx; // Current column being drawn | ||
+ | logic [2:0] row_idx; // Current row being drawn | ||
+ | |||
+ | logic col_done; // High when on the last column of the row | ||
+ | logic row_done; // High when on the last row of the character | ||
+ | logic char_done; // High when on the last row and col | ||
+ | |||
+ | // State Machine | ||
+ | typedef enum {S_INIT, S_NEXT_CHAR, S_READ_ROW, S_SAVE_ROW, S_DRAW_ROW, S_DONE} StateType; | ||
+ | StateType cs; | ||
+ | |||
+ | logic char_is_null; | ||
+ | logic [7:0] curr_char; | ||
+ | logic [7:0] char_select; | ||
+ | |||
+ | |||
+ | ////////////////////////////////// Output Logic //////////////////////////////////// | ||
+ | assign x_out = x + col_idx; | ||
+ | assign y_out = y + row_idx; | ||
+ | assign draw_en = pixel_row[CHAR_COLS - 1]; | ||
+ | assign done = (char_done && char_idx == 0) || (cs == S_NEXT_CHAR && char_is_null && char_idx == 0); | ||
+ | |||
+ | |||
+ | ////////////////////////////////// State Machine ////////////////////////////////// | ||
+ | always_ff @(posedge clk) begin | ||
+ | if (reset) begin | ||
+ | cs <= S_INIT; | ||
+ | end else begin | ||
+ | case (cs) | ||
+ | S_INIT: | ||
+ | if (enable) | ||
+ | cs <= S_NEXT_CHAR; | ||
+ | S_NEXT_CHAR: | ||
+ | if (~char_is_null) | ||
+ | cs <= S_READ_ROW; | ||
+ | else if (char_idx == 0) | ||
+ | cs <= S_DONE; | ||
+ | S_READ_ROW: | ||
+ | cs <= S_SAVE_ROW; | ||
+ | S_SAVE_ROW: | ||
+ | cs <= S_DRAW_ROW; | ||
+ | S_DRAW_ROW: begin | ||
+ | if (col_done) begin | ||
+ | if (row_done) begin | ||
+ | if (char_idx == 0) begin | ||
+ | cs <= S_DONE; | ||
+ | end else begin | ||
+ | cs <= S_NEXT_CHAR; | ||
+ | end | ||
+ | end else begin | ||
+ | cs <= S_READ_ROW; | ||
+ | end | ||
+ | end | ||
+ | end | ||
+ | S_DONE: | ||
+ | if (!enable) | ||
+ | cs <= S_INIT; | ||
+ | endcase | ||
+ | end | ||
+ | end | ||
+ | |||
+ | ////////////////////////////////// Row/Col/Char Counting ////////////////////////////////// | ||
+ | assign col_done = (cs == S_DRAW_ROW) && (col_idx == (char_width - 1)); | ||
+ | assign row_done = (cs == S_DRAW_ROW) && (row_idx == (CHAR_ROWS - 1)); | ||
+ | assign char_done = col_done && row_done; | ||
+ | |||
+ | assign char_select = string_in[char_idx * 8 +: 8]; | ||
+ | assign char_is_null = (char_select == 0); | ||
+ | |||
+ | always_ff @(posedge clk) begin | ||
+ | if (cs == S_NEXT_CHAR) | ||
+ | curr_char <= char_select; | ||
+ | end | ||
+ | |||
+ | // char_idx | ||
+ | always_ff @(posedge clk) begin | ||
+ | if (cs == S_INIT) | ||
+ | char_idx <= MAX_CHARS - 1; | ||
+ | else if (char_done) | ||
+ | char_idx <= char_idx - 1; | ||
+ | else if (cs == S_NEXT_CHAR && char_is_null) | ||
+ | char_idx <= char_idx - 1; | ||
+ | end | ||
+ | |||
+ | // col_idx | ||
+ | always_ff @(posedge clk) begin | ||
+ | if (cs == S_READ_ROW) | ||
+ | col_idx <= 0; | ||
+ | else if (cs == S_DRAW_ROW) | ||
+ | col_idx <= col_idx + 1; | ||
+ | end | ||
+ | |||
+ | // row_idx | ||
+ | always_ff @(posedge clk) begin | ||
+ | if (cs == S_NEXT_CHAR) | ||
+ | row_idx <= 0; | ||
+ | if (col_done) | ||
+ | row_idx <= row_idx + 1; | ||
+ | end | ||
+ | |||
+ | // x,y | ||
+ | always_ff @(posedge clk) begin | ||
+ | if (cs == S_INIT) begin | ||
+ | x <= x_in; | ||
+ | y <= y_in; | ||
+ | end else if (char_done) begin | ||
+ | x <= x + char_width + 1; | ||
+ | end | ||
+ | end | ||
+ | |||
+ | // Shift register of current row of pixels being drawn | ||
+ | always_ff @(posedge clk) begin | ||
+ | if (cs == S_INIT) | ||
+ | pixel_row <= 0; | ||
+ | if (cs == S_SAVE_ROW) | ||
+ | pixel_row <= pixel_rom_out; | ||
+ | else if (cs == S_DRAW_ROW) | ||
+ | pixel_row <= {pixel_row[CHAR_COLS - 2:0], 1'b0}; | ||
+ | end | ||
+ | |||
+ | ////////////////////////////////// Character ROM Lookups ////////////////////////////////// | ||
+ | always_comb begin | ||
+ | if (curr_char >= "A" && curr_char <= "Z") begin | ||
+ | pixel_rom_addr = {curr_char - "A", row_idx}; | ||
+ | width_rom_addr = {curr_char - "A"}; | ||
+ | end else if (curr_char >= "0" && curr_char <= "9") begin | ||
+ | pixel_rom_addr = {curr_char - "0" + 26, row_idx}; | ||
+ | width_rom_addr = {curr_char - "0" + 26}; | ||
+ | end else if (curr_char == " ") begin | ||
+ | pixel_rom_addr = {8'd36, row_idx}; | ||
+ | width_rom_addr = 8'd36; | ||
+ | end else begin | ||
+ | pixel_rom_addr = {8'd37, row_idx}; | ||
+ | width_rom_addr = 8'd37; | ||
+ | end | ||
+ | end | ||
+ | |||
+ | always_ff @(posedge clk) begin | ||
+ | if (cs == S_SAVE_ROW) | ||
+ | char_width <= width_rom_out; | ||
+ | end | ||
+ | |||
+ | always_ff @(posedge clk) begin | ||
+ | case(pixel_rom_addr) | ||
+ | {"A" - "A", 3'd0}: pixel_rom_out = 5'b11100; | ||
+ | {"A" - "A", 3'd1}: pixel_rom_out = 5'b10100; | ||
+ | {"A" - "A", 3'd2}: pixel_rom_out = 5'b11100; | ||
+ | {"A" - "A", 3'd3}: pixel_rom_out = 5'b10100; | ||
+ | {"A" - "A", 3'd4}: pixel_rom_out = 5'b10100; | ||
+ | | ||
+ | {"B" - "A", 3'd0}: pixel_rom_out = 5'b11100; | ||
+ | {"B" - "A", 3'd1}: pixel_rom_out = 5'b10100; | ||
+ | {"B" - "A", 3'd2}: pixel_rom_out = 5'b11110; | ||
+ | {"B" - "A", 3'd3}: pixel_rom_out = 5'b10010; | ||
+ | {"B" - "A", 3'd4}: pixel_rom_out = 5'b11110; | ||
+ | |||
+ | {"C" - "A", 3'd0}: pixel_rom_out = 5'b11100; | ||
+ | {"C" - "A", 3'd1}: pixel_rom_out = 5'b10000; | ||
+ | {"C" - "A", 3'd2}: pixel_rom_out = 5'b10000; | ||
+ | {"C" - "A", 3'd3}: pixel_rom_out = 5'b10000; | ||
+ | {"C" - "A", 3'd4}: pixel_rom_out = 5'b11100; | ||
+ | |||
+ | {"D" - "A", 3'd0}: pixel_rom_out = 5'b11000; | ||
+ | {"D" - "A", 3'd1}: pixel_rom_out = 5'b10100; | ||
+ | {"D" - "A", 3'd2}: pixel_rom_out = 5'b10100; | ||
+ | {"D" - "A", 3'd3}: pixel_rom_out = 5'b10100; | ||
+ | {"D" - "A", 3'd4}: pixel_rom_out = 5'b11000; | ||
+ | |||
+ | {"E" - "A", 3'd0}: pixel_rom_out = 5'b11100; | ||
+ | {"E" - "A", 3'd1}: pixel_rom_out = 5'b10000; | ||
+ | {"E" - "A", 3'd2}: pixel_rom_out = 5'b11000; | ||
+ | {"E" - "A", 3'd3}: pixel_rom_out = 5'b10000; | ||
+ | {"E" - "A", 3'd4}: pixel_rom_out = 5'b11100; | ||
+ | |||
+ | {"F" - "A", 3'd0}: pixel_rom_out = 5'b11100; | ||
+ | {"F" - "A", 3'd1}: pixel_rom_out = 5'b10000; | ||
+ | {"F" - "A", 3'd2}: pixel_rom_out = 5'b11100; | ||
+ | {"F" - "A", 3'd3}: pixel_rom_out = 5'b10000; | ||
+ | {"F" - "A", 3'd4}: pixel_rom_out = 5'b10000; | ||
+ | |||
+ | {"G" - "A", 3'd0}: pixel_rom_out = 5'b11110; | ||
+ | {"G" - "A", 3'd1}: pixel_rom_out = 5'b10000; | ||
+ | {"G" - "A", 3'd2}: pixel_rom_out = 5'b10110; | ||
+ | {"G" - "A", 3'd3}: pixel_rom_out = 5'b10010; | ||
+ | {"G" - "A", 3'd4}: pixel_rom_out = 5'b11110; | ||
+ | |||
+ | {"H" - "A", 3'd0}: pixel_rom_out = 5'b10100; | ||
+ | {"H" - "A", 3'd1}: pixel_rom_out = 5'b10100; | ||
+ | {"H" - "A", 3'd2}: pixel_rom_out = 5'b11100; | ||
+ | {"H" - "A", 3'd3}: pixel_rom_out = 5'b10100; | ||
+ | {"H" - "A", 3'd4}: pixel_rom_out = 5'b10100; | ||
+ | |||
+ | {"I" - "A", 3'd0}: pixel_rom_out = 5'b10000; | ||
+ | {"I" - "A", 3'd1}: pixel_rom_out = 5'b10000; | ||
+ | {"I" - "A", 3'd2}: pixel_rom_out = 5'b10000; | ||
+ | {"I" - "A", 3'd3}: pixel_rom_out = 5'b10000; | ||
+ | {"I" - "A", 3'd4}: pixel_rom_out = 5'b10000; | ||
+ | |||
+ | {"J" - "A", 3'd0}: pixel_rom_out = 5'b11100; | ||
+ | {"J" - "A", 3'd1}: pixel_rom_out = 5'b00100; | ||
+ | {"J" - "A", 3'd2}: pixel_rom_out = 5'b00100; | ||
+ | {"J" - "A", 3'd3}: pixel_rom_out = 5'b10100; | ||
+ | {"J" - "A", 3'd4}: pixel_rom_out = 5'b11100; | ||
+ | |||
+ | {"K" - "A", 3'd0}: pixel_rom_out = 5'b10100; | ||
+ | {"K" - "A", 3'd1}: pixel_rom_out = 5'b10100; | ||
+ | {"K" - "A", 3'd2}: pixel_rom_out = 5'b11000; | ||
+ | {"K" - "A", 3'd3}: pixel_rom_out = 5'b10100; | ||
+ | {"K" - "A", 3'd4}: pixel_rom_out = 5'b10100; | ||
+ | |||
+ | {"L" - "A", 3'd0}: pixel_rom_out = 5'b10000; | ||
+ | {"L" - "A", 3'd1}: pixel_rom_out = 5'b10000; | ||
+ | {"L" - "A", 3'd2}: pixel_rom_out = 5'b10000; | ||
+ | {"L" - "A", 3'd3}: pixel_rom_out = 5'b10000; | ||
+ | {"L" - "A", 3'd4}: pixel_rom_out = 5'b11100; | ||
+ | |||
+ | {"M" - "A", 3'd0}: pixel_rom_out = 5'b10001; | ||
+ | {"M" - "A", 3'd1}: pixel_rom_out = 5'b11011; | ||
+ | {"M" - "A", 3'd2}: pixel_rom_out = 5'b10101; | ||
+ | {"M" - "A", 3'd3}: pixel_rom_out = 5'b10001; | ||
+ | {"M" - "A", 3'd4}: pixel_rom_out = 5'b10001; | ||
+ | |||
+ | {"N" - "A", 3'd0}: pixel_rom_out = 5'b10010; | ||
+ | {"N" - "A", 3'd1}: pixel_rom_out = 5'b11010; | ||
+ | {"N" - "A", 3'd2}: pixel_rom_out = 5'b10110; | ||
+ | {"N" - "A", 3'd3}: pixel_rom_out = 5'b10010; | ||
+ | {"N" - "A", 3'd4}: pixel_rom_out = 5'b10010; | ||
+ | |||
+ | {"O" - "A", 3'd0}: pixel_rom_out = 5'b11100; | ||
+ | {"O" - "A", 3'd1}: pixel_rom_out = 5'b10100; | ||
+ | {"O" - "A", 3'd2}: pixel_rom_out = 5'b10100; | ||
+ | {"O" - "A", 3'd3}: pixel_rom_out = 5'b10100; | ||
+ | {"O" - "A", 3'd4}: pixel_rom_out = 5'b11100; | ||
+ | |||
+ | {"P" - "A", 3'd0}: pixel_rom_out = 5'b11100; | ||
+ | {"P" - "A", 3'd1}: pixel_rom_out = 5'b10100; | ||
+ | {"P" - "A", 3'd2}: pixel_rom_out = 5'b11100; | ||
+ | {"P" - "A", 3'd3}: pixel_rom_out = 5'b10000; | ||
+ | {"P" - "A", 3'd4}: pixel_rom_out = 5'b10000; | ||
+ | |||
+ | {"Q" - "A", 3'd0}: pixel_rom_out = 5'b11100; | ||
+ | {"Q" - "A", 3'd1}: pixel_rom_out = 5'b10100; | ||
+ | {"Q" - "A", 3'd2}: pixel_rom_out = 5'b10100; | ||
+ | {"Q" - "A", 3'd3}: pixel_rom_out = 5'b10100; | ||
+ | {"Q" - "A", 3'd4}: pixel_rom_out = 5'b11110; | ||
+ | |||
+ | {"R" - "A", 3'd0}: pixel_rom_out = 5'b11100; | ||
+ | {"R" - "A", 3'd1}: pixel_rom_out = 5'b10100; | ||
+ | {"R" - "A", 3'd2}: pixel_rom_out = 5'b11000; | ||
+ | {"R" - "A", 3'd3}: pixel_rom_out = 5'b10100; | ||
+ | {"R" - "A", 3'd4}: pixel_rom_out = 5'b10100; | ||
+ | |||
+ | {"S" - "A", 3'd0}: pixel_rom_out = 5'b11100; | ||
+ | {"S" - "A", 3'd1}: pixel_rom_out = 5'b10000; | ||
+ | {"S" - "A", 3'd2}: pixel_rom_out = 5'b11100; | ||
+ | {"S" - "A", 3'd3}: pixel_rom_out = 5'b00100; | ||
+ | {"S" - "A", 3'd4}: pixel_rom_out = 5'b11100; | ||
+ | |||
+ | {"T" - "A", 3'd0}: pixel_rom_out = 5'b11100; | ||
+ | {"T" - "A", 3'd1}: pixel_rom_out = 5'b01000; | ||
+ | {"T" - "A", 3'd2}: pixel_rom_out = 5'b01000; | ||
+ | {"T" - "A", 3'd3}: pixel_rom_out = 5'b01000; | ||
+ | {"T" - "A", 3'd4}: pixel_rom_out = 5'b01000; | ||
+ | |||
+ | {"U" - "A", 3'd0}: pixel_rom_out = 5'b10100; | ||
+ | {"U" - "A", 3'd1}: pixel_rom_out = 5'b10100; | ||
+ | {"U" - "A", 3'd2}: pixel_rom_out = 5'b10100; | ||
+ | {"U" - "A", 3'd3}: pixel_rom_out = 5'b10100; | ||
+ | {"U" - "A", 3'd4}: pixel_rom_out = 5'b11100; | ||
+ | |||
+ | {"V" - "A", 3'd0}: pixel_rom_out = 5'b10100; | ||
+ | {"V" - "A", 3'd1}: pixel_rom_out = 5'b10100; | ||
+ | {"V" - "A", 3'd2}: pixel_rom_out = 5'b10100; | ||
+ | {"V" - "A", 3'd3}: pixel_rom_out = 5'b11100; | ||
+ | {"V" - "A", 3'd4}: pixel_rom_out = 5'b01000; | ||
+ | |||
+ | {"W" - "A", 3'd0}: pixel_rom_out = 5'b10001; | ||
+ | {"W" - "A", 3'd1}: pixel_rom_out = 5'b10001; | ||
+ | {"W" - "A", 3'd2}: pixel_rom_out = 5'b10101; | ||
+ | {"W" - "A", 3'd3}: pixel_rom_out = 5'b11011; | ||
+ | {"W" - "A", 3'd4}: pixel_rom_out = 5'b10001; | ||
+ | |||
+ | {"X" - "A", 3'd0}: pixel_rom_out = 5'b10100; | ||
+ | {"X" - "A", 3'd1}: pixel_rom_out = 5'b10100; | ||
+ | {"X" - "A", 3'd2}: pixel_rom_out = 5'b01000; | ||
+ | {"X" - "A", 3'd3}: pixel_rom_out = 5'b10100; | ||
+ | {"X" - "A", 3'd4}: pixel_rom_out = 5'b10100; | ||
+ | |||
+ | {"Y" - "A", 3'd0}: pixel_rom_out = 5'b10100; | ||
+ | {"Y" - "A", 3'd1}: pixel_rom_out = 5'b10100; | ||
+ | {"Y" - "A", 3'd2}: pixel_rom_out = 5'b11100; | ||
+ | {"Y" - "A", 3'd3}: pixel_rom_out = 5'b01000; | ||
+ | {"Y" - "A", 3'd4}: pixel_rom_out = 5'b01000; | ||
+ | |||
+ | {"Z" - "A", 3'd0}: pixel_rom_out = 5'b11100; | ||
+ | {"Z" - "A", 3'd1}: pixel_rom_out = 5'b00100; | ||
+ | {"Z" - "A", 3'd2}: pixel_rom_out = 5'b01000; | ||
+ | {"Z" - "A", 3'd3}: pixel_rom_out = 5'b10000; | ||
+ | {"Z" - "A", 3'd4}: pixel_rom_out = 5'b11100; | ||
+ | |||
+ | {"0" - "0" + 26, 3'd0}: pixel_rom_out = 5'b11100; | ||
+ | {"0" - "0" + 26, 3'd1}: pixel_rom_out = 5'b10100; | ||
+ | {"0" - "0" + 26, 3'd2}: pixel_rom_out = 5'b10100; | ||
+ | {"0" - "0" + 26, 3'd3}: pixel_rom_out = 5'b10100; | ||
+ | {"0" - "0" + 26, 3'd4}: pixel_rom_out = 5'b11100; | ||
+ | |||
+ | {"1" - "0" + 26, 3'd0}: pixel_rom_out = 5'b11000; | ||
+ | {"1" - "0" + 26, 3'd1}: pixel_rom_out = 5'b01000; | ||
+ | {"1" - "0" + 26, 3'd2}: pixel_rom_out = 5'b01000; | ||
+ | {"1" - "0" + 26, 3'd3}: pixel_rom_out = 5'b01000; | ||
+ | {"1" - "0" + 26, 3'd4}: pixel_rom_out = 5'b01000; | ||
+ | |||
+ | {"2" - "0" + 26, 3'd0}: pixel_rom_out = 5'b11100; | ||
+ | {"2" - "0" + 26, 3'd1}: pixel_rom_out = 5'b00100; | ||
+ | {"2" - "0" + 26, 3'd2}: pixel_rom_out = 5'b11100; | ||
+ | {"2" - "0" + 26, 3'd3}: pixel_rom_out = 5'b10000; | ||
+ | {"2" - "0" + 26, 3'd4}: pixel_rom_out = 5'b11100; | ||
+ | |||
+ | {"3" - "0" + 26, 3'd0}: pixel_rom_out = 5'b11100; | ||
+ | {"3" - "0" + 26, 3'd1}: pixel_rom_out = 5'b00100; | ||
+ | {"3" - "0" + 26, 3'd2}: pixel_rom_out = 5'b01100; | ||
+ | {"3" - "0" + 26, 3'd3}: pixel_rom_out = 5'b00100; | ||
+ | {"3" - "0" + 26, 3'd4}: pixel_rom_out = 5'b11100; | ||
+ | |||
+ | {"4" - "0" + 26, 3'd0}: pixel_rom_out = 5'b10100; | ||
+ | {"4" - "0" + 26, 3'd1}: pixel_rom_out = 5'b10100; | ||
+ | {"4" - "0" + 26, 3'd2}: pixel_rom_out = 5'b11100; | ||
+ | {"4" - "0" + 26, 3'd3}: pixel_rom_out = 5'b00100; | ||
+ | {"4" - "0" + 26, 3'd4}: pixel_rom_out = 5'b00100; | ||
+ | |||
+ | {"5" - "0" + 26, 3'd0}: pixel_rom_out = 5'b11100; | ||
+ | {"5" - "0" + 26, 3'd1}: pixel_rom_out = 5'b10000; | ||
+ | {"5" - "0" + 26, 3'd2}: pixel_rom_out = 5'b11100; | ||
+ | {"5" - "0" + 26, 3'd3}: pixel_rom_out = 5'b00100; | ||
+ | {"5" - "0" + 26, 3'd4}: pixel_rom_out = 5'b11100; | ||
+ | |||
+ | {"6" - "0" + 26, 3'd0}: pixel_rom_out = 5'b10000; | ||
+ | {"6" - "0" + 26, 3'd1}: pixel_rom_out = 5'b10000; | ||
+ | {"6" - "0" + 26, 3'd2}: pixel_rom_out = 5'b11100; | ||
+ | {"6" - "0" + 26, 3'd3}: pixel_rom_out = 5'b10100; | ||
+ | {"6" - "0" + 26, 3'd4}: pixel_rom_out = 5'b11100; | ||
+ | |||
+ | {"7" - "0" + 26, 3'd0}: pixel_rom_out = 5'b11100; | ||
+ | {"7" - "0" + 26, 3'd1}: pixel_rom_out = 5'b00100; | ||
+ | {"7" - "0" + 26, 3'd2}: pixel_rom_out = 5'b00100; | ||
+ | {"7" - "0" + 26, 3'd3}: pixel_rom_out = 5'b00100; | ||
+ | {"7" - "0" + 26, 3'd4}: pixel_rom_out = 5'b00100; | ||
+ | |||
+ | {"8" - "0" + 26, 3'd0}: pixel_rom_out = 5'b11100; | ||
+ | {"8" - "0" + 26, 3'd1}: pixel_rom_out = 5'b10100; | ||
+ | {"8" - "0" + 26, 3'd2}: pixel_rom_out = 5'b11100; | ||
+ | {"8" - "0" + 26, 3'd3}: pixel_rom_out = 5'b10100; | ||
+ | {"8" - "0" + 26, 3'd4}: pixel_rom_out = 5'b11100; | ||
+ | |||
+ | {"9" - "0" + 26, 3'd0}: pixel_rom_out = 5'b11100; | ||
+ | {"9" - "0" + 26, 3'd1}: pixel_rom_out = 5'b10100; | ||
+ | {"9" - "0" + 26, 3'd2}: pixel_rom_out = 5'b11100; | ||
+ | {"9" - "0" + 26, 3'd3}: pixel_rom_out = 5'b00100; | ||
+ | {"9" - "0" + 26, 3'd4}: pixel_rom_out = 5'b00100; | ||
+ | | ||
+ | {8'd36, 3'd0}: pixel_rom_out = 5'b00000; | ||
+ | {8'd36, 3'd1}: pixel_rom_out = 5'b00000; | ||
+ | {8'd36, 3'd2}: pixel_rom_out = 5'b00000; | ||
+ | {8'd36, 3'd3}: pixel_rom_out = 5'b00000; | ||
+ | {8'd36, 3'd4}: pixel_rom_out = 5'b00000; | ||
+ | |||
+ | {8'd37, 3'd0}: pixel_rom_out = 5'b11110; | ||
+ | {8'd37, 3'd1}: pixel_rom_out = 5'b11110; | ||
+ | {8'd37, 3'd2}: pixel_rom_out = 5'b11110; | ||
+ | {8'd37, 3'd3}: pixel_rom_out = 5'b11110; | ||
+ | {8'd37, 3'd4}: pixel_rom_out = 5'b11110; | ||
+ | endcase | ||
+ | end | ||
+ | |||
+ | always_ff @(posedge clk) begin | ||
+ | case(width_rom_addr) | ||
+ | // A-Z | ||
+ | {"A" - "A"}: width_rom_out = 3; | ||
+ | {"B" - "A"}: width_rom_out = 4; | ||
+ | {"C" - "A"}: width_rom_out = 3; | ||
+ | {"D" - "A"}: width_rom_out = 3; | ||
+ | {"E" - "A"}: width_rom_out = 3; | ||
+ | {"F" - "A"}: width_rom_out = 3; | ||
+ | {"G" - "A"}: width_rom_out = 4; | ||
+ | {"H" - "A"}: width_rom_out = 3; | ||
+ | {"I" - "A"}: width_rom_out = 1; | ||
+ | {"J" - "A"}: width_rom_out = 3; | ||
+ | {"K" - "A"}: width_rom_out = 3; | ||
+ | {"L" - "A"}: width_rom_out = 3; | ||
+ | {"M" - "A"}: width_rom_out = 5; | ||
+ | {"N" - "A"}: width_rom_out = 4; | ||
+ | {"O" - "A"}: width_rom_out = 3; | ||
+ | {"P" - "A"}: width_rom_out = 3; | ||
+ | {"Q" - "A"}: width_rom_out = 4; | ||
+ | {"R" - "A"}: width_rom_out = 3; | ||
+ | {"S" - "A"}: width_rom_out = 3; | ||
+ | {"T" - "A"}: width_rom_out = 3; | ||
+ | {"U" - "A"}: width_rom_out = 3; | ||
+ | {"V" - "A"}: width_rom_out = 3; | ||
+ | {"W" - "A"}: width_rom_out = 5; | ||
+ | {"X" - "A"}: width_rom_out = 3; | ||
+ | {"Y" - "A"}: width_rom_out = 3; | ||
+ | {"Z" - "A"}: width_rom_out = 3; | ||
+ | |||
+ | // 0-9 | ||
+ | {"0" - "0" + 26}: width_rom_out = 3; | ||
+ | {"1" - "0" + 26}: width_rom_out = 2; | ||
+ | {"2" - "0" + 26}: width_rom_out = 3; | ||
+ | {"3" - "0" + 26}: width_rom_out = 3; | ||
+ | {"4" - "0" + 26}: width_rom_out = 3; | ||
+ | {"5" - "0" + 26}: width_rom_out = 3; | ||
+ | {"6" - "0" + 26}: width_rom_out = 3; | ||
+ | {"7" - "0" + 26}: width_rom_out = 3; | ||
+ | {"8" - "0" + 26}: width_rom_out = 3; | ||
+ | {"9" - "0" + 26}: width_rom_out = 3; | ||
+ | |||
+ | // Space | ||
+ | 36: width_rom_out = 4; | ||
+ | |||
+ | // non-supported, non-null | ||
+ | 37: width_rom_out = 4; | ||
+ | endcase | ||
+ | end | ||
+ | |||
+ | endmodule | ||
+ | </file> |