新手入门 Makefile:FPGA 项目实战教程(一)
系列文章目录
1、VMware Workstation Pro安装指南:详细步骤与配置选项说明
2、VMware 下 Ubuntu 操作系统下载与安装指南
3、基于 Ubuntu 的 Linux 系统中 Vivado 2020.1 下载安装教程
4、利用 Makefile 高效启动 VIVADO 软件:深入解析与实践
引言
在上一篇4、利用 Makefile 高效启动 VIVADO 软件:深入解析与实践文章中,大概的介绍了通过makefile对vivado2020.1进行GUI的启动,接下来将详细的介绍makefile的自动化流程。
文章目录
一、Makefile 基础与 FPGA 项目环境
1.1 什么是 Makefile?
Makefile 是一种用于自动化构建和编译项目的工具,它使用简单的语法描述项目中的文件如何编译以及它们之间的依赖关系。在 FPGA 开发中,使用 Makefile 可以大大简化项目的编译和管理过程,尤其当项目包含多个源文件、IP 核和约束文件时,Makefile 能够清晰地定义编译流程,实现一键式构建。
对于 FPGA 开发者来说,掌握 Makefile 的基本使用方法是提高开发效率的关键一步。通过 Makefile,你可以将原本需要在 Vivado 图形界面中完成的一系列操作(如添加文件、设置顶层模块、综合、实现、生成比特流等)自动化,从而更专注于设计本身。
1.2为什么在 FPGA 项目中使用 Makefile?
在 FPGA 项目中使用 Makefile 有以下几个显著优势:
自动化流程:可以将重复性的任务(如添加文件、综合、实现、生成报告等)自动化,减少手动操作的错误和时间消耗。
版本控制友好:Makefile 本身是文本文件,易于纳入版本控制系统,方便团队协作和代码管理。
可重复性:确保每次构建都遵循相同的步骤,提高结果的可预测性和一致性。
跨平台兼容性:Makefile 可以在不同的操作系统(如 Linux、Windows 和 macOS)上使用,只需进行少量调整。
集成测试:可以方便地集成仿真、综合和实现等测试流程,实现完整的 CI/CD(持续集成 / 持续部署)工作流。
1.3 环境准备
在开始使用 Makefile 进行 FPGA 项目开发之前,需要确保以下环境已正确设置:
- 安装必要工具:
Vivado:Xilinx 的 FPGA 开发工具,本教程以 Vivado 2020.1 为例。
GNU Make:大多数 Linux 系统默认已安装,可通过以下命令验证:
make --version
- 文本编辑器:如 Vim、nano 或 VS Code 等,用于编写 Makefile 和 Verilog 代码。
设置环境变量:
在 Linux 系统中,需要将 Vivado 的命令行工具路径添加到系统路径中。打开终端,编辑
.bashrc
文件:
nano \~/.bashrc
在文件末尾添加以下行(根据 Vivado 实际安装路径调整):
source /opt/Xilinx/Vivado/2020.1/settings64.sh
保存并关闭文件,然后执行以下命令使配置生效:
source \~/.bashrc
)
验证安装:
打开新的终端窗口,输入以下命令验证 Vivado 命令是否可用:
vivado -version
如果正确输出版本信息,则说明环境设置成功。
二、Makefile 基础语法
2.1 Makefile 基本结构
Makefile 由一系列规则组成,每个规则通常包含以下几个部分:
目标 ... : 依赖 ...
命令
命令
目标:要生成的文件或要执行的操作(如可执行文件、目标文件或伪目标)。
依赖:生成目标所需要的文件或其他目标。
命令:生成目标所需执行的具体命令,必须以 Tab 键开头。
例如,一个简单的 Makefile 规则可能如下所示:
led_bit: top.v led.xdc
vivado -mode batch -source build_project.tcl
2.2 变量定义
在 Makefile 中可以定义变量来存储常用的值,如文件路径、编译器选项等,这使得 Makefile 更易于维护和修改。变量定义的基本语法是:
变量名 = 值
或使用:=
进行显式赋值:
变量名 := 值
在 FPGA 项目中,常见的变量包括:
# 项目名称
PROJECT_NAME = led_project
# FPGA型号
FPGA_PART = xc7a100tfgg484-2
# 源文件目录
SRC_DIR = ./src/rtl
# 约束文件目录
CONSTRAINTS_DIR = ./src/constraints
# 生成的比特流文件路径
BITSTREAM_PATH = ./output/$(PROJECT_NAME).bit
变量的引用使用$(变量名)
或${变量名}
格式:
$(PROJECT_NAME).bit: $(SRC_DIR)/top.v $(CONSTRAINTS_DIR)/led.xdc
vivado -mode batch -source build_project.tcl -tclargs $(PROJECT_NAME) $(FPGA_PART)
2.3 自动变量
Makefile 提供了一些自动变量,它们在规则的命令中具有特殊含义:
自动变量 | 描述 |
---|---|
$@ |
当前目标的名称 |
$< |
第一个依赖文件的名称 |
$^ |
所有依赖文件的列表,以空格分隔 |
$? |
所有比目标文件新的依赖文件的列表 |
这些变量在编写通用规则时特别有用。例如:
%.bit: %.v %.xdc
vivado -mode batch -source build_project.tcl -tclargs $@ $<
2.4 伪目标
伪目标不是实际存在的文件,而是执行特定命令的目标。通过声明伪目标,可以避免与实际文件名称冲突,并确保每次执行时都会运行相应的命令。伪目标使用.PHONY
声明:
.PHONY: all clean synth impl bitstream
常见的伪目标包括:
all:默认目标,通常用于执行多个其他目标。
clean:用于清理生成的文件和目录。
synth:执行综合过程。
impl:执行实现过程(布局布线)。
bitstream:生成最终的比特流文件。
2.5 注释和特殊符号
注释:以
#
开头的行是注释。@符号:在命令前加
@
可以禁止显示命令本身,只显示输出。- 符号:在命令前加
-
可以忽略命令执行中的错误。
例如:
# 生成比特流文件
bitstream:
@echo "Generating bitstream..."
-vivado -mode batch -source generate_bit.tcl
三、FPGA 项目结构设计
3.1 推荐的 FPGA 项目目录结构
为了更好地组织项目文件,建议采用以下标准目录结构:
project\_root/
├── src/
│ ├── rtl/ # RTL源代码
│ ├── constraints/ # 约束文件
│ └── ip/ # IP核文件
├── scripts/ # Tcl脚本和Makefile
├── reports/ # 生成的报告文件
└── output/ # 生成的输出文件(比特流、日志等)
这种结构有助于保持项目的清晰和易于管理:
src/rtl/:存放所有 RTL 设计文件(.v 或.vhd)。
src/constraints/:存放约束文件(如 XDC 文件)。
src/ip/:存放 IP 核文件(如 XCI 文件)。
scripts/:存放 Tcl 脚本和 Makefile。
reports/:存放综合和实现过程中生成的报告文件。
output/:存放最终生成的比特流文件和其他输出文件。
3.2 典型的 FPGA 项目文件类型
在 FPGA 项目中,通常会遇到以下几种文件类型:
RTL 源文件(.v 或.vhd):包含硬件设计的代码。
约束文件(.xdc):定义 FPGA 引脚分配、时序约束和其他配置参数。
Tcl 脚本(.tcl):用于自动化 Vivado 操作。
IP 核文件(.xci):预配置的 IP 核。
Makefile:项目构建文件。
报告文件(.rpt):综合和实现过程中生成的报告。
比特流文件(.bit):最终生成的 FPGA 配置文件。
3.3 配置环境变量
在 Makefile 中,可以通过环境变量配置项目的关键参数。例如:
# 项目名称
PROJECT_NAME = led_blink
# FPGA型号
FPGA_PART = xc7a100tfgg484-2
# 源文件目录
SRC_DIR = ./src/rtl
# 约束文件目录
CONSTRAINTS_DIR = ./src/constraints
# 输出目录
OUTPUT_DIR = ./output
# Vivado选项
VIVADO_OPTS = -mode batch -nojournal -nolog
这些变量可以根据不同的项目进行调整,而无需修改 Makefile 的核心逻辑。