赞
踩
本篇文章主要是记录一下FPGA的基础理论知识以及一些面试时经常会被问到的题目。
锁存器和触发器是具有记忆功能的二进制存贮器件,是组成各种时序逻辑电路的基本器件之一。区别为:latch 同其所有的输入信号相关,当输入信号变化时 latch 就变化,没有时钟端;flipflop 受时钟控制,只有在时钟触发时才采样当前的输入,产生输出。当然因为 latch 和 flip-flop 二者都是时序逻辑,所以输出不但同当前的输入相关还同上一时间的输出相关。
If…else 语句特点:具有优先级。If 不满足时,才执行 else语句。Case 语句特点:没有优先级。一般类别少的用 if…else,类别多用 case。
If…else 语句基本上可以处理所有的复杂判定条件,但是在实际电路中占用更多的资源。所以如果可以用 case 语句的话尽量用 case语句。
ARM 和 DSP 都是处理器,需要软件代码在其中运行才能工作,也就是我们常说的 CPU,只有 CPU 而没有程序,这个系统是不能工作的。而程序是顺序执行的,所以 ARM 和 DSP 的工作速度是不可能太快的。
而 FPGA 是个纯硬件,内部没有代码,一旦完成配置(只需要在上电时配置一次),就可以快速工作,内部各个模块之间没有顺序问题,是同时工作的,所以工作速度可以很快。
因此,FPGA 常用于要求工作速度快,而 ARM 或者 DSP 在工作速度上满足不了应用需求的场合。具备 1.设计灵活 2.兼容性强 3.适用性强等优势。
在 Verilog 中有两种类型的赋值语句:阻塞赋值语句(“=”)和非阻塞赋值语句("<=”)。正确地使用这两种赋值语句对于Verilog 的设计和仿真非常重要。
Verilog 语言中讲的阻塞赋值与非阻塞赋值,但从字面意思来看。
阻塞就是执行的时候在某个地方卡住了,等这个操作执行完在继续
执行下面的语句。
非阻塞就是不管执行完没有,我不管执行的结果是什么,反正我继
续下面的事情。也就是说阻塞赋值是一条一条的语句顺序执行,而非阻塞赋值则是所有语句并行运行。
阻塞与非阻塞语句的使用:
(1)在时序逻辑电路中一般使用非阻塞赋值。非阻塞赋值在块结束后
才完成赋值操作,此赋值方式可以避免在仿真出现冒险和竞争现
象。
(2)在组合逻辑电路中一般使用阻塞赋值。使用阻塞方式对一个变量
进行赋值时,此变量的值在在赋值语句执行完后就立即改变。
(3)在 assign 语句中必须使用阻塞赋值语句。
同步电路:存储电路中所有触发器的时钟输入端都接同一个时钟脉冲源,因而所有触发器的状态的变化都与所加的时钟脉冲信号同步。
异步电路:电路没有统一的时钟,有些触发器的时钟输入端与时钟脉冲源相连,只有这些触发器的状态变化与时钟脉冲同步,而其他的触发器的状态变化不与时钟脉冲同步。
同步逻辑是时钟之间有固定的因果关系。异步逻辑是各时钟之间没有固定的因果关系。
竞争:在组合逻辑电路中,信号经过多条路径到达输出端,每条路径经过的逻辑门不同存在时差,在信号变化的瞬间存在先后顺序。这种现象叫竞争。
冒险:由于竞争而引起电路输出信号中出现了非预期信号,产生瞬间错误的现象称为冒险。
表现为输出端出现了原设计中没有的窄脉冲,即毛刺。
一是修改逻辑表达式避免以上情况,二是采用时序逻辑,仅在时钟边沿采样,三是在芯片外部并联电容消除窄脉冲。
查找表(look-up-table)简称为 LUT,LUT 本质上就是一个RAM。目前 FPGA 中多使用 4 输入的 LUT,所以每一个 LUT 可以看成一个有 4 位地址线的 16x1 的 RAM。当用户通过原理图或 HDL语言描述了一个逻辑电路以后,PLD/FPGA 开发软件会自动计算逻辑电路的所有可能的结果,并把结果事先写入 RAM,这样,每输入一个信号进行逻辑运算就等于输入一个地址进行查表,找出地址对应的内容,然后输出即可。
module divide_2(clk,rst,clk_out);
input clk,rst;
output clk_out;
reg clk_out;
always @(posedge clk or negedge rst)
if(!rst)begin
clk_out<=0;
end
else begin
clk_out<=~clk_out;
end
endmodule
亚稳态是指触发器无法在某个规定时间段内达到一个可确认的状态。当一个触发器进入亚稳态时,既无法预测该单元的输出电平,也无法预测何时输出才能稳定在某个正确的电平上。在这个稳定期间,触发器输出一些中间级电平,或者可能处于振荡状态,并且这种无用的输出电平可以沿信号通道上的各个触发器级联式传播下去。
产生原因是没有满足触发器的建立时间和保持时间。
后果:由于输出在稳定下来之前可能是毛刺、振荡、固定的某一电压值,因此亚稳态除了导致逻辑误判之外,输出0~1之间的中间电压值还会使下一级产生亚稳态(即导致亚稳态的传播)。
避免:
1、对异步信号进行同步处理(采用两级触发器同步);
2、采用异步FIFO对跨时钟域数据通信进行缓冲设计;
3、对复位电路采用异步复位、同步释放方式处理;
4、使用采样相应更快的触发器。
5、降低采样速率(降频);
建立时间:触发器在时钟上升沿到来之前,其数据输入端的数据必须保持不变的最小时间。
保持时间:触发器在时钟上升沿到来之后,其数据输入端的数据必须保持不变的最小时间。
HDL:Hardware Description Language 硬件描述语言
RTL:Register Transfer Level 寄存器传输级
LAB:Logic Array Block 逻辑阵列块
DSP:Digital Signal Processing 数字信号处理
EDA:Electronic Design Automation 电子设计自动化
PLD:Programmable Logic Device 可编程逻辑器件
同步复位在时钟沿变化时,完成复位动作。异步复位不管时钟,只要复位信号满足条件,就完成复位动作。
异步复位对复位信号要求比较高,不能有毛刺,如果其与时钟关系不确定,也可能出现亚稳态。
FPGA 是基于 SRAM 查找表的可编程结构。
PGA 内部结构组成部分一般分为三部分:可编程逻辑阵列块 LAB、可编程输入输出I/0 模块、可编程内部互连线。
其中逻辑阵列块(Logic Array Block,也简称为 LAB):每个 LAB 由16 个LE(Logic Element)组成,每个 LE 由左边一个蓝色 LUT 和右边一个红色寄存器组成。
奇校验:当实际数据中“1”的个数为奇数的时候,这个校验位就是“0”,否则这个校验位就是“1”;
偶校验:当实际数据中“1”的个数为偶数的时候,这个校验位就是“0”,否则这个校验位就是“1”。
并且奇偶校验只能检验奇数个数据的错误,对于偶数个数据的错误无法检测。
FIFO : 先入先出,先进去的数据先出来。
RAM : 读出的数据顺序跟写入数据顺序不一致,可以向 RAM 中的任意位置写入数据,也可以读取任意的位置的数据。
FIFO 没有写地址和读地址,只能按顺序读写数据,而 RAM 具有读写地址,因此可以读写任意地址。
规模较大的 FIFO 一般都是用 RAM 实现的(规模特别小的 FIFO 才会使用寄存器实现)。
FIFO 常用于数据传输通道中,用于缓存数据,避免数据丢失:如不同速率时钟模块间的数据传输就需要用到异步 FIFO。
RAM 常用于存储指令或者中间的数据,如指令 cache 和数据 cache就是由 RAM 实现的。
FPGA 芯片内有两种存储器资源:一种叫 BLOCK RAM,另一种是由 LUT 配置成的内部存储器(也就是分布式 RAM)。BLOCK RAM 由一定数量固定大小的存储块构成的,使用 BLOCK RAM 资源不占用额外的逻辑资源,并且速度快。但是使用的时候消耗的 BLOCKRAM 资源是其块大小的整数倍。
我们需要考虑数据轻载和重载的情况,对缓存能力要求最高的情况为背靠背传输,则 FIFO 深度为 160-(160/100)*80=32。
对于一位的异步信号可以使用“两级触发器进行同步”,而对于多位的异步信号,可以采用如下方法:
1:可以采用保持寄存器加握手信号的方法(多数据,控制,地址);
2:特殊的具体应用电路结构,根据应用的不同而不同;
3:异步 FIFO。(最常用的缓存单元是 DPRAM);
(1)发送 START 信号
(2)发送写控制字并接收 ACK 信号
(3)发送读地址并接收 ACK 信号
(4)发送开始信号
(5)发读控制字并接收 ACK
(6)接收第一个字节数据并发送 ACK
(7)接收第二个字节数据并发送 NACK
(8)发送 STOP 信号
(1)可编程输入输出单元(I/O 单元)
目前大多数 FPGA 的 I/O 单元被设计为可编程模式,即通过软件的灵活配置,可适应不同的电器标准与 I/O 物理特性;可以调整匹配阻抗特性,上下拉电阻;可以调整输出驱动电流的大小等。
(2)编程逻辑单元
FPGA 的基本可编程逻辑单元是由查找表(LUT)和寄存器(Register)组成的, 查找表完成纯组合逻辑功能。FPGA 内部寄存器可配置为带同步/异步复位
和置位、 时钟使能的触发器,也可以配置成为锁存器。FPGA 一般依赖寄存器
完成同步时序 逻辑设计。
(3)嵌入式块 RAM
目前大多数 FPGA 都有内嵌的块 RAM。嵌入式块 RAM 可以配置为单端口 RAM、双端口 RAM、伪双端口 RAM、CAM、FIFO 等存储结构。CAM,即为内容地址存储器。写入 CAM 的数据会和其内部存储的每一个数据进行比较,并返回与端口数据相同的所有内部数据的地址。简单的说,RAM 是一种写地址,读数据的存储单元;CAM 与 RAM 恰 恰相反。
(4)丰富的布线资源
布线资源连通 FPGA 内部所有单元,连线的长度和工艺决定着信号在连线上驱动 能力和传输速度。布线资源的划分:全局性的专用布线资源:以完成器件内部的全局时钟和全局复位/置位的布线;长线资源:用以完成器件 Bank 间的一些高速信号和一些第二全局时钟信号的布线;短线资源:用来完成基本逻辑单元间的逻辑互连与布线;其他:在逻辑单元内部还有着各种布线资源和专用时钟、复位等控制信号线。
(5)时钟资源
专用输入时钟引脚、锁相环(PLL)、时钟控制模块(选择时钟以提供时钟布线网、可启用/禁用时钟以节能)、时钟布线网络(全局时钟网络驱动整个设备、局部时钟网络驱动特定的设备区域)
(6)底层嵌入功能单元
底层嵌入功能单元是指通用程度较高的嵌入式功能模块。如锁相环(Phase
Locked Loop,PLL)、DLL(Delay Locked Loop)、DSP(Digital SignalProcessing) 和 CPU 等。
首先说说异步电路的延时实现:异步电路一半是通过加 buffer、两级与非门等来实现延时,但这是不适合同步电路实现延时的。在同步电路中,对于比较大的和特殊要求的延时,一半通过高速时钟产生计数器,通过计数器来控制延时;对于比较小的延时,可以通过触发器打一拍,不过这样只能延迟一个时钟周期。
单工, 只能发或者收数据。
半双工, 可以发也可以收,但是收发不能同时进行。
全双工, 可以发也可以收,收发可以同时进行。
一般解决跨时钟域有以下几种方法:
(1)多级寄存,一般针对单 bit 控制信号跨越两个异步时钟域传输,可以采用多级寄存器。
(2)异步 FIFO/RAM 缓存,一般用于跨时钟域传输数据,写端和读端分别对应两个时钟域,由空/满信号控制着读写过程,实现数据的跨域传输。
(3)数据编码,例如采用格雷码。
bit是计算机中信息存储的基本单位。
1byte = 8bit
1word = 2byte = 16bit
1dword = 2word = 4byte = 32bit doubule
1qword = 2dword = 4word = 8byte = 64bit quadruple
原码:符号位+真值,最高位表示符号位,以8bit为例。
[+3]原 = 0000_0011
[-3]原 = 1000_0011
表示范围:-127到+127
原码中0000和1000都表示0。
反码:正数的反码是它本身,负数的反码将原码除符号位外逐位取反。以8bit为例。
[+3]原 = [0000_0011]原 = [0000_0011]反
[-3]原 = [1000_0011]原 = [1111_1100]反
表示范围:-127到+127
反码中0000_0000和1111_1111都表示0。
补码:正数的补码是它本身,负数的补码将原码除符号位外逐位取反再加1。以8bit为例。
[+3]原 = [0000_0011]原 = [0000_0011]反 = [0000_0011]补
[-3]原 = [1000_0011]原 = [1111_1100]反 = [1111_1101]补
表示范围:-128到+127
补码中0的表示只有一种形式,即0000_0000,1000_0000表示-128。
时钟抖动 jitter:指时钟信号的跳变沿不确定,故是时钟频率上的不一致。jitter 主要受外界干扰引起,通过各种抗干扰手段可以避免。
时钟偏移 Skew:指全局时钟产生的各个子时钟信号到达不同触发器的时间点不同,是时钟相 位的不一致。 skew由数字电路内部各路径布局布线长度和负载不同导致,利用全局时钟网络可尽量将其消除。
分别为.sof 和.pof文件。
sof 为 SRAM Object File,下载到 FPGA 中,断电丢失;
pof 为 Programming Object File,下载到配置芯片中,上电重新配置 FPGA。以JIC文件下载至FLASH中。
两种资源:BLOCK RAM,可编程逻辑单元(LE)分为 触发器(FF)和查找表(LUT);
1)在⽣成 RAM 等存储单元时,应该⾸选 BLOCK RAM 资源; 其原因有⼆:
使⽤ BLOCK RAM 等资源,可以节约更多的 FF 和 4-LUT 等底层可编程单元。使⽤ BLOCK RAM 可以说是 “不⽤⽩不⽤”,是最⼤程度发挥器件效能,节约成本的⼀种体现;
BLOCK RAM 是⼀种可以配置的硬件结构,其可靠性和速度与⽤ LUT 和 REGISTER 构建 的存储器更有优势。
2)弄清 FPGA 的硬件结构,合理使⽤ BLOCK RAM 资源
3)分析 BLOCK RAM 容量,⾼效使⽤ BLOCK RAM 资源
4)分布式 RAM 资源(DISTRIBUTE RAM)
Moore 状态机的输出仅与当前状态值有关, 且只在时钟边沿到来时才会有状态变化。 摩尔型状态机的输出来⾃组合逻辑,可能会产⽣⽑刺,从⽽产⽣不利的影响。
Mealy 状态机的输出不仅与当前状态值有关, ⽽且与当前输⼊值有关。
静态时序分析是采用穷尽分析方法来提取出整个电路存在的所有时序路径,计算信号在这些路径上的传播延时,检查信号的建立和保持时间是否满足时序要求,通过对最大路径延时和最小路径延时的分析,找出违背时序约束的错误。它不需要输入向量就能穷尽所有的路径,且运行速度很快、占用内存较少,不仅可以对芯片设计进行全面的时序功能检查,而且还可利用时序分析的结果来优化设计,因此静态时序分析已经越来越多地被用到数字集成电路设计的验证中。
动态时序模拟就是通常的仿真,因为不可能产生完备的测试向量,覆盖门级网表中的每一条路径。因此在动态时序分析中,无法暴露一些路径上可能存在的时序问题;
流水线设计就是将组合逻辑系统地分割,并在各个部分(分级)之间插入寄存器,并暂存 中间数据的方法。目的是将一个大操作分解成若干的小操作,每一步小操作的时间较小, 所以能提高频率,各小操作能并行执行,所以能提高数据吞吐率(提高处理速度)。
① 描述组合逻辑时,case 语句分支描述不完整,case 语句中没有使用 default 导致产生锁 存器。 当没有 default 时,如果条件无法在 case 的列表中找到与之对应的就会陷入”锁存“。
② 描述组合逻辑时,在 always 块中使用 if 语句,但是没有 else,这会导致当条件不成立时, 没有其他语句可执行,使得被赋值的寄存器一直保持不变,”锁存“住。
单 bit 信号从慢到快:在快时钟域同步打拍,将信号同步到快时钟域;
单 bit 信号从快到慢:信号展宽后进行同步打拍;
多 bit 信号从快到慢:异步 FIFO;
多 bit 信号从慢到快:异步 FIFO、握手信号。
FPGA 和 C 的联系:HLS/OpenCL
Verilog 是硬件描述语言,经过分析综合、布局布线、生成下载文件,用于配置
FPGA 芯片内部逻辑资源的连接方式。
C 是编程语言,经过预处理、编译、汇编 和链接,得到可以被处理器执行的可执行文件。
时序约束主要包括周期约束,偏移约束,静态时序路径约束三种。通过 附加时序约束可以综合布线⼯具调整映射和布局布线,使设计达到时序要求。 附加时序约束的⼀般策略是先附加全局约束,然后对快速和慢速例外路 径附加专门约束。附加全局约束时,⾸先定义设计的所有时钟,对各时钟域 内的同步元件进⾏分 组,对分组附加周期约束,然后对 FPGA/CPLD 输⼊ 输出 PAD 附加偏移约束、对全组合逻辑的 PAD TO PAD 路径附加约束。附 加专门约束时,⾸先约束分组之间的路径,然后约束快、慢速例外路径和多 周期路径,以及其他特殊路径。
1)提⾼设计的⼯作频率(减少了逻辑和布线延时);
2)获得正确的时序分析报告;(静态时序分析⼯具以约束作为判断时序是否 满⾜设计要求的标准,因此要求设计者正确输⼊约束,以便静态时序分析⼯具可以正确的输出时序报告)
3)指定 FPGA/CPLD 的电⽓标准和引脚位置。
(余数倒排法)
将要转换的十进制整数除以2,取余数;再用商除以2,直到商等于0为止,将每次得到的余数按倒序的方法排列起来即为结果。
例如:125=1111101B
3位一转换
从小数点开始分别向左向右把二进制数每三个分成一组,然后把每一组二进制数对应的八进制数写出来,就得到对应的八进制数。
例如:例如:将2进制数字(1011100101)2转换为8进制
(001 011 100 101)=(1345)8
先将八进制数按位权值展开成为十进制数,再将十进制数运用余数倒序法转换为十六进制数。
并行接口
并行接口是指数据的各位同时进行传送,其特点是传输速度快(1Mbps),但当传输距离较远、位数又多时,导致了通信线路复杂且成本提高;比如rgb888
串行接口
串行接口是指数据一位位地顺序传送,其特点是通信线路简单,只要一对传输线就可以实现双向通信,并可以利用电话线,从而大大降低了成本,特别适用于远距离通信,但传送速度较慢(115kbps~230kbps);比如uart
总线是连接多个部件的信息传输线,是各部件共享的传输介质。当多个部 件与总线相连时,如果出现两个或两个以上部件同时向总线发送信息,势必导 致信号冲突,传输无效。因此,在某一时刻,只允许有一个部件向总线发送信 息,而多个部件可以同时从总线上接收相同的信息。
共计四种通讯模式,由 CPOL(Clock Polarity)时钟极性和 CPHA(Clock
Phase)时钟相位定义为模式 0/1/2/3 四种模式。如下图所示:
SPI是一种高速、全双工、同步通信总线,在芯片中只占用四根管脚用来控制
及数据传输,分别是片选信号 cs_n,串行时钟线 sclk,和两条数据总线。 当
spi 进行多从机通信时,通过拉低相应的 cs_n 选中从机。
SPI 总线是一种支持一主机多从机的通信总线,它通过片选信号对从机进行寻址,主机在发起通信之前需要先拉低对应从机的片选信号 CS_N,然后产生串行时钟 SCLK,同时向 MOSI 总线发送数据、从 MISO 采样数据,当通信结束的时候,再由主机拉高片选信号。
IIC 总线上的每一个器件都有一个唯一器件 ID,主机可以利用这个地址进行不同设备之间的访问只有总线上的传输与该器件的 ID 匹配时,该器件才会对总线上的传输做出相应的响应。
IIC 总线是一种支持多主机多从机的通信总线,它通过设备地址对从机进行寻址,只有设备地址匹配的从机才会向主机发出应答,然后主机继续传输下一个字节。而且,主机每发送一字节数据给从机,从机需要向主机发送一 bit应答信号,当从机给出有效应答后,主机才会继续传输下一个字节,以此保证主从与从机之间的正常通信,因此 IIC 总线是一种具有流控机制的可靠串行总线。此外,在含有多主机的 IIC 总线上还会有总线仲裁器,对每个主机的总线抢占权进行仲裁,以避免多个主机同时向总线发起通信造成碰撞。
wire 类型(线网类型),表示的是直通,即一根线,一侧连接输入另一侧连 接输出,输入变化则输出随之变化。当没有输入时候,wire 型变量的默认值是 Z(高阻态)。
而 reg 类型(寄存器类型)表示的是存储单元,会一直保持原有的数据即默认 值 X(未知态),直至相应的触发信号产生,输出才会有变化。
高阻态:电路的一种输出状态,既不是高电平也不是低电平,如果高阻态 再输入下一级电路的话,对下级电路无任何影响,可以理解为断路,不被任何 东西所驱动,也不驱动任何东西。
时序设计的实质就是满足每一个触发器的建立时间和保持时间的要求。
EEPROM:(2Block × 256 × 8)bit = 4Kbit
FLASH:32sector × 256page × 256Byte = 2,097,152Byte = 2MByte
在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这
种编码为格雷码。
格雷码属于可靠性编码,是一种错误最小化的编码方式,因为它在相邻位间转换时,只有一位产生变化。详情可参考我前面发的博客:FPGA——verilog实现格雷码与二进制的转换
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。