文章目录
数字系统和FPGA(流水线结构)
1、数字系统的简单介绍
1.1 控制单元和数据通路
如下图所示:
- 数字系统有两个基本组件:控制单元和数据通路。
控制单元能够为数据通路提供控制信号,同时数据通路能产生status信号,从而被控制块用于定义要执行的操作顺序。
另外控制单元能从外部接收控制输入信号,比如简单的start信号。数据通路也能对外部接收的数据执行操作。这个操作通常分成一步或者几步执行,每一步占用一个时钟周期。
- 数据通路块的示例包括
内部连接网络—电路线,多路复用器,总线,以及三态缓冲器
功能单元—加法器, 减法器, 移位器, 乘法器, 以及算数逻辑单元(ALU)
1.2 组合电路和时序电路
数据通路和控制单元都是基于两种类型电路:组合电路和时序电路。
组合电路:输出引脚只取决于输入引脚的值,与电路原来的状态无关。
时序电路:输出信号不仅取决于输入信号的值,也取决于当前存储模块中存储的状态。
组合电路可以根据其应用来分为以下几类:
互连电路:如多路复用器,多路输出选择器,编码器,解码器。
逻辑和算术电路:如加法器,减法器,乘法器,移位器,比较器和ALUs (多个算术模块或逻辑模块)。
多路复用器:多路的输入合并为一个输出。
编码器:把多个低电平有效信号或多个高电平有效信号,转换成多位二进制数输出。
解码器:把多位二进制数转换成多个单电平有效信号输出。
组合电路图:
如图下一个状态(如 Nj)和当前状态信号(如Sj )的数量取决于有限状态机(FSM)状态的编码类型(例如连续二进制, 格雷码,或者独热码)。
二进制编码:以2为基数进行编码。
格雷码:相邻状态转换时只有一个状态位发生翻转。
独热编码:使用N位状态寄存器来对N个状态进行编码。
1.3 数字系统中数值的表示
- 数字系统中,各种数值常用二进制或基于两个数字的方法进行表示
- 如下所示:一个正的二进制的整数B,就可又N位二进制位bi进行表示,其每一位表示一个连续的2次幂。
- 在大多数的软件表示方法中,N固定为8,16,32,64,是由软件运行的计算机架构决定的,但是FPGA的话,没必要约束这些宽度,它能根据表示数值的范围进行宽度的调整,从而减少硬件的消耗;
- 比如说,640*480的图像,就可以分别采用9位和10位整数来进行 行列坐标 的表示。
2、实现数字电路设计的几种方法对比
设计一个电路实现如下逻辑方程:
在这个电路中,输入A,B和输出 f 都是4位宽的数据。
实现数字电路设计采用如下方法:
2.1 用一个7408 TTL 器件(专用集成电路------ASIC解决方案)
其中TTL电路是晶体管-晶体管逻辑电路的英文缩写(Transister-Transister-Logic),是数字集成电路的一大门类。74系列的7408集成电路芯片是一个输入端四与门芯片。因此,一个7408 TTL 器件足以实现4-bits 功能。
针对上面的题目来说,这是一个不错的解决方案,但是缺点:TTL是过时的技术,存在高功耗和占大空间的弊端。 另外一个缺点是万一遇到设计需求的改变或者升级需要重新完整的设计一遍。也就是说 芯片的功能是制造商定义好的(永久的),不能够被改变,只能将旧芯片换成新芯片。
2.2 微处理器(软件解决方案)
其中微处理器:由一片或少数几片大规模集成电路组成的中央处理器。
微控制器:微控制器,简单来说就是微型或小型控制器。基本是指由单片机为核心的控制单元,及外部电路组成的控制器。
与第一种方法类似,这个微处理器也需要焊接到PCB上,但是在系统功能改进上它比第一种方案要更加灵活。由于解决方案是在"software"层面实施的,任何设计需求的改变可直接修改软件程序,无需修改硬件或PCB。也就是微处理器内部的硬件已经被设计好了,以便执行程序指令,根据不同的设计需求可以写出不同的程序。
缺点:需要一个专门的C 编译器来提供4-bits 宽的int型。另外要分配输入和输出(A,B,F)到微处理器物理管脚上。考虑到如果是一个标准的C编译器,开发者需要使用scanf 或者getc等输入函数来获取A和B的值,并用printf函数来输出F的值。
2.3 FPGA(介于硬件方案和软件方案之间的一个方案)
跟TTL方案和微处理器方案类似,FPGA器件亦需要焊接到PCB上,所有的输入输出引脚应该连接上。与微处理器方案相比,FPGA方案的最大的不同点是:解决方案并不是在软件中实现。FPGA方案是一个硬件方案,若需要修改,可以在FPGA中建立起一个新的电路,然后生成一个新的FPGA配置即可,且无需修改PCB。电路的描述可以用VHDL或者Verilog语言。
3、FPGA(现场可编程逻辑门阵列)
3.1 什么是可编程硬件?
可编程硬件就是得到一个通用电路,并可针对特殊的应用对该通用电路的功能进行编程实现。
如下是可编程阵列的解释:
左:可编程的与 和 或
中:PAL :可编程的与 和 固定的或
右:PROM /LUT:可编程的或 和 固定的与(每一个 与门 都对应一个输入信号的组合)
但是一般来说,可编程只读存储器并不是用右边结构来实现的,是将可编程器件用可编程存储单元来代替,如下所示:
3.2 FPGA的内部结构
- FPGA芯片结构采用像SRAM或者FLASH存储器一样的"可写"技术。
- FPGA 器件有3种主要可配置组件:
逻辑块:通常基于查找表结构(前面分析的可编程的或 和 固定的与 阵列组成)
路由单元:为经过路由单元的每个数据帧寻找一条最佳传输路径,并将该数据有效地传送到目的站点
输入输出(I/O)块:将FPGA核心部分以及内部的其他部分与外围器件进行连接。
由此,在任意配置下,可实现各个模块的连接,从而能改变内部逻辑。
如下是FPGA内部结构图:
如下是对 f(A,B) = A and B 的实现:
3.3 FPGA内的逻辑器件
3.3.1 逻辑单元
FPGA内逻辑器件的最小单元是逻辑单元,它通常是由一个小的查找表和一个输出端锁存器组成
如下是FPGA的一个逻辑单元的方框图:
3.3.2 查找表
- 三输入的LUT为3-LUT;LUT可实现其输入的任意函数;将LUT多层级联(将输出连到下一层的输入),可实现复杂功能。
- LUT的最佳尺寸是4-6个输入,由此来判断是大LUT还是小LUT;大LUT有更多的数据传输延迟
- 锁存器用来寄存输出
- 可将多个逻辑单元连接并合并到一个逻辑功能块,功能块内的所有逻辑单元共享通用控制信号(通用时钟和时钟使能信号),在逻辑功能块中,相同逻辑功能块内的输出信号可直接用作块内其他逻辑单元的输入,通过直接连接的方式,可减少互连布线信号的数量,减少关键路径上的传输延迟。
- 使用专用复用器,可将相邻的LUT相连,实现复杂功能。
- 最佳逻辑单元块的大小是4-10个逻辑单元
给出一个例子,看一个计算中有几个LUT?
根据下面的全加器真值表可看出,此操作在FPGA上,1个全加器需要2个3-LUT,一个用来产生和,一个用来产生进位。
3.4 FPGA的功耗
分别动态和静态功耗
动态:信号01或者10切换时的功耗
静态:不进行信号切换时的功耗——仅仅是设备开机的功耗
可以用什么方法让功耗变小呢?
通常来说,时钟信号本身会消耗大部分功率,因此可降低时钟频率
逻辑器件之间互连线长度最小化
3.5 FPGA的编程语言
- 为了让工作人员读懂工程设计,因此要对工程进行编码——也就是用HDL语言进行硬件描述
- 综合:将硬件描述进行转化,成一个由器件或门电路组成的网表——RTL图,也可定义不同构造块间的互连关系
- RTL图:可描述FPGA实际创建的逻辑电路
如下是FPGA的设计流程:FPGA上实现算法要同时对软件(算法方面)和硬件(逻辑电路)技巧进行融合
3.6 FPGA的流水线结构
- 流水线结构是把逻辑分成更小的块,展开为多个时钟周期,以减少每个时钟周期的传播延迟,从而使得设计的时钟速率更快。
- 如何分成更小的块?在各个计算之间插入寄存器,尽管寄存器也会引入额外的小延迟,但相当于传播延迟来说可忽略
- 流水线的方式能让吞吐量随着时钟速率的增高而增加。
- 虽然整个的计算占用多个时钟周期,且第一次运算的总时间不会改变,但是后续每一个时钟周期都会完成一个计算输出
如下为简单流水线的例子:
第一个:一个时钟周期内完成运算
第二个:两级流水线
第三个:四级流水线,将计算分成四个时钟周期来完成