Hans Code Console Generator
I created a Perl program that will generate Verilog code to produce a console on a VGA display.
This web page is dedicated to some examples:
Example 1: The Background Console Yellow Rectangles
I chose to tackle the background "yellow" rectangles. These are
strategically (and logically) placed on the console to highlight
certain bits or bit-groupings.
First, I made a file called PDP8consts.v which contained many of
the constants that were defined in VHDL by Hans for locating many of
the Console text and graphic elements.
Second, I noted that the rectangles all had many properties that
were similar. So, I created a parameterizable module. Then, with
each new invocation I create the invocation with new parameters, they
are compile-time options.
Alright, well here is an example:
Example 1: Input
#
# This is the code to generate the Console code the PDP8
#
include: "PDP8consts.v"
bg_header:
bg_yellow_hi_bit: reg=ir
bg_yellow_hi_bit: reg=lac
bg_yellow_hi_med_lo: reg=ma
bg_yellow_hi_med_lo: reg=addr
bg_yellow_med_lo: reg=ir
bg_yellow_med_lo: reg=em
bg_yellow_med_lo: reg=pc
bg_yellow_med_lo: reg=lac
bg_yellow_med_lo: reg=mq
bg_yellow_med_lo: reg=eae
bg_yellow_med_lo: reg=mb
bg_yellow_med_lo: reg=io
bg_yellow_med_lo: reg=keys
Example 1: Output
`include "PDP8consts.v"
module cons_background(pixel_row, pixel_column, bg_rgb);
input [9:0] pixel_row, pixel_column;
output [2:0] bg_rgb;
wire [2:0] bg_ir_hi_bit_rgb;
wire bg_ir_hi_bit_hit;
cons_bg_rectangle
#(3'b110,
(`ir_row * 8) - 4, (`r_col -12 * `delta) * 8,
(`ir_row * 8) +12, (`r_col -11 * `delta) * 8)
bg_ir_hi_bit_rect (pixel_row, pixel_column, bg_ir_hi_bit_rgb, bg_ir_hi_bit_hit);
wire [2:0] bg_lac_hi_bit_rgb;
wire bg_lac_hi_bit_hit;
cons_bg_rectangle
#(3'b110,
(`lac_row * 8) - 4, (`r_col -12 * `delta) * 8,
(`lac_row * 8) +12, (`r_col -11 * `delta) * 8)
bg_lac_hi_bit_rect (pixel_row, pixel_column, bg_lac_hi_bit_rgb, bg_lac_hi_bit_hit);
wire [2:0] bg_ma_hi_rgb;
wire bg_ma_hi_hit;
cons_bg_rectangle
#(3'b110,
(`ma_row * 8) - 4, (`r_col -14 * `delta) * 8,
(`ma_row * 8) +12, (`r_col -11 * `delta) * 8)
bg_ma_hi_rect (pixel_row, pixel_column, bg_ma_hi_rgb, bg_ma_hi_hit);
wire [2:0] bg_ma_med_rgb;
wire bg_ma_med_hit;
cons_bg_rectangle
#(3'b110,
(`ma_row * 8) - 4, (`r_col -8 * `delta) * 8,
(`ma_row * 8) +12, (`r_col -5 * `delta) * 8)
bg_ma_med_rect (pixel_row, pixel_column, bg_ma_med_rgb, bg_ma_med_hit);
wire [2:0] bg_ma_lo_rgb;
wire bg_ma_lo_hit;
cons_bg_rectangle
#(3'b110,
(`ma_row * 8) - 4, (`r_col -2 * `delta) * 8,
(`ma_row * 8) +12, (`r_col +1 * `delta) * 8)
bg_ma_lo_rect (pixel_row, pixel_column, bg_ma_lo_rgb, bg_ma_lo_hit);
wire [2:0] bg_addr_hi_rgb;
wire bg_addr_hi_hit;
cons_bg_rectangle
#(3'b110,
(`addr_row * 8) - 4, (`r_col -14 * `delta) * 8,
(`addr_row * 8) +12, (`r_col -11 * `delta) * 8)
bg_addr_hi_rect (pixel_row, pixel_column, bg_addr_hi_rgb, bg_addr_hi_hit);
wire [2:0] bg_addr_med_rgb;
wire bg_addr_med_hit;
cons_bg_rectangle
#(3'b110,
(`addr_row * 8) - 4, (`r_col -8 * `delta) * 8,
(`addr_row * 8) +12, (`r_col -5 * `delta) * 8)
bg_addr_med_rect (pixel_row, pixel_column, bg_addr_med_rgb, bg_addr_med_hit);
wire [2:0] bg_addr_lo_rgb;
wire bg_addr_lo_hit;
cons_bg_rectangle
#(3'b110,
(`addr_row * 8) - 4, (`r_col -2 * `delta) * 8,
(`addr_row * 8) +12, (`r_col +1 * `delta) * 8)
bg_addr_lo_rect (pixel_row, pixel_column, bg_addr_lo_rgb, bg_addr_lo_hit);
wire [2:0] bg_ir_med_rgb;
wire bg_ir_med_hit;
cons_bg_rectangle
#(3'b110,
(`ir_row * 8) - 4, (`r_col -8 * `delta) * 8,
(`ir_row * 8) +12, (`r_col -5 * `delta) * 8)
bg_ir_med_rect (pixel_row, pixel_column, bg_ir_med_rgb, bg_ir_med_hit);
wire [2:0] bg_ir_lo_rgb;
wire bg_ir_lo_hit;
cons_bg_rectangle
#(3'b110,
(`ir_row * 8) - 4, (`r_col -2 * `delta) * 8,
(`ir_row * 8) +12, (`r_col +1 * `delta) * 8)
bg_ir_lo_rect (pixel_row, pixel_column, bg_ir_lo_rgb, bg_ir_lo_hit);
wire [2:0] bg_em_med_rgb;
wire bg_em_med_hit;
cons_bg_rectangle
#(3'b110,
(`em_row * 8) - 4, (`r_col -8 * `delta) * 8,
(`em_row * 8) +12, (`r_col -5 * `delta) * 8)
bg_em_med_rect (pixel_row, pixel_column, bg_em_med_rgb, bg_em_med_hit);
wire [2:0] bg_em_lo_rgb;
wire bg_em_lo_hit;
cons_bg_rectangle
#(3'b110,
(`em_row * 8) - 4, (`r_col -2 * `delta) * 8,
(`em_row * 8) +12, (`r_col +1 * `delta) * 8)
bg_em_lo_rect (pixel_row, pixel_column, bg_em_lo_rgb, bg_em_lo_hit);
wire [2:0] bg_pc_med_rgb;
wire bg_pc_med_hit;
cons_bg_rectangle
#(3'b110,
(`pc_row * 8) - 4, (`r_col -8 * `delta) * 8,
(`pc_row * 8) +12, (`r_col -5 * `delta) * 8)
bg_pc_med_rect (pixel_row, pixel_column, bg_pc_med_rgb, bg_pc_med_hit);
wire [2:0] bg_pc_lo_rgb;
wire bg_pc_lo_hit;
cons_bg_rectangle
#(3'b110,
(`pc_row * 8) - 4, (`r_col -2 * `delta) * 8,
(`pc_row * 8) +12, (`r_col +1 * `delta) * 8)
bg_pc_lo_rect (pixel_row, pixel_column, bg_pc_lo_rgb, bg_pc_lo_hit);
wire [2:0] bg_lac_med_rgb;
wire bg_lac_med_hit;
cons_bg_rectangle
#(3'b110,
(`lac_row * 8) - 4, (`r_col -8 * `delta) * 8,
(`lac_row * 8) +12, (`r_col -5 * `delta) * 8)
bg_lac_med_rect (pixel_row, pixel_column, bg_lac_med_rgb, bg_lac_med_hit);
wire [2:0] bg_lac_lo_rgb;
wire bg_lac_lo_hit;
cons_bg_rectangle
#(3'b110,
(`lac_row * 8) - 4, (`r_col -2 * `delta) * 8,
(`lac_row * 8) +12, (`r_col +1 * `delta) * 8)
bg_lac_lo_rect (pixel_row, pixel_column, bg_lac_lo_rgb, bg_lac_lo_hit);
wire [2:0] bg_mq_med_rgb;
wire bg_mq_med_hit;
cons_bg_rectangle
#(3'b110,
(`mq_row * 8) - 4, (`r_col -8 * `delta) * 8,
(`mq_row * 8) +12, (`r_col -5 * `delta) * 8)
bg_mq_med_rect (pixel_row, pixel_column, bg_mq_med_rgb, bg_mq_med_hit);
wire [2:0] bg_mq_lo_rgb;
wire bg_mq_lo_hit;
cons_bg_rectangle
#(3'b110,
(`mq_row * 8) - 4, (`r_col -2 * `delta) * 8,
(`mq_row * 8) +12, (`r_col +1 * `delta) * 8)
bg_mq_lo_rect (pixel_row, pixel_column, bg_mq_lo_rgb, bg_mq_lo_hit);
wire [2:0] bg_eae_med_rgb;
wire bg_eae_med_hit;
cons_bg_rectangle
#(3'b110,
(`eae_row * 8) - 4, (`r_col -8 * `delta) * 8,
(`eae_row * 8) +12, (`r_col -5 * `delta) * 8)
bg_eae_med_rect (pixel_row, pixel_column, bg_eae_med_rgb, bg_eae_med_hit);
wire [2:0] bg_eae_lo_rgb;
wire bg_eae_lo_hit;
cons_bg_rectangle
#(3'b110,
(`eae_row * 8) - 4, (`r_col -2 * `delta) * 8,
(`eae_row * 8) +12, (`r_col +1 * `delta) * 8)
bg_eae_lo_rect (pixel_row, pixel_column, bg_eae_lo_rgb, bg_eae_lo_hit);
wire [2:0] bg_mb_med_rgb;
wire bg_mb_med_hit;
cons_bg_rectangle
#(3'b110,
(`mb_row * 8) - 4, (`r_col -8 * `delta) * 8,
(`mb_row * 8) +12, (`r_col -5 * `delta) * 8)
bg_mb_med_rect (pixel_row, pixel_column, bg_mb_med_rgb, bg_mb_med_hit);
wire [2:0] bg_mb_lo_rgb;
wire bg_mb_lo_hit;
cons_bg_rectangle
#(3'b110,
(`mb_row * 8) - 4, (`r_col -2 * `delta) * 8,
(`mb_row * 8) +12, (`r_col +1 * `delta) * 8)
bg_mb_lo_rect (pixel_row, pixel_column, bg_mb_lo_rgb, bg_mb_lo_hit);
wire [2:0] bg_io_med_rgb;
wire bg_io_med_hit;
cons_bg_rectangle
#(3'b110,
(`io_row * 8) - 4, (`r_col -8 * `delta) * 8,
(`io_row * 8) +12, (`r_col -5 * `delta) * 8)
bg_io_med_rect (pixel_row, pixel_column, bg_io_med_rgb, bg_io_med_hit);
wire [2:0] bg_io_lo_rgb;
wire bg_io_lo_hit;
cons_bg_rectangle
#(3'b110,
(`io_row * 8) - 4, (`r_col -2 * `delta) * 8,
(`io_row * 8) +12, (`r_col +1 * `delta) * 8)
bg_io_lo_rect (pixel_row, pixel_column, bg_io_lo_rgb, bg_io_lo_hit);
wire [2:0] bg_keys_med_rgb;
wire bg_keys_med_hit;
cons_bg_rectangle
#(3'b110,
(`keys_row * 8) - 4, (`r_col -8 * `delta) * 8,
(`keys_row * 8) +12, (`r_col -5 * `delta) * 8)
bg_keys_med_rect (pixel_row, pixel_column, bg_keys_med_rgb, bg_keys_med_hit);
wire [2:0] bg_keys_lo_rgb;
wire bg_keys_lo_hit;
cons_bg_rectangle
#(3'b110,
(`keys_row * 8) - 4, (`r_col -2 * `delta) * 8,
(`keys_row * 8) +12, (`r_col +1 * `delta) * 8)
bg_keys_lo_rect (pixel_row, pixel_column, bg_keys_lo_rgb, bg_keys_lo_hit);
/*
* Put all the pieces together for the output
*/
assign bg_rgb = bg_ir_hi_bit_hit ? bg_ir_hi_bit_rgb
: bg_lac_hi_bit_hit ? bg_lac_hi_bit_rgb
: bg_ma_hi_hit ? bg_ma_hi_rgb
: bg_ma_med_hit ? bg_ma_med_rgb
: bg_ma_lo_hit ? bg_ma_lo_rgb
: bg_addr_hi_hit ? bg_addr_hi_rgb
: bg_addr_med_hit ? bg_addr_med_rgb
: bg_addr_lo_hit ? bg_addr_lo_rgb
: bg_ir_med_hit ? bg_ir_med_rgb
: bg_ir_lo_hit ? bg_ir_lo_rgb
: bg_em_med_hit ? bg_em_med_rgb
: bg_em_lo_hit ? bg_em_lo_rgb
: bg_pc_med_hit ? bg_pc_med_rgb
: bg_pc_lo_hit ? bg_pc_lo_rgb
: bg_lac_med_hit ? bg_lac_med_rgb
: bg_lac_lo_hit ? bg_lac_lo_rgb
: bg_mq_med_hit ? bg_mq_med_rgb
: bg_mq_lo_hit ? bg_mq_lo_rgb
: bg_eae_med_hit ? bg_eae_med_rgb
: bg_eae_lo_hit ? bg_eae_lo_rgb
: bg_mb_med_hit ? bg_mb_med_rgb
: bg_mb_lo_hit ? bg_mb_lo_rgb
: bg_io_med_hit ? bg_io_med_rgb
: bg_io_lo_hit ? bg_io_lo_rgb
: bg_keys_med_hit ? bg_keys_med_rgb
: bg_keys_lo_hit ? bg_keys_lo_rgb
: 3'b000;
endmodule // cons_background
module cons_bg_rectangle(input [9:0] pixel_row,
input [9:0] pixel_col,
output [2:0] bg_rgb,
output bg_hit);
parameter RECT_COLOR = 3'b111;
parameter RECT_TOP_EDGE = 0;
parameter RECT_LEFT_EDGE = 0;
parameter RECT_BOTTOM_EDGE = {9{1'b1}};
parameter RECT_RIGHT_EDGE = {9{1'b1}};
assign bg_hit = ((pixel_row > RECT_TOP_EDGE) &&
(pixel_col >= RECT_LEFT_EDGE) &&
(pixel_row < RECT_BOTTOM_EDGE) &&
(pixel_col < RECT_RIGHT_EDGE)) ? 1'b1 : 1'b0;
assign bg_rgb = RECT_COLOR;
endmodule // cons_bg_rectangle
The Perl code is located
here.