VHDL入门实践:从实体结构体到进程的快速上手指南

FPGA小白
文章2026-05-02
48

Quick Start:5分钟运行第一个VHDL仿真

本指南将带你从零开始,完成一个二输入与门的VHDL代码编写与仿真验证。你将在10分钟内掌握实体(Entity)、结构体(Architecture)和进程(Process)的核心用法。

前置条件

  • 已安装任意一款VHDL仿真工具(推荐ModelSim、GHDL或Vivado Simulator)。
  • 具备基本的文本编辑能力,了解VHDL语法基础(如信号声明、逻辑运算符)。
  • 熟悉操作系统的命令行或图形界面基本操作。

目标与验收标准

  • 目标:编写并仿真一个二输入与门,使用进程实现组合逻辑。
  • 验收标准
    • 仿真波形显示:当a=‘1’且b=‘1’时,y=‘1’;否则y=‘0’。
    • 测试平台时钟生成正确,无仿真时间单位不一致的警告。

实施步骤

步骤1:创建工程与工作目录

打开仿真工具,新建工程并设置工作目录。例如在ModelSim中:File → New → Project,输入工程名(如and_gate_tutorial),指定一个空文件夹作为工作目录。

步骤2:编写实体(Entity)

在工程中新建一个VHDL源文件(如and_gate.vhd),输入以下实体描述,定义输入输出端口:

entity and_gate is
    port (
        a : in  std_logic;
        b : in  std_logic;
        y : out std_logic
    );
end entity and_gate;

原因分析:实体是VHDL模块的外部接口,定义了信号方向与类型。std_logic是标准逻辑类型,支持多值逻辑,适合仿真与综合。

步骤3:编写结构体(Architecture)与进程(Process)

在同一个文件中添加结构体,内部使用进程实现组合逻辑:

architecture behavioral of and_gate is
begin
    process(a, b)
    begin
        if (a = '1' and b = '1') then
            y <= '1';
        else
            y <= '0';
        end if;
    end process;
end architecture behavioral;

机制说明:进程的敏感信号列表(a, b)确保任何输入变化时进程重新执行。if语句描述组合逻辑,赋值使用<=信号赋值操作符。注意:组合逻辑中所有输入都应列入敏感列表,否则仿真行为可能不匹配硬件。

步骤4:编写测试平台(Testbench)

新建一个测试平台文件(如tb_and_gate.vhd),实例化被测试模块并生成激励:

entity tb_and_gate is
end entity tb_and_gate;

architecture sim of tb_and_gate is
    signal a, b, y : std_logic;
begin
    uut: entity work.and_gate
        port map (a => a, b => b, y => y);

    process
    begin
        a <= '0'; b <= '0'; wait for 10 ns;
        a <= '0'; b <= '1'; wait for 10 ns;
        a <= '1'; b <= '0'; wait for 10 ns;
        a <= '1'; b <= '1'; wait for 10 ns;
        wait;
    end process;
end architecture sim;

落地路径:测试平台中,uut是被测试的与门实例,process生成所有输入组合,每个组合保持10 ns以便观察。注意wait for语句中时间单位与仿真工具设置一致(默认ns)。

步骤5:编译与仿真

在仿真工具中编译所有源文件(通常点击Compile All)。然后启动仿真,将tb_and_gate设为顶层,运行仿真至40 ns。添加波形窗口,观察a、b、y信号。

验证结果

仿真波形应显示:

  • 0-10 ns:a=0, b=0 → y=0
  • 10-20 ns:a=0, b=1 → y=0
  • 20-30 ns:a=1, b=0 → y=0
  • 30-40 ns:a=1, b=1 → y=1

若结果正确,则验证通过。若y始终为0或出现‘X’(未知),检查敏感列表是否完整、端口映射是否匹配。

排障指南

  • 编译错误:检查实体与结构体名称是否一致,端口方向是否正确。
  • 仿真波形无变化:确认测试平台中wait for语句是否执行,顶层模块是否设置为测试平台。
  • 时间单位警告:在测试平台开头添加library ieee; use ieee.std_logic_1164.all;,并统一所有文件的时间单位(如ns)。

扩展实践

尝试将进程改为y <= a and b;的并发赋值形式,观察仿真结果是否一致。进一步可添加复位信号或实现多输入逻辑门。

参考信息

  • VHDL标准:IEEE 1076-2008
  • ModelSim用户手册:modelsim.com/doc

附录:完整代码清单

and_gate.vhd

entity and_gate is
    port (
        a : in  std_logic;
        b : in  std_logic;
        y : out std_logic
    );
end entity and_gate;

architecture behavioral of and_gate is
begin
    process(a, b)
    begin
        if (a = '1' and b = '1') then
            y <= '1';
        else
            y <= '0';
        end if;
    end process;
end architecture behavioral;

tb_and_gate.vhd

entity tb_and_gate is
end entity tb_and_gate;

architecture sim of tb_and_gate is
    signal a, b, y : std_logic;
begin
    uut: entity work.and_gate
        port map (a => a, b => b, y => y);

    process
    begin
        a <= '0'; b <= '0'; wait for 10 ns;
        a <= '0'; b <= '1'; wait for 10 ns;
        a <= '1'; b <= '0'; wait for 10 ns;
        a <= '1'; b <= '1'; wait for 10 ns;
        wait;
    end process;
end architecture sim;
分类
技术分享
标签
VHDL入门实践
浏览 48
分享:

相关推荐

同频道 · 相近分类

暂无相关推荐

作者

FPGA小白查看主页

同分类阅读

文章

延伸阅读与实操

  • 文章 + 课程联动深度文章常对应体系课章节,可一键选课。
  • 学习产出可参考笔记与作业案例在学习产出广场持续更新。

探索全站