一、前言

很多人在学习FPGA或者数字IC设计时,首先面临的问题必定是编程语言的选择,目前常用的硬件描述语言有三种,即VHDL,Verilog HDL,system verilog。FPGA常用前两种,system verilog常常用于验证,是Verilog HDL的升级版,建议在学习Verilog HDL之后进行学习。由于VHDL是在军事背景下产生的,语法要求就比较严格,语法也比较多,出错的机率比较小。而Verilog HDL出生于商用,语法跟C语言长的比较相似。

关于VHDL和Verilog的选择
1、现在的企业,已经基本都使用Verilog进行开发了,仅有极少数军工企业因为历史原因使用VHDL。
2、在企业,大部分人都使用Verilog进行开发,如果您使用VHDL开发,那么进行团队协同开发的时候就会有对接障碍,团队人员无法理解你的代码。
3、网络上教学资料全部使用Verilog了,学习Verilog学习资料充足,进步更快。遇到问题查找解决方案更容易。
4、现在芯片原厂开发例程和ip 都只用verilog 了。其他第三方厂家如adi ,开发他们的芯片基于fpga 的应用也只用verilog。
综合考虑,还是比较推荐学习Verilog HDL的,就像手机生态一样,vhdl 就像早年的windows phone 系统,即使做的再优秀。因为没有足够的应用生态,只能越来越往小众发展。
因此,推荐一些FPGA入门书籍,最后一本是进阶可以使用,里面包含时序约束,复位问题,快慢时钟域数据传输问题,面积与速度优化问题,可综合电路设计等等问题的解决方法。

二、Verilog数字系统设计教程

不可能让初学者去通过阅读IEEE_Verilog_2001规则学习Verilog HDL,所以推荐一本Verilog HDL语法讲的比较全的书籍,在图书馆也比较容易找到,即夏宇闻老师的Verilog数字系统设计教程,电子书可以在原文中直接获取。

这本书Verilog HDL语法讲的比较完整,适合作为语法工具书使用,第一部分讲述了Verilog HDL的基本语法,Verilog HDL运算符大部分与C语言是相同的,需要注意的有拼接符和缩减符。选择语句与C含义基本一致,Verilog HDL含有四种循环语句,但是只有for循环可以综合成电路,for循环的含义与C语言有本质区别,具体可以查看之前写的一篇文章去理解Verilog中for循环的含义。而always,assign,begin…end这些是Verilog最常用的,也是比较简单的。对于系统函数只需要有印象即可,因为这些都只能用于测试文件的编写,都是不可以综合成电路的。
第二部分主讲数字电路中加法器,数据选择器,状态机等常用器件Verilog HDL的描述方法,以及对阻塞赋值与非阻塞赋值这些概念进行更加详细的讲解。最后会有对risc的CPU进行设计的介绍。

部分目录如下:

绪论
第一部分Verilog数字设计基础
第1章Verilog的基本知识
1.1硬件描述语言HDL
1.2VerilogHDL的历史
1.2.1什么是VerilogHDL
1.2.2VerilogHDL的产生及发展
1.3VerilogHDL和VHDL的比较
1.4Verilog的应用情况和适用的设计
1.5采用VerilogHDL设计复杂数字电路的优点
1.5.1传统设计方法——电路原理图输入法
1.5.2VerilogHDL设计法与传统的电路原理图输入法的比较
1.5.3Verilog的标准化与软核的重用
1.5.4软核、固核和硬核的概念及其重用
1.6采用硬件描述语言(VerilogHDL)的设计流程简介
1.6.1自顶向下(TopDown)设计的基本概念
1.6.2层次管理的基本概念
1.6.3具体模块的设计编译和仿真的过程
1.6.4具体工艺器件的优化、映像和布局布线
小结
思考题
第2章Verilog语法的基本概念概述
2.1Verilog模块的基本概念
2.2Verilog用于模块的测试
小结
思考题
第3章模块的结构、数据类型、变量和基本运算符号概述
3.1模块的结构
3.1.1模块的端口定义
3.1.2模块内容
3.1.3理解要点
3.1.4要点总结
3.2数据类型及其常量和变量
3.2.1常量
3.2.2变量
3.3运算符及表达式
3.3.1基本的算术运算符
3.3.2位运算符
小结
思考题
第4章运算符、赋值语句和结构说明语句概述
4.1逻辑运算符
4.2关系运算符
4.3等式运算符
4.4移位运算符
4.5位拼接运算符
4.6缩减运算符
4.7优先级别
4.8关键词
4.9赋值语句和块语句
4.9.1赋值语句
4.9.2块语句
小结
思考题
第5章条件语句、循环语句、块语句与生成语句
概述
5.1条件语句(if_else语句)
5.2case语句
5.3条件语句的语法
5.4多路分支语句
……
第二部分设计和验证部分
第三部分设计示范与实验练习

三、手把手教你学FPGA设计:基于大道至简的至简设计法

这本书是潘老师进行编写的,主要通过讲解以计数器,状态机,FIFO为架构去实现uart,SCCB,SPI,SDRAM,UDP等模块的设计,以及模块接口设计。电子书可以在原文中进行获取。

做过FPGA的都知道,80%左右的设计都可以通过计数器、状态机、FIFO或者RAM去实现,讲解这几种结构的设计的书有很多,之所以推荐这一本是因为本书的设计思想以及计数器和状态机与其他书都有所区别。关注计数器无非在于其初始值是多少,什么时候加一,什么时候计数结束这三个问题。状态机很多书上也都只是对传统的一段式,二段式,三段式进行对比讲解,而本书总结出四段式。后面两章通过从模块划分,到各个模块内部实现,调试,最终实现两个案例。
注意计数器,状态机,FIFO并不是我们最终目的,架构都是为输出信号服务。实现同一种功能往往可以使用不同架构,根据难度选择合适的架构,这是需要多加练习的。

目录如下:

第一篇 模块设计
第1章 模块
1.1 模块结构
1.2 模块的三大架构概述
第2章 计数器架构
2.1 计数器架构八步法
2.1.1 计数器规则
2.1.2 第一步:明确功能
2.1.3 第二步:功能波形
2.1.4 第三步:计数结构
2.1.5 第四步:加1和结束条件
2.1.6 第五步:定义特殊点
2.1.7 第六步:完整性检查
2.1.8 第七步:计数器代码
2.1.9 第八步:功能代码
2.1.10 总结
2.2 计数器项目实践
2.2.1 PWM流水灯项目
2.2.2 UART接口项目
2.2.3 VGA接口项目
2.2.4 SCCB(IIC)接口项目
第3章 状态机架构
3.1 状态机架构八步法
3.1.1 状态机规则
3.1.2 第一步:明确功能
3.1.3 第二步:输出分析
3.1.4 第三步:状态合并
3.1.5 第四步:状态转移
3.1.6 第五步:转移条件
3.1.7 第六步:完整性检查
3.1.8 第七步:状态机代码
3.1.9 第八步:功能代码
3.1.10 总结
3.2 状态机项目实践
3.2.1 简易报文类型识别器项目
3.2.2 SPI接口项目
3.2.3 SDRAM接口项目
第4章 FIFO架构
4.1 FIFO架构八步法
4.1.1 概述
4.1.2 第一步:确认FIFO架构
4.1.3 第二步:读状态
4.1.4 第三步:读状态启动和结束条件
4.1.5 第四步:信息FIFO读清条件
4.1.6 第五步:生成FIFO的IP核
4.1.7 第六步:其他信号的产生条件
4.1.8 第七步:FIFO代码
4.1.9 第八步:其他信号代码
4.1.10 总结
4.2 FIFO项目实践
4.2.1 报文汇聚模块项目
4.2.2 以太网切包模块项目
4.2.3 UDP打包模块项目
第二篇 模块划分
第5章 模块划分核心知识
5.1 模块划分概述
5.1.1 模块划分原则
5.1.2 模块划分端口规范
5.2 模块划分过程
5.2.1 模块划分思路
5.2.2 模块的端口及模块之间的数据流向
第6章 模块划分常用架构及项目实践
6.1 直接交互架构
6.2 无缓存rdy交互架构
6.3 有缓存rdy交互架构
6.4 请求一应答交互架构
6.5 外设交互架构
6.6 模块划分项目实践
6.6.1 AT93C46的存储与读取项目
6.6.2 温度采集与显示项目
6.6.3 OV7670图像采集项目
第三篇 项目实践
第7章 基于FPGA的温度监控系统
7.1 背景介绍
7.2 项目要求
7.3 基本原理
7.3.1 PC端(串口调试助手)
7.3.2 温度传感器DSl8820
7.3.3 数码管显示
7.3.4 蜂鸣器
7.4 设计方案
7.5 FPGA设计实现
7.5.1 硬件
7.5.2 Verilog代码设计
7.6 功能仿真
7.7 板级调试
7.8 总结
第8章 基于FPGA的图像边缘检测系统
8.1 背景介绍
8.2 设计要求
8.3 基本原理
8.3.1 PLL
8.3.2 OV7670配置与采集
8.3.3 灰度转换
8.3.4 高斯滤波
8.3.5 Sobel边缘检测
8.3.6 乒乓操作
8.4 设计方案
8.5 FPGA设计实现
8.5.1 硬件
8.5.2 Verilog代码设计
8.6 功能仿真
8.7 板级调试
8.8 总结
参考文献

四、FPGA原理和结构

前面两本一本讲语法,一本讲计数器,状态机,FIFO这些架构的应用,这本书就是用来讲解FPGA的结构以及组成的,全书很少有代码,电子书目前还没有,扫描版可以在原文中进行获取。

这本书更像一本介绍FPGA原理的科普书,读着就像读小说,写的很好,而且与现在主流的FPGA技术有结合,非常适合初学者。对FPGA的基本结构详细了解是很有必要的,前期不想直接看数据手册时,可以看看这本书,这本书还对altera和xilinx设计流程,工具以及原理进行了介绍。

目录如下:

第 1章 理解FPGA所需的基础知识
1.1 逻辑电路基础 1
1.2 同步电路设计 6
1.3 FPGA的定位和历 11
1.4 FPGA专业术语 27
参考文献 33
第 2 章 FPGA的概要
2.1 FPGA的构成要素 36
2.2 可编程技术 38
2.3 FPGA的逻辑实现 47
参考文献 59
第3 章 FPGA的结构
3.1 逻辑块的结构 61
3.2 逻辑簇 66
3.3 自适应查找表 67
3.4 布线线段 71
3.5 开关块 77
3.6 连接块 80
3.7 I/O块 81
3.8 DSP块 85
3.9 硬宏 88
3.10 嵌入式存储器 89
3.11 配置链 92
3.12 PLL和DLL 94
3.13 典型的PLL块 95
3.14 PLL块的自由度和限制 96
参考文献 98
第4 章 设计流程和工具
4.1 设计流程 105
4.2 基于HDL的设计流程 106
4.3 HLS设计 116
4.4 基于IP的设计方法 126
4.5 包含处理器的设计 128
参考文献 132
第5 章 设计原理
5.1 FPGA设计流程 134
5.2 工艺映射 135
5.3 逻辑打包 139
5.4 布局布线 144
5.5 低功耗设计工具 149
参考文献 153
第6 章 硬件算法
6.1 流水线结构 156
6.2 并行计算和Flynn分类 160
6.3 脉动算法 162
6.4 数据流机 169
6.5 流处理 177
6.6 细胞自动机 182
6.7 硬件排序算法 184
6.8 模式匹配 185
参考文献 194
第7 章 PLD/FPGA应用案例
7.1 可编程逻辑器件的现在和未来 198
7.2 超级计算机:大规模系统中的PLD/FPGA 199
7.3 网络通信领域:实现高速、高带宽通信的PLD/FPGA 204
7.4 大数据处理:Web搜索 212
7.5 基因科学:短序列拼接 214
7.6 金融市场:FPGA创造巨大财富 216
7.7 人工智能:在FPGA上实现深度学习之后 220
7.8 图像处理:搜索太空垃圾 223
参考文献 225
第8 章 新器件与新架构
8.1 粗粒度可重构架构 237
8.2 动态重配置架构 239
8.3 异步FPGA 244
8.4 FPGA系统的低功耗化技术 251
8.5 3D-FPGA 257
8.6 高速串行I/O 259
8.7 光可编程架构 263
参考文献 266

五、FPGA设计实战演练(高级技巧篇)

本书建议在进阶时使用,主要以quartus讲解时序约束,快慢时钟域下数据传输,全局复位,面积与速度优化,可综合设计讲解。电子书可以在原文中进行获取。

现代FPGA的结构越来越复杂,多时钟域的设计现在已是常态。对于功能电路来说,复位结构都必不可少。在同步逻辑设计中如何很好地处理异步复位,甚至在多时钟域之间传递(异步)复位信号也是逻辑工程师经常面临的挑战。本书除专门介绍了上述电路的设计方法外,还介绍了状态机的设计。在介绍这些通用电路结构的基础上,还介绍了代码优化以及如何对设计进行综合与布局布线优化方面的相关内容。但是不建议初学者阅读。

第1章 从PCB开始研究FPGA设计问题
1.1 基于FPGA的高速电路板设计
1.1.1 PCB材料选择
1.1.2 PCB上的传输线走线
1.1.3 阻抗计算
1.1.4 降低串扰和维持信号完整性的布线方法
1.2 FPGA的电源供电
1.2.1 供电要求
1.2.2 PCB设计的电源和地叠层分布
1.3 退耦电容
1.3.1 为何需要退耦电容
1.3.2 计算电容值
1.3.3 电容的摆放
1.4 小结
第2章 如何处理逻辑设计中的时钟域
2.1 PLL对时钟域的管理
2.2 单比特信号跨时钟域的同步处理
2.2.1 亚稳态及其危害
2.2.2 处理亚稳态的经典办法——双触发
2.2.3 使用三级触发器对亚稳态进行同步处理
2.2.4 如何同步快速信号到慢速时钟域
2.3 多比特信号跨时钟域同步处理
2.3.1 多比特信号融合
2.3.2 多周期路径规划
2.4 使用FIFO结构处理多比特跨时钟域信号
2.5 多时钟域设计分区划分
2.5.1 在时钟边界划分分区
2.5.2 多时钟域分区划分后的静态时序分析
2.5.3 对多周期规划逻辑设计进行分区划分
2.6 设计中的门控时钟行波时钟的处理
2.6.1 衍生时钟处理指导原则一
2.6.2 衍生时钟处理指导原则二
2.6.3 衍生时钟处理指导原则三
2.6.4 衍生时钟处理的其他方法
2.7 小结
第3章 正确分析衍生时钟
3.1 实例演示门控时钟分析处理
3.1.1 时钟反相生成的时钟
3.1.2 时钟经过缓冲后生成的时钟
3.1.3 经过使能处理后的时钟
3.1.4 时钟多路选择器输出的时钟
3.1.5 经外部反馈回来的时钟
3.2 实例演示衍生时钟的分析和处理
3.2.1 触发器切换生成的时钟
3.2.2 由行波计数器生成的时钟
3.2.3 由同步计数器生成的时钟
3.2.4 由PLL生成的时钟
3.3 小结
第4章 复位电路的实现及其时序分析处理
4.1 同步复位设计处理
4.2 异步复位设计处理
4.3 异步复位同步化(异步复位同步释放设计处理)
4.4 Recovery和Removal分析
4.4.1 什么是Recovery和Removal分析
4.4.2 什么是Recovery和Removal故障
4.4.3 为何总是建议使用异步复位
4.4.4 分析并解决Recovery故障
4.5 小结
第5章 如何写好状态机
5.1 状态机的特定及常见问题
5.2 如何选择状态机的编码方式
5.3 合理选择及使用单进程或多进程来设计状态机
5.3.1 多进程状态机
5.3.2 单进程状态机
5.3.3 状态机的比较
5.4 设计综合工具能够识别的状态机
5.4.1 采用Verilog编写
5.4.2 采用VHDL编写
5.5 小结
第6章 如何在书写代码时进行速度优化
6.1 逻辑设计中速度的概念
6.2 时序收敛的早期考虑
6.3 代码编写过程中时刻考虑时序优化
6.3.1 编写时序收敛代码的总体规则
6.3.2 通过减少关键路径上的组合逻辑单元数来优化时序
6.3.3 适当进行逻辑复制以优化设计速度
6.3.4 在组合逻辑中插入寄存器优化时序
6.3.5 通过寄存器平衡优化时序
6.3.6 使用并行结构优化时序
6.3.7 通过消除代码中的优先级优化速度
6.4 小结
第7章 如何在书写代码时进行面积优化
7.1 优化设计面积——操作符平衡
7.2 优化设计面积——打破设计流水
7.3 优化设计面积——资源共享
7.3.1 在互斥操作中共享操作符
7.3.2 共享表达式
7.3.3 共享逻辑功能模块
7.4 复位对设计面积的影响
7.5 从器件角度理解如何节省资源
7.5.1 利用厂家原语进行面积优化
7.5.2 巧用触发器的控制端口
7.5.3 多路选择器优化
7.6 小结
第8章 代码优化设计实例分析
8.1 对设计时序进行优化的实例分析
8.1.1 时序优化实例一:同步电路时序分析
8.1.2 时序优化实例二:异步电路及时序例外分析
8.1.3 时序优化实例三:利用PLL对设计进行时序优化
8.2 修改代码优化面积具体实例分析
8.3 小结
第9章 如何编写可综合代码
9.1 普通if和case语句可综合代码书写规则
9.1.1 基本的if语句
9.1.2 简单的case语句
9.2 如何调整if和case语句中关键信号的路径
9.2.1 简单、多个并行if语句的情况
9.2.2 单个if语句的情况
9.2.3 if语句嵌套case语句的情况
9.2.4 case语句嵌套if语句的情况
9.3 提高设计性能的代码技巧
9.3.1 通过复制数据路径提高设计性能
9.3.2 如何更好地处理if条件语句中的算术操作
9.4 代码可综合常用指导原则
9.4.1 避免创建不必要的锁存器
9.4.2 进程中的敏感列表一定要完备
9.4.3 for循环的使用以及避免组合逻辑回环
9.4.4 阻塞和非阻塞赋值
9.4.5 可综合代码设计对时钟和复位的要求
9.5 小结
第10章 综合以及布局布线优化
10.1 综合级速度与面积优化设置
10.2 使用设计助手和优化顾问
10.3 对设计执行早期时序估算
10.4 综合网表优化
10.5 物理综合
10.5.1 物理综合概述
10.5.2 针对性能的物理综合优化选项
10.5.3 针对布局布线的物理综合优化选项
10.6 了解并理解布局布线工具及其对设计的优化
10.6.1 可以帮助布局布线的一些综合建议
10.6.2 时序约束及其优化
10.6.3 优化I/O时序
10.6.4 优化设计面积
10.7 了解逻辑单元所见即所得结构
10.7.1 逻辑单元结构
10.7.2 布线延时与布线距离以及布线规则的关系
10.7.3 综合网表建议
10.7.4 综合及优化
10.8 小结
第11章 预先布图规划
11.1 增量编译
11.1.1 增量编译简介
11.1.2 使用增量编译的设计流程
11.2 为何要对设计进行分区和布图规划
11.3 对设计进行分区划分
11.3.1 设计分区划分宏观考虑因素
11.3.2 设计分区划分指导原则
11.3.3 如何对第三方设计进行分区划分
11.3.4 检查设计分区的质量
11.3.5 从底层导入设计时如何导入SDC约束
11.4 对设计进行预先布图规划的危害
11.5 布图规划
11.5.1 布图规划简介
11.5.2 布图规划布局指导原则
11.5.3 实际应用实例推荐的设计流程
11.6 小结
参考文献

六、总结

本次推荐了四本书,分别是夏宇闻老师的语法书,潘老师的至简设计法,以及FPGA结构与原理和高级技巧设计的书籍,前三本可以方便快速入门,最后一本建议有一定基础在进行阅读。后续还会推荐一些书籍以及电子书。