ECE 448 Lecture 12. VGA Display Part 4 Text Generation

Similar documents
ECE 448 Lecture 10. VGA Display Part 1 VGA Synchronization

ECE 448 Lecture 11. VGA Display Part 3 Animation

ECE 448 Lecture 11. VGA Display Part 3 Animation

library IEEE; use IEEE.STD_LOGIC_1164.ALL;

Flip-flop and Registers

Ryerson University Department of Electrical and Computer Engineering EES508 Digital Systems

Lab 3: VGA Bouncing Ball I

HDL & High Level Synthesize (EEET 2035) Laboratory II Sequential Circuits with VHDL: DFF, Counter, TFF and Timer

Eng. Mohammed Samara. Fall The Islamic University of Gaza. Faculty of Engineering. Computer Engineering Department

Lecture 6: Simple and Complex Programmable Logic Devices. EE 3610 Digital Systems

Using the XSV Board Xchecker Interface

Lab 6: Video Game PONG

Design Problem 4 Solutions

ACS College of Engineering. Department of Biomedical Engineering. HDL pre lab questions ( ) Cycle-1

MASSACHUSETTS INSTITUTE OF TECHNOLOGY Department of Electrical Engineering and Computer Sciences

Spartan-II Development System

Figure 1 Block diagram of a 4-bit binary counter

COE758 Xilinx ISE 9.2 Tutorial 2. Integrating ChipScope Pro into a project

Design of VGA Controller using VHDL for LCD Display using FPGA

4:1 Mux Symbol 4:1 Mux Circuit

Feedback Sequential Circuits

FPGA Laboratory Assignment 4. Due Date: 06/11/2012

California State University, Bakersfield Computer & Electrical Engineering & Computer Science ECE 3220: Digital Design with VHDL Laboratory 7

Smooth Ternary Signaling For Deep-Submicron(DSM) Buses

Spartan-II Development System

TSIU03: Lab 3 - VGA. Petter Källström, Mario Garrido. September 10, 2018

ECE 3401 Lecture 11. Sequential Circuits

DIGITAL SYSTEM DESIGN VHDL Coding for FPGAs Unit 7

Bachelor Thesis. Augmented Reality using a Virtual Reality. R.J.A. Blokker & L.M. Noordam. Implementation on an FPGA device

Lab 4: Hex Calculator

VGA Pixel Buffer Stephen Just

Laboratory Exercise 7

Bachelor of Technology (Electronics and Instrumentation Engg.)

Class 19 Sequential Logic: Flip-Flop

VHDL test bench for digital image processing systems using a new image format

Class 06 Sequential Logic: Flip-Flop

VHDL Design and Implementation of FPGA Based Logic Analyzer: Work in Progress

VHDL 4 BUILDING BLOCKS OF A COMPUTER.

Video. Prof. Stephen A. Edwards Columbia University Spring Video p.

Laboratory Exercise 7

Design and Implementation of an AHB VGA Peripheral

The Nexys 4 Number Cruncher. Electrical and Computer Engineering Department

ECE 3401 Lecture 12. Sequential Circuits (II)

Lab # 9 VGA Controller

Video. Prof. Stephen A. Edwards Columbia University Spring Video p. 1/2

STATIC RANDOM-ACCESS MEMORY

Digital Blocks Semiconductor IP

Flip-Flops and Registers

ECE 263 Digital Systems, Fall 2015

ThedesignsofthemasterandslaveCCBFPGAs

hochschule fu r angewandte wissenschaften hamburg Prof. Dr. B. Schwarz FB Elektrotechnik/Informatik

CS/EE Homework 6

PicoBlaze. for Spartan-3, Virtex-II, Virtex-IIPRO and Virtex-4 devices. JTAG Loader. Quick User Guide. Kris Chaplin and Ken Chapman

Laboratory Manual and Supplementary Notes. ECE 495: Computer Engineering Design Laboratory

CSE140L: Components and Design Techniques for Digital Systems Lab. CPU design and PLDs. Tajana Simunic Rosing. Source: Vahid, Katz

EE178 Spring 2018 Lecture Module 5. Eric Crabill

Massachusetts Institute of Technology Department of Electrical Engineering and Computer Science Introductory Digital Systems Laboratory

Serial FIR Filter. A Brief Study in DSP. ECE448 Spring 2011 Tuesday Section 15 points 3/8/2011 GEORGE MASON UNIVERSITY.

Massachusetts Institute of Technology Department of Electrical Engineering and Computer Science Introductory Digital Systems Laboratory

Vending Machine. Keywords FSM, Vending Machine, FPGA, VHDL

VID_OVERLAY. Digital Video Overlay Module Rev Key Design Features. Block Diagram. Applications. Pin-out Description

VLSI DESIGN LAB (EE-330-F) VI SEMESTER. Electrical and Electronics Engineering

CPE 329: Programmable Logic and Microprocessor-Based System Design

Fixed-Point Calculator

Real-Time Digital Oscilloscope Implementation in 90nm CMOS Technology FPGA

Block Diagram. dw*3 pixin (RGB) pixin_vsync pixin_hsync pixin_val pixin_rdy. clk_a. clk_b. h_s, h_bp, h_fp, h_disp, h_line

LFSRs as Functional Blocks in Wireless Applications Author: Stephen Lim and Andy Miller

Figure 1: segment of an unprogrammed and programmed PAL.

EECS150 - Digital Design Lecture 13 - Project Description, Part 3 of? Project Overview

Lab 5 FPGA Design Flow Based on Aldec Active-HDL. Fast Reflex Game.

EE178 Lecture Module 4. Eric Crabill SJSU / Xilinx Fall 2005

CHAPTER1: Digital Logic Circuits

Level and edge-sensitive behaviour

ECE 545 Lecture 1. FPGA Devices & FPGA Tools

Tic-Tac-Toe Using VGA Output Alexander Ivanovic, Shane Mahaffy, Johnathan Hannosh, Luca Wagner

Using HERON modules with FPGAs to connect to FPDP

2608 Sweetgum Drive Apex NC Toll-free: International: FAX: How to install and use your new XStend Board

Asynchronous & Synchronous Reset Design Techniques - Part Deux

Design of VGA and Implementing On FPGA

Revision: 5/7/ E Main Suite D Pullman, WA (509) Voice and Fax GND. 5VDC regulator VDD. 4 7-seg. displays

EECS150 - Digital Design Lecture 12 - Video Interfacing. Recap and Outline

Lab 3 LCD Mar

Debugging of VHDL Hardware Designs on Altera s DE2 Boards

Chapter 8 Registers & Counters

download instant at

Synchronous Sequential Design

Outline. CPE/EE 422/522 Advanced Logic Design L04. Review: 8421 BCD to Excess3 BCD Code Converter. Review: Mealy Sequential Networks

FPGA-BASED EDUCATIONAL LAB PLATFORM

Memec Spartan-II LC User s Guide

CALIFORNIA STATE UNIVERSITY, NORTHRIDGE. Reconfigurable RGB Video Test Pattern Generator

Design and Implementation of SOC VGA Controller Using Spartan-3E FPGA

Modeling Latches and Flip-flops

Device 1 Device 2 Device 3 Device 4

Latest Timing System Developments

FPGA Design. Part I - Hardware Components. Thomas Lenzi

LED Array Board.

AbhijeetKhandale. H R Bhagyalakshmi

CAD for VLSI Design - I Lecture 38. V. Kamakoti and Shankar Balachandran

Digilent Nexys-3 Cellular RAM Controller Reference Design Overview

Digital Systems Design

Transcription:

ECE 448 Lecture 12 VGA Display Part 4 Text Generation George Mason University

Required Reading P. Chu, FPGA Prototyping by VHDL Examples Chapter 13, VGA Controller II: Text Source Codes of Examples http://academic.csuohio.edu/chu_p/rtl/fpga_vhdl.html Nexys 3 Board Reference Manual VGA Port, pages 15-17 2

Text Generation 3

Text Generation Basics Each character is treated as a tile The patterns of the tiles constitute the font of the character set We use an 8 x 16 font, similar to the one used in early IBM PCs In this font each character is represented as an 8 x 16 pixel pattern The character patterns are stored in the pattern memory, known as font ROM For a 7-bit ASCII we need 128 x 16 x 8 = 2k x 8 ROM 4

Font Pattern of A 5

Spartan-6 FPGA Family 6

Font ROM in VHDL (1) library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity font_rom is port( ); clk: in std_logic; addr: in std_logic_vector(10 downto 0); data: out std_logic_vector(7 downto 0) end font_rom; 7

Font ROM in VHDL (2) architecture arch of font_rom is constant ADDR_WIDTH: integer:=11; constant DATA_WIDTH: integer:=8; signal addr_reg: std_logic_vector(addr_width-1 downto 0); type rom_type is array (0 to 2**ADDR_WIDTH-1) of std_logic_vector(data_width-1 downto 0); 8

Font ROM in VHDL (3) constant ROM: rom_type:=( "00000000", -- 0 "00000000", -- 1 "00000000", -- 2 "00000000", -- 3 "00000000", -- 4 "00000000", -- 5 "00000000", -- 6 "00000000", -- 7 "00000000", -- 8 "00000000", -- 9 "00000000", -- a "00000000", -- b "00000000", -- c "00000000", -- d "00000000", -- e "00000000", -- f -- 2^11-by-8 9

Font ROM in VHDL (4) -- code x01 (smiley face) "00000000", -- 0 "00000000", -- 1 "01111110", -- 2 ****** "10000001", -- 3 * * "10100101", -- 4 * * * * "10000001", -- 5 * * "10000001", -- 6 * * "10111101", -- 7 * **** * "10011001", -- 8 * ** * "10000001", -- 9 * * "10000001", -- a * * "01111110", -- b ****** "00000000", -- c "00000000", -- d "00000000", -- e "00000000", -- f 10

Font ROM in VHDL (5) version 1 "00000000" -- f ); begin data_next <= ROM(to_integer(unsigned(addr))); -- addr register to infer block RAM process (clk) begin if (clk'event and clk = '1') then data <= data_next; end if; end process; end arch; 11

Font ROM in VHDL (5) version 2 "00000000" -- f ); begin -- addr register to infer block RAM process (clk) begin if (clk'event and clk = '1') then addr_reg <= addr; end if; end process; data <= ROM(to_integer(unsigned(addr_reg))); end arch; 12

Font ROM in VHDL (6) The complete code available at http://academic.csuohio.edu/chu_p/rtl/fpga_vhdl.html File: ch13/list_ch13_01_font_rom.vhd 13

Font Pattern of A 14

Character coordinates 640 pixels ó 640/8 = 80 characters 0 1 2 3 0 1 2 3 4 5 6 7 8 9 10 7576777879 480 pixels ó 480/16 = 30 characters................... 26 27 28 29 15

Text Generation Circuit [0..15] [0..29] [0..127] [0..79] [0..7] [0..2047] 16

Text Generation Circuit in VHDL (1) library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity font_test_gen is port( ); clk: in std_logic; video_on: in std_logic; pixel_x, pixel_y: std_logic_vector(9 downto 0); rgb_text: out std_logic_vector(2 downto 0) end font_test_gen; 17

Text Generation Circuit in VHDL (2) architecture arch of font_test_gen is signal rom_addr: std_logic_vector(10 downto 0); signal char_addr: std_logic_vector(6 downto 0); signal row_addr: std_logic_vector(3 downto 0); signal bit_addr: std_logic_vector(2 downto 0); signal font_word: std_logic_vector(7 downto 0); signal font_bit, text_bit_on: std_logic; 18

Text Generation Circuit [0..15] [0..29] [0..127] [0..79] [0..7] [0..2047] 19

Text Generation Circuit in VHDL (3) -- instantiate font ROM font_unit: entity work.font_rom port map(clk=>clk, addr=>rom_addr, data=>font_word); -- font ROM interface row_addr<=pixel_y(3 downto 0); rom_addr <= char_addr & row_addr; bit_addr<=pixel_x(2 downto 0); font_bit <= font_word(to_integer(unsigned(not bit_addr))); 20

not bit_addr bit_addr= f(bit_addr)= 0 1 2 3 4 5 6 7 7 6 5 4 3 2 1 0 f(bit_addr) = 7 bit_addr = bit_addr Example: 2 = 010 2 5 = 101 2 = 7-2 = 2 21

not A n-1 n-2... 0 1 1... 1 a n-1 a n-2 a 0 a i 0 1 a i 1 a i 1 a n-1 a n-2 a 0 1 0 0 (2 n -1) A = A 22

Repeated display of all 128 characters 4 chars 0 3 4 7 32 chars 0 31 32 63 64 79 95 128 characters 128 characters 128 characters 128 characters 128 characters 128 characters 24 27 28 31 128 characters 128 characters 128 characters 128 characters 128 characters 128 characters 23

Text Generation Circuit in VHDL (4) char_addr <=pixel_y(5 downto 4) & pixel_x(7 downto 3); -- 32 consecutive characters displayed in 4 rows -- This 32 x 4 region displayed repetitively on the screen 24

Repeated display of all 128 characters 4 chars 0 3 32 chars 0 31 79 0 255 128 characters 63 29 25

Text Generation Circuit in VHDL (4) text_bit_on <= font_bit when pixel_x(9 downto 8)="00" and pixel_y(9 downto 6)="0000" else '0'; -- Only the top-left portion of the screen -- (256 x 64 pixels = 32 characters x 4 lines) turned on 26

Text Generation Circuit [0..15] [0..29] [0..127] [0..79] [0..7] [0..2047] 27

Text Generation Circuit in VHDL (5) -- rgb multiplexing circuit process(video_on, text_bit_on) begin if video_on='0' then else rgb_text <= "000"; --blank if text_bit_on='1' then rgb_text <= "010"; -- green else rgb_text <= "000"; -- black end if; end if; end process; end arch; 28

Font Scaling by a Factor of 2 (1) -- instantiate font ROM font_unit: entity work.font_rom port map(clk=>clk, addr=>rom_addr, data=>font_word); -- font ROM interface -- row_addr<=pixel_y(3 downto 0); -- without scaling row_addr<=pixel_y(4 downto 1); -- with scaling rom_addr <= char_addr & row_addr; -- bit_addr<=pixel_x(2 downto 0); -- without scaling bit_addr<=pixel_x(3 downto 1); -- with scaling font_bit <= font_word(to_integer(unsigned(not bit_addr))); 29

Font Scaling by a Factor of 2 (2) -- char_addr <=pixel_y(5 downto 4) & pixel_x(7 downto 3); -- without scaling char_addr <=pixel_y(6 downto 5) & pixel_x(8 downto 4); -- with scaling -- 32 consecutive characters displayed in 4 rows -- This 32 x 4 region displayed repetitively on the screen text_bit_on <= -- font_bit when pixel_x(9 downto 8)="00" and -- pixel_y(9 downto 6)="0000" else -- '0'; font_bit when pixel_x(9)= 0" and pixel_y(9 downto 7)="000" else '0'; -- Only the top-left portion of the screen -- (256 x 64 pixels = 32 characters x 4 lines) turned on 30

Text Generation Circuit with Tile Memory [0..15] [0..29] & [0..79] [0..29] [7..0] [0..79] [0..2047] [0..7] 31

Full-Screen Text Display in VHDL (1) library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity text_screen_gen is port( clk, reset: std_logic; btn: std_logic_vector(2 downto 0); sw: std_logic_vector(6 downto 0); video_on: in std_logic; pixel_x, pixel_y: in std_logic_vector(9 downto 0); text_rgb: out std_logic_vector(2 downto 0) ); end text_screen_gen; 32

Full-Screen Text Display in VHDL (2) architecture arch of text_screen_gen is -- font ROM signal char_addr: std_logic_vector(6 downto 0); signal rom_addr: std_logic_vector(10 downto 0); signal row_addr: std_logic_vector(3 downto 0); signal bit_addr: unsigned(2 downto 0); signal font_word: std_logic_vector(7 downto 0); signal font_bit: std_logic; -- tile RAM signal we: std_logic; signal addr_r, addr_w: std_logic_vector(11 downto 0); signal din, dout: std_logic_vector(6 downto 0); -- 80-by-30 tile map constant MAX_X: integer:=80; constant MAX_Y: integer:=30; 33

Full-Screen Text Display in VHDL (3) -- cursor signal cur_x_reg, cur_x_next: unsigned(6 downto 0); signal cur_y_reg, cur_y_next: unsigned(4 downto 0); signal move_x_tick, move_y_tick: std_logic; signal cursor_on: std_logic; -- delayed pixel count signal pix_x1_reg, pix_y1_reg: unsigned(9 downto 0); signal pix_x2_reg, pix_y2_reg: unsigned(9 downto 0); -- object output signals signal font_rgb, font_rev_rgb: std_logic_vector(2 downto 0); 34

Full-Screen Text Display in VHDL (4) begin -- instantiate debounce circuit for two buttons debounce_unit0: entity work.debounce port map(clk=>clk, reset=>reset, sw=>btn(0), db_level=>open, db_tick=>move_x_tick); debounce_unit1: entity work.debounce port map(clk=>clk, reset=>reset, sw=>btn(1), db_level=>open, db_tick=>move_y_tick); 35

Full-Screen Text Display in VHDL (5) -- instantiate font ROM font_unit: entity work.font_rom port map(clk=>clk, addr=>rom_addr, data=>font_word); -- instantiate dual port tile RAM (2^12-by-7) video_ram: entity work.xilinx_dual_port_ram_sync generic map(addr_width=>12, DATA_WIDTH=>7) port map(clk=>clk, we=>we, addr_a=>addr_w, addr_b=>addr_r, din_a=>din, dout_a=>open, dout_b=>dout); 36

Full-Screen Text Display in VHDL (6) -- registers process (clk) begin if (clk'event and clk='1') then cur_x_reg <= cur_x_next; cur_y_reg <= cur_y_next; pix_x1_reg <= unsigned(pixel_x); -- 2 clock delay pix_x2_reg <= pix_x1_reg; pix_y1_reg <= unsigned(pixel_y); pix_y2_reg <= pix_y1_reg; end if; end process; 37

Text Generation Circuit with Tile Memory [0..15] [0..29] & [0..79] [0..29] [7..0] [0..79] [0..2047] [0..7] 38

Full-Screen Text Display in VHDL (7) -- tile RAM write addr_w <=std_logic_vector(cur_y_reg & cur_x_reg); we <= btn(2); din <= sw; -- tile RAM read -- use non-delayed coordinates to form tile RAM address addr_r <=pixel_y(8 downto 4) & pixel_x(9 downto 3); char_addr <= dout; -- font ROM row_addr<=pixel_y(3 downto 0); rom_addr <= char_addr & row_addr; -- use delayed coordinate to select a bit bit_addr<=pix_x2_reg(2 downto 0); font_bit <= font_word(to_integer(not bit_addr)); 39

Full-Screen Text Display in VHDL (8) -- new cursor position cur_x_next <= (others=>'0') when move_x_tick='1' and -- wrap around cur_x_reg=max_x-1 else cur_x_reg + 1 when move_x_tick='1' else cur_x_reg ; cur_y_next <= (others=>'0') when move_y_tick='1' and -- wrap around cur_y_reg=max_y-1 else cur_y_reg + 1 when move_y_tick='1' else cur_y_reg; 40

Full-Screen Text Display in VHDL (9) -- object signals -- green over black and reversed video for cursor font_rgb <="010" when font_bit='1' else "000"; font_rev_rgb <="000" when font_bit='1' else "010"; -- use delayed coordinates for comparison cursor_on <='1' when pix_y2_reg(8 downto 4)=cur_y_reg and pix_x2_reg(9 downto 3)=cur_x_reg else '0'; 41

Full-Screen Text Display in VHDL (10) -- rgb multiplexing circuit process(video_on,cursor_on,font_rgb,font_rev_rgb) begin if video_on='0' then text_rgb <= "000"; --blank else if cursor_on='1' then text_rgb <= font_rev_rgb; else text_rgb <= font_rgb; end if; end if; end process; end arch; 42