DEV Community

Hedy
Hedy

Posted on

How to use Xilinx FPGA VHDL?

This guide covers the basics of programming Xilinx FPGAs using VHDL, including setup, coding, simulation, and synthesis.

Image description

🔧 1. Required Tools
Before starting, install these tools:

1.1 Xilinx Vivado (Free WebPACK Edition)

  • Download from: Xilinx Downloads
  • Supports Artix, Kintex, and Zynq FPGAs
  • Includes VHDL simulator & synthesis tools

1.2 FPGA Development Board (Optional but Recommended)
Example boards:

📝 2. Creating a Simple VHDL Project
2.1 Open Vivado & Create a New Project

  1. Launch Vivado → Click "Create Project"
  2. Select RTL Project → Choose VHDL as the language.
  3. Select your FPGA board model (or manually pick the chip).

2.2 Write a Basic VHDL Example (Blinking LED)
📄 File: led_blink.vhd

vhdl
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity led_blink is
    Port ( 
        clk : in  STD_LOGIC;   -- 100MHz clock input
        led : out STD_LOGIC    -- LED output
    );
end led_blink;

architecture Behavioral of led_blink is
    signal counter : STD_LOGIC_VECTOR(26 downto 0) := (others => '0');
begin
    process(clk)
    begin
        if rising_edge(clk) then
            counter <= counter + 1;
        end if;
    end process;

    led <= counter(26);  -- Blink LED at ~1Hz (100MHz / 2^27)
end Behavioral;
Enter fullscreen mode Exit fullscreen mode

2.3 Assign FPGA Pins (Constraints File)
📄 File: constraints.xdc

tcl
# Basys 3 Example
set_property PACKAGE_PIN W5 [get_ports clk]    # 100MHz Clock
set_property PACKAGE_PIN U16 [get_ports led]   # LED0
set_property IOSTANDARD LVCMOS33 [get_ports {led clk}]
Enter fullscreen mode Exit fullscreen mode

⚙️ 3. Compile & Program the FPGA
3.1 Run Synthesis & Implementation

  1. Click "Run Synthesis" → Wait for completion.
  2. Click "Run Implementation" → Generates a bitstream.

3.2 Generate & Flash the Bitstream

  1. Click "Generate Bitstream".
  2. Connect your FPGA via USB-JTAG (Digilent/USB-Blaster).
  3. Click "Open Hardware Manager" → "Program Device".

✅ The LED should now blink at ~1Hz!

🔍 4. Simulating VHDL (Optional but Recommended)
Vivado includes a built-in simulator (XSim).

4.1 Create a Testbench
📄 File: tb_led_blink.vhd

vhdl
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity tb_led_blink is
end tb_led_blink;

architecture Behavioral of tb_led_blink is
    signal clk : STD_LOGIC := '0';
    signal led : STD_LOGIC;
begin
    -- Instantiate the design
    DUT: entity work.led_blink
    port map (
        clk => clk,
        led => led
    );

    -- Generate a 100MHz clock
    clk <= not clk after 5 ns;  -- 10ns period = 100MHz

    -- Stop simulation after 1ms
    process
    begin
        wait for 1 ms;
        std.env.stop;
    end process;
end Behavioral;
Enter fullscreen mode Exit fullscreen mode

4.2 Run Simulation

  1. Right-click "Simulation Sources" → "Add Sources" → Select testbench.
  2. Click "Run Simulation" → "Run Behavioral Simulation".
  3. View waveforms in XSim.

📌 5. Key VHDL Concepts for FPGAs

Image description

🚀 6. Next Steps

  • Try UART communication (send/receive serial data).
  • Learn Finite State Machines (FSMs) for complex logic.
  • Explore Xilinx IP Integrator for pre-built modules (PLLs, RAM, etc.).

Top comments (0)