题目1:解释一下什么是 UART?以及波特率与比特率的区别?
通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART。UART是一种通用串行数据总线,主要应用于串行异步通信。这样的通用串行数据总线属于双向通信,可以实现全双工传输和接收。
波特率:是码元传输速率单位,他说明单位时间传输了多少个码元。
比特率:是信息量传送速率单位,即每秒传输二进制代码位数。bit/s
题目2:简述 FIFO 使用场景和使用方法。
(2)数据缓存
这也是一个很常用的场景,在模块内部处理数据的过程中,当前后处理的性能不一致的时候,往往会用一个fifo做为前面处理数据的中间缓存,平衡前后的性能。其实和上面(1)的应用是类似的,只不过一个是用于模块间,一个用于模块内部。
(3)跨时钟域
在不同时钟域传递多bit数据的时候,最简单可靠的方案就是采用异步FIFO。
题目3:简述SPI和I2C总线如何实现多机通信的?
SPI:主机通过拉低从机的CS/SS来使能通信。 在空闲/非传输状态下,片选线保持高电平。在主机上可以存在多个CS/SS引脚,允许主机与多个不同的从机进行通讯。
IIC:I2C使用寻址功能,可以通过一个主机控制多个从机。使用7位地址时,最多可以使用128(27)个唯一地址。
题目4:简述在使用 FPGA 使用 IIC 总线对 EEPROM 进行数据写入与读出时,一般需要遵循的操作流程。
顺序读:
(1)发送 START 信号
(2)发送写控制字并接收 ACK 信号
(3)发送读地址并接收 ACK 信号
(4)发送开始信号
(5)发读控制字并接收 ACK
(6)接收第一个字节数据并发送 ACK
(7)接收第二个字节数据并发送 NACK
(8)发送 STOP 信号
顺序写:
(1)发送 START 信号
(2)发送写控制字并接收 ACK 信号
(3)发送写地址并接收 ACK 信号
(5)发送写数据并接收 ACK
(6)再次发送写数据并接收ACK
7)发送 STOP 信号
题目5:有一个异步 FIFO,位宽为 16bit,写时钟为 100MhHz,读时钟为 80MHz,在某个特定使用场
景下,发现每 100us 内最多有 3200bit 数据写入,那么 FIFO 的深度设置为多少比较合适?
( 6400-3200/100Mh*80MH*2)/16
题目6.简述 FPGA 和单片机的区别
结构上:单片机是一个微处理器,类似于电脑的CPU,它一般采用的是哈佛总线结构或者冯诺依曼结构,对于单片机的编程很大程度上要考虑到它的结构和各个寄存器的作用。FPGA的结构是查找表结构,其程序不用太考虑芯片的结构,更多的是注意时序上的问题。
速度上:单片机是单线程串行执行,程序语句需要等待单片机周期才能执行。FPGA是多线并行执行,运行速度取决于晶振速度。
编程语言上:单片机使用的是软件编程语言描述软件指令在硬件芯片上的执行。FPGA是通过硬件描述语言在FPGA芯片上自定义集成电路。
题目7.SRAM,FLASH,DRAM,SSRAM 及 SDRAM 的区别?
SRAM,静态随机存取存储器,不需要周期性的充电数据也不会丢失,存储不是线性存储,而是按指定地址存储。
FLASH,快闪存储器,一种电子式可清楚程序化只读存储器的形式,断电数据不丢失,存储不是线性存储,而是按指定地址存储。
DRAM,动态随机存取存储器,需要周期性的充电以保证数据不丢失,存储不是线性存储,而是按指定地址存储。
SSRAM,同步静态随机存取存储器,读写操作均在时钟上下沿进行,不需要周期性的充电数据也不会丢失,存储不是线性存储,而是按指定地址存储。
SDRAM,同步动态随机存取存储器,读写操作均在时钟上下沿进行,需要周期性的充电以保证数据不丢失,存储不是线性存储,而是按指定地址存储。
题目8.解释一下以下名词:RAM、ROM、CAM;FPGA 中哪些资源可以用于实现 RAM/ROM/CAM?当我们用FPGA来实现RAM等存储资源时,应该首选哪一种资源?
RAM:随机存取存储器(Random Access Memory);ROM(Read Only Memory):只读存储器;CAM:关联内存(Content Addressable Memory)。
与传统的随机存取存储器(RAM)不同,CAM 允许用户一次性搜索整个存储空间,找出与给定值完全匹配的数据项,并立即返回其存储地址。这使得 CAM 在需要快速查找、路由表更新、数据库索引等应用场景中有独特优势。
FPGA 中共有三种资源可以用于实现 RAM/ROM/CAM:BLOCK RAM,触发器(FF),查找表(LUT)。
在生成 RAM 等存储单元时,应该首选 BLOCK RAM 资源;其原因有二:
1)、使用 BLOCK RAM 等资源,可以节约更多的 FF和 LUT 等底层可编程单元,使用 BLOCK RAM 可以说是“不用白不用“,是最大程度发挥器件效能,节约成本的一种体现;
2)、BLOCK RAM 是一种可以配置的硬件结构,其可靠性和速度与用 LUT 和 FF 构建的存储器更有优势。
题目9. 简述一下什么是单工、半双工、全双工通信?串口通信和IIC通信分别属于什么以上哪种通信模式?
单工:只能发送数据或者接收数据,即数据传输是单向、点对点的;
半双工:可以发送数据也可以接收数据,但是收发不能同时进行,一般是发送与接收共享同一根总线;
全双工:可以接收数据也可以接收数据,收发可以同时进行,一般是发送与接收使用两根独立的总线。
串口全双工通信,IIC半双工通信。
题目10.Verilog 中 task和function语句的使用方法?他们的区别是什么?
用法:
function主要有以下几个特点:
1)不含有任何延迟、时序或时序控制逻辑
2)至少有一个输入变量
3)只有一个返回值,且没有输出
4)不含有非阻塞赋值语句
5)函数可以调用其他函数,但是不能调用任务
function定义格式:
function 函数名;
function内部输入输出变量;
function内部变量变化规律;
endfunction
模块内子程序出现下面任意一个条件时,则必须使用任务而不能使用函数。
1)子程序中包含时序控制逻辑,例如延迟,事件控制等
2)没有输入变量
3)没有输出或输出端的数量大于 1
task定义格式:
task 任务名;
task内部输入输出变量;
task内部变量变化规律;
endtask
区别:
1)function只能与主模块共同用同一个仿真时间单位,而task可以定义自己的仿真时间单位;
2)function不能启动任务,而task能启动其他function和task;
3)function至少要有一个输入变量,而task可以没有或有多个任何类型的输入变量;
4)function返回一个值,而task则不返回值;
function的目的是通过返回一个值来响应输入信号的值,verilog中使用function时,把它当作表达式中的操作符,这个操作的结果的值就是function的返回值;
task能支持多种目的,能计算多个结果值,这些结果值只能通过被调用的task的输出或总线端口输出。
题目11.什么是阻塞复制?什么是非阻塞复制?他们的区别是什么?
阻塞赋值:在赋值时先计算等号右手部分的值,这时赋值语句不允许任何别的Verilog语句的干扰,直到现行的赋值完成时刻,才允许别的赋值语句的执行。
非阻塞赋值:在时钟上升到来时,执行赋值语句右边,然后将begin-end之间的所有赋值语句同时赋值到赋值语句的左边。
区别:一个是定义上的区别,一个是阻塞赋值用于组合逻辑,非阻塞赋值用于时序逻辑,还有一个是阻塞赋值用=,非阻塞赋值用<=。
题目12.格雷码的特点是什么?他和8421码是如何互相转换的?
循环特性:最后一个码组与第一个码组的码距为1,意味着这两个码组是相邻的。这使得格雷码具有循环性,有时也被称为循环码或反射码。
无权码:在格雷码中,任意相邻的两代码之间的码数只相差一位,即它们的码距恒为1。这意味着每个码只能被前一个码和后一个码所唯一决定,没有自由度,因此是无权的。
反射特性:当码组进行对半折叠时,除了最高位上下两部分不同外,其他部分类似于一个镜面,这种现象称为反射特性。
格雷码转8421码:使用格雷码的最高位作为8421码的最高位,8421码次高位产生过程是使用8421码的高位和次高位格雷码相异或得到,其他位的值与次高位产生过程类似。
8421码转格雷码:8421码的最高位作为格雷码的最高位,次高位的格雷码为8421码的高位和次高位相异或得到,其他位与次高位类似。
题目13.跨时钟域的处理方法有哪些?
单 bit 信号从慢到快:在快时钟域同步打拍,将信号同步到快时钟域;
单 bit 信号从快到慢:拓展位宽后进行同步打拍;
多 bit 信号从快到慢:异步 FIFO;
多 bit 信号从慢到快:异步 FIFO、握手信号。
题目14.用 VHDL/Verilog HDL 语言开发可编程逻辑电路的完整流程?
一般设计流程可以大致归纳为:设计文件输入、功能仿真、逻辑综合、布局布线、时序仿真、硬件测试。
1) 设计文件输入:使用 HDL 语言、调用 IP 核或者网表文件等方式进行源文件设计;
2) 功能仿真:在测试文件中产生测试向量对设计进行功能仿真,或者说叫行为防止,以验证设计的逻辑功能是否满足需求;
3) 逻辑综合:根据设计功能和实现该设计的约束条件(如面积、速度、功耗和成本等),将设计输入转换成满足要求的电路设计方案,该方案必须同时满足其功能和约束条件。综合的过程也是设计优化目标的过程,其目的是将多个模块设计文件合并为一个网表文件,供布局布线使用,网表文件中包含了目标器件中的逻辑单元和互连的信息;
4) 布局布线:根据设计者指定的约束(SDC 文件)条件(如面积、延时、时钟频率等)、目标器件的结构资源和工艺特性,以最优的方式对逻辑元件布局,并准确地实现元件间的互连,完成网表文件到实际目标器件的转换;
5) 时序仿真:在布局布线完成后,EDA 工具会提供一个时序仿真模型,其中包括了器件的一些延时参数,如门电路延时、走线延时等,通过时序仿真可以检查在特定的时钟频率下设计是否正常能工作,也就说可以检查出设计中存在的时序违例的路径;但是通常我们会使用静态时序分析(STA)的方式来代替时序仿真,因此一般可以省略这一步;
6) 硬件测试:使用工具生成的 bit 流文件对 FPGA 芯片进行配置,测试运行结果;既可以使用专用的逻辑分析仪通过 FPGA 的 IO 口对内部信号进行抓取,也可以使用 EDA 工具内嵌的在线逻辑分析工具(如 Signaltap、ILA 等)进行在线调试。
题目15.仿真波形中出现“X”或“Z”,如何分析?
首先,在仿真波形中出现“X”或“Z”,表示该信号可能出现了未知态或高阻态,这时候不一定就是设计存在问题,需要具体问题具体分析。有时出现“X”或“Z”是正常的,例如某些 IP 核,或者未初始化的寄存器和 RAM/FIFO的输出一开始都会出现“X”,但系统正常运行之后“X”或“Z”都不应当存在。
具体而言,出现“X”或“Z”比较常见的情况有如下几种:
1、某些 IP 核的输出在复位状态下输出为“X”态,但是复位结束后应该是正常状态;
2、FIFO IP 核在一开始为 empty 时,输出端可能是“X”态,但是当有数据写入、开始读出数据的时候就不应该是“X”态了;
3、信号位宽不匹配、声明的信号名称写错等问题都会导致“X”或“Z”,这些是必须要解决的问题;
4、此外,还有一些是寄存器或者存储器没有使用初始化复位功能也会出现“X”或“Z”。
题目15:FPGA 的内部结构?
主要包含:可编程逻辑单元(LAB)、可编程I/O、可编程连线。其中可编程逻辑块是FPGA的主要资源指标,在芯片内部以二维阵列的形式排布。在CLB中包含查找表和D触发器,查找表(LUT)负责给芯片提供组合逻辑,D触发器负责提供时序逻辑,为设计数字电子系统提供资源。
①可编程逻辑单元(Logic Array Block,也简称为LAB):每个LAB由16个LE(Logic Element)逻辑单元组成。LE由一个4输入查找表和一个(可编程)触发器组成。
②可编程I/O(User I/Os,也被称为IOE):可编程I/O资源分布在整个芯片的四周。(其中包括双向I/O缓冲器、OE寄存器、对齐寄存器、同步寄存器、DDR输出寄存器、三态门、延时模块等组成)。
③可编程连线:目前大多数FPGA的I/O单元被设计为可编程模式,即通过软件的灵活配置,可适应不同的电器标准与I/O物理特性;可以调整匹配阻抗特性,上下拉电阻;可以调整输出驱动电流的大小等。
④嵌入式存储单元(Memory Bits,也被称为Block RAM或简称为BRAM):该部分资源主要用于生成RAM、ROM、FIFO、移位寄存器,在存储较多数据或作跨时钟域处理时常用到。(相对于LUT构成的分布式RAM(Distribute RAM,简称为DRAM),这种专门的存储单元容量更大,从而避免LUT资源的浪费)
⑤嵌入式乘法单元(也称为DSP(digital signal processing数字信号处理器)块):该单元主要用于各种复杂的数学运算,乘法、除法以及常用的功能函数。
⑥时钟资源:锁相环(PLL)、50M晶振。锁相环(Phase Lock Loop,也简称为PLL):该芯片一共有两个锁相环,一个在右上角处附近,一个在左下角附近。PLL的参考时钟输入都是由专用时钟管脚上的晶振进来的,用于时钟的倍频、分频,以及相位、占空比调制。PLL出来的时钟都会连接到全局时钟网络上,以保证时钟的质量,减小时钟偏斜(Skew)和抖动(Jitter)。
题目16:FPGA可编程逻辑基于的可编程结构?该种结构具体是怎样一个工作原理?
FPGA 可编程逻辑基于的可编程结构是基于查找表(Look-Up-Table,LUT)结构。
LUT本质上就是一个SRAM。目前FPGA中多使用4输入的LUT,所以每一个LUT可以看成一个有4位地址线的16×1的RAM。当用户通过原理图或HDL语言描述了一个逻辑电路以后,PLD/FPGA开发软件会自动计算逻辑电路的所有可能的结果,并把结果事先写入RAM。这样,每输入一个信号进行逻辑运算就等于输入一个地址进行查表,找出地址对应的内容,然后输出。
题目17:简述时序逻辑和组合逻辑的区别。
1组合逻辑:(基本单元是门电路)
任意时刻的输出仅仅取决于该时刻的输入,与电路原本的状态无关。组合逻辑的verilog描述方式有两种:
(1)always @(电平敏感信号列表)
always模块的敏感列表为所有判断条件信号和输入信号。在always模块中可以使用if、case和for等各种RTL关键字结构。使用阻塞赋值语句“=”。always模块中的信号必须定义为reg型,不过最终的实现结果中并没有寄存器。这是由于在组合逻辑电路描述中,将信号定义为reg型,只是为了满足语法要求。
(2)assign描述的赋值语句。等式左边信号只能被定义为wire型。
2时序逻辑:
任意时刻的输出不仅取决于该时刻的输入,而且还和电路原来的状态有关。电路里面有存储元件(各类触发器,在FPGA芯片结构中只有D触发器)用于记忆信息,从电路行为上讲,不管输入如何变化,仅当时钟的沿(上升沿或下降沿)到达时,才有可能使输出发生变化。使用非阻塞赋值语句“<=”。
两者区别:
(1)是否与电路原本的状态有关。
(2)时序逻辑中推荐使用非阻塞赋值“<=”。
(3)在组合逻辑中使用阻塞赋值“=”。
题目四:在Verilog中什么样的语法写法可能会产生锁存器?
锁存器是一种在异步电路系统中,对输入信号电平敏感的单元,用来存储信息。时序分析时模型就等效为两个各组合电路互为反馈的反馈系统,因此,系统有可能会因为瞬态特性不稳定而产生振荡现象。
在组合逻辑中,不完整的if...else...结构。当条件不成立时,没有其他语句可执行,使得被赋值的寄存器一直保持不变,“锁存”住。(在时序逻辑中生成触发器。)
case结构中分支没有包含所有情况且没有default语句时。如果条件无法在case的列表中找到与之对应的,需要保持原来的电路状态不变,就会陷入”锁存“来保持状态。
在组合逻辑中输出变量赋值给自己。
题目18:如何防止亚稳态?
亚稳态(semi-stable state)是指触发器无法在某个规定时间段内达到一个可确认的状态。
危害:毛刺、振荡、逻辑混乱、复位失败。一般情况下亚稳态的产生不可预知的数据,也可能导致系统崩溃,影响系统后续的逻辑判断和程序整体运行走向,影响系统稳定性。
发生场合:跨时钟域信号传输;复位电路;异步信号采集(异步系统)
避免亚稳压的方法:
1降低时钟频率(降频)
2使用反应更快的触发器Flip-Flop(亚稳态窗口小)
3改善时钟质量,使用边沿变化更快的时钟信号
4引入同步机制,防止亚稳态传播(如:加两级触发器)