赞
踩
FPGA 软件方向:以软件开发为主,开发FPGA在数据分析、人工智能、机器视觉等领域的加速应用能力,主要采OpenC和HLS技术实现软硬件协同开发。
FPGA 硬件方向:以逻辑设计为主,针对FPGA特定领域的应用设计和集成电路设计,以及芯片验证能力。
FPGA应用:通信方向(有线领域、无线领域),视频图像处理方向,数字信号处理方向,高速接口方向,人工智能机器学习方向,IC原型验证。
FPGA基本资源:可编程逻辑阵列、可编程I/O,互连线、IP核等。
内部最基本的主要单元:查找表(Look Up Tabe,LUT)和寄存器。
(1)逻辑阵列块(Logic Array Block,LAB),每个 LAB 由16个 LE(Logic Element)组成,下图是两个已经映射资源后的 LAB,资源利用率不同的 LAB 会有颜色差异(左边 LAB 使用资源量少,颜色较浅;右边 LAB 使用资源较多,颜色较深)。
放大后的 LE 如图 3-17 所示,每个 LE 主要由查找表(蓝色)和寄存器(红色)组成。
标注①处为查找表:查找表本质上就是一个 RAM。当用户通过原理图或 HDL 语言描述设计出逻辑电路后,FPGA 开发软件会自动计算逻辑电路的所有可能结果,将其列成真值表的形式,并把真值表(即输 入对应的输出逻辑)事先写入RAM,这样每输入一个信号进行逻辑运算就等于输入一个地址进行查表,找出地址对应的内容,然后输出即可。目前 FPGA 中多使用 4 输入的查找 表,所以每一个查找表可以看成一个有 4 位地址线的 RAM。
标注②处为寄存器:可以配置成多种工作方式,比如触发器或锁存器,同步复位或异 步复位、复位高有效或低有效。
标注③处为进位链:超前进位加法器,方便加法器的实现,加快复杂加法的运算。
标注④处为数据选择器:数据选择器一般在 FPGA 配置后固定下来。
(2)用户可编程I/O(User I/Os,也被简称IOE):可编程 I/O 资源分布在整个芯片的四周。
为了便于管理和适应多种电器标准,FPGA 的IOE部分被划分为若干个组(Bank), 每个 Bank 的接口标准由其接口电压 VCCIO 决定,一个 Bank 只能有一种 VCCIO,但不同 Bank 的 VCCIO 可以不同。只有相同电气标准和物理特性的端口才能连接在一起,VCCIO 电压相同是接口标准的基本条件。图 3-21 为 EP4CE10F17C8N 芯片“Pin Planner”的整体 视图,用于管脚的绑定,图中芯片被划分为 8 种不同的颜色,每种颜色代表不同的 Bank。
(3) 互连线资源(Interconnect):布线资源连通 FPGA 内部的所有单元,而连线的长度 和工艺决定着信号在连线上的驱动能力和传输速度。
FPGA芯片内部有着丰富的布线资源,根据工艺、长度、宽度和分布位置的不同划分为4类:第一类是全局布线资源,用于芯片内部全局时钟和全局复位/置位的布线;第二类是长线资源,用于完成芯片 Bank间的高速信号和第二全局时钟信号的布线;第三类是短线资源,用 于实现基本逻辑单元之间的逻辑互连;第四类是分布式的布线资源,用于专有时钟、复位等控制信号线。
(4)嵌入式存储单元(Memory Bits,也被称为 Block RAM 或简称为 BRAM):该部分资源主要用于生成 RAM、ROM、FIFO 以及移位寄存器等常用的存储模块,常用于大数据存储或跨时钟域处理,BRAM 由一定数量固定大小的存储块构成的,使用 BRAM 资源不占用额外的逻辑资源,不过使用的时候消耗的 BRAM 资源只能是 其块大小的整数倍,就算你只存了 1 bit 也要占用一个完整的 BRAM。
(5) 嵌入式乘法单元(Embedded multiPlier 9-bit elements,也简称为 DSP 块):该单元主要用于各种复杂的数学运算,乘法、除法以及常用的功能函数如:有限冲激响应滤波器(FIR),无限冲击响应滤波器(IIR),快速傅里叶变换(FFT),离散余弦变换(DCT)等,因为 FPGA 中的 LUT 和寄存器资源有限,使用嵌入式乘法单元可大大节省逻辑资源。
(6) 锁相环(Phase Lock Loop,PLL):本芯片一共有两个锁相环,芯片右上角、左下角各一个。PLL 的参考时钟由晶振通过专用时钟管脚传入,用于时钟的倍频、分频,以及相位、占空比的调整。PLL 输出的时钟信号会连接到全局时钟网络上,以保证时钟的质量,减小时钟偏斜(Skew)和抖动(Jitter)。
FPGA设计流程(野火版):
时序电路还有一个特点,就是“延一拍”的效果。上面两个图最左边的一组红色竖线所表达的就是这个现象。key_in 在复位后的第一个时钟的上升沿来到时拉高,我们可以发现此时 led_out 并没有在同一时刻也跟着拉高,而在之前的组合逻辑中输出是在输入变化的同一时刻立刻变化的,这是什么原因呢?
因为我们所画的波形图都是基于前仿真的,没有加入门延时的信息,所以很多时候数据的变化都是和时钟直接对齐的。
当表达时序逻辑时如果时钟和数据是对齐的,则默认当前时钟沿采集到的数据为在该时钟上升沿前一时刻的值;当表达组合逻辑时如果时钟和数据是对齐的,则默认当前时钟沿采集到的数据为在该时钟上升沿同一时刻的值。
仿真波形分析:我们在观察时序逻辑时不能再像观察组合逻辑那样子,因为输入和输出会有延一拍的效果,如果输入数据在前一个时钟的上升沿变化,则输出数据不会立刻变化,而是在下一个时钟的上升沿才变化,这样的现象我们简单化运用——当时钟和信号在同一时刻变化 时,我们以时钟的上升沿前一时刻采集的输入信号为依据来产生输出信号,这样我们就可以很好的观察时序逻辑产生的波形了。
Latch相关的概念与问题:
Latch的问题是因为只有组合逻辑才会产生这种问题,产生 Latch 是我们在同步电路中尽量避免的,但并不表示 Latch 没有用的或者说是错误的,Latch 在异步电路中是非常有用的,只是我们设计的是同步电路,要尽量避免。
综合出更好的电路。以下不规范的 3 种产生 Latch 的写法一定要尽量避免:
1. 组合逻辑中 if 语句没有 else;
2. 组合逻辑中 case 的条件不能够完全列举时且不写 default;
3. 组合逻辑中输出变量赋值给自己。
阻塞赋值:
一个寄存器就是“延一拍”,所 以该仿真波形和前面的 RTL 视图刚好对应,发现输入信号 in 和中间变量 in_reg、输出信号 out 的关系就是延迟一拍的关系,但是为什么只是延迟一拍呢?首先中间变量 in_reg 一定要等待复位被释放后且第一个时钟上升沿来到时才会被赋值为输入信号 in 的值,所以会比输入信号 in 延迟一拍,而中间变量 in_reg 和输出信号 out 却没有延迟一拍的关系了,而是在同一时刻同时变化的,因为我们使用的是阻塞赋值,也就是说只要赋值号右边的表达式的值有变化,赋值号左边的表达式的值也将立刻变化,所以我们最终看到的结果是中间变量 in_reg 和输出信号 out 是同时变化的。
非阻塞赋值:
根据图16-4,输入信号 in 和中间变量 in_reg 是延迟一拍的关系,而中间变量 in_reg 和输出信号 out 也 是延迟一拍的关系,也就是输入信号 in 和输出信号 out 一共是延迟两拍的关系,为什么会 这样呢?首先中间变量 in_reg 一定要等待复位被释放后且第一个时钟上升沿来到时才会被赋值为输入信号 in 的值,所以会比输入信号 in 延迟一拍,这是和阻塞赋值过程相同的,但是接下来就不一样了,因为我们使用的是非阻塞赋值,也就是说只要赋值号右边的表达式的值有变化,赋值号左边的表达式的值也不会立刻变化,需要等待下一次时钟沿到来时一起变化,所以我们最终看到的结果是输出信号 out 相对于输入信号是打了两拍的关系。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。