不枉初心,砥砺前行

皮皮祥的博客

欢迎留言,评论

导航

FPGA面试题

1.对于同步fifo,每100个cycle可以写入80个数据,每10个cycle可以读出8个数据,fifo的深度至少为?

写时钟频率 w_clk,
读时钟频率 r_clk,
写时钟周期里,每B个时钟周期会有A个数据写入FIFO
读时钟周期里,每Y个时钟周期会有X个数据读出FIFO
则,FIFO的最小深度是?
计算公式如下:
fifo_depth = burst_length - burst_length * X/Y * r_clk/w_clk

例举说明:
如果100个写时钟周期可以写入80个数据,10个读时钟可以读出8个数据。令wclk=rclk ,考虑背靠背(20个clk不发数据+80clk发数据+80clk发数据+20个clk不发数据的200个clk)代入公式可计算FIFO的深度
fifo_depth = 160-160X(80%)=160-128= 32

拓展:
如果令wclk=200mhz,改为100个wclk里写入40个,rclk=100mhz,10个rclk里读出8个。那么fifo深度为48
计算如下fifo_depth =80-80X(80%)X(100/200)=80-32=48

 

2.如果只使用2选1mux完成异或逻辑,至少需要几个mux?

【解】对于异或 F=A^B=AB\'+A\'B。即组合逻辑 assign F=A?~B:B; 用外部2选1选择器表示三目运算,内部嵌套一个选择器做反相器。如下图:

img

同理,对于同或F=A~^B=AB+A\'B\'。即assign F=A?B:~B; 将上图外部选择器01位置交换即可。

 

3.在对信号采样过程之前抗混滤波,其作用是什么?它选用何种滤波器?其截止频率如何确定?

根据“奈奎斯特采样定律”:在对模拟信号进行离散化时,采样频率f2至少应2倍于被分析的信号的最高频率f1,即:f2≥2 f1;否则可能出现因采样频率不够高,模拟信号中的高频信号折叠到低频段,出现虚假频率成分的现象。但工程测量中采样频率不可能无限高也不需要无限高,因为我们一般只关心一定频率范围内的信号成份.为解决频率混叠,在对模拟信号进行离散化采集前,采用低通滤波器滤除高于1/2采样频率的频率成份.实际仪器设计中,这个低通滤波器的截止频率(fc) 为: 截止频率(fc)= 采样频率(fz)/2.56

 

4.线与逻辑

线与逻辑是两个输出信号相连可以实现“与”的功能,可以用OC或OD门来实现,需要在输出端加一个上拉电阻

 

5.将二输入的与非门当非门使用时,另一端的接法应该是

二输入与非门的真值表如下: 非门的真值表如下:

img   img

假设现在A端为非门的输入,F为输出。A=0时,B端任意高低电平,F都为1;A=1时,B只有等于1,即接高电平,F才等于0。

所以,最终接法如下:(另一端B接高电平

img

 

6.属于高速串行接口的是

PCIE,USB,SPI,RapidIO;

 

7.关于芯片启动时初始化代码在调到main函数之前会执行的操作

 

8.Verilog HDL中哪些结构是不可综合的

 (1)所有综合工具都支持的结构:always,assign,begin,end,case,wire,tri,aupply0,supply1,reg,integer,default,for,function,and,nand,or,nor,xor,xnor,buf,not,bufif0,bufif1,notif0,notif1,if,inout,input,instantitation,module,negedge,posedge,operators,output,parameter。

   (2)所有综合工具都不支持的结构:time,defparam,$finish,fork,join,initial,delays,UDP,wait。

   (3)有些工具支持有些工具不支持的结构:casex,casez,wand,triand,wor,trior,real,disable,forever,arrays,memories,repeat,task,while。

 

9.关于时序设计和异步设计的描述

 

10.代码覆盖率

 包括语句覆盖,判定覆盖,条件覆盖,路径覆盖;

 

11.面积和速度优化

 面积优化:资源共享,逻辑复制,串行化;

 速度优化:流水线,关键路径法,寄存器配平;

 

12.关于正则表达式中的计数符和通用字符集进行搜索匹配

  img

 

13.时序检查中对异步复位电路的时序分析叫做(恢复时间检查)和(移除时间检查)?

 

2.1 下列关于多bit数据跨时钟域的处理思路,错误的有()

A. 发送方给出数据,接收方用本地时钟同步两拍再使用.

B. 发送方把数据写到异步fifo,接收方从异步fifo里读出.

C. 对于连续变化的信号,发送方转为格雷码发送,接收方收到后再转为二进制.

D. 发送方给出数据,发送方给出握手请求,接收方收到后回复.

两级信号同步是处理单比特信号,而多比特数据可以用异步FIFO、格雷码、握手协议。

 

2.2 对12.918做无损定点化,需要的最小位宽是多少位,位宽选择11位时的量化误差是多少?

A. 12位,0.0118. B. 13位,0.0039. C. 12位,0.0039. D. 13位,0.0118.

12用二进制表示需要4位,若小数用8位表示0.918/(2(-8))=235.008,即235×2(-8)=0.918,所以最少只要12位。当11位时,小数的位宽只有7,0.918/(2(-7))=117.5040,117×2(-7)=0.9141,0.918-0.9141=0.0039。

 

2.3 考虑如下的4×4的“二维仲裁器”,R00到R33为输入,G00到G33为输出,N和W也为输入,E和S也为输出,假设所有的逻辑门(包括非门/与门/反相器)延时都为1ns,请问该电路的最大延迟为:

A. 23ns. B. 25ns. C. 19ns. D. 21ns.

img

img

 

2.4 下图所示4位右移位寄存器,0时刻ABCD初始状态为0111,请写出5个时刻后的ABCD输出:

注:下图中或非门接到A似乎有问题,应该是A(n+1)=~(B|C|D)

img

A. 1010. B. 0100. C. 1101. D. 1110.

解析:0111->0011->0001->0000->1000->0100(第五次移位值)


2.5 关于流水线设计的理解,错误的是: 

A. 流水线设计会消耗较多的组合逻辑资源.

B. 流水线设计会导致原有通路延时增加.

C. 流水线设计的思想,是使用面积换取速度.

D. 关键路径中插入流水线,能够提高系统时钟频率.

 

2.6 下列哪种逻辑门可以实现逻辑(A XOR B)OR (C AND D)?

A. NAND. B. NOR. C. XOR. D. INV.

(A XOR B)OR (C AND D) = AB’ + A’B + CD = ((AB’)’(A’B)’(CD)’)’ = ((A(BB)’)’((AA)’B)’(CD)’)’

若只用2输入与非门,则(XYZ)\'=((XY)Z)\'=(((XY)\'(XY)\')\'Z)\' 即AA=A;A+A=A

 

2.7 关于DFT的描述错误的是:

A. DFT测试不能覆盖电路时序问题.

B. DFT测试过程通常会消耗大量的动态功耗.

C. DFT的主要目的是发现芯片生产过程中出现的缺陷.

D. 寄存器扫描链是一种常用的DFT技术.

DFT的at-speed test会采用芯片PLL高速时钟进行寄存器的setup和hold测试

 

2.8 下列那个工具不具备逻辑综合功能

A. Synplify. B. Design Compiler. C. Modelsim. D. ISE.

 

2.9 对芯片静态功耗影响最大的是哪一项

A. 工作模式. B. 频率. C. 负载. D. 电压.

Pstat = Istat × Vdd

 

2.10 组合逻辑中的冒险是由于()引起的

A. 电路中有多个输出. B. 电路未达到最简. C. 逻辑门类型不同. D. 电路中的延时.

由于延时导致电平翻转不能同时进行

 

2.11 指令系统中程序控制类指令的功能是

A. 实现主存于CPU之间的数据传送.

B. 实现程序执行顺序的改变.

C. 实现算术和逻辑运算.

D. 时间堆栈操作.

程序控制类指令包括:

  • 跳转指令;

  • 循环指令;

  • 子程序指令;

  • 中断指令。 这些指令可以控制程序的执行顺序。

 

2.12 在对信号做降采样前添加滤波器,一般需要添加什么样的滤波器,完成什么功能?

A. 高通,抗周期延拓.

B. 高通,抗混叠滤波.

C. 低通,抗周期延拓.

D. 低通,抗混叠滤波.

为解决频率混叠,在对模拟信号进行离散化采集前,采用低通滤波滤除 高于1/2采样频率的频率成分。实际仪器设计中,这个低通滤波器的截止频率(fc)为:截止频率(fc)=采样频率(fz)/2.56,在进行动态信号测试中测量仪器必须具有抗混叠滤波功能。

 

2.13 假设一个cycle只能完成一个8bits×8bits或一个17bits+17bits+17bits操作,那么设计16bits×16bits乘法最少可以多少个cycle完成?

A. 2. B. 4. C. 3. D. 1.

两个16位相乘(A×B),等于同时有两个“两个8位相乘”,消耗一个cycle; A的低八位乘B的低八位产生一个16位的数,类似的,一共产生4个16位的数,这四个16位的数交错相加; 最低八位不变,最高八位不变,次高位三个八位数相加,次低位三个八位数相加,又消耗两个cycle。

img

 

2.14 如下关于“线与”逻辑的描述,错误的是:

A. 可以使用OC门来实现“线与”.

B. “线与”逻辑必须在输出端加一个下拉电阻.

C. “线与”逻辑是两个输出信号相连可以实现“与”的功能.

D. 可以用OD门来实现“线与”.

OD:开漏,是对MOS管而言; OC:集电极开路,是对双极性管而言。 两者实现线与需外加上拉电阻。

 

2.15 关于异步处理,以下说法正确的是:

A. 静态配置信号可以不做异步处理.

B. 异步FIFO采用格雷码的原因是为了提高电路速度.

C. 异步处理需要考虑发送和接收时钟之间的频率关系.

D. 单比特信号打两拍之后可以避免亚稳态的发生.

 

2.16 关于16点的FFT描述正确的是:

A. 每个蝶形算法需要一次复数加法.

B. 每级有8个蝶形算法.

C. 每个蝶形算法需要一次复数乘法.

D. 共有4级分解.

完成一个蝶形运算需要一次复数乘法和两次复数加法。

 

2.17 在不增加pipeline的情况下,如何解决一条critical path的setup时序不满足的问题

A. 使用更先进工艺的工艺库.

B. 在这条path上插入寄存器.

C. 将部分组合逻辑电路搬移到前级path上.

D. 降低时钟频率.


 

2.18 下列关于代码覆盖率描述错误的是:

A. 代码覆盖率达到百分之一百说明代码bug已消除.

B. 代码覆盖率包括功能覆盖率.

C. 代码覆盖率包括条件覆盖率.

D. 代码覆盖率包括语句覆盖率.

覆盖率是衡量设计验证完成程度的指标,并不是验证的目的。任何覆盖率达到100%并不代表芯片bug已消除。 代码覆盖率包括:

  • 行覆盖率;

  • 条件覆盖率;

  • 状态机覆盖率;

  • 翻转覆盖率。 功能覆盖率反映开发出来的需要覆盖的功能点覆盖的比例。 断言覆盖率测量断言被触发的频繁程度。

 

2.19 C语言中定义了一个全局数组,编译后此数组可能分配在下列哪个阶段?

A. Text段. B. Bss段. C. Data段. D. Stack段.

BSS存放的是未初始化的全局变量; DATA存放的是初始化的全局变量。

 

2.20 下列优化方法中那些是速度优化方法:

A. 资源共享. B. 关键路径优化. C. 流水线. D. 串行化.

 

2.21 对于PSK和QAM调制,以下哪些说法是正确的?

A. 对于QAM调制,星座图的每个点的幅度相等.

B. 2PSK和4PSK在归一化条件下,其幅值都是1.

C. 4-QAM调制与QSPK的调制方式一致.

D. 在同样信道条件下,16-QAM的误码率大于4-QAM.

PSK调制,星座图中的点都位于单位圆上,模相同(都为1),只有相位不同。而QAM调制星座图中的点不再位于单位圆上,而是分布在复平面的一定范围内,各点如果模相同,则相位必不相同,如果相位相同则模必不相同。

 

2.22 wirte-back cache和write-through cache的区别:(write-back)cache只在cache line被替代的时候把cache里的有效数据写下一级存储。

write-through(直写模式)在数据更新时,同时写入缓存cache和后端存储。此模式的优点是操作简单,缺点是因为数据修改需要同时写入存储,数据写入速度较慢。 write-back(回写模式)在数据更新时写入缓存cache只在数据被替换出缓存时,被修改的缓存数据才会被写到后端存储。此模式的优点是数据写入速度快,因为不需要写存储;缺点是已更新后的数据未被写入存储时出现系统掉电的情况,数据将无法找回。

 

2.23 正则表达式里可以使用计数符和通用字符集进行搜索匹配,这些计数符中,(*)号的意思是匹配0个,1个或多个,(+)号的意思是匹配一个或多个,(?)的意思是匹配0个或1个。

 

2.24 FPGA时序检查中对于异步复位电路的时序分析分别叫(恢复时间检查)和(移除时间检查)。

recovery time:恢复时间。 撤销复位时,恢复到解复位状态的电平必须在时钟有效沿来临之前的一段时间到来,才能保证时钟能有效恢复到解复位状态,此段时间为recovery time。类似于同步时钟的setup time。 如下图,rst_n为1’b0表示复位,clk上升沿触发,rst_n从1’b0到1’b1的上升沿与时钟上升沿必须不小于recovery time才能保证寄存器恢复到正常状态。

removal time:移除时间。 复位时,在时钟有效沿来临之后复位信号还需要保持的时间为移除时间removal time。类似同步时钟hold time。 如下图,rst_n为1’b0表示复位有效,clk为上升沿触发,rst_n保持为1’b0经过clk上升沿后仍需保持一段时间,才能保证寄存器有效复位,放置亚稳态。

img

 

2.25 并行计算是提高程序速度的关键,设a为并行计算部分所占比例,n为并行处理的节点数,则并行计算带来的加速比为(1 /(a/n + 1 - a))。

S = (Ws + Wp)/(Ws + Wp/p),Ws为程序中串行部分,Wp为程序中的并行部分,p为并行节点数。

 

2.26 下图球框由三个相同的铁圈两两正相交组成,每个铁圈的电阻均为R。AB两点间的电阻为(5R/48)。

img

img

 

2.27 signal_a是clk_a(300M)时钟域的一个单时钟脉冲信号,如何将其同步到时钟域clk_b(100M)中,并产生出signal_b同步脉冲信号。请用verilog代码描述,并画出对应的时序波形说明图。

 module div_3_50(
     input   clk,
     input   rst_n,
     input   in,
     output  q,
     output  out,
 );
     reg q1,q2;
     reg [1:0] count1,count2;
     reg in_p,in_pp,in_ppp;
     wire out_b;
     reg out_bb,out_bbb;
  
     assign q=q1|q2;
  
     always@(posedge clk , negedge rst_n)begin
         if(!rst_n) begin
             q1 <= \'0;
             count1 <=\'0;
         end
         else if(count1==0) begin
             q1 <= ~q1;
             count1 <= count1 + 1;
         end
         else if(count1==1) begin
             q1 = ~q1;
             count1 <= count1 + 1;
         end
         else begin
             count1 <= \'0;
         end
     end
  
     always@(negedge clk , negedge rst_n)begin
         if(!rst_n) begin
             q2 <= \'0;
             count2 <=\'0;
         end
         else if(count2==0) begin
             q2 <= ~q2;
             count2 <= count2 + 1;
         end
         else if(count2==1) begin
             q2 = ~q2;
             count2 <= count2 + 1;
         end
         else begin
             count2 <= \'0;
         end
     end
  
     always@(posedge clk , negedge rst_n)begin
         if(!rst_n) begin
             in_p   <= \'0;
             in_pp  <= \'0;
             in_ppp <= \'0;
         end
         else begin
             in_p   <= in;
             in_pp  <= in_p;
             in_ppp <= in_pp;
         end
     end
  
     assign out_b = in_ppp|in_pp|in_p;
  
     always@(posedge clk , negedge rst_n)begin
         if(!rst_n) begin
             out_bb  <= \'0;
             out_bbb <= \'0;
         end
         else begin
             out_bb  <= out_b;
             out_bbb <= out_bb;
         end
     end
  
     assign out = out_bbb; 
 endmodule

img

 

2.28 如下图,一个高速接口的端口电路示意图,要求D端发送数字0/1。D/Q端收到相同的数字0/1。VREF电压为比较器数字输出0/1的判决电压。

(1)S1断开时,DQ端VREF电压需设置为? (2)S1连通时,DQ端VREF电压需设置为? (3)驱动端发送0时功耗比较低,这句话正确吗?为什么?

img

(1)S1断开时,若D为1,Q端电压为VDDQ,因此VREF要小于VDDQ。若D为0,Q端电压为0,因此VREF要大于0,因此0<VREF<VDDQ。

(2)S1连通时,若D为1,Q端电压为VDDQ/3。若D为0,Q端电压为0,因此VREF要大于0,因此0<VREF<VDDQ/3。

(3)驱动端为0时,NMOS管道通,反相器输出接地,电阻没有电流,因此功耗较低。

 

2.29 用Moore型状态机实现序列“1101”从右至左的不重叠检测。

(1)请画出状态转换图,其中状态用S0,S1,S2…表示。 (2)针对这个具体设计如何衡量验证的完备性?

img

可以从定向测试,随机测试两种方式中产生激励,从代码覆盖率的角度保证代码覆盖率达100%。

 

2.30 进行一个运算单元的电路设计,A[7:0]*11111011,尽量用最少的资源实现,写出对应的RTL代码。

11111011(B)=251(D);硬件中运算以2进制进行,所以应划分成以2的n次方倍数的加减运算,而乘除2的n次方数可以用移位来表示; 251=(256-4-1),即A左移8位减去A左移2位再减去A。

module mul(
    input  [7:0]    A,
    output [15:0]   B
);
    wire [15:0] reg1;
    wire [15:0] reg2;
    wire [15:0] reg3;
 
    assign reg1 = { A, {8{1\'b0}}};
    assign reg2 = { {6{1\'b0}} , A ,{2{1\'b0}}};
    assign reg3 = { {8{1\'b0}} , A};
 
    assign B = reg1 - reg2 - reg3; 
endmodule

 

2.31 用C语言实现整数到ASCII码字符串的转换

 char* itoa(int num,char* str,int radix)
 {
     char index[]="0123456789ABCDEF";//索引表
     unsigned unum;//存放要转换的整数的绝对值,转换的整数可能是负数
     int i=0,j,k;//i用来指示设置字符串相应位,转换之后i其实就是字符串的长度;转换后顺序是逆序的,有正负的情况,k用来指示调整顺序的开始位置;j用来指示调整顺序时的交换。
  
     //获取要转换的整数的绝对值
     if(radix==10&&num<0)//要转换成十进制数并且是负数
     {
         unum=(unsigned)-num;//将num的绝对值赋给unum
         str[i++]=\'-\';//在字符串最前面设置为\'-\'号,并且索引加1
     }
     else unum=(unsigned)num;//若是num为正,直接赋值给unum
  
     //转换部分,注意转换后是逆序的
     do
     {
         str[i++]=index[unum%(unsigned)radix];//取unum的最后一位,并设置为str对应位,指示索引加1
         unum/=radix;//unum去掉最后一位
  
     }while(unum);//直至unum为0退出循环
  
     str[i]=\'\0\';//在字符串最后添加\'\0\'字符,c语言字符串以\'\0\'结束。
  
     //将顺序调整过来
     if(str[0]==\'-\') k=1;//如果是负数,符号不用调整,从符号后面开始调整
     else k=0;//不是负数,全部都要调整
  
     char temp;//临时变量,交换两个值时用到
     for(j=k;j<=(i-1)/2;j++)//头尾一一对称交换,i其实就是字符串的长度,索引最大值比长度少1
     {
         temp=str[j];//头部赋值给临时变量
         str[j]=str[i-1+k-j];//尾部赋值给头部
         str[i-1+k-j]=temp;//将临时变量的值(其实就是之前的头部值)赋给尾部
     }
  
     return str;//返回转换后的字符串
 }

 

posted on 2022-12-26 17:59  皮皮祥  阅读(1111)  评论(0编辑  收藏  举报