FPGA八股文(2)——笔试的FPGA问题汇总(持续更新)

目录

如何防止亚稳态?

多时域设计中,如何处理信号跨时域?

什么是竞争与冒险现象?怎样判断?如何消除?

锁存器(Latch)和寄存器(Flip-Flop)概念和区别

`timescale

阻塞赋值&非阻塞赋值

流水线

函数&任务

不可综合verilog语句

一些小计算总结


如何防止亚稳态?

亚稳态是指触发器无法在某个规定时间段内达到一个可确认的状态。当一个触发器进入亚稳态时,既无法预测该单元的输出电平,也无法预测何时输出才能稳定在某个正确的电平上。在这个稳定期间,触发器输出一些中间级电平,或者可能处于振荡状态,并且这种无用的输出电平可以沿信号通道上的各个触发器级联式传播下去。

解决方法:

1 降低系统时钟频率

2 用反应更快的FF

3 引入同步机制,防止亚稳态传播(加两级D触发器)。

4 改善时钟质量,用边沿变化快速的时钟信号

多时域设计中,如何处理信号跨时域?

不同的时钟域之间信号通信时需要进行同步处理,这样可以防止新时钟域中第一级触发器的亚稳态信号对下级逻辑造成影响。

解决方法:
1 信号跨时钟域同步:当单个信号跨时钟域时,可以采用两级触发器来同步;
2 数据或地址总线跨时钟域: 可以采用异步 FIFO 来实现时钟同步;
3 第三种方法就是采用握手信号

什么是竞争与冒险现象?怎样判断?如何消除?

在组合电路中, 门电路两个输入信号同时向相反的逻辑电平跳变称为竞争;由于竞争而在电路的输出端可能产生尖峰脉冲的现象称为竞争冒险。 (也就是由于竞争产生的毛
刺叫做冒险)。


判断方法:
代数法: 如果布尔式中有相反的信号则可能产生竞争和冒险现象,即逻辑函数在一定条件
下可以化简成 Y=A+A’或 Y=AA’则可以判断存在竞争冒险现象(只是一个变量变化的情况) ;
卡诺图:有两个相切的卡诺圈并且相切处没有被其他卡诺圈包围,就有可能出现竞争冒险;
实验法+观察法:示波器观测;


解决方法:
1加滤波电容,消除毛刺的影响;
2加选通信号,避开毛刺;
3增加冗余项消除逻辑冒险。

锁存器(Latch)和寄存器(Flip-Flop)概念和区别

电平敏感的存储器件称为锁存器。可分为高电平锁存器和低电平锁存器,用于不同时钟之间的信号同步。
有交叉耦合的门构成的双稳态的存储原件称为触发器(寄存器)。分为上升沿触发和下降沿触发。可以认为是两个不同电平敏感的锁存器串连而成。前一个锁存器决定了触发器的建立时间,后一个锁存器则决定了保持时间。
latch 是电平触发, register 是边沿触发。 register 在同一时钟边沿触发下动作,符合同步电路的设计思想,而 latch 则属于异步电路设计,往往会导致时序分析困难,不适当的应用 latch 则会大量浪费芯片资源。

`timescale

 `timescale 1ns / 1ps,含义为:时延单位为1ns,时延精度为1ps

在仿真文件里面需要写,例如

`timescale 10 ns / 1 ns     //单位10ns,精度1ns
 
module test;
    reg set;
    
    initial begin
        #1    set = 0;     //1*10 ns  = 10ns
        #10    set = 1;    //10*10ns  = 100ns
    end
endmodule

阻塞赋值&非阻塞赋值

阻塞赋值“<=”属于顺序执行,即下一条语句执行前,当前语句一定会执行完毕

非阻塞赋值“=”属于并行执行语句,即下一条语句的执行和当前语句的执行是同时进行的

在设计电路时,always 时序逻辑块中多用非阻塞赋值,always 组合逻辑块中多用阻塞赋值;在仿真电路时,initial 块中一般多用阻塞赋值

不要在一个过程结构中混合使用阻塞赋值与非阻塞赋值

流水线

流水线设计是verilog设计中基本功之一,是对组合逻辑系统的分割,并在各个部分之间插入寄存器,并暂存中间数据的方法。

流水线操作的目的是把一个大操作分解为若干小操作,因为每一步操作变小了,所以时间更短,频率更快面积换时间)。流水线在理各个阶段都需要增加寄存器保存中间计算状态,而且多条指令并行执行会导致功耗增加,硬件复杂度增加

函数&任务

函数返回一个值,而任务则不返回值

函数至少要有一个输入变量,而任务可以没有或有多个任何类型的变量。

函数只能与主模块共用同一个仿真时间单位,而任务可以定义自己的仿真时间单位。

函数不能启动任务,而任务能够启动其他任务和函数。

不可综合verilog语句

(1)initial:只能在test bench中使用,不能综合。

(2)events:event在同步test bench时更有用,不能综合。

(3)real:不支持real数据类型的综合。

(4)time:不支持time数据类型的综合。

(5)force 和release:不支持force和release的综合。

  (6)assign 和deassign:不支持对reg 数据类型的assign或deassign进行综合,支持对wire数据类型的assign或deassign进行综合。

  (7) fork join:不可综合,可以使用非块语句达到同样的效果。

  (8) primitives:支持门级原语的综合,不支持非门级原语的综合。

  (9) table:不支持UDP 和table的综合。

  (10) 敏感列表里同时带有posedge和negedge
如:always @(posedge clk or negedge clk) begin...end
这个always块不可综合。

  (11) 同一个reg变量被多个always块驱动

  (12) 延时
以#开头的延时不可综合成硬件电路延时,综合工具会忽略所有延时代码,但不会报错。
如:a=#10 b;
这里的#10是用于仿真时的延时,在综合的时候综合工具会忽略它。也就是说,在综合的时候上式等同于a=b;

  (13) 与X、Z的比较
可能会有人喜欢在条件表达式中把数据和X(或Z)进行比较,殊不知这是不可综合的,综合工具同样会忽略。所以要确保信号只有两个状态:0或1。

一些小计算总结

%0表示用最少位数表示

进行取模运算%时,结果值的符号位采用模运算式里第一个操作数的符号位

对于有符号数来说:

若符号位为1,使用>>>,高位补1;

若符号位为0,使用>>>,高位补0;

对于无符号数来说,无论最高位是什么,使用>>>,高位都补0。

标识符可以是任意一组数字、字母、$符合和下划线的组合,但第一个字符必须是字母或者下划线

你可能感兴趣的:(fpga开发)