草庐IT

FPGA面试题目笔记(二)——同步异步D触发器、静动态时序分析、分频设计、Retiming

Fighting_XH 2025-03-06 原文

文章目录


FPGA基础知识的总结

1、行为级与RTL级的区别

数字系统设计的过程:
算法——行为级描述——RTL级描述——门级网表——物理版图

1.1 RTL级(可综合成门级电路)

  • RTL级又称为寄存器级,是指用寄存器来描述电路数据流的方式,用硬件描述语言(verilog)描述,语句必须是可综合的(能生成各种门电路)。
  • 寄存器和组合逻辑来组成RTL级。在RTL级下,需要描述各级寄存器(寄存器),还要描述各级寄存器之间的信号的转换关系(组合逻辑)
  • 需要掌握如何采用RTL级对流水线原理图进行描述,同时还要知道哪里需要使用组合逻辑,哪里需要用寄存器,并且该如何实现。

1.2 行为级

  • 行为级一般基于算法,仅用来描述电路的功能,最终目的是得到输入和输出之间的关系,采用任何verilog语法描述都可以,因为不用考虑可综合的问题。
  • 行为级描述下,一般采用直接赋值的方式,需要运用大量的算术运算、延迟、initial块等不可综合语句,因此常用于验证仿真中。

题目:Verilog语言的层次高低对应(D)

A.系统级,行为级,功能级,寄存器传输级,门级

B.系统级,行为级,寄存器传输级,功能级,门级

C.系统级,功能级,寄存器传输级,行为级,门级

D.系统级,功能级,行为级,寄存器传输级,门级

二者区别的详细讲解


2、关于LUT

2.1 LUT是什么

LUT为查找表,顾名思义,其根本的作用也是查找(好比我们在字典中查找我们想要的字)。本质:给定一个输入的值,返回给一个对应的输出值。

2.2 N维查找表

查找表包括一维(1D LUT)、二维查找表等。

  • (1D LUT)一维查找表是在一维空间中,给定一个输入变量,得到一个对应的输出变量。如下所示,给输入0,得到输出0,给输入1,得到输出0.5……
  • (2D LUT)二维查找表是在二维空间中,输入输入两个不相关的变量,会得到相应的输出。比方说,我们的输入一组坐标(x, y),可得到该坐标对应的值。
  • 同理,3D LUT 就是三维查找表,输入三个不相关的变量,得到一个输出值。可在色彩空间中应用,比如给予一组RGB的数值,通过查找表查找后,得到一组新的RGB数值,从而实现了颜色的变化。

2.3 FPGA中的LUT

FPGA查找表的本质就是一个RAM,每一个LUT可看作一个有4位地址线的16*1RAM。一般情况下我们采用LUT4或者LUT6,因为如果查找表的输入位数过大的话,需要进行级联操作,会造成更大的数据传输延迟;

FPGA中,可使用LUT来实现组合逻辑电路的功能,形成门电路。LUT里存储的数据是真值表,根据逻辑计算后的结果,即可在LUT中查找对应内容。

  • 如下我们实现了二输入查找表,通过两个不相关的输入,根据逻辑功能得到对应的输出,这里的逻辑功能就是查找表,因此查找表也相当于逻辑门的真值表。
module test(
    input  a,
	 input  b,
	 output out1,
	 output out2
	 );
	 assign out1 = a & b;
	 assign out2 = a | b;
endmodule

可看出我们采用LUT实现了门电路,LUT内就是逻辑门电路的真值表。
根据LUT是ROM且内部存储数据是真值表的本质,对于LUT1,我们即可通过输入变量00,输出LUT1中地址为00存储单元中的数值0……

  • 如何看一个设计中含有几个查找表?
    3.2.2 详解

LUT前生今世
FPGA中LUT详解


3、`include和条件编译

我们用`include来进行文件的包含,和C语言类似,该文件中定义一些公共的宏参数。一个include只能对一个头文件进行包含。

  • 条件编译:当满足条件时对一组语句进行编译,当条件不满足时则对另外一组语句进行编译。
  • `define作为条件编译的标志,定义了哪一段哪一段即可编译,否则不编译。
  • `ifdef 可出现在设计的任何地方;
 `ifdef 宏名(标识符)
        程序段1
`else
        程序段2 
`endif
  • 在FPGA图像处理中,VGA驱动设计处会用到这种条件编译的方式,用来选择不同VGA分辨率中对应的显示前沿、行有效等宏参数,如下是定义的800*600分辨率的VGA时序参数。我们通过包含头文件(建议包含头文件和该文件在同一文件夹下)以及用`define的方式来选择对应的分辨率即可。

  • `define VGA_800_600……表示这800*600分辨率的一部分代码被编译。

详解


4、写异步D触发器(扬智电子笔试)

关于D触发器:

D触发器通常在时钟上升沿时,此时会捕获D端输入的值,然后保持该值不变,直到下一个上升沿到来时,重新捕获D端的输入值。因此它具有存储记忆功能。

注意:D触发器的正常工作必须要满足其保持和建立时间要求。如果数据稳定的时候不满足要求,也是不能正常存储的。

//一位 异步D触发器
 module test(clk,rst,d,q);

	 input clk;
	 input rst;
	 input d;
	 output reg q;
	 
always@(posedge clk or negedge rst)
	 if(!rst)
	     q <= 0;
	 else
	     q <= d;

endmodule

生成的RTL如下:

4.1 八位同步D触发器

 module test(clk,rst,d,q);

	 input clk;
	 input rst;
	 input [7:0]d;
	 output reg [7:0]q;
	 
always@(posedge clk )
	 if(!rst)
	     q <= 0;
	 else
	     q <= d;

endmodule

RTL图:

4.2 具有异步清零,同步复位信号功能的D触发器

module test(clk,rst,clr,q,d);

 
	 input           clk    ;
	 input           rst    ;
	 input clr;
	 input           d      ;
	 output  reg     q      ;
	 

always @ (posedge clk or posedge clr )
    if(clr)
        q <= 0;
    else if(rst)
	     q <= 1;

    else
	     q <= d;
		  
endmodule


这里相当于有了优先级,清零信号clr优先于复位rst信号。
优先的理解:当clr清零的时候,不管rst信号为高电平还是低电平都不会影响q为0的结果。

5、静态、动态时序分析的优缺点(威盛VIA 2003.11.06 上海笔试试题)

1、动态时序分析:是通常我们所说的仿真,该仿真可以验证功能和时序。方法:首先确定测试向量,输入硬件模型,进行仿真。
优点:比较精确,同静态时序相比,它适用于更多的设计类型 。
缺点:若遇到门级等,分析速度慢;其次它需要使用输入矢量,这使得它在分析的过程中有可能会遗漏一些关键路径,难以保证足够的覆盖率;随着规模增大,所需要的向量数量以指数增长。

2、静态时序分析:只能分析时序,不能功能验证。
优点:不需要输入测试向量,比动态时序分析快得多,提高仿真时间。采用穷尽分析的方法,可验证每一条路径(100%覆盖),分析路径上的传播延时,比如组合逻辑延时、走线延时等,检查信号建立时间和保持时间是否满足时序要求。通过对最大路径延时和最小路径延时的分析,找出违背时序约束的错误。运行速度很快、占用内存较少。可利用时序分析结果进行时序优化。

缺点:静态时序分析只能对同步电路分析,不能对异步电路时序分析。在深亚微米的工艺条件下,静态时序分析不能完整的把所有影响延时的因素给包含进去。

6、采用二选一多路器 mux2和inv非门实现异或操作(飞利浦-大唐笔试)

module test(sel,b,c);
	 input   sel ;
	 input   b   ;
	 output  c   ;
	 
   assign  c= sel ?(~b):(b);	  
endmodule

生成的RTL图:

只使用mux实现异或:

7、寄存器和锁存器的区别,为什么多用寄存器,行为级描述中锁存器如何产生

1、锁存器Latch :锁存器是电平触发方式,属于异步电路设计。————用于组合逻辑
缺点:不利于时序分析;对毛刺敏感;FPGA是没有锁存器单元的,它由查找表和触发器组成,因此会造成更多的资源浪费。

产生锁存器的几个情况

1,case——缺少default的时候产生锁存器

2,if-------else if ——缺少else的时候产生锁存器

3,always@(敏感信号表)——赋值表达式右边参与赋值的信号没有在敏感列表出现会出现透明锁存器

2、寄存器Register:寄存器是时钟边沿触发方式,属于同步电路设计。
寄存器更利于时序分析,还能防止亚稳态等现象出现,FPGA里有寄存器单元,因此使用可节约芯片资源。

8、 D触发器实现2分频的Verilog描述 (汉王笔试)

关于分频设计及仿真的参考

verilog代码:

module test(clk,rst_n,out);
 
	 input   clk ;
	 input   rst_n ;
	 output  reg out;
	 

always @ (posedge clk or negedge rst_n)
    if(!rst_n)
	     out <= 0;
	 else
	     out <= ~out;  
endmodule

RTL图:

tb文件:

`timescale 1ns/1ns
`define clock_period  20	 
module test_tb;
	   
	   reg clk;
		reg rst_n;
	
		wire out;

	
	  test  u1(
	
	   .clk(clk),
	   .rst_n(rst_n),
		.out(out)

	 );
	 
//产生时钟复位激励
	 initial  clk = 1;
	 always #(`clock_period/2)  clk =~clk;
	 
initial  begin 
	 rst_n = 0;
	 #5;
	 rst_n = 1;
	 #100;
	 $stop;
	 end

	 
endmodule 

波形仿真:

9、D触发器实现带同步高置数和异步高复位端的二分频的电路

需要关注两个点:同步高置数和异步高复位。
因此这里有置位和复位两个信号——set和rst

verilog代码如下:
module test(clk,rst,set,q);

 
	 input           clk    ;
	 input           rst    ;
	 input           set   ;
	 output  reg     q ;
	 

always @ (posedge clk or posedge rst )
    if(rst)
	     q <= 0;
	 else if(set)
	     q <= 1;
    else
	     q <= ~q;
		  
endmodule

RTL图:

10、设计一个可预置初值的7进制循环计数器

module test(clk,rst_n,load,data,cout);

 
	 input           clk    ;
	 input           rst_n  ;
	 input           load   ;
	 input       [2:0] data ;
	 output  reg [2:0] cout  ;
	 

always @ (posedge clk )
    if(!rst_n)
	     cout <= 3'd0;
	 else if(load)
	     cout <= data;
	 else if(cout == 3'd6)
	     cout <= 3'd0;
    else
	     cout <= cout + 3'd1;
		  
endmodule

如果想要设计一个可预置初值的15进制循环计数器,修改位宽以及计数最大值即可。

参考

11、高阻态

高阻态是指电路的一种输出状态,和高低电平一样,但是它既不是高电平也不是低电平,如果高阻态再输入下一级电路的话,对下级电路无任何影响,可以理解为断路,不被任何东西所驱动,也不驱动任何东西。

12、对Retiming技术的理解

重定时(Retiming)是一种时序优化技术,用在不影响电路输入/输出行为的情况下跨组合逻辑寄存器从而提高设计性能。
例如:当组合逻辑过大的时候,我们可采用流水线的方式用面积换取速度——插入寄存器

有关FPGA面试题目笔记(二)——同步异步D触发器、静动态时序分析、分频设计、Retiming的更多相关文章

  1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  2. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  3. ruby - 触发器 ruby​​ 中 3 点范围运算符和 2 点范围运算符的区别 - 2

    请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是

  4. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  5. 【Java 面试合集】HashMap中为什么引入红黑树,而不是AVL树呢 - 2

    HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候

  6. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  7. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  8. ruby - 在 Ruby 中动态创建数组 - 2

    有没有办法在Ruby中动态创建数组?例如,假设我想遍历用户输入的书籍数组:books=gets.chomp用户输入:"TheGreatGatsby,CrimeandPunishment,Dracula,Fahrenheit451,PrideandPrejudice,SenseandSensibility,Slaughterhouse-Five,TheAdventuresofHuckleberryFinn"我把它变成一个数组:books_array=books.split(",")现在,对于用户输入的每一本书,我想用Ruby创建一个数组。伪代码来做到这一点:x=0books_array.

  9. ruby-on-rails - 设计注册确认 - 2

    我在我的项目中有一个用户和一个管理员角色。我使用Devise创建了身份验证。在我的管理员角色中,我没有任何确认。在我的用户模型中,我有以下内容:devise:database_authenticatable,:confirmable,:recoverable,:rememberable,:trackable,:validatable,:timeoutable,:registerable#Setupaccessible(orprotected)attributesforyourmodelattr_accessible:email,:username,:prename,:surname,:

  10. ruby - 是否可以将 IRB 提示配置为动态更改? - 2

    我想在IRB中浏览文件系统并让提示更改以反射(reflect)当前工作目录,但我不知道如何在每个命令后进行提示更新。最终,我想在日常工作中更多地使用IRB,让bash溜走。我在我的.irbrc中试过这个:require'fileutils'includeFileUtilsIRB.conf[:PROMPT][:CUSTOM]={:PROMPT_N=>"\e[1m:\e[m",:PROMPT_I=>"\e[1m#{pwd}>\e[m",:PROMPT_S=>"FOO",:PROMPT_C=>"\e[1m#{pwd}>\e[m",:RETURN=>""}IRB.conf[:PROMPT_MO

随机推荐