杰瑞科技汇

eda技术实用教程 vhdl版

EDA技术实用教程(VHDL版)

前言:什么是EDA与VHDL?

  • EDA (Electronic Design Automation):电子设计自动化,是利用计算机辅助工具,完成电子系统设计的全过程,它就像电子工程师的“CAD”软件,涵盖了从原理图设计、仿真、综合到布局布线的方方面面。
  • VHDL (VHSIC Hardware Description Language):超高速集成电路硬件描述语言,是一种用于描述电子电路系统结构和行为的语言,它和Verilog是业界最主流的两种HDL语言。

本教程核心目标:学会使用VHDL语言,借助EDA工具(如Xilinx Vivado, Intel Quartus Prime),完成从设计构思、代码编写、功能仿真、综合实现到最终硬件验证(FPGA开发板)的全过程。

eda技术实用教程 vhdl版-图1
(图片来源网络,侵删)

第一部分:基础入门篇

第1章:EDA技术概述

  1. 什么是EDA?
    • EDA的定义、发展历程和重要性。
    • 传统设计与现代EDA设计的区别。
  2. EDA设计流程
    • 设计输入:原理图输入、HDL代码输入(VHDL/Verilog)。
    • 功能仿真:验证逻辑功能是否正确,不考虑延时。
    • 综合:将HDL代码转换为由基本逻辑门(与、或、非、触发器等)组成的网表。
    • 实现:布局布线,将网表映射到具体的FPGA/ASIC芯片上。
    • 时序仿真:考虑了实际硬件延时的仿真,验证电路在高速下能否正常工作。
    • 编程/配置:将最终生成的位流文件下载到FPGA芯片中。
  3. 主流EDA工具介绍
    • 综合工具:Synplify Pro, Precision Synthesis。
    • FPGA厂商开发套件
      • Xilinx:Vivado (主流), ISE (逐渐淘汰)。
      • Intel (原Altera):Quartus Prime。
    • 仿真工具:ModelSim (主流), Questa Simulator。
  4. 为什么选择VHDL?
    • 语法严谨:强类型语言,不易出错,适合大型、复杂项目。
    • 文档性强:代码本身就像一份详细的设计文档,可读性好。
    • 标准化:是IEEE标准(IEEE 1076),通用性强。
    • 面向设计:支持从系统级到门级的抽象描述。

第2章:VHDL语言基础

  1. VHDL设计实体结构

    • 一个完整的VHDL设计由 entity (实体) 和 architecture (结构体) 组成。

    • 实体:定义设计的对外接口,即输入和输出端口。

    • 结构体:描述设计的内部逻辑行为或结构。

      eda技术实用教程 vhdl版-图2
      (图片来源网络,侵删)
    • 程序包:提供预定义的数据类型、函数和组件声明。

    • 配置:高级概念,用于指定结构体与实体之间的绑定关系。

    • 示例:一个最简单的与门设计。

      library IEEE;
      use IEEE.STD_LOGIC_1164.ALL;
      entity and_gate is
          Port ( A : in  STD_LOGIC;
                 B : in  STD_LOGIC;
                 Y : out STD_LOGIC);
      end and_gate;
      architecture Behavioral of and_gate is
      begin
          Y <= A and B;
      end Behavioral;
  2. 基本数据类型与操作符

    eda技术实用教程 vhdl版-图3
    (图片来源网络,侵删)
    • 标准逻辑类型
      • STD_LOGIC:9值逻辑 ('U', 'X', '0', '1', 'Z', 'W', 'L', 'H', '-'),必须使用 library IEEE; use IEEE.STD_LOGIC_1164.all;
      • STD_LOGIC_VECTORSTD_LOGIC的数组,用于表示总线。
    • 操作符
      • 逻辑操作符and, or, not, nand, nor, xor, xnor
      • 算术操作符:, , , , mod, rem
      • 关系操作符:, , <, >, <=, >=
      • 移位操作符sll, srl, sla, sra, rol, ror
  3. VHDL词法规则

    标识符、注释、分隔符、字符串。


第二部分:核心设计篇

第3章:组合逻辑电路设计

  1. 进程语句
    • 核心概念:VHDL中描述动态行为的最基本单元。
    • 敏感表process (敏感信号列表),当列表中的任何一个信号发生变化时,进程将被激活。
    • 进程内部:包含顺序语句(如 if, case, loop),描述信号在特定条件下的变化。
  2. 常用组合逻辑电路设计
    • 三路选择器
      process (sel, a, b, c)
      begin
          case sel is
              when "00" => y <= a;
              when "01" => y <= b;
              when "10" => y <= c;
              when others => y <= 'X'; -- 处理未知状态
          end case;
      end process;
    • 编码器与译码器
    • 优先编码器
    • 七段数码管显示译码器
  3. 并发语句与顺序语句
    • 并发语句:在结构体中,所有并发语句都是“执行的,如 <= 赋值语句、进程语句、块语句。
    • 顺序语句:只在进程、函数或过程中按书写顺序执行,如 if, case, loop, wait

第4章:时序逻辑电路设计

  1. 时钟与复位
    • 时钟信号:数字电路的“心跳”,通常在进程的敏感表中列出。
    • 复位信号:将电路恢复到初始状态,分为同步复位和异步复位。
      • 异步复位:复位信号与时钟信号无关,优先级最高。
        process (clk, rst_n)
        begin
        if rst_n = '0' then -- 异步复位
            q <= '0';
        elsif rising_edge(clk) then -- 时钟上升沿
            q <= d;
        end if;
        end process;
      • 同步复位:复位信号仅在有效时钟沿起作用。
        process (clk)
        begin
        if rising_edge(clk) then
            if rst_n = '0' then -- 同步复位
                q <= '0';
            else
                q <= d;
            end if;
        end if;
        end process;
  2. 触发器
    • D触发器:最基础的时序单元。
    • JK触发器、T触发器
  3. 寄存器与计数器
    • 通用寄存器:由多个D触发器构成,用于暂存数据。
    • 计数器:由触发器和组合逻辑构成。
      • 同步计数器:所有触发器在同一时钟沿翻转。
      • 异步计数器:高位触发器的时钟由低位触发器的输出提供。
    • 示例:一个4位同步加法计数器。
      process (clk, rst_n)
      begin
          if rst_n = '0' then
              count <= (others => '0');
          elsif rising_edge(clk) then
              count <= count + 1;
          end if;
      end process;

第三部分:进阶与实用篇

第5章:状态机设计

  1. 状态机概述

    • Moore型:输出仅与当前状态有关。
    • Mealy型:输出与当前状态和输入信号都有关。
  2. 状态机的VHDL实现

    • 三段式状态机(推荐)

      1. 状态译码段:使用 case 语句根据当前状态决定下一状态。
      2. 状态寄存段:在时钟沿将下一状态锁存为当前状态。
      3. 输出译码段:根据当前状态(有时也包括输入)产生输出。
    • 示例:一个简单的序列检测器(检测"101"序列)。

      -- 状态定义
      type state_type is (S0, S1, S2);
      signal current_state, next_state : state_type;
      -- 状态寄存段
      process (clk, rst_n)
      begin
          if rst_n = '0' then
              current_state <= S0;
          elsif rising_edge(clk) then
              current_state <= next_state;
          end if;
      end process;
      -- 状态译码与输出段
      process (current_state, data_in)
      begin
          next_state <= current_state; -- 默认保持
          case current_state is
              when S0 =>
                  if data_in = '1' then
                      next_state <= S1;
                  end if;
              when S1 =>
                  if data_in = '0' then
                      next_state <= S2;
                  end if;
              when S2 =>
                  if data_in = '1' then
                      next_state <= S1;
                      output <= '1'; -- 检测到序列
                  else
                      next_state <= S0;
                  end if;
          end case;
      end process;

第6章:子程序与组件

  1. 函数
    • 用于计算一个返回值,可以有输入参数,但不能有输出参数。
    • 通常用于组合逻辑的封装。
  2. 过程
    • 可以执行一系列操作,可以有多个输入/输出参数。
    • 常用于测试平台的编写,或封装复杂的、有副作用的逻辑。
  3. 组件
    • 将一个已设计好的实体(如一个计数器)声明为一个“组件”,然后在其他设计中像调用“积木”一样实例化它。
    • 组件声明 -> 组件实例化 -> 端口映射
    • 这是实现大型、模块化设计的核心。

第7章:测试平台

  1. 测试平台的基本结构

    • 通常是一个独立的VHDL文件,不包含实体,只有结构体。
    • 内部包含被测设计组件的实例化,以及用于生成激励信号的进程。
  2. 测试平台编写技巧

    • 使用 wait 语句控制时序。

    • 使用 report 语句输出信息。

    • 使用 std.textio 包将仿真结果写入文件。

    • 示例:为前面的与门编写测试平台。

      library IEEE;
      use IEEE.STD_LOGIC_1164.ALL;
      use IEEE.STD_LOGIC_TEXTIO.ALL;
      use STD.TEXTIO.ALL;
      entity tb_and_gate is
      end tb_and_gate;
      architecture Behavioral of tb_and_gate is
          component and_gate
              Port ( A : in  STD_LOGIC;
                     B : in  STD_LOGIC;
                     Y : out STD_LOGIC);
          end component;
          signal A, B, Y : STD_LOGIC;
      begin
          -- 实例化被测单元
          uut: and_gate port map (A => A, B => B, Y => Y);
          -- 激励进程
          stim_proc: process
              variable my_line : line;
          begin
              -- 写入文件头
              write(my_line, "Time, A, B, Y");
              writeline(output, my_line);
              A <= '0'; B <= '0';
              wait for 10 ns;
              write(my_line, string'("0ns, 0, 0, ") & std_logic'image(Y));
              writeline(output, my_line);
              A <= '0'; B <= '1';
              wait for 10 ns;
              -- ... 其他激励
              wait;
          end process;
      end Behavioral;

第四部分:实践与工具篇

第8章:EDA工具使用实战

  1. 项目创建与工程设置
    • Xilinx VivadoIntel Quartus Prime 为例,演示如何创建新工程。
    • 添加源文件(VHDL文件)。
    • 指定目标FPGA器件。
  2. 功能仿真
    • 添加测试平台文件。
    • 设置仿真器(如ModelSim)。
    • 运行仿真,分析波形,验证功能。
  3. 综合与实现
    • 运行综合工具,查看RTL视图(原理图级)。
    • 运行实现流程,查看技术映射视图(门级)。
    • 查看时序报告,分析时序是否满足要求。
  4. 生成比特流与硬件验证
    • 生成用于下载的 .bit (Vivado) 或 .sof (Quartus) 文件。
    • 连接FPGA开发板(如Xilinx Basys 3, DE10-Lite)。
    • 使用JTAG或USB-Blaster下载程序。
    • 通过板载LED、开关、数码管等硬件验证设计是否正确。

第9章:设计实例

  1. 数字时钟:结合计数器、分频器、数码管显示驱动。
  2. UART收发器:一个经典的串口通信设计,包含波特率发生器、发送器和接收器。
  3. VGA图像显示控制器:控制VGA接口,在屏幕上显示简单的图形或文字。
  4. 简易CPU设计:一个非常小的8位或4位CPU,包含指令译码、算术逻辑单元、寄存器堆等。

学习资源推荐

  1. 经典教材
    • 《数字系统设计与VHDL》(Charles H. Roth Jr.):经典中的经典,讲解清晰,实例丰富。
    • 《VHDL for Engineers》(Brock J. LaMeres):现代、实用,非常适合初学者。
    • 《FPGA之道》:中文社区神作,从哲学到实践,内容极其全面。
  2. 在线课程
    • Coursera / edX:搜索 "Digital Design", "FPGA" 等关键词。
    • B站/YouTube:大量优秀的免费视频教程,如“FPGA入门到放弃”系列等。
  3. EDA工具官方文档与教程
    • Xilinx Vivado:UG901 (Vivado Design Suite User Guide: Designing with IP)。
    • Intel Quartus Prime:相关的设计指南和教程。
  4. 开源项目与社区
    • GitHub:寻找开源的FPGA项目,阅读和分析别人的代码是进步最快的方式。
    • 专业论坛FPGA技术论坛, Reddit (r/FPGA)

学习EDA和VHDL是一个“理论+实践”不断循环的过程,本教程为你搭建了一个清晰的框架,关键在于动手,从点亮一个LED开始,逐步完成复杂的项目,你将真正掌握这项强大的技术,祝你学习顺利!

分享:
扫描分享到社交APP
上一篇
下一篇