
Explore the eight-course FPGA communication series, starting with UART, SPI, and I2C, then cover high-speed Ethernet, PCI, CAN, and related bus protocols.
Explore how interfaces are classified as simplex or duplex, half- or full-duplex, serial or parallel, and point-to-point, multi-drop, or multipoint, with UART, SPI, and I2C as examples.
Learn how UART enables asynchronous communication with start, parity, and stop bits, and implement a simplified 16550-style core with a 16-byte fifo and TX/RX logic at a fixed baud rate.
Develop and verify a simple Verilog UART transmitter and receiver, detailing idle high, start bit, LSB-first eight-bit data, stop bit, and baud-rate timing within a verification environment.
the uart rx uses an independent clock generator, starts when rx goes low, shifts in eight bits (lsb first) to form rx data, within a uart top module for verification.
Create and validate a simple uart testbench that connects inputs and outputs to the DUT, runs ten random transmissions on the N_TX line, and verifies TX and RX data.
Examine a verilog-based uart 16550 implementation focusing on basic functionality. Develop tx and rx FIFOs of 16 bytes, registers, baud generator, and transmitter/receiver logic, with start, stop, and parity framing.
Implement a 16-depth, 8-bit fifo for a 16550 uart with push_in and pop_in, D_in and D_out, and a 4-bit threshold that triggers an interrupt, tracking empty, full, underrun, overrun.
Designs a Verilog fifo module named p4 top with 8-bit data and 16-depth memory. Implements empty and full flags and gates push/pop with asynchronous reset to prevent overrun and underrun.
Learn how to update a UART fifo: manage push and pop with write and read addresses, handle full and empty flags, shift memory on reads, and keep D out synchronized.
Implement underrun, overrun, and threshold logic for a UART fifo in Verilog, using empty and full flags with push and pop and an XOR-based threshold, plus a simple testbench.
Demonstrate the fifo testbench setup and run 20 write and 20 read transactions to observe full, empty, overrun, threshold at 10 with d_in/d_out data comparison.
The lecture details transmitter operation driven by the line control register and explains oversampling choices of 16x or 13x with a programmable baud rate generator forming the baud clock.
Examine how the UART transmitter uses the line control register to select data width five through eight bits and configure start and parity logic via EPS, SP, and parity enable.
Learn how the UART transmitter uses the LCR and WLS fields to select 1, 1.5, or 2 stop bits, with durations of 16, 24, or 32 baud clock cycles.
Explore the 16550 uart transmitter design with a fifo, shift register, and data format decoder. Understand parity, stop bits, baud rate generation, and 16x oversampling that drives the tx line.
Design a UART transmitter testbench by wiring input and output ports to the DUT, generating baud pulses, and validating parity, stop bits, and an 8-bit data frame.
Implements UART RX logic with a four-state FSM that samples RX on baud pulses, computes parity when enabled, and pushes data to FIFO while signaling parity and frame errors.
Design and validate a UART RX testbench for 16550, generating baud pulses, applying LCR settings, and debugging parity with a corrected XNOR-based parity calculation to ensure correct RX reception.
Explore 16550 UART registers: THR, RBR, baud divisor latch, and IER, IIR, FCR, LCR, MCR, LSR, MSR, SPR, and how the DLAB bit switches between data and divisor access.
Explore the UART 16550 registers, focusing on the transmit holding register and receiver buffer register, and how TX FIFO and RX FIFO manage data flow with push and pop signals.
Master how the UART 16550 divisor latch and baud generator use eight-bit latches and DLAB to form a 16-bit baud count and generate baud pulses for RX and TX.
Explore the 16550 uart registers, focusing on the fcr and lcr: fifo control, dma mode, rx/tx clears, rx threshold, iir read-only behavior, and dlab-driven data format.
The lecture explains the 16550 uart line status register (lsr), including data ready and reception errors such as overrun, parity, frame, and break.
Create a testbench to verify updates to the divisor latch by setting the LCR DLAB bit and writing LSB and MSB values, producing baud pulses and updating the baud counter.
Connects UART receiver and transmitter through RX and TX FIFOs to manage data flow. Uses baud pulses, parity controls, and address 0x00 reads to push and pop data.
Explains how to configure UART TX path in a Verilog testbench: set DLAB, update LSB/MSB, select frame format, and transmit via the TX FIFO while validating parity and baud timing.
Learn how spi operates as a four-wire, full-duplex synchronous interface where the master drives the clock, data timing, and chip select, covering mode zero and other modes with edge sampling.
Understand the fundamentals of spi, including four pins (s clock, mosi, miso, slave select) and master-driven transactions, with msb-first data across 8–32 bits.
Explore SPI modes, polarity and phase definitions, and how clock edges determine data sampling; learn to implement mode 0–3 in a Verilog SPI interface.
Understand spi timing variability across devices, including chip select, s clock, mosi, and miso, and learn to wait a single s clock cycle before transmitting data in verilog on fpga.
Implement a simple SPI master with single mode, transmitting eight bits on the positive edge and sampling on the negative edge of a slower S clock, framed by chip select.
Build an 8-bit SPI master using an FSM with idle, start_tx, tx_data, and end_tx states. The module generates s_clock, asserts chip_select, and transmits data on MOSI when tx_enable is high.
This Verilog SPI master uses a two-process design to manage reset, idle, start TX, and TX data, controlling mosi, chip select, and s_clock via a next-state decoder.
Explore a Verilog SPI master demonstration: reset and tx_enable sequencing, chip select control, eight-bit data transmission on s_clock, and sampling on the negative edge toward a slave design.
Design an spi slave that samples 8-bit data on the negative edge of s_clock when chip select is low, using idle and sampling states with a left-shift register and done signal.
We build a testbench for the SPI slave by generating clock, reset, and enable stimuli and verify the master's data appears as A and then F.
Explore alternate spi master implementations using an fsm on the s clock. Understand clock generation from system clock, reset, tx enable, chip select, and 8-bit msb-first data transmission.
Understand CPOL behavior in a Verilog SPI interface, exploring idle S clock values and edges across modes 0–3 with S clock at 1/4 F clock for 8 bits.
Generate a serial clock four times slower than the system clock to drive a 16-edge SPI transfer; manage start, ready, polarity, and a 2-bit clock counter for edges.
Explore how CPHA defines the slave sampling edge in SPI, clarifying mode zero to mode three, polarity, phase, and data stability on the MOSI bus around clock edges.
The lecture explains SPI modes 0–3, detailing how CPOL sets the clock polarity and CPHA determines sampling edges, with data must be stable before each edge and the MOSI timing.
Execute an SPI master flow using cphase to start transmission on the first or delayed edge, while controlling chip select, MOSI data, and a five-state FSM.
Explain mode zero SPI, with C polarity and C phase at zero, so S clock idles at zero. Show MOSI data held for half a clock around the sampling edge.
Explore how a spi slave detects start of transmission, samples 8-bit data on the s clock, and left-shifts bits into rx data with chip select and mode-dependent edges.
Explore how a Digilent PMOD DA4 DAC uses SPI to select a DAC via a 4-bit address, send 32-bit commands, and instantly update the DAC channel with 12 data bits.
Design a master SPI controller to drive the PMOD DA4 DAC, initialize the DAC, generate a slower s clock from the 100 MHz clock, and serialize a 32-bit data word.
Showcases spi data transfer from a Verilog dut, generating 100 mhz and reducing to 1 mhz for simulation, sending 32 bits via mosi with s clock and chip select.
Implement daisy chain configuration in SPI to reduce extra chip select pins by linking slaves in a serial data path, with data passing from one slave to the next.
Operate the master to transmit 8-bit data on SGO using chip select and a serial clock at 1/8 the input rate, while concurrently receiving data via another FSM.
Design and implement a slave that handles master transactions via two FSMs, 8-bit shift registers, and a new data flag in a daisy chain SPI configuration with a test bench.
Shows a Verilog testbench for an SPI master–slave system, generating clocks, driving new_data, and transmitting 8-bit data, with two FSMs handling transmit and collect in a two-slave daisy chain.
Explore I2C fundamentals, master-slave communication with two wires, clock synchronization, and 7-bit/10-bit addressing, including write/read operations, clock stretching, and Verilog implementation.
Understand how I2C uses open drain on SDA and SC lines with pull-up resistors to produce one, while masters pull low for zero, implemented in Verilog with SDA inout.
Master the I2C start and stop conditions using SDA and SC signals, with a four-part bit duration waveform showing address, acknowledgment, and data transfer.
Describe i2c write and read transactions, including start condition, 7-bit address with r/w bit, ack/nack, data bytes, optional register address, and stop condition for memory or sensor peripherals.
Implement an I2C master finite state machine without clock stretch, handling start, slave address and operation type, address bits, acknowledgments, read and write data, and clean stop sequences.
Explore implementing an I2C master without clock stretching, handling SDA and SCL signals, 7-bit address with read/write operations, 8-bit data, acknowledgments, and an 8-state FSM from start to stop.
Demonstrates a testbench for an I2C master, including modified master behavior, manual acknowledgments, and serial write of address and data with clocked SDA control and start/stop sequencing.
Develop an i2c slave memory that understands master transactions and provides memory data for the master, using 128 eight-bit locations and synchronized start conditions with d_out for reads.
simulate a testbench for top that runs i2c master-slave transactions with 10 writes and 10 reads, printing din, address, and dout to verify correct data transmission and handshake.
Learn how to bit-bang SPI transactions on Arduino using GPIO pins, driving chip select and clock signals to send data without a dedicated SPI controller.
Learn how clock stretching lets an I2C slave pause the master by pulling the SCL line low during acknowledgment, and how to implement this in the controller's acknowledgment state.
Implement the master in Verilog by releasing the SCL line, reading rscl to detect clock stretching, and generating clocks for write and read while handling acknowledgment on the SDA line.
Modify the slave logic to handle clock stretching via a wait stretch state. Demonstrate normal operation and stretching scenarios, showing memory updates occur consistently.
This comprehensive course is meticulously designed to cater to a broad audience, ranging from beginners who are just stepping into the world of digital design and hardware description languages (HDLs) to experienced FPGA/ASIC developers looking to deepen their expertise. The central aim of this course is to equip participants with a thorough mastery of digital communication interfaces, employing Verilog as the primary tool. Regardless of your prior experience in the field, this course offers something valuable. Beginners will find a structured and gradual introduction to the complex world of digital communication interfaces and Verilog. The course spans a comprehensive curriculum that encompasses three fundamental digital communication protocols: Serial Peripheral Interface (SPI), Universal Asynchronous Receiver-Transmitter (UART), and Inter-Integrated Circuit (I2C). Each of these protocols plays a critical role in modern electronics and embedded systems, and mastering them is vital for both aspiring and experienced engineers.
In summary, this course is a transformative journey that welcomes participants at all skill levels into the world of digital communication interfaces and Verilog. It equips you with the skills, knowledge, and confidence needed to excel in the dynamic and ever-evolving field of digital design and embedded systems. Whether you're taking your first steps or seeking to advance your career, this course provides a robust foundation for your success.