> 技术文档 > 禾赛FPGA面经(八股汇总)_lut跟触发器的比例

禾赛FPGA面经(八股汇总)_lut跟触发器的比例

ps:统计了一下网上提到过的禾赛FPGA面经,对其中的八股问题进行了解答,文字来源网络,侵权请联系删除!

目录

1、面经统计

1.1 FPGA面经1

1.2 FPGA面经2

1.3 FPGA面经3

1.4 FPGA面经4

1.5 FPGA面经5

1.6 FPGA面经6

1.7 FPGA面经7

1.8 FPGA面经8

1.9 FPGA面经8

1.10 FPGA面经10

1.11 FPGA面经11


1、面经统计

1.1 FPGA面经1

1.FPGA你是怎么进行资源评估的?

FPGA资源评估主要可以分成3个阶段进行资源评估。

设计前期,我们会对这个项目的需求文档进行功能模块的划分,然后分析每个模块的逻辑复杂度和主要功能。明确各个模块的时钟频率、数据吞吐率等性能指标。这会影响到该模块设计的复杂度,间接影响资源使用。比如说我们在选取完成滤波操作的过程中,就应该根据当前的数据的吞吐率和滤波器阶数提前预估我们滤波器所需的dsp资源消耗。还有如果是数据传输相关项目,我们就应该根据数据通道通道数和数据吞吐量预估我们所需的ram资源。

设计中期,我们各个部分模块在完成rtl实现后对当前部分模块进行综合,可以得到一个初步的资源利用率报表,如果发现某项资源消耗过多,我们就需要对占比高的模块进行一定的代码优化。

然后再设计后期即布局布线之后就可以得到准确的资源使用情况,可以用于判断当前的FPGA型号是否满足设计要求。我们一般要求资源消耗在总资源的70%以下较为合适。

2.FPGA中LUT跟触发器中的比例?

LUT,和FF是构成CLB的两个基本组件,其数量比例一般由 FPGA芯片的型号决定,比如我常用的Xilinx 7 系列芯片来说,其一个 CLB包含 8 个 6 输入 LUT(LUT6)和 16 个 D 触发器(FF) ,比例为1:2。一个CLB中有两个SLICE

3.DDR的数据传输速率跟什么有关?

针对FPGA实现中,DDR的数据传输速率应该分硬件层面和软件层面两部分来说。

硬件层面是指DDR的选型,核心时钟频率,数量,总线位宽等等,但这一部分一般是由板卡确定,我们无法进行更改。

软件层面的话,比如我项目中使用的Xilinx MIG对DDR进行交互,我们选用其AXI4接口。这个IP核里面选择的AXI4的时钟频率,数据位宽均能影响DDR的传输速率。还有我们使用AXI4总线进行数据传输的过程中尽量利用其outstanding特性,减少指令交互造成的吞吐损失。

4.异步FIFO怎么减少数据出错?

异步FIFO里面利用了格雷码,多级触发器同步以及安全的空满判定机制用于降低数据出错的概率。 格雷码的使用可以使异步FIFO中的读写指针跨时钟传输只会出现单bit数据跳变,多级触发器同步可以使单bit跨时钟域出现亚稳态的概率降到非常低,而安全的空满判定机制是指满标志是在写时钟域生成,空标志是在读时钟域生成,同时空满状态的判断逻辑通常会设计得比较保守,这都是为了避免因指针同步延迟导致的FIFO溢出或读空。

5.怎么定义一个接口是高速接口呢?

我觉得首先可以从数据速率和带宽上界定, 当接口的单线数据速率达到数百Mbps以上时,通常被认为是高速接口。 比如我们常见的GT接口,DDR接口。还有一种即使单线速率不是很高,但是并行路数很多,导致接口总带宽很大也可以称之为高速接口,就比如相机通常采用的cameralink,采用并行serdes技术。

还有一个方面就是高速信号的信号完整性要求比较高,硬件设计的过程中需考虑到高速信号可能出现的各种效应,比如反射,串扰,衰减等等,通常硬件设计会比低速信号更加困难。

1.2 FPGA面经2

1. 使用的FPGA资源的LUT是几输入几输出,可以生成多大的RAM存储;

我接触和学习过的 FPGA 比如Xilinx 7系列,其采用LUT通常是6输入的,并且拥有1个或2个独立的输出 。因为一个6输入LUT可以拆分成两个5输入的LUT,这个时候就拥有两个输出。(7系列及以后都是2输出)

LUT通常是用于实现组合逻辑,也可用于生成LUTRAM,因为lut是6输入的,所以其有64位寻址空间,因此可以配置成一个64*1bit的单端口RAM,或者32*1bit的伪双端口RAM

2. 如果6变量的组合逻辑可以用几个LUT资源实现?

一个具有单个输出的6变量组合逻辑函数可以用1个6输入LUT来实现,如果需要多个输出的话可能每个独立的输出都需要一个LUT6。

3. 使用过FPGA上的资源情况,详细讲解一下有哪些,具体是怎么使用;

常用的FPGA资源一般就是LUT,FF,DSP,BRAM,IO,和时钟资源。

LUT一般用于组合逻辑,还可以配置成移位寄存器,比如我们项目中会利用xilinx原语SRL16就可以利用一个LUT实现一个16bit移位寄存器,减少FF资源的使用。

FF就是我们时序逻辑通常需要使用到的D触发器,用于存储数据。(触发器不只是D触发器)

DSP 通常用于乘法和加法器的实现,比如项目设计一个 FIR数字滤波器时,滤波器的核心运算是输入数据与滤波器抽头系数的乘累加。可以采用IP核或者自己写模块实现这个结构,让vivado将这些运算映射到DSP Slice上,以获得高性能和节省LUT资源。(如果是单bit加法优先会调用LUT资源)

BRAM是用于存储较大块的数据,常用的方法就是我们在进行数据缓存时使用的FIFO,也可以用于生成ROM和RAM。

IO资源就是FPGA芯片上面拥有的引脚,用于FPGA与外部电路进行控制或者采样。

时钟资源有PLL和MMCM两种,是用于生成时钟信号,比如系统时钟是200m,我们可以通过使用MMCM模块配置我们所需的其他频率的时钟。如果是较为简单的时钟倍频、分频和相位调整需求,PLL 就可以满足;而对于复杂的、对时钟频率和质量要求苛刻的应用,MMCM 则是更好的选择。

PLL:时钟倍频,分频,调节相位 ,MMCM:在PLL的基础上加上了相位动态调整功能,我们项目中一般一个clock_ip使用一个MMCM,然后一些GT 时钟相关的IP配置会格外使用一个时钟时钟,比如以太网物理层

然后FPGA还有一些底层嵌入功能单元,比如GT,这个常用于高速信号传输。

4. 使用的Block RAM的大小是多少?(BRAM本质是SRAM, FPGA 芯片中预先布好、结构化的 SRAM )

7 系列的FPGA中,每个 BRAM 模块容量为 36 Kb,可进一步配置为两个独立的 18 Kb 子块。

5. BRAM和分布式RAM的区别是什么?

首先是物理资源实现不同,Block RAM使用专用的存储资源,而分布式RAM使用LUT构成。

Block RAM适用于存储大块数据,并且其速度快,延迟较低。而分布式RAM一般用于小容量存储,规模增大其可能由于LUT分布不紧密导致布线延迟可能增加 。

Block RAM通常支持真正的双端口读写(True Dual-Port),即两个独立的地址和数据端口,可以同时进行读或写操作。 而分布式RAM 通常实现单端口或伪双端口。

Block RAM的静态功耗较高,分布式RAM 的动态功耗是随使用量进行变化。

特性

Block RAM

分布式RAM

物理资源

专用存储模块

由LUT构成

容量

大(18/36Kb每块)

小(每LUT≈64位)

时序特性

同步读写(需时钟)

同步/异步可选

功耗

静态功耗较高

动态功耗随使用量变化

典型应用

大数据缓冲、FIFO

小规模寄存器、查找表

1.3 FPGA面经3

1.怎么验收性能?怎么验收抗干扰性能?

2.怎么解决时序违例?

  • 首先,通过VIVADO生成的时序分析报告定位到违例的具体路径。
  • (vivado时序违例报错有三种:intra clock path/inter clock path/other path,一般other path是由前两种引发的,通常解决前两种后第三种就会解决)
  • (你要是这样讲那你就对着同源时钟报错和跨时钟报错两种开展分析呗)
  • 分析该路径的组成:逻辑延迟、布线延迟、时钟歪斜等。
  • 根据是建立时间还是建立时间违例,以及路径的具体情况,选择合适的优化方法。

优化的方法一般有以下几种:

1、可以优化代码的组合逻辑级数,可用于处理建立时间违例。或者增加部分组合逻辑级数,用于处理保持时间违例。还可以插入局部时钟缓冲器,但是这个我们项目中一般很少用。

2、 完善时序约束 ,异步路径和多周期路径分别用set_false_pathset_multicycle_path 进行标注,让VIVADO进行优化处理。

3、 使用VIVADO的不同的布局布线策略,比较时序报表输出,选择最优策略。

在我参与过的项目中,我主要遇到的是建立时间违例,通常通过流水线设计或优化组合逻辑来解决。对于保持时间违例,我的理解主要是通过增加数据路径延迟来修复。

3.为什么扇出高会引起时序违例?

我说是单元的负载/驱动能力不够,在面试官提示下说扇出高有些路径就会跨很多单元,可能布线时延会比较长。

扇出是指一个逻辑门驱动的下级逻辑门的数量。高扇出主要引起建立时间违例,其原因为增加驱动的数量会增加电容负载,而由于每个逻辑门驱动能力是有限的,这使得后级信号的电平变化所需要的时间增加,从而增加了数据路径的总延迟,这样就有可能导致产生建立时间违例。

我们通常可以在代码实现上通过寄存器复制的方式解决高扇出的问题,或者通过时序约束语句set_property MAX_FANOUT让vivado自行优化解决。

4.怎么计算setup/hold slack?

Tsu_slack = Tcycle + Tskew - Tcq - Tlogic - Tsu

Thd_slack = Tcq + Tlogic- Tskew - Thd

(Tskew = Tclk1 -Tclk2)

5.multicycle怎么看两个沿?然后大概手撕了一下multicycle的tcl代码

一般来说setup向后延N个clk,hold得回推N-1个clk,然后具体分析一下就行

\'两个沿\'指的是数据的发起沿和捕获沿,

# 设置 Setup 多周期

set_multicycle_path -from [get_pins A] -to [get_pins B] -setup 2

# 设置 Hold 多周期

set_multicycle_path -from [get_pins A] -to [get_pins B] -hold 1

6.用MUX搭一个与门

假设输入信号为A,B,mux的输入信号为D0,D1和sel。将A接到mux的D0,B接到mux的SEL,D1脚接0,这让mux的输出就是A&B了。

7.怎么实现一个延迟模块(输入20bit数据及动态可配置的延时)?如果延迟500突然变200怎么做?

异步fifo和移位寄存器两种方法。将输入的延时打一拍并相减,然后如果不等于0代表变化,然后给状态机和fifo复位。(听面试官意思还有其他方法,忘记问了)

有两种方案,一种是用fifo相对较为简单,一种使用ram相对比较复杂。

fifo方案需要让fifo读使能一直置高,然后设置一个cnt,让cnt小于预设延迟周期时进行累加并且让fifo读使能至0,然后在cnt等于预设延迟周期时保持不变,并且让读使能至1。这样的话不太能适应延迟可动态配置的情况。

ram方案 使用一个双端口RAM作为存储,然后设置写指针和读指针,写指针在每个周期进行递增,达到最大深度时进行回绕为0 ,读指针设置为(写指针-预设延迟周期),并且这里要注意指针回绕。然后每个周期根据读写指针进行数据读取和写入。

这里如果有严格要求的可以在数据输出端加一个使能信号,因为模块刚启动的输出属于RAM的初始值,可以设置一个cnt,在cnt大于预设周期数之后输出使能拉高。

如果最大延迟周期不是很大的话建议使用 Xilinx FPGA 的SRL原语,这让可以较少资源的使用。

(计数器适用于信号间隔的周期数大于延时的周期的场景,粗暴打拍适合延迟数较小的场景)

8.说一下AXI写数据过程

写操作需要用到AXI的三个通道,他们分别是独立的。

首先是写地址通道,首先需要将写信息防止在总线上,如写地址,写突发长度,突发类型,AWSIZE,写ID等,然后拉高AWVALID,等待AWREADY拉高,表示握手成功,然后拉低AWVALID。

然后是写数据通道,然后就是主机将WVALID,WDATA,WSTRB,WLAST输入到写数据通道,等待从机的WREADY握手,持续写入数据,写入的个数应于写突发长度对应,在最后一拍数据将WLAST拉高。

最后是写响应通道,主机可以将BREADY拉高,等待从机发送BVALID完成握手,从BRESP中解析响应状态信息。通过上述操作就可以完成一次写数据过程。

9.介绍一下FPGA底层资源

10.介绍一下锁相环

锁相环是一种利用反馈控制结构的电路,其核心功能是使输出信号的相位频率能够精准的跟踪输入信号的相位,常用于时钟生成。

锁相环是由鉴相器PD,环路滤波器LF,压控振荡器VCO。

鉴相器完成相位比较的过程,其检测输入信号和输出信号的相位差,并转化成一个电压信号输出至环路滤波器,环路滤波器实际上就是一个低通滤波器,去除上述电压信号的高频分量使其更加平滑,然后其滤波后的电压信号输出至压控振荡器,压控振荡器根据这个信号调整输出信号的频率。以上构成一个反馈环路,不断迭代最终输出我们所需的信号。

11.ZYNQ启动流程

1.4 FPGA面经4

1. 高速接口 8B/10B 编码的作用;

8B/10B编码的核心作用是通过直流平衡强制信号跳变确保信号完整性,例如我们在使用GT IP时候,一般算则K28.5,这样可以避免出现长段的0或1导致接收端的CDR工作异常。其还可以用于帧对齐功能,方便接收端正确恢复帧数据。

2. 项目里的跨时钟时序约束怎么做的;

3. 两个触发器做建立保持时间分析模型中,涉及到哪些参数?(Tck2q,Tcomb,Tsu/Th,Tskew,Tjitter)

4. ZYNQ 启动流程;

5. 项目用了多少资源,BRAM主要是用在了什么地方;

6. 多周期约束怎么用;

7. 现场出题做题,主要考察verilog设计的思路、对FPGA底层资源的了解程度(LUT等)、关键路径分析;

1.5 FPGA面经5

1、FPGA里面浮点数运算是如何实现的(底层原理)?比如浮点数加法;你觉得浮点数加法和浮点数乘法哪个更复杂?为什么?
2、FPGA里面4个单bit位或运算的底层原理?

利用LUT实现4个单bit的或运算,通常FPGA的LUT是6输入的,但可以灵活配置成4输入的逻辑函数。其底层原理就是通过FPGA配置将一个LUT的内部存储单元编程配置为特定逻辑函数的真值表。
3、因为我做的神经网络部署,面试官问为什么还要用浮点数运算?现在不都是全INT16/INT8吗?
4、用了多少DSP?为什么要用LUT/FF而不是DSP?

DSP主要是用于乘法、加法、乘累加等操作。 比较适用于逻辑密集型的算数计算,一些比较简单的乘法计算一般就会选择用LUT/FF资源实现。如果是通用的逻辑控制、状态存储、简单的或非乘法类的算术运算,就用LUT/FF;如果是定点乘法、乘累加等复杂算术运算,且对性能有较高要求,那么DSP是更好的选择。

5、用异步FIFO做跨时钟域传输为什么很稳定?

异步FIFO里面利用了格雷码,多级触发器同步以及安全的空满判定机制用于降低数据出错的概率。 格雷码的使用可以使异步FIFO中的读写指针跨时钟传输只会出现单bit数据跳变,多级触发器同步可以使单bit跨时钟域出现亚稳态的概率降到非常低,而安全的空满判定机制是指满标志是在写时钟域生成,空标志是在读时钟域生成,同时空满状态的判断逻辑通常会设计得比较保守,这都是为了避免因指针同步延迟导致的FIFO溢出或读空
6、问了电路时序方面做了哪些优化?

因为没有涉及到跨时钟域,针对较大的组合逻辑块做了流水线设计,还做了set_max_delay的时序约束,面试官就说这逻辑有问题,set_max_delay并不能优化时序,软件上面的timing结果跟实际上板会不一样,需要一条路径一条路径去优化

首先可以通过流水线设计将大块的组合逻辑分成多个周期完成计算,比如一个项目中扩频相关值累加的过程中需要同时将256个数据相加,一个周期完成对时序不友好,我们可以将其拆分成组,多个周期完成计算。

模块输入输出的时候推荐将信号寄存一拍输出,这样可以减少各个模块的耦合性,使其不受外部负载的影响。

有时候会出现扇出很高的情况,我们可以通过逻辑复制或者设置max_fanout tcl语句进行时序优化。

然后针对跨时钟域我们应当设置 set_false_path 进行时序约束,还有一些ADC或者DAC还需要设置输入/输出延迟约束和multi_cycle_path。
7、有没有做PS和PL的交互?如何实现的?

答:通过DMA和AXI总线;再问:谁主谁从?

8、介绍一下DMA工作原理

1.6 FPGA面经6

一面主要是技术,项目,会问一些问题,让你给解决思路,然后不断优化。这个感觉还比较好。对FPGA底层特别是硬核的使用,需要有仔细的了解,面试官会不断深挖
二面比较短,感觉比较凉,问的问题也比较宏观,一些信号处理方面的知识点,另外就是对FPGA资源的压榨,DSP,SRL怎么高效的利用,频率怎么提高之类的。

1.7 FPGA面经7

先自我介绍,介绍项目,面试官会问自己感兴趣的

1. fft ip核计算原理

FFT IP核的核心原理是通过分治法将DFT的计算复杂度从O(N²)降低到O(NlogN)。 其采用了蝶形运算和流水线架构。

采用基2的蝶形运算可以将N点的FFT分别称两个N/2点的FFT计算,然后在进行往下分别从而可以减少计算复杂度。

并且还采用了多级流水线架构实现输入数据,蝶形运算,模块输出的并行化处理,提升了ip核的吞吐。

2.fft运算一次,包括多少次复数乘法,复数加法

对于一个N点的FFT计算,采用基2算法的话应该需要((N/2)log2(N))次复数乘法运算和(Nlog2(N))次复数加法运算。一次复数乘法可以有4次乘法和2次加法组成,或者3次乘法和5次加法组成。

3.开根号ip核计算原理

FPGA中实现开平方根运算的IP核,由于开平方不是一个基本的算术运算,它通常利用迭代算法来实现。常见的算法有 :

1、 数字递归算法

类似于我们手算除法或开方的过程,逐位确定结果。每一轮确定结果的第几位的输出值,然后迭代得到最终的结果。

2、CORDIC算法:通过坐标旋转迭代逼近结果,适用于无硬件乘法器的场景

4.组合逻辑,时序逻辑的区别

电路结构上,组合逻辑是纯组合电路,时序逻辑是组合电路+触发器。

输出响应上,组合逻辑在输入产生变化时立马发生变化,而时序逻辑需要等到始终边沿到来的时刻才发生变化。

5.跨时钟传输方式

6.为什么使用格雷码,格雷码和二进制数的转换

常用的就是计数器进行跨时钟域传输过程中,将计数器二进制转化成格雷码,这样相邻两个计数值之间只有一个bit进行了翻转,这样避免多比特跳变过程中出现亚稳态而产生中间态的数值。

二进制转格雷码:gray_wr_ptr = wr_ptr ^ (wr_ptr >> 1\'b1);

格雷码转二进制:最高位不变,次高位和最高位输出进行异或得次高位输出,以此类推。

7.详细描述单bit数据怎么从快时钟传到慢时钟

分电平信号和脉冲信号两种,vivado原语(xpm_cdc_single,xpm_cdc_pulse)

电平信号:xxx

脉冲信号:xxx

8.axi总线包括哪几个通道,包括哪几种类型,握手协议

通道:写地址通道,写数据通道,写回应通道,读地址通道,读数据通道。

类型:AXI4, 适用于需要高性能内存访问和复杂数据传输的场景

AXI4-Lite,对于简单的、低吞吐量的内存映射通信

AXI4-stream,用于高速流数据。

握手协议:AXI总线的握手协议主要是由VALID和READY两个信号组成,他们没有先后要求,只要同时置高一拍就表示握手成功一次。

1.8 FPGA面经8

一面

1.讲项目

2.笔试的除法器怎么实现的?

讲了流水线乘法器,用移位的方法,面试官说还有查表,逼近的办法

3.PAPR算法被抑制的点在接收机怎么处理?

我一直觉得是不用处理的,具体原理面试官也不懂通信,感觉解释的不好

4.怎么做信噪比估计?

5.FFT ip核内部是怎么实现的?基2基4有什么区别?

FFT IP核的核心原理是通过分治法将DFT的计算复杂度从O(N²)降低到O(NlogN)。 其采用了蝶形运算和流水线架构。

采用基2的蝶形运算可以将N点的FFT分别称两个N/2点的FFT计算,然后在进行往下分别从而可以减少计算复杂度。

并且还采用了多级流水线架构实现输入数据,蝶形运算,模块输出的并行化处理,提升了ip核的吞吐。

基2和基4代表的是FFT计算中分解DFT时采用的基数,即采用2点蝶形运算单元还是采用4点蝶形运算因子。

基4-> log4N 级蝶形运算,

  • 资源利用:
    • 乘法器 (DSPs): 基4通常旨在减少乘法运算
    • 加法器/逻辑 (LUTs/FFs): 基4的蝶形单元更复杂,可能需要更多的加法器和控制逻辑。
    • 存储器 (BRAMs): 用于存储旋转因子和级间数据缓存。基4由于级数少,级间数据排列可能不同,对BRAM的需求模式也可能不同。
  • 性能:
    • 吞吐率: 在流水线架构中,基4由于其蝶形单元内部能并行处理更多数据,有时可以实现更高的吞吐率。
    • 延迟: 对于非流水线的块处理FFT,基4的级数较少,可能带来较低的整体计算延迟。
  • 灵活性:
    • 纯基2算法适用于N是任意2的幂的情况。纯基4算法适用于N是任意4的幂的情况。
    • 许多FPGA IP核采用混合基数 (Mixed-Radix) 策略,例如结合基4和基2的蝶形运算,以便支持更广泛的N值(所有2的幂),同时利用基4的优势。

6.a&b&c&d要用多少LUT,怎么实现

可以用二输入LUT搭

使用一个6-LUT就可以实现,一个6-LUT可以实现任意一个具有6输入变量的组合逻辑函数,因此这个函数表达式只需要一个LUT即可完成映射。

7.六个单比特相加要用多少六输入LUT

需要3个6输入LUT,6个单bit相加,其输出有3位,我们只需要对这三位分别采用一个6输入LUT进行配置,这样就能实现6个单bit相加。

1.9 FPGA面经8

1.LUTRAM的意思

2.LUTRAM和block RAM的区别

3.时序约束和时序优化

常见的时序约束类型:

  • 时钟定义 (create_clock): 定义时钟源、周期、波形。这是最基本和最重要的约束。
  • 时钟特性 (set_clock_uncertainty, set_clock_latency, set_clock_groups): 定义时钟的抖动、延迟、以及不同时钟域之间的关系(如异步、互斥)。
  • 输入/输出延迟 (set_input_delay, set_output_delay): 定义相对于时钟的外部输入信号到达时间和外部输出信号的需求时间。
  • 路径例外 (set_false_path, set_multicycle_path, set_max_delay, set_min_delay):
    • set_false_path:告诉工具某些路径在逻辑上无效或无需分析。
    • set_multicycle_path:告知某些路径其数据传输需要多个时钟周期。
    • set_max_delay/set_min_delay:为特定路径设定最大或最小允许延迟,覆盖默认的单周期要求。

常见的时序优化手段 (可分为不同层面):

  1. RTL设计层面 (逻辑优化,设计者主导):
    • 流水线 (Pipelining)
    • 逻辑重构(减少逻辑级数、平衡操作符、优化状态机编码)
    • 寄存器复制(减少扇出延迟)
    • 关键路径输入输出寄存
    • 使用FPGA硬核资源 (DSPs, BRAMs)
  1. 综合层面 (EDA工具主导,受约束和代码影响):
    • 选择注重性能的综合策略
    • 寄存器重定时 (Retiming)
    • 边界优化
    • 门级逻辑优化
  1. 实现层面 (布局布线,EDA工具主导,受约束影响):
    • 选择注重性能的布局布线策略
    • 物理综合优化 (Physical Synthesis)
    • 关键路径的特殊布局和布线
    • 缓冲器插入

4.跨时钟域

5.为什么不能多bit采用同步寄存器打两拍

由于实际布线上面存在差异,多bit中的每个bit到达同步寄存器的时刻是不完全一致的,这就是数据歪斜。而寄存器打两拍只能起到降低亚稳态的功能,多个bit就会出现一些bit被采样成新值,一些为旧值,比如011->100,这就可能会出现101的现象。

6.场景题:100M系统时钟,输入数据位宽为16,一直持续输入,延迟1s再发送出去,应该怎么做到延时1s再发送出去呢?

延迟1s相当于要延迟10^8个时钟周期,数据宽度是16bit,则需要200Mbyte的数据空间进行存储,现有的FPGA板上资源是不够的,只能通过外部存储器比如DDR。

1.10 FPGA面经10

面试30分钟,体验很好,前15分钟让我详细了讲了两个项目,讲述了自己发表的小论文的原理。

  1. FPGA的组成
  2. Case语句
  3. 16bit的数除3.14,如何实现
  4. 时序设计违约,如何解决
  5. 时序约束

1.11 FPGA面经11

1、异步FIFO读写地址空满判断;

1、读时钟域进行空判断,写时钟域进行满判断。

2、首先将读写指针均多拓展一位,然后转化成格雷码,然后分别再用二级触发器进行跨时钟域传输,然后让跨时钟域的读写指针与原时钟域的指针进行比较,如果除了最高一位,其余全部相同则判断为满,所有指针均相同则判断为空。

2、异步FIFO读写时钟是否需要约束:

需要;怎么约束?面试官举了个例子,写时钟域的时钟很快,读时钟域的时钟很慢,这样慢时钟域可能漏采样地址,怎么办?继续引导:布线约束。我回答:各条线之间的长度差不大于时钟周期*信号传输速度;面试官:勉强算你对吧

3、低功耗手段;

低功耗的设计主要可以从静态功耗和动态功耗两个方面进行设计。

动态功耗:

1、首先就可以通过门控时钟进行时钟门控,就比如我存储数传这个项目中,就有低功耗要求,我们在低功耗模式下就需要将载荷和DDR的时钟通过bufgce原语进行关闭。这样可以减少对应模块所产生的功耗。

2、还可以通过多时钟域管理的方法,将一些吞吐要求不是那么高的模块采用频率较低的时钟,这个在我们以前的项目中使用过这个方法。

3、还有一些手段用于降低模块内部的翻转率,但是我们项目中一般没有使用过。

静态功耗:

1、采用电源门控,比如我们项目中,一切外挂的功能模块比如EDFA,我们就可以硬件设计加软件控制就可以让其电源关闭,这样就可以在不使用他们的时候进行功耗节省。

2、还有vivado好像还提供专门的功耗优化策略和设置,但是我们项目中也未使用过。

4、提升频率手段;

想要提升系统的工作频率,其主要就是提升时序裕度,主要采用减少关键路径延迟来实现。

对于我们来说只能硬件一定无法更改,那就是在软件层面进行提升,首先可以通过流水线方法将长的组合逻辑分成多个时钟周期进行计算,从而降低每个周期的延迟。

还有就是应该通过寄存器复制或者约束语句避免出现高扇出的问题,这个也会增加延迟。

还有就是合理的运用FPGA资源,比如将适合的运算映射到专用的DSP Slice。

5、FPGA的基本组成;

6、4个1bit数相加需要几个6输入LUT(Xilinx)?

需要2个6输入LUT,4个单bit相加,其输出有3位,我们可以将一个6-LUT拆分成两个共享输入的5-LUT,让其实现输出的最低位和中间位,然后最高位在采用一个新的LUT,这样我们就只需要2个6-LUT就可以实现4个单bit求和。

7、128大小的滑窗,计算128个数的平均值:

连续的数据流:

1、第一个状态:将前128个数据累加,并且将每个数据写入FIFO1

2、第二个状态:继续将数据写入FIFO1,将上述累加和去掉低7位输出,并且将第129个数据和累加和相加,并从FIFO中读出第一个数据,并减去,这样就完成了原始累加和+第129个数据-第一个数据,即完成了2-129个数据的求和。

3、持续上面的过程,就可以完成滑窗求平均。

8、LDPC的BF算法和MS算法的流程;

9、具体项目