FPGA学习笔记01
FPGA的工作原理(Mojo)
- 一块FPGA由通用的逻辑单元组成(具有64个输入和一个输出)。配置FPGA时,使用更多的逻辑门将这些通用的逻辑单元连接在一起,最终将输出连接至特殊的通用输入/输出(General-Purpose Input-Output,GPIO)单元,允许其通过FPGA芯片封装上的物理管脚作为数字输入和输出。如果所用的开发板内置了LED和开关,则它们将会被永久连接至FPGA的某个GPIO逻辑单元。
- 组成FPGA的逻辑块使用查找表(Lookup Tabel, LUT)。查找表有多个输入,例如6个输入和1个输出。设想将查找表视为6输入(64种组合)的真值表。该表对于逻辑门6输入的每种可能组合都设定义一个输入值(0或1)。这些查找表的内容,与其他布线信息一起,给定FPGA的逻辑。
- LUT常与诸如触发器之类的其他组件组合,构成独立的逻辑块。如上图显示。
- FPGA芯片上的GPIO管脚连接至专用输入/输出(IO)块,这些块提供类似微控制器的缓存的输入/输出,通常能生成和存储数十毫安(mA)的电流。
- FPGA中的绝大多数功能单元都是逻辑块,一块典型的现代FPGA具有20万至数百万个逻辑块。当FPGA作为处理器配置或仅需要存储大量数据时,需要使用固定的随机存储去(Random Access Memory,RAM)。将FPGA的一些专用领域的思想运用到极致,你会发现高端的片上系统(Systems-on-a-Chip,SoC)FPGA,其芯片上包含固定的高性能处理器核及存储器,也包含可配置逻辑单元。FPGA通常也用于超大型产品运行的专用集成电路(Application-Specific IC,ASIC)原型设计。
- LUT中的信息及布局信息是不稳定的,布局矩阵用于定义互连关系。断电时,所有的信息都会消失,FPGA恢复至初始状态。为配置FPGA,配置信息一般保存在FPGA外面的电可擦可编程只读存储器(Electrically Erasable Programmable Read-Only Memory,EEPROM)或闪存中(在断电时不会丢失)。FPGA通常有一个内置的固定硬件加载界面,在FPGA启动时进入配置信息。这一般不会超过1/5秒。
- 集成开发环境(ISE)
- ISE设计工具提供了两种设计FPGA编程方法。一种是绘制大家熟悉的逻辑原理图。另一种是硬件描述语言(Hardware Description Lanuage,HDL),例如Verilog。
- 熟练的FPGA设计者基本都使用Verilog或其他类似的VHSIC硬件描述语言(VHSIC Hardware Description Language,VHDL)。
Verilog简介
1.模块
- 将Verilog模块视为类似于面向对象语言中的类。它定义了具有公共和私有属性的逻辑集合,在设计中可多次实例化。
2.引线、寄存器和总线
- Verilog语言中的引线(将一物连接至另一物)或寄存器(存储状态,因此更类似与程序变量)在传统编程语言中是变化的。一个引线和寄存器涉及单个二进制数位。通常希望一次运行多位,因此可将多位组合为一个向量(vector),作为一个整体运行。定义向量时,会声明其高位和低位。例如一个8位:
reg[7:0] counter;
3.并行执行
- 因为Verilog描述的时硬件而非软件,在Verilog中隐含了并行性。如果设计中有3个计数器,每个计数器均连接不同的时钟,这是很合适的,每个计数器完成自己的功能。这与使用微控制器不一样,微控制器时单线程执行。
4.数字格式
- 在Verilog中你会多次处理向量,如果使用任意基数任意位长的数位向量赋值,这将很方便。Verilog使用特殊的句法。如果你没有声明位数和基数,则默认为十进制数,未使用的数位设置为0。数字格式以十进制数开始,紧跟着一个单引号,然后是基数指示符(b=二进制,h=十六进制,d=十进制),接着是常数。
4'b1011 // 四位二进制常数
8'hF2 // 八位十六进制常数
8'd123 // 八位十进制数123
123 // 未定义位数的十进制数123(ISE将尽其所能猜数位)
5.非阻塞赋值
在always语句中,使用<=
赋值,为非阻塞赋值。