FPGA的硬件结构&FPGA基本开发设计流程(FPGA随笔01)

如今FPGA内部结构也愈加丰富,但万变不离其宗——可编程逻辑单元、可编程I/O单元和布线资源构成了FPGA内部三大主要资源,如图所示。
在这里插入图片描述
1.可配置逻辑单元(Configurable Logic Block,CLB)
CLB在FPGA中最为丰富,由两个SLICE构成。由于SLICE有SLICEL (L:Logic)和SLICEM (M: Memory)之分,因此CLB可分为CLBLL和CLBLM两类,如图所示,图中箭头为进位链。
在这里插入图片描述
SLICEL 和 SLICEM内部都包含4个6输入查找表(LUT6)、3个数据选择器(MUX)1个进位链(Carry Chain)和8个触发器(Flip-Flop),如图所示。
在这里插入图片描述
LUT6的内部结构和基本功能表如下,尽管如此,二者的结构仍略有不同,正是这种结构上的差异导致了LUT6功能的不同。:
在这里插入图片描述在这里插入图片描述
查找表还可用作ROM(Read-Only Memory),每个SLICE 中的LUT6可配置为64×1(占用1个LUT6,64代表ROM深度,1代表ROM 宽度)、128×1(占用2个 LUT6)和256×1(占用4个LUT6)的ROM。
SLICEM 中的查找表可配置为RAM (Random Access Memory),称为分布式RAM。其中 RAM的写操作为同步,而读操作为异步,与时钟信号无关。如果需要实现同步读操作,则要占用额外的触发器,从而增加了一个时钟的Latency(延迟),但提升了系统的性能。一个LUT6可配置64×1的RAM,当RAM 的深度大于64时,会占用额外的MUX(F7AMUX、F7BMUX和 F8MUX)。VHDL代码1.2实现的是单端口RAM,会占用16个LUT6。对于分布式存储单元(RAM和ROM),Vivado提供了相应的IP:Distributed Memory Generator。

2.存储单元(Block RAM,BRAM)
每个BRAM2大小为36KB(RAMB36E1),由两个独立的18KB BRAM (RAMB18E1)构成,因此一个36KB的 BRAM可配置为4种情形,如图所示。由于两个18KB的BRAM无法共享其中的FIFO Logic(用于生成FIFO控制信号包括读/写地址等),因此无法将一个36KB的 BRAM当作两个18KB的 Built-in FIFO(使用固有的FIFO Logic)来使用。
在这里插入图片描述
BRAM与查找表构成的分布式RAM的差异如表所示。尽管BRAM可支持更多功能,但这并不表明BRAM在任何场合都具有优势。对于一些小规模的数据存储,分布式RAM可获得与BRAM相媲美甚至比 BRAM更好的性能(从功耗和速度两方面比较)。
在这里插入图片描述
BRAM配置为RAM时有三种工作模式:读优先(Read First,Read-Before-Write Mode),写优先 (Write First,Transparent Mode)和保持模式(No Change Mode)。这三种模式体现了当对RAM中同一地址同时进行读操作和写操作时的不同。

3.运算单元(DSP48E1)
7系列FPGA中的运算单元为 DSP48E123,它不仅可以实现逻辑运算,如与、或、异或,也可以实现算术运算,如加法、乘法、乘累加等。其对外端口如图所示。
在这里插入图片描述
端口描述如表所示,表中 Fix_W_F表示有符号定点数,字长为W,小数部分字长为F;UFix_W_F表示无符号定点数,字长为W,小数部分字长为F。DSP48E1支持25×18(被乘数和乘数位宽分别为25bit和 18bit)的有符号数乘法或24×17的无符号数乘法(端口A用作乘法输入端口时,尽管为30bit,但其高5位为符号位的扩展)。
在这里插入图片描述
在这里插入图片描述

DSP48E1的简化结构如图所示。图中D表示D触发器。构成 DSP48E1的核心部分为预加器、乘法器和算术逻辑单元(ALU,用于实现逻辑运算和算术运算,具体功能由ALUMODE 控制)。其中 ALU的输入数据由OPMODE 控制X MUX、Y MUX和ZMUX(图中以XYZ MUX表示)来决定。

在这里插入图片描述

传统的FPGA设计流程如图所示。设计输入支持 HDL代码如 VHDL、Verilog和System Verilog,也支持厂商提供的IP,同时还应提供FPGA工程约束文件如引脚分配、时序约束。

1.设计综合(Synthesis)则完成HDL代码到硬件电路的转化与映射并生成网表文件。这一步与FPGA内部结构密切相关。
2.设计实现(Implementation)阶段主要完成布局和布线(Place and Route)。
3.布局是将综合后的各个电路元件根据约束放置在FPGA内部,布线则是完成元件之间的走线。
4.设计调试则是将程序下载到FPGA中,借助测试仪器对设计进行分析。由于SRAM 工艺的 FPGA在掉电后程序会消失,因此需要将生成的下载程序转换为厂商要求的文件存储在片外Flash中,这即是程序固化。

在这里插入图片描述
设计验证贯穿于FPGA 设计的整个过程,包括两个部分:仿真和静态时序分析(STA:Static Timing Analysis)。
设计输入时除了提供可综合的 HDL代码外还应提供用于仿真的测试文件(Testbench)。测试文件有两个功能:一是提供输入激励;二是对测试结果进行对比分析。其中两个功能均具备的测试文件称为具有自我检查功能的测试文件。
设计输入完成后即可进行行为级仿真(Behavioral Simulation),该阶段的仿真没有延时信息只是功能上的验证,但在FPGA设计验证环节至关重要。
综合后仿真分为功能仿真和时序仿真两种。前者目的在于验证综合后的电路与原本HDL所描述电路功能是否保持一致;后者则加入了门级延时信息,可进一步用于分析设计时序。
实现后仿真也分为功能仿真和时序仿真,其目的与综合后仿真一致,只是实现后的时序仿真不仅加入了门级延时信息还包含了走线延时信息,使得仿真与FPGA本身的运行状态保持一致。仿真工具既可以选用FPGA厂商自己的工具,也可以选用第三方仿真工具。
静态时序分析建立在约束(时序约束和物理约束如面积约束、位置约束等)的基础上,对设计进行时序检查和分析。之所以进行时序分析是因为FPGA本身存在固有延时,而综合和布局布线又会引入门级延时和走线延时,这些延时可能会导致时序违例(建立时间或保持时间不能满足FPGA要求)。因此,只有仿真通过且没有时序违例的设计才可能在FPGA中正常运行。
上图中的虚线还表明FPGA 设计是一个反复迭代的过程,如在设计实现后发现时序违例,那么可能需要修改实现策略,也可能需要返回到设计输入阶段优化 HDL代码,然后重新综合、实现。

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值