310 likes | 455 Views
This document provides an extensive overview of VHDL (Very High Speed Integrated Circuit Hardware Description Language), a critical tool for designing digital hardware. It covers essential concepts such as entities, architectures, data types, combinational and sequential processes, and state machines. The document also includes practical examples and simulation protocols to aid in synthesizing circuits for FPGA boards. Ideal for students and engineers eager to learn about VHDL, this resource serves as both an educational guide and a reference for digital design practices.
E N D
Introduction to VHDL Joseph Collins, 3A Software Eng. with files from Dr. W.D. Bishop, P.Eng Email: j4collin@engmail.uwaterloo.ca
What is VHDL? • Very High-Speed Integrated Circuit • Hardware • Description • Language • A popular tool for designing digital hardware
Important Concepts • Entity • What the hardware looks like to the outside world • Defines inputs and outputs ENTITY lab1 IS PORT ( r1, r0 : in std_logic; x, y, z : in std_logic; a, d0, d1 : out std_logic ); END lab1;
Important Concepts • Architecture • This is the implementation of your entity. • This is where you put your gates and stuff. ARCHITECTURE main OF lab1 IS SIGNAL temp : std_logic; BEGIN a <= r0 AND r1; temp <= y OR z; d0 <= x AND temp; d1 <= (r0 AND x) OR temp; END main;
VHDL Data Types • std_logic • A wire • Can be set to ‘1’ or ‘0’ (among other things) • SIGNAL a : std_logic; • use ieee.std_logic_1164.all
VHDL Data Types • std_logic_vector • A group of wires with a similar purpose • SIGNAL v : std_logic_vector (3 DOWNTO 0); • Wires can be assigned: • individually: v(3) <= ‘0’; • in groups: v(1 DOWNTO 0) <= v(3 DOWNTO 2); • all at once: v <= “1001”; • use ieee.std_logic_1164.all
VHDL Data Types • signed/unsigned • Used to represent signed and unsigned numbers • SIGNAL num : signed (2 downto 0); • Assignment similar to std_logic_vectors • Can do arithmetic on these • This includes, addition, subtraction, multiplication, and comparisons • use ieee.numeric_std.all
Converting Between Data Types • One can convert between signed, unsigned and std_logic_vector explicitly • SIGNAL x : std_logic; • SIGNAL num : unsigned (3 DOWNTO 0); • SIGNAL v : std_logic_vector (3 DOWNTO 0); • … • num <= unsigned(v); • v <= std_logic_vector(num); • x <= v(1);
Combinational Circuitry • Statements that may be helpful • When-else statements • Case statements --a is std_logic, b is std_logic_vector (3 DOWNTO 0) --x and s are unsigned (3 DOWNTO 0) s <= x – 10; b <= “0000” WHEN a = ‘1’ ELSE std_logic_vector(x) WHEN x < 10 ELSE std_logic_vector(s); s <= x – 10; WITH x(3 DOWNTO 1) SELECT b <= std_logic_vector(s) WHEN “101” | “110” | “111”, std_logic_vector(x) WHEN OTHERS;
Processes • So far, we’ve covered basic combinational circuitry • Processes allow for much more human-readable designs • Processes can be combinational or sequential • Will not cover combinational because they are frowned upon by SE141 TAs
Sequential Processes • Sequential processes run on a clock signal • Usually involve one or more flip-flops • They are NOT sequential in the sense that the hardware will execute one step at a time • Hardware runs in parallel • You can make things run sequentially by separating tasks into multiple clock cycles.
D Flip-Flop with Chip Enable • Probably the second-simplest sequential process you will ever run into PROCESS BEGIN WAIT UNTIL RISING_EDGE(clock); IF (ce = ‘1’) THEN q <= d; END IF; END PROCESS;
State Machines • Flip Flops that represent a state in your system • Multiple encoding types • One-hot • Gray • Binary • Usually used in sequential processes
Hardware Interfacing • You can easily use a provided piece of hardware as part of a larger circuit • Make sure you understand the specs • You needn’t know the VHDL code behind this piece of hardware • This allows you to work independently on separate parts of your lab
Interfacing a Block of Memory • We wish to integrate a piece of 256x256 memory into our circuit ARCHITECTURE main OF circ IS COMPONENT mem IS PORT ( i_add : in std_logic_vector (7 DOWNTO 0); i_wren : in std_logic; i_clock : in std_logic; i_data : in std_logic_vector (7 DOWNTO 0); o_q : out std_logic_vector (7 DOWNTO 0) ); END COMPONENT mem; SIGNAL address, data, q : std_logic_vector (7 DOWNTO 0); SIGNAL wren, clk : std_logic; BEGIN … mem1: mem PORT MAP (address, wren, clk, data, q); … END main
Simulation • We have covered hardware that you can synthesize nicely for use on an FPGA board • VHDL can be used to simulate these circuits • Note: we will be using non-synthesizable VHDL for doing simulations
How to Simulate • Develop your simulation plan • Prepare a new entity and do a port map • Use wait statements to assign your inputs clock_proc: PROCESS BEGIN -- 50 MHz clock clk <= ‘0’; wait for 10 ns; clk <= ‘1’; wait for 10 ns; END PROCESS
Simulation Example ENTITY tb_lab1 IS END tb_lab1 ARCHITECTURE main OF tb_lab1 IS COMPONENT lab1 IS PORT ( r0, r1, x, y, z : in std_logic; a, d0, d1 : out std_logic ); END COMPONENT lab1; SIGNAL r0, r1, x, y, z, a, d0, d1 : std_logic; BEGIN lab1_inst : lab1 PORT MAP (r0, r1, x, y, z, a, d0, d1); r0_proc : PROCESS BEGIN r0 <= ‘0’; wait for 10 ns; r0 <= ‘1’; wait for 10 ns; END PROCESS; r1_proc : PROCESS BEGIN r1 <= ‘0’; wait for 20 ns; r1 <= ‘1’; wait for 20 ns; END PROCESS; --etc. END main;
Common Pitfalls • Multiple Signal Drivers • When you assign to a signal in multiple locations (without appropriate ifs) • Usually in multiple processes • Best preventative measure: avoid assigning to more than one signal in a given process • Processes run parallel to each other
Common Pitfalls • Invalid State = Undefined Behaviour • If your state machine enters an invalid state, it should return to a pre-defined “reset” state • This can happen by programmer error or due to environmental factors
What questions do you have? This is about all I have.
Do not hesitate to contact me! - Email: j4collin@engmail.uwaterloo.ca - I often hang out in SE lounge/lab and/or MathSoc (MC 3038) - Have a good Pi Day tomorrow