FPGA: FPGA: Hans Code Console Generator
Site Navigation for FPGA
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.