Udemy
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
Turn what you know into an opportunity and reach millions around the world.
Learn More
Your cart is empty.
Keep shopping
Learn FPGA Design With VHDL (Intel/Altera)
Rating: 4.4 out of 5(670 ratings)
5,033 students

Learn FPGA Design With VHDL (Intel/Altera)

Gain a Solid Foundation in VHDL for FPGA Development with Lots of Examples
Last updated 6/2026
English

What you'll learn

  • We will cover the VHDL language and syntax with lots of example projects
  • Relate VHDL code to hardware implementation
  • Creating FPGA building blocks using VHDL
  • Creating State Machines using VHDL
  • Creating complex FPGA designs from scratch
  • Highlight good design practice & common pitfalls
  • Writing Test Benches in VHDL
  • Simulate & debug FPGA Designs using ModelSim
  • Use the Intel Quartus software to compile and implement projects
  • Use Quartus To Perform Pin Assignments
  • Programming FPGAs using the USB Blaster
  • Using the Quartus Netlist Viewer to view the Hardware Realisation
  • Making sense of the Quartus Fitter Reports
  • Quartus Assignment Editor
  • Quartus Settings, Options & Optimisations
  • Basic Introduction to Quartus Timing Analyser
  • Implement a UART project that communicates over RS232 with a PC
  • Implement a State Machine project
  • Implement a 4 Digit 7-Segment Display to print a Count value
  • Implement a Project to Create A PWM output
  • Implement a Shift Register to Drive LEDs
  • Implement a Project to cover Switch De-bouncing and Synchronisation

Course content

1 section76 lectures25h 34m total length
  • Introduction9:05
  • Development Boards4:38
  • Where to get the FPGA Development Boards0:14
  • Installing Quartus6:47
  • FPGA Fundamentals24:50

    Explore FPGA fundamentals, including its reprogrammable fabric of CLBs with LUTs, D flip-flops, interconnect, and hard peripherals, and learn how VHDL enables RTL design and the FPGA design flow.

  • Signals & Data Types I31:55

    Learn how to model signals and data types in VHDL for FPGAs, including std_logic, std_logic_vector, signed and unsigned arithmetic, enumerated types, and arrays.

  • Signals & Data Types II12:15

    Explore predefined and user-defined data types in VHDL, including enumerated types, arrays, and records, and learn how to declare signals with subtypes, and access record fields.

  • Constants1:50

    Declare and use constants in VHDL by using the constant keyword with a data type and initial value. Ensure constants remain immutable after declaration and differ from signals.

  • VHDL Operators18:53

    Explore VHDL operators, including boolean, comparison, shift, rotate, arithmetic, and concatenation, with practical examples and guidance on operator precedence and usage across data types.

  • Structure of a VHDL File9:31

    Define a VHDL file with an entity block for inputs and outputs, and an architecture block with a declarative part. Describe the body and include signals, concurrent and sequential statements.

  • Project : Switch And LED (FPGA Explorer Development Board)29:44
  • Project : Switch And LED (Cyclone IV Development Board)25:37

    Learn to build a simple switch and led project on an Intel/Altera fpga using quartus software, including creating a project, assigning pins, compiling, and programming via usb blaster.

  • The Process Block17:51

    Explore the process block in VHDL, learn how to write processes inside architecture, define sensitivity lists, declarative and body sections, and implement combinational and registered logic with flip-flops.

  • State Machine Project (FPGA Explorer Development Board)51:18
  • State Machine Project (Cyclone IV Development Board)35:15

    Implement a three-state synchronous state machine in VHDL to drive three LEDs on an FPGA development board, transitioning between states via switches and detailing Quartus project setup.

  • Component Instantiation9:27

    Instantiate multiple components inside a top level entity, map inputs and outputs through port connections, and declare component and architecture blocks to build a simple adder that sums two integers.

  • Project : Using Quartus IP Wizard To Generate PLL (FPGA Explorer Dev Board)30:11
  • Project : Using Quartus IP Wizard To Generate PLL (Cyclone IV Development Board)33:49

    Instantiate a pll with the quartus ip wizard to downscale a 50 mhz clock to 25 mhz, then drive a three-state machine with a reset button.

  • Quartus Netlist Viewer & Fitter Reports (For Both Development Boards)38:22

    Learn to analyze a Quartus FPGA design using the netlist viewer, RTL and technology map views, and fitter reports. Understand inputs, outputs, registers, and the state machine.

  • Quartus Settings & Options (For Both Development Boards)23:06

    Explore the assignment editor to manage pin assignments, global signals, and io timing. Promote clock nets to global, place output registers in io cells, and review reports for optimization.

  • VHDL Concurrent Statements14:15
  • VHDL Sequential Statements26:56

    Explore VHDL sequential statements inside the process block, including sequential assignment, if and case statements, for loops, and wait constructs, with insights on synthesis, priority, and hardware delays.

  • Signal Assignments I14:20

    Explore how signal assignments inside a process implement combinational logic or flip-flops, compare conventional and registered processes, and learn to avoid latches and use flip-flops in FPGA designs.

  • Signal Assignments II13:08

    Explore signal assignments inside a registered process, driven by clock and reset, and analyze their hardware timing with flip-flops, timing diagrams, and edge-triggered behavior.

  • How To Generate A PWM9:19

    Generate a precise PWM signal on an FPGA by driving a counter with a 50 MHz clock, configuring a one-second period and a tunable duty cycle via a comparator.

  • Project : PWM LED30:41

    Design a pwm led module in VHDL by building a 50 MHz driven counter to produce a 1 Hz 50% duty cycle and program the FPGA with Quartus.

  • Variables6:38

    Explore how variables store intermediate values inside a process with immediate updates and multiple assignments, unlike signals. Note their declarative scope and hardware ignores initial values.

  • Functions and Procedures8:10

    Explore functions and procedures in VHDL, including syntax and reusable algorithms within architectures, processes, and packages. Understand how functions return values and procedures use inout parameters.

  • Packages and Libraries8:03

    Explore how packages and libraries share declarations across designs, use the current working library with the use keyword, and centralize types like a traffic light data type in a package.

  • Parameterised Components6:36

    Explore how parametrized components use generics to configure individual module instances. Define generics in entity declarations and instantiate multiple components with different values to support various bit widths.

  • Type Conversions5:59
  • Miscellaneous Topics2:22

    Learn the two uses of the others keyword in VHDL: cover unspecified case choices and assign a single value to all elements of an array, using binary or hex forms.

  • Tri-State Drivers1:50

    Learn to implement FPGA tri-state drivers using a process block, with an enable control that drives the external output or tri-states it ('z'), while internal FPGA signals remain undriven.

  • Comparators3:03

    Learn how to implement comparators in vhdl using an if statement, with combinational and registered output options, driven by signals a, b, and out.

  • Multiplexers4:45

    Learn to implement a VHDL multiplexer with a case statement in combinational or registered form, using a, b, c, d and a select, with asynchronous reset and FPGA lookup tables.

  • Shift Registers10:57

    Learn to implement a parametrized shift register in VHDL using a chain of flip-flops. Instantiate a generic shift register with configurable length for serial-to-parallel conversion.

  • Serialisers5:49

    Implement a configurable VHDL serializer that converts a parallel input into a serial output using a registered process. Use a generic data width with load and shift enable controls.

  • RAMs & ROMs13:17

    Explore implementing rams and block ram in FPGAs using VHDL; compare register banks with block ram, and cover single-port and dual-port ram designs with generics for data and address widths.

  • Finite State Machines8:28

    Design and implement a simple finite state machine in VHDL by modeling a water heating system with idle, heating, and ready states, using a registered process and case statements.

  • State Machine Practise
  • Good Design Practice I16:07

    Improve FPGA design readability and timing by using meaningful signal names, proper indentation, and registered inputs/outputs; avoid clocking from logic, favor pipelined, synchronous designs with dedicated clocking resources.

  • Good Design Practice II8:12

    Synchronize all asynchronous inputs with a two-flip-flop synchronizing chain to prevent glitches, and manage clock-domain crossing using handshakes and reset synchronization for reusable FPGA designs.

  • Project : LED Shift Register (FPGA Explorer Development Board)55:58
  • Project : LED Shift Register (Cyclone IV Development Board)36:37

    Learn to implement a four-bit LED shift register on an FPGA using VHDL, drive a rotating pattern with a push button, and synchronize asynchronous inputs to avoid glitches.

  • How To Debounce A Switch Input7:54

    Debounce a switch input with a two-threshold counter, using zero and an upper threshold to filter bounces and deliver a clean active or inactive output after about 50 ms.

  • Project : De-bouncing Asynchronous Input11:47

    Implement a debounced input circuit in VHDL by using a counter and upper and lower thresholds to clean the switch, preventing multi-press shifts in the shift register.

  • Quartus Timing Analyser (For Both Development Boards)31:57
  • Project : Driving An LCD Display (FPGA Explorer Development Board)1:50:56
  • Project : Driving A Seven Segment Display (Cyclone IV Development Board) Part 112:29

    Drive a seven-segment display on an fpga board by multiplexing four digits with a common anode and segment control (a through g, dp) to display digits zero to nine.

  • Project : Driving A Seven Segment Display (Cyclone IV Development Board) Part 259:32

    Learn to design an FPGA circuit with VHDL that counts button presses and displays the count on a seven-segment display, using input synchronization, debouncing, a decoder, and a state machine.

  • Test Benches I6:34

    Test benches drive input to the design under test and verify outputs, while vectors and results are stored in text files and logged with severity levels.

  • Test Benches II5:16

    Demonstrate writing data to a text file in a VHDL test bench by opening, buffering the line, writing signals to the line, and closing the file after simulation.

  • Test Benches III4:17

    Read data from a text file into test bench signals by opening the file and reading lines with a line buffer. Parse an integer, a character, and a binary value.

  • UART Block Diagram14:51
  • UART Protocol7:49
  • BaudClkGenerator Block Diagram2:26

    Implement a baud clock generator on an FPGA, using a mid-period counter to generate pulses and a start-loaded counter to emit a fixed number of pulses.

  • BaudClkGenerator VHDL35:33

    Discover how to implement a baud clock generator in VHDL for an FPGA, detailing entity, architecture, and a counter-based baud pulse for RS-232 serial data.

  • BaudClkGenerator Test Bench42:16

    Learn to build and simulate a baud clock generator test bench. Compile the module, instantiate the test bench, drive reset and clock, and verify ten clock pulses.

  • Serialiser Block Diagram1:30

    Explain how to implement a serializer using a shift register to convert parallel data to a serial bitstream, loading data, enabling shifts, rotating right, and signaling end of packet.

  • Serialiser VHDL17:09

    Learn to implement a VHDL serializer with a shift register, using a generic data width, controlled by load and shift enable signals, with an asynchronous reset and idle default state.

  • Serialiser Test Bench37:39

    Compile the serializer module in a VHDL test bench, then write and simulate a bench to drive a shift-register transmitter. Verify lsb-first output with clocked data and generics-driven configuration.

  • UART Transmitter VHDL22:23

    Design a uart transmitter in VHDL using a zero model, integrating a regenerator for timing and a serializer to output data with start and stop bits.

  • UART Transmitter Test Bench29:42

    Explore how to build and run a UART transmitter test bench in a VHDL FPGA project, validating data patterns, baud rate timing, and stop-bit behavior through simulation.

  • Shift Register VHDL17:25

    Implement a flexible VHDL shift register for a receiver path, converting serial input to parallel output via cascaded flip-flops with a generic width and selectable shift direction.

  • Shift Register Test Bench25:41

    Explore compiling and testing a VHDL shift register using a dedicated test bench. Drive a 50 megahertz clock, instantiate with generics and ports, and verify eight-bit data shifts using simulation.

  • Synchroniser VHDL12:52

    Implement a VHDL synchronizer module using two flip-flops to resynchronize an asynchronous receive signal, with a shift-register approach and a configurable reset state via a generic.

  • Synchroniser Test Bench13:44

    Master testing a synchroniser module in VHDL by building a test bench, fixing syntax errors, instantiating components, driving clocks and asynchronous inputs, and observing shift-register capture in simulation.

  • UART Receiver VHDL46:14

    Demonstrates a UART receiver by instantiating synchronization, shift register, and control components, synchronizing asynchronous input, and generating mid-bit sampling with a state machine.

  • UART Receiver Test Bench39:46

    Learn how to simulate and verify a uart receiver in a vhdl test bench for an fpga design, including compiling, debugging errors, and driving data through the test environment.

  • Summary So Far2:50

    Design a flexible FPGA transmitter and receiver in VHDL using a serializer and generator to create a serial bitstream and timing pulses, with a top-level module to echo data back.

  • Top Level Module VHDL28:38

    Instantiate the top level VHDL module by declaring and wiring transmitter and receiver components, defining generics and ports, and implementing a simple state machine to echo received data.

  • Top Level Module Test Bench I25:37

    Compile the top level module to verify syntax, then create a test bench that instantiates it, configures generics, and drives a character transmit sequence.

  • Top Level Module Test Bench II35:07

    Compile the top-level test bench, fix syntax errors, and run simulations to verify UART-like transmission, including start bit, data bits, and stop bit, then plan automated checks.

  • Quartus Implementation & Conclusion (FPGA Explorer Development Board)43:34
  • Quartus Implementation (Cyclone IV Development Board)37:16

    Create a Quartus project, integrate all FPGA design files, assign pins, and generate a binary for the development board while configuring timing constraints.

  • Conclusion (Cyclone IV Development Board)17:32

    Conclude by compiling and programming the FPGA project with USB Blaster, adjusting reset polarity, using the Quartus editor, and exploring volatile versus non-volatile configuration and reprogramming, test benches, and models.

  • Quartus Project and Dev Board Schematics0:03

Requirements

  • Fundamentals of digital electronics & logic gates
  • Knowledge of binary and hexadecimal number systems

Description

Course Audience :

This course is aimed at students & engineers who want to get into the field of FPGA development using VHDL. No prior knowledge in VHDL/FPGA is assumed so we will start from the very basics.

Students should have a basic knowledge of digital electronics including logic gates and flip-flops.


Course Summary :

This course covers the VHDL language in detail. In between lectures, we will complete a number of fun projects (please see below) with increasing complexity to consolidate the knowledge we have gained during the course. We will go through how to write Test Benches and we will implement a number of Test Benches to verify the UART project. We cover the Intel Quartus software in detail and also go through how to simulate Test Benches using using ModelSim.


Projects (Implemented and Tested On the FPGA Explorer Development Board and the Cyclone IV Development Boards):

1. Reading a switch input and driving an LED output.

2. Simple State Machine which reacts to user input and drives a number of LEDs

3. Synchronising and de-bouncing a Switch Input.

4. Generating a PWM output.

5. Designing a Shift Register.

6. 4 Digit Numeric Display for counting the number of push button activations.

7. UART Module & State machine for echoing characters received from a PC over USB or RS232.


Intel Quartus Softare:

1. Creating & Compiling a new project.

2. Performing pin assignments.

3. Basic introduction to Quartus IP Catalogue.

4. Using the USB Blaster to program the FPGA via JTAG.

5. Using the Quartus Net List Viewer to explore the hardware realisation of your design.

6. Making sense of Quartus Fitter Reports to better understand resource allocation.

7. Using the Quartus Assignment Editor.

8. Overview of Quartus settingsoptions and optimisations.

9. Basic introduction to timing analyser, timing constraints and SDC files.


Intel ModelSim Starter Edition Software :

1. Creating a new ModelSim Project.

2. Writing & compiling Test Benches.

3. Running simulations.

4. Using the Waveform viewer to analyse results.


Course Details :

We will start by covering the basics of FPGA hardware. This hardware background is vital and as we learn how to write VHDL, we will also refer back to how our code gets implemented in hardware.

In the second section of the course, we will cover the VHDL language in detail. We will cover all the aspects (Signals & Data types, VHDL Keywords & Operators, Concurrent & Sequential statements, Entity & Architecture, Process Block, Generics, Constants & Variables, Records, Component Instantiation, Procedures & Functions, Packages & Libraries and Type Conversions) that are needed to be able to develop complex and advanced FPGA designs. There will be plenty of simple examples to allow you to learn the VHDL language quickly and enable you to confidently write your own code. We will also look at how most of the VHDL language maps to hardware on the actual device.

With this strong foundation in the language, we will look at how to build fundamental FPGA blocks starting from Tri-State Drivers, Registers, Comparators, Multiplexers, Shift Registers, Serialisers, RAMs & ROMs and Finite State Machines. We will look at how to code all of the above structures and also explore how these are implemented in real hardware in the FPGA.

In the next section, we will look at hierarchical design with VHDL. This design practise is used when creating complex designs having more than one design unit. We will explore this concept from an example to see how design units can be joined together to form a hierarchical design.

In the next section we will explore good FPGA design practise. From my experience most beginners in FPGA design make common mistakes and fall into certain traps. Some of these can lead to issues that are very difficult to debug and fix. The idea behind this section is to make you aware of these common pitfalls and explore ways in which we can circumvent these. We will talk about Latches, Generated Clocks, Clock & Data Gating, Benefits of a Register Rich Design, Benefits of Synchronous Design, Dealing With Asynchronous Inputs, Clock Domain Crossing, Designing for Reuse, Signal Initialisation, Synchronising Reset De-assertion, Routing Clocks & Resets and Using PLLs.

By this stage, we would have covered a lot of the theory and also completed a number of design projects so you should have the knowledge to create your own FPGA designs independently. We will now cover design verification. This section will explore how to write test benches. We will explore aspects of VHDL coding styles for writing test benches. We will discuss how to perform file IO for creating input vectors and to store output results. We will also discuss self-checking test benches to help automate the test process.

In the final section of the course, we will design a UART module controlled by a State machine. We will write VHDL code to implement the UART and state machine from scratch. We will use a hierarchical design approach where we will have a number of design units. We will write test benches for each design unit and perform simulations (using ModelSim) for verification.  We will bring all design units together into our top level VHDL module and do a system level simulation. Next, we will explore how to create & configure a project in Intel Quartus to implement our design on our FPGA development board. We will look at how to do the pin assignments and also very briefly look at applying very basic timing constraints to get our design to pass. We will then test the design on real hardware to make sure our design works as intended.



Who this course is for:

  • Graduate students looking for a career as an RTL engineer or Design Engineer
  • Electronics engineers/hobbyists who want to get into the field of FPGA design
  • Those interested in FPGA development who are looking for an introductory course
  • Anyone about to embark on their first VHDL design project