搜档网
当前位置:搜档网 › FPGA经典面试题

FPGA经典面试题

FPGA经典面试题
FPGA经典面试题

FPGA与CPLD内部结构区别?

CPLD

以altraMAX7000这种PLD为例,可分为三块结构:宏单元(Marocell),可编程连线(PIA)和I/O控制块。宏单元是PLD的基本结构,由它来实现基本的逻辑功能。可编程连线负责信号传递,连接所有的宏单元。I/O控制块负责输入输出的电气特性控制,比如可以设定集电极开路输出,摆率控制,三态输出等。

这种基于乘积项(实际就是与或阵列)的PLD基本都是由EEPROM和Flash 工艺制造的,一上电就可以工作,无需其他芯片配合。布线方式是全局的,所以延时可预测。CPLD适合做逻辑设计。

FPGA

FPGA基于LUT,LUT本质上就是一个RAM,每一个LUT可以看成一个有4位地址线的16x1的RAM。这也是为什么FPGA需要外接一个rom来上电配置。

以xilinx的Spartan-II为例,主要包括CLBs,I/O块,RAM块和可编程连线。在spartan-II中,一个CLB包括2个Slices,每个slices包括两个LUT,两个触发器和相关逻辑。Slices可以看成是SpartanII实现逻辑的最基本结构。

FPGA的制造工艺确定了FPGA芯片中包含的LUT和触发器的数量非常多,往往都是几千上万,PLD一般只能做到512个逻辑单元,而且如果用芯片价格除以逻辑单元数量,FPGA的平均逻辑单元成本大大低于PLD。所以如果设计

中使用到大量触发器,例如设计一个复杂的时序逻辑,那么使用FPGA就是一个很好选择。

https://www.sodocs.net/doc/8a11703561.html,tch和Register区别?行为描述中Latch如何产生?

本质的区别在于:latch是电平触发,reg是边沿触发。时序设计中尽量使用reg触发。

行为描述中,如果对应所有可能输入条件,有的输入没有对应明确的输出,系统会综合出latch。

比如:always@( a or b) //缺少else语句

begin

if(a==1)

q <= b;

end

3.对竞争冒险的理解,以及如何消除?

在组合逻辑中,由于门的输入信号通路中经过了不同的延时,导致到达该门的时间不一致叫竞争。产生毛刺叫冒险。如果布尔式中有相反的信号则可能产生竞争和冒险现象。解决方法:一是添加布尔式的消去项,二是在芯片外部加电容。

4.用Verilog设计一个5分频器。

5分频,奇数分频都可以类似这么做,只需要改div1和div2的参数。div1为奇数分频除2的余数。采用上升延和下降延分别触发不同波形,最后叠加的方式产生奇数分频。

module divfreq(clk, clk1x, rst, clk1xpose, clk1xnege, coutpose, coutnege);

input clk;

input rst;

output clk1x;

output clk1xpose;

output clk1xnege;

output[2:0] coutpose;

output[2:0] coutnege;

reg clk1xpose;

reg clk1xnege;

reg[2:0] coutpose;

reg[2:0] coutnege;

parameter div1 = 2 , div2 = 4; // div1 =5 / 2, div2 = 5 - 1 assign clk1x = clk1xpose | clk1xnege;

always@(posedge clk or negedge rst)

begin

if(!rst)

clk1xpose = 0;

else if(coutpose == div1)

clk1xpose = ~clk1xpose;

else if(coutpose == div2)

clk1xpose = ~clk1xpose;

else

clk1xpose = clk1xpose;

end

always@(negedge clk or negedge rst)

begin

if(!rst)

clk1xnege = 0;

else if(coutnege == div1)

clk1xnege = ~clk1xnege;

else if(coutnege == div2)

clk1xnege = ~clk1xnege;

else

clk1xnege = clk1xnege;

end

always@(posedge clk or negedge rst)

begin

if(!rst)

coutpose = 0;

else if(coutpose == div2)

coutpose = 0;

else

coutpose = coutpose + 1;

end

always@(negedge clk or negedge rst)

begin

if(!rst)

coutnege = 0;

else if(coutnege == div2)

coutnege = 0;

else

coutnege = coutnege + 1;

end

endmodule

1、FPGA结构一般分为三部分:可编程逻辑块(CLB)、可编程I/O模块和可编程内部连线。

2 CPLD的内部连线为连续式布线互连结构,任意一对输入、输出端之间的延时是固定;FPGA的内部连线为分段式布线互连结构,各功能单元间的延时不定(不可预测)。

3 大规模可编程器件主要有CPLD和FPGA两类,其中CPLD通过可编程乘积项逻辑实现其逻辑功能。基于SRAM的FPGA器件,每次上电后必须进行一次配置。FPGA内部阵列的配置一般采用在电路可重构技术,编程数据保存在静态存储器(SRAM) ,掉电易失。

4 目前世界上有十几家生产CPLD/FPGA的公司,最大的两家是:Altera,Xilinx。

5 硬件描述语言(HDL)是EDA技术的重要组成部分,是电子系统硬件行为描述、结构描述、数据流描述的语言,它的种类很多,如VHDL、Verilog HDL、AHDL

6 WHEN_ELSE条件信号赋值语句和IF_ELSE顺序语句的异同

WHEN_ELSE条件信号赋值语句中无标点,只有最后有分号;必须成对出现;是并行语句,必须放在结构体中。

IF_ELSE顺序语句中有分号;是顺序语句,必须放在进程中

7 可编程逻辑器件设计输入有原理图输入、硬件描述语言输入和波形输入三种方式。

原理图输入方式是一种最直接的设计描述方式,

硬件描述语言的突出优点是:

* 语言与工艺的无关性;语言的公开可利用性,便于实现大规模系统的设计;

* 具有很强的逻辑描述和仿真功能,而且输入效率高,在不同的设计输入库之间的转换非常方便,用不着对底层的电路和PLD结构的熟悉。

波形设计输入适用于时序逻辑和有重复性的逻辑函数。

8 用VHDL/Veilog HDL语言开发可编程逻辑电路的完整流程:

文本编辑→功能仿真→逻辑综合→布局布线→时序仿真。

* 所谓综合,就是根据设计功能和实现该设计的约束条件(如面积、速度、功耗和成本等),将设计输入转换成满足要求的电路设计方案,该方案必须同时满足与其的功能和约束条件。综合的过程也是设计目标的优化过程,其目的是将多个模块化设计文件合并为一个网表文件,供布局布线使用,网表中包含了目标器件中的逻辑单元和互连的信息。

*布局布线就是根据设计者指定的约束条件(如面积、延时、时钟等)、目标器件的结构资源和工艺特性,以最优的方式对逻辑元件布局,并准确地实现元件间的互连,完成实现方案(网表)到使实际目标器件(FPGA或CPLD)的变换。

9 基于EDA软件的FPGA / CPLD设计流程为:

原理图/HDL文本输入→功能仿真→综合→适配→时序仿真→编程下载→硬件测试。

* 综合是EDA设计的关键步骤,综合就是将电路的高级语言转换成低级的,可与FPGA/CPLD相映射的功能网表文件。为实现系统的速度、面积、性能的要求,需要对综合加以约束,称为综合约束。

10 构成一个完整的VHDL语言程序的五个基本结构:

实体(ENTITY)、结构体(ARCHITECURE)、配置(CONFIGURATION) 、库(LIBRARY) 、程序包(PACKAGE) 。

*实体的由实体说明和结构体两部分组成。实体说明部分用于描述所设计系统的外部端口信号和参数的属性和设置,而结构体部分则定义了设计单元的具体功能、行为、数据流程或内部结构。

*结构体的三种描述方式,即行为级描述、数据流级描述和结构级描述。

结构体通常由结构体名称、定义语句和并行处理语句构成,

*程序包用于存放各设计模块能共享的数据类型、常数、子程序等。

*库用于存放已编译的实体、结构体、程序包和配置,可以通过其目录进行查询和调用。在VHDL语言中,可以存在多个不同的库,但是库与库之间是独立的,不能互相嵌套。它可由用户生成或由ASIC芯片制造商提供,以便于在设计中为大家所共享。

常用库:(1)IEEE库

IEEE库主要包括std_logic_1164、numeric_bit、numeric_std等程序包,还有一些程序包非IEEE标准,但并入IEEE库,如std_logic_arich、std_logic_unsign ed、std_logic_signed。

使用IEEE程序包,必须声明。

(2) std库

包含standard textio程序包。Std库符合IEEE标准,应用中不必声明。

(3) work库

用户的VHDL设计先行工作库。

(4) vital 库

包含时序程序包vital_timing和vital_primitives。设计开发过程通常不用

每个设计实体都必须有各自完整的库说明语句和use语句。Use语句的使用将使说明的程序包对本设计实体部分全部开放,即是可视的。

11 VHDL的数据对象包括常量(constant)、变量(varuable) 和信号(signal) ,它们是用来存放各种类型数据的容器。

12 在VHDL的端口声明语句中,端口方向包括in 、out 、buffer 、inout、linkage

“BUFFER”为缓冲端口,与OUT类似,只是缓冲端口允许实体内部使用该端口信号,它可以用于输出,也可以用于端口信号的反馈。当一个结构体用“BU FFER”说明输出端口时,与其连接的另一个结构体的端口也要用BUFFER说明。

以“LINKAGE”定义的端口不指定方向,无论哪个方向的信号都可以连接。

13 VHDL的PROCESS(进程)语句是由顺序语句组成的,但其本身却是并行语句。

14 VHDL的子程序有过程(PROCEDURE) 和函数(FUNCTION) 两种类型,具有可重载性特点。

15 图形文件的扩展名是.bdf ;矢量波形文件的扩展名是.vwf ;使用VH DL语言,文本设计文件的扩展名是.vhd ;自建元件图形符号文件的扩展名.bs f;资源分配说明文件扩展名.qsf,用文本打开它可以修改引脚编号;逻辑综合会生成.edf文件;双击.qpf文件可启动QuartusII并打开已有工程。

16 图形编辑中模块间的连线有三种形式:节点线、总线和管道线

17 Quartus编译器编译FPGA工程最终生产两种不同用途的文件,它们分别是.sof和.pof。sof是SRAM Object File,下载到FPGA中,断电丢失。

pof是Programmer Object File,下载到配置芯片中,上电重新配置FPGA

18 FPGA过程中的仿真有三种:行为仿真、逻辑仿真、时序仿真。

19 IP核在EDA技术和开发中占有很重要的地位,提供VHDL硬件描述语言功能块,但不涉及实现该功能模块的具体电路的IP核为软件IP。

二名词解释,写出下列缩写的中文(或者英文)含义:

1. FPGA Field-Programmable Gate Array 现场可编程门阵列

2 VHDL-- Very-High-Speed Integrated Circuit Hardware Description Langu age)甚高速集成电路硬件描述语言

3 HDL Hardware Description Language硬件描述语言

4 EDA Electronic Design Automation 电子设计自动化

5 CPLD Complex Programmable Logic Device复杂可编程逻辑器件

6 PLD Programmable Logic Device 可编程逻辑器件

7 GAL,generic array logic通用阵列逻辑

8. LAB Logic Array Block逻辑阵列块

9. CLB Configurable Logic Block 可配置逻辑模块

10 EAB Embedded Array Block 嵌入式阵列块

11 SOPC System-on-a-Programmable-Chip 可编程片上系统

12. LUT Look-Up Table 查找表

13. JTAG Joint Test Action Group 联合测试行为组织

14. IP Intellectual Property 知识产权

15 ASIC Application Specific Integrated Circuits 专用集成电路

16 ISP In System Programmable 在系统可编程

17 ICR In Circuit Re-config 在电路可重构

18 RTL Register Transfer Level 寄存器传输级

选择:

1.基于VHDL设计的仿真包括有①门级时序仿真、②行为仿真、③功能仿真和④前端功能仿真这四种,按照自顶向下的设计流程,其先后顺序应该是:______D___

A.①②③④B.②①④③C.④③②①D.②④③①

2.执行Quartus II的B 命令,可以检查设计电路错误。

A Create Default Symbol

B Compiler----编译

C Simulator ----时序仿真

D Timing Analyzer ---时序分析

3. 在设计输入完成后,应立即对设计文件进行(C )。

A编辑B 编译C 功能仿真D时序仿真

4. 在VHDL中用(C )来把特定的结构体关联一个确定的实体,为一个大型系统的设计提供管理和进行工程组织。

A输入B 输出C综合D配置

5 电子系统设计优化,主要考虑提高资源利用率减少功耗(即面积优化),以及提高运行速度(即速度优化),下列方法 A 不属于面积优化。

A 流水线设计

B 资源共享

C 逻辑优化

D 串行化

6 不完整地IF语句,其综合结果可实现

A 时序逻辑电路

B 组合逻辑电路

C 双向电路

D 三态控制电路

7.下面对利用原理图输入设计方法进行数字电路系统设计,那一种说法是不正确的______。

A. 原理图输入设计方法直观便捷,但不适合完成较大规模的电路系统设计;

B. 原理图输入设计方法一般是一种自底向上的设计方法;

C. 原理图输入设计方法无法对电路进行功能描述;

D. 原理图输入设计方法也可进行层次化设计。

8.在VHDL语言中,下列对进程(PROCESS)语句的语句结构及语法规则的描述中,不正确的是___C____。

A. PROCESS为一无限循环语句;敏感信号发生更新时启动进程,执行完成后,等待下一次进程启动。

B. 敏感信号参数表中,不一定要列出进程中使用的所有输入信号;

C. 进程由说明部分、结构体部分、和敏感信号三部分组成;

D. 当前进程中声明的变量不可用于其他进程

9 IP核在EDA技术和开发中占有很重要的地位,提供VHDL硬件描述语言功能块,但不涉及实现该功能模块的具体电路的IP核为 C

A 硬件IP

B 固件IP

C 软件IP

D 都不是

10 综合是EDA设计的关键步骤,下面对综合的描述中错误的是A 综合就是把抽象设计中的一种表示转换成另一种表示的过程。

B 综合就是将电路的高级语言转换成低级的,可与FPGA/CPLD相映射的功能网表文件。

C 为实现系统的速度、面积、性能的要求,需要对综合加以约束,称为综合约束。

D 综合可理解为一种映射过程,并且这种映射关系是唯一的,即综合结果是唯一的。

11 大规模可编程器件主要有CPLD和FPGA两类,下面对FPGA结构与工作原理描述中,正确的是

A FPGA全称为复杂可编程逻辑器件

B FPGA是基于乘积项结构的可编程逻辑器件。

C 基于SRAM的FPGA器件,每次上电后必须进行一次配置。

D 在Altera公司生产的器件中,MAX7000系列属于FPGA结构

12 大规模可编程器件主要有CPLD和FPGA两类,其中CPLD通过实现其逻辑功能。

A 可编程乘积项逻辑;

B 查找表(LUT)

C 输入缓冲

D 输出缓冲

13 进程中的信号赋值语句,其信号更新是

A 按顺序完成B比变量更快完成C 在进程最后完成D 都不对

14 VHDL语言是一种结构化的语言,一个设计实体(电路模块)包括实体说明与结构体两部分,结构体描述

A 器件的外部特性

B 器件的内部功能

C 器件的综合约束

D 器件外部特性与内部功能

15 关于VHDL的数字,请找出以下数字中最大的一个A 2#1111_1110# B 8#276# C 10#170# D 16#E#E1

判断下列标识符书写是否合法

Architecture \architecture\ add2-1 add2_1

2_009 2,009 2.009e3 2.009 E3

VHDL语言的短标识符遵循以下命名规则:

* 短标识符必须以英文字母开头;

* 短标识符由26个字母(A~Z,a~z)、数字(0~9)和下划线“_”字符组成;

* 下划线“_”的前后都必须有英文字母或者数字;

* 短标识符不区分大小写;

如:EDA、Eda、eda均为相同的命名。

VHDL语言的扩展标识符遵循以下命名规则:

* 扩展标识符用反斜杠来分隔;如:\adde\,\begin-add\等。

* 扩展标识符允许包含图形符号及空格等;如:\counter & adder\,\entity% end\

* 扩展标识符的两个反斜杠之间可以用保留字;如:\entity\,\architecture\等。

* 扩展标识符的两个反斜杠之间可以用数字开头;如:\ l adder\,\44count er\等。

* 扩展标识符中允许多个下划线相连;如:\adder.es__ counter\等。

* 同名的扩展标识符和短标识符不表示同一名称;如:\adder\和adder不相同。

* 扩展标识符区分大小写字母;如:\EDA\和\eda\不相同。

* 扩展标识符中如果含有一个反斜杠,可以两个反斜杠来代替;

如:\adder\\counter\表示的扩展标识符名称为adder\countera

十进制数的定义格式为:整数[.整数][指数]

其中整数可表示为"数字_数字",指数可表示为"E+(或-)整数",但只有十进制的实数才允许指数为负值。在相邻的数字之间插入下划线,对数值并无影响,而且允许在数字之前冠以若干个零,但是不允许在数字中存在空格或其它字符。

以基表示的数,格式:基#基于基的整数[.基于基的整数]#指数

基是一个整数,其最小值是2,最大值是16。基于基的整数可表示为“扩展数字_扩展数字”,其中扩展数字为数字(或字母,如十六进制中的A、B、C、D、E、F,且大小写字母所表达的意义相同),插入下划线不会影响其数值大小。

2#111111_11# 等效于(2#11111111#),表示十进制数255

8#0037 等效于(8#377#),表示十进制数255 3×82+7×8+7

016#0Ff# 等效于(16#FF#),表示十进制数255=16×15+15

16#8F#E1 表示十进制数2288,即143×16=(16 ×8+15)×16

2#1.1111_01#e8 表示十进制数500=(1+2-1+2-2+2-3+2-4+2-6) ×28

16#0.E#E0 表示十进制数0.875 =(16×0+14×16-1) ×160

位串用于表示位矢量,格式为:基数说明符“数字字符串”

其中的基数说明符包括B、O和X,

B表示二进制数,O表示八进制数,X表示十六进制数。

B“10101111”,O“375”,X“89AC”,

数位字符串实际是位矢量,只有2,8,16进制,默认为B,

用于对一维位矢量的赋值,8每数占3位,16每数占4位

逻辑运算符的左边和右边以及代入的信号的数据类型必须是相同的,否则编译时会给出出错警告。当一个语句中存在两个以上的逻辑表达式时,在VHDL 语言中,左右没有优先级差别。X<=(a AND b) OR c;若去掉式中的括号,则从语法上来说是错误的。不过,如果一个逻辑表达式中只有一种逻辑运算符,那么改变运算的顺序不会导致逻辑的改变,此时括号就可以省略掉。例如:

a<=b OR c OR d OR e;

a<=b AND c AND d AND e --对应的逻辑表达式为a=b·c·d·e

a<=b OR c OR d OR e --对应的逻辑表达式为a=b+c+d+e

a<= (b OR c) AND (d OR e) --对应的逻辑表达式为a= (b+c)·(d+e)

在进行关系运算时,左右两边的操作数的类型必须相同,但是位长度不一定相同。在利用关系运算符对位矢量数据进行比较时,比较过程是从最左边的位开始,自左至右按位进行比较的。在位长不同的情况下,只能按自左至右的比较结果作为关系运算的结果。

关系运算符中的小于等于运算符“<=”与信号赋值时的符号“<=”是相同的。在阅读程序时,应按照上下文关系来判断此符号到底是关系运算符还是代入符。

移位运算:

SLL是将位向量左移,右边移空位补零;SLA是将位向量左移,右边第一位的数值保持原值不变;SRL是将位向量右移,左边移空位补零;SRA是将位向量右移,左边第一位的数值保持原值不变。ROR和ROL是自循环移位方式。

A<= "1001";

B<=A SLL 1; 逻辑左移B=0010

C<=A SRL 1; 逻辑右移C=0100

D<=A SLA 1; 算术左移D=0011

E<=A SRA 1; 算术右移E=1100

F<=A ROL 1; 循环左移F=0011

G<=A ROR 1; 循环右移G=1100

VHDL的数据对象有三种类型:常量(constant)、变量(varuable) 和信号(sig nal)它们是用来存放各种类型数据的容器。

* 常量。全局量CONSTANT 常量名: 数据类型: = 表达式;

相关主题