Intel FPGA权威设计指南:基于Quartus Prime Pro 19集成开发环境
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.1 逻辑阵列块和自适应逻辑块

逻辑阵列块(Logic Array Block,LAB)由基本构件块—自适应逻辑模块(Adaptive Logic Module,ALM)构成。通过配置LAB,可以实现逻辑功能、算术功能和寄存器功能。

Cyclone 10 GX器件中1/4可用的LAB可用作存储器LAB(Memory LAB,MLAB)。某些器件有更多的MLAB。

1.1.1 ALM结构和功能

LAB 为可配置的逻辑块,它由一组逻辑资源构成。每个 LAB 包含用于将控制信号驱动其ALM的专用逻辑。MLAB是LAB的超集,包含所有LAB的特性。Cyclone 10 GX器件中 ALM 的内部结构如图 1.1 所示。从图中可知,每个 ALM 由上下两半部分组成,上/下半部包含下面逻辑设计资源:

① 1个4输入查找表(Look-Up Table,LUT);

② 2个3输入查找表(Look-Up Table,LUT);

③ 2个可编程寄存器;

④ 1个加法器;

⑤ 进位输入。

Cyclone 10 GX 器件中 ALM 的高层次结构如图 1.2 所示。每个 ALM 包含不同的基于LUT的资源,可以分割为两个组合自适应LUT(Adaptive LUT,ALUT)和4个寄存器。从图1.2可知,两个ALUT可以最多有8个输入,一个ALM可以实现两个函数的不同组合。这种适应性允许ALM与四输入LUT架构完全向后兼容。一个ALM可以实现具有多达6个输入和某些7个输入功能的任何函数。

图1.1 Cyclone 10 GX器件中ALM的内部结构

1.1.2 LUT的工作模式

每个ALM内的LUT可以工作在下面中的任何一种模式,包括普通模式、扩展LUT模式、算术模式和共享算术模式。

1.普通模式

在该模式中,允许在一个 ALM 中实现两个函数,或者 6 输入的一个函数。来自 LAB本地互联最多的 8 个数据输入可以作为组合逻辑的输入。ALM 可以支持完全独立功能的某些组合,以及具有共同输入的各种功能组合。Quartus Prime 编译器自动选择 LUT 的输入。在普通模式下,ALM支持寄存器打包。

一个具有四输入和两输出逻辑函数的Verilog HDL描述如代码清单1-1所示,适配后的网表结构如图1.3所示。

图1.2 Cyclone 10 GX器件中ALM的高层次结构

图1.3 一个具有四输入和两输出的逻辑函数适配后的网表结构

代码清单1-1 一个具有四输入和两输出逻辑函数的Verilog HDL描述

对图1.3给出的网表结构进行分析,如表1.1和表1.2所示。

表1.1 a~d输入与z[0]输出的网表结构分析

表1.2 a~d输入与z[1]输出的网表结构分析

续表

(1)对于 INPUT 原语(a~pad)而言,端口 SIMIN 和 PADOUT 的输出互补,SIMIN端口的输入为a,而PADOUT的输出为a_input;

(2)对于 INPUT 原语(b~pad)而言,端口 SIMIN 和 PADOUT 的输出互补,SIMIN端口的输入为b,而PADOUT的输出为b_input。

思考与练习1-1:在Cyclone 10 GX系列的FPGA中,使用LUT实现基本组合逻辑的方法。

适配后 z[1]与 z[0]在 ALM 上的布局和布线表示如图 1.4 所示。从图中可以看到,在ALM内部通过组合不同的LUT资源实现四输入和两输出的逻辑功能。

图1.4 适配后z[1]与z[0]在ALM上的布局和布线表示

图1.4 适配之后z[1]与z[0]在ALM上的布局和布线表示(续)

一个具有五输入和两输出逻辑函数的Verilog HDL描述如代码清单1-2所示,适配后的网表结构如图1.5所示。

代码清单1-2 一个具有五输入和两输出逻辑函数的Verilog HDL描述

图1.5 一个具有五输入和两输出的逻辑函数适配后的网表结构

对于两个五输入的函数封装到一个 ALM 的情况,函数必须至少要有两个公共的输入。公共的输入是 dataa 和 datab。用五输入函数来组合一个四输入函数要求一个公共输入,即dataa或datab。

思考与练习1-2:分析图1.5给出的结构,以及在ALM上的布局和布线。

一个具有六输入和两输出逻辑函数的Verilog HDL描述如代码清单1-3所示,适配后的网表结构如图1.6所示。

代码清单1-3 一个具有六输入和两输出逻辑函数的Verilog HDL描述

图1.6 一个具有六输入和两输出的逻辑函数适配后的网表结构

在使用一个ALM 实现两个六输入函数的情况下,必须共享4个输入且组合函数必须相同。在一个稀疏使用的器件中,放置在一个 ALM 中的函数可以通过软件放置在独立的ALM 中以实现最好的性能。当一个器件开始被逐步填满时,Quartus Prime 软件自动使用Cyclone 10 GX器件中所有潜在的ALM。软件编译器在一个ALM中自动查找使用公共输入的函数或完全独立的函数,以最有效地使用器件资源。此外,可以通过设置位置分配来人工控制资源。

通过使用 dataa、datab、datac、datad、datae0,dataf1、datae1 和 dataf0,可以实现任意六输入函数。如果使用datae0 和dataf1,得到的输出可以驱动寄存器0/寄存器1;如果使用datae1和dataf0,得到的输出可以驱动寄存器2/寄存器3。

思考与练习1-3:分析图1.6给出的网表结构,以及在ALM上的布局和布线。

2.扩展LUT模式

当实现七输入函数时,则使用扩展LUT模式。通过使用下面的输入,即dataa、datab、datac、datad、datae0、datae1和dataf0/dataf1,可以在一个ALM内实现一个七输入的函数。如果使用 dataf0,则输出可以驱动寄存器 0/寄存器 1;如果使用 dataf1,则输出可以驱动寄存器2/寄存器3。

一个具有七输入和两输出逻辑函数的Verilog HDL描述如代码清单1-4所示,适配后的网表结构如图1.7所示。

代码清单1-4 一个具有七输入和两输出逻辑函数的Verilog HDL描述

图1.7 一个具有七输入和两输出的逻辑函数适配后的网表结构

思考与练习1-4:分析图1.7给出的网表结构,以及在ALM上的布局和布线。

3.算术模式

在算术模式下,ALM使用两组两个四输入的LUT和两个专用的加法器。专用的加法器允许LUT执行预加法逻辑。因此,每个加法器可以对两个四输入的函数相加。ALM支持同时使用加法器的进位输出和组合逻辑输出。在这个操作中,忽略加法器的输出。

使用包含组合逻辑输出的加法器,可以为使用这个模式的功能节省最多 50%的资源。算术模式也提供时钟使能、计数器使能、同步向上和向下控制、加减控制、同步清除和同步加载。

LAB 本地互联的数据输入产生时钟使能、计数器使能、同步向上/向下和加/减控制信号。这些信号是在一个ALM内的4个LUT之间共享输入的良好备选。

同步清除和同步加载选项是基于LAB宽度的信号,它影响一个LAB内的所有寄存器。设计者可以单独地为每一个寄存器禁止或使能这些信号。

此外,在该模式下,进位链在专用加法器之间提供快速进位的功能。Cyclone 10 GX器件中两位的进位选择特性将 ALM 内的进位传输延迟减半。进位链可以起始于 ALB 内的第一个 ALM 或者第五个 ALM。最后的进位输出将连接到一个 ALM,此处它输入到本地、行或列互联。

如果实现一个高扇入功能的算术功能,为了避免在一个小的面积内出现布线阻塞,在链接到下一个LAB之前,LAB支持进位链只使用ALB的上/下半部分。这样,将LAB内剩下其他一半的ALM用于普通模式下降低扇入的函数。使用第一个LAB内上面5个ALM的进位链进位输入到列中下一个 LAB 的 ALM 的上半部分。使用第一个LAB 内下面5 个 ALM的进位链进位输入到列中下一个LAB的ALM的下半部分。设计者可以旁路掉LAB列的上半部分和MLAB列的下半部分。

从图 1.1 中可知,一个 ALM 内有两个专用的路径,即进位链 carry_in 和共享算术链shared_arith_in(将在共享的算术模式中详细介绍)。在Cyclone 10 GX器件中,包含在ALB内的一个扩展的互联结构,用于对共享的算术链布线,以及实现高效算术功能的进位链,如图1.8所示。这些ALM到ALM的连接旁路本地互联。Quartus软件将自动利用这些资源以提高利用率和性能。

图1.8 用于进位链和共享算术功能的扩展布线结构

一个带有进位输出的两个四位二进制无符号数加法的 Verilog HDL 描述如代码清单 1-5所示,适配后的网表结构如图1.9所示。

图1.9 一个带有进位输出的两个四位二进制无符号数加法适配后的网表结构

代码清单1-5 一个带有进位输出的两个四位二进制无符号数加法的Verilog HDL描述

图 1.9 中标记为 add_0~1 的 LOGIC_CELL_COMB 在 ALM 中的布局和布线如图 1.10所示。

图1.10 标记为add_0~1的LOGIC_CELL_COMB在ALM中的布局和布线

思考与练习1-5:分析图1.10给出的结构,以及在ALM上的布局和布线,观察进位链的连接。

4.共享算术模式

在共享算术模式中,ALM可以实现三输入的加法。这个模式用4个四输入的LUT配置ALM。每个LUT计算3个输入的和或3个输入的进位。进位计算的输出使用一个称为共享算术链的专用连接馈送到下一个加法器。

在该模式下,通过共享算术链可以允许 ALM 实现一个四输入的加法器。这就显著减少了实现较大规模加法器或相关器所需要的资源。共享算术链可以起始于一个 LAB 内的第一个或者第六个ALM。与进位链类似,可以绕过备用LAB列中共享算术链的上半部分和下半部分。此功能允许共享算术链级联LAB中的一半ALM,而另一半可用于位宽较小的扇入功能。在每个LAB中,将上半部分的列旁路;而在MLAB中,将下半部分的列旁路。

通过自动将 LAB 链接在一起,Quartus 软件可以创建长度大于 20 个 ALM 的共享算术链。为了扩展适配,垂直运行一个长的共享算术链,这样允许快速水平链接到 TriMatrix 存储器和DSP模块。共享算术链可以连续到一个完整的列。

一个带有进位输出的3个四位二进制无符号数加法的Verilog HDL描述如代码清单1-6所示,适配后的网表结构如图1.11所示。

代码清单1-6 一个带有进位输出的3个四位二进制无符号数加法的Verilog HDL描述

思考与练习1-6:分析图1.11给出的网表结构,以及在ALM上的布局和布线,观察进位链和共享算术链的连接。

1.1.3 寄存器和锁存器

从图1.1可知,每个LAB包含用于将控制信号驱动到其ALM的专用逻辑,并有两个独特的时钟源和3个时钟使能信号。

通过使用两个时钟源和 3 个时钟使能信号,LAB 控制块最多能生成 3 个时钟。一个反相的时钟可以看作单个的时钟源。每个始终与时钟使能信号相关联。当时钟使能信号无效时,将关闭对应LAB宽度的时钟,如图1.12所示。

LAB行时钟[5:0]和LAB本地互联产生LAB宽度的控制信号。MultiTrack互联本身的低抖动允许时钟和控制信号分配。MultiTrack 互联由不同长度与速度连续的、性能优化的布线行组成,用于设计之间和设计内的块连接。

LAB 宽度的信号控制逻辑用于寄存器的清除信号。ALM 直接支持一个异步清除功能。在Quartus软件中,寄存器预置实现为非门回推逻辑(NOT-gate push-back)。每个LAB最多支持两个清除信号aclr[1:0]。

Cyclone 10 GX器件提供了一个器件宽度的复位引脚DEV_CLRn,它可以用于复位器件内所有的寄存器。设计者可以在编译之前使能 DEV_CLRn 引脚。器件宽度的信号覆盖其他所有控制信号。

每个寄存器的端口包含数据、时钟、同步和异步复位,以及同步加载。全局信号、通用I/O(General Purpose I/O,GPIO)或任何的内部逻辑可以用来驱动ALM寄存器的时钟使能信号,以及时钟和清除控制信号。对于单纯的组合逻辑而言,可以旁路掉寄存器,LUT 的输出可以直接驱动ALM的输出。

图1.11 一个带有进位输出的3个四位二进制无符号数加法适配后的网表结构

图1.12 Cyclone 10 GX器件的ALB宽度控制信号

1.寄存器

一个带异步复位寄存器的Verilog HDL描述如代码清单1-7所示,适配后的网表结构如图1.13所示。

图1.13 一个带异步复位寄存器适配后的网表结构

代码清单1-7 一个带异步复位寄存器的Verilog HDL描述

一个带同步复位寄存器的Verilog HDL描述如代码清单1-8所示,适配后的网表结构如图1.14所示。

图1.14 一个带同步复位寄存器适配后的网表结构

代码清单1-8 一个带同步复位寄存器的Verilog HDL描述

思考与练习 1-7:比较图 1.13 和图 1.14 给出适配后的网表结构,说明区别(提示:异步复位电路可以直接映射到触发器的异步复位端口,而同步复位电路不能直接映射到触发器的复位端口,很明显经过了 LOGIC_CELL_COMB 单元,将其和输入数据,经过逻辑运算后,送给触发器的D端口,对设计性能会有一些影响)。

一个带异步复位和时钟使能寄存器的Verilog HDL描述如代码清单1-9所示,适配后的网表结构如图1.15所示,在ALM内具体的布局和布线如图1.16所示。

图1.15 一个带异步复位和时钟使能寄存器适配后的网表结构

图1.16 在ALM内具体的布局和布线

代码清单1-9 一个带异步复位和时钟使能寄存器的Verilog HDL描述

需要在Advanced Analysis&Synthesis Settings中将Allow Synchronous Control Signals设置为Off。

2.锁存器

在此特别指出,ALM 内的触发器不能用作锁存器。在 ALM 内实现锁存器,仍然使用LUT 资源,这点要特别注意。锁存器是一个小的组合环路,它保存信号的值直到分配新的值。当设计者不打算使用锁存器时,综合工具可以从 HDL 代码中推断锁存器。如果设计者打算让综合工具推断锁存器,则必须正确推断它以确保正确的器件操作。

尽可能不使用锁存器进行设计。

当设计组合逻辑时,某些编码风格会使软件综合设计时无意间产生锁存器。例如,当case或if语句没有覆盖所有可能的输入条件时,如果没有分配一个新的值,则综合工具就会推断出锁存器以保持输出。检查综合工具给出的消息以获取对推断锁存器的引用。如果设计的代码无意间创建了一个锁存器,则需要修改RTL以去除设计中出现的锁存器。

(1)当HDL代码为时钟边沿之外的信号分配值(如异步复位),但是代码没有在一个边沿触发的设计模块中分配值时,综合就会推断一个锁存器。

(2)当 HDL 代码在一个边沿触发的设计模块中为一个信号分配值,而综合优化去掉了这个逻辑时,则会推断出锁存器。例如,当case或if语句的条件只评价为False时,综合优化将删除该语句中的任何逻辑或信号赋值,该优化将导致为该信号推断出锁存器。

(3)省略if或case语句中最终的else或when others子句时,也会生成锁存器。在默认条件下,无关项(X)的赋值对于防止生成锁存器非常有用。为了获得最佳的逻辑优化,请将默认case或else值指定为无关项(X)而不是某个逻辑值。

在 Verilog HDL 设计中,使用 full_case 属性来处理未指定的情况为无关项(X)。但是full_case仅为综合,因此可以导致仿真不匹配,因为仿真工具仍然处理未指定的情况为锁存器。

综合工具可以推断出一个锁存器,该锁存器没有出现与组合环路相关的毛刺和时序问题。在Quartus Prime Pro版本的集成开发环境中生成编译报告时,在用户指定和推断锁存部分会给出推断出的锁存器。该报告指出锁存器是否存在时序危险,以及用户指定和推断锁存器的总数。

在某些情况下,时序分析并不能完全建模锁存器时序。作为最佳实践,应避免锁存器,除非设计需要,并且设计者本人完全了解其影响。

如果设计中的锁存器或组合环路没有出现在用户指定的和推断锁存器的部分中,则Quartus软件不会将锁存器推断为安全锁存器,这样锁存器将不会被认为是无毛刺的。

在编译报告中分析和综合逻辑单元部分所列出的逻辑环路是有时序风险的。这些选项表明设计可能存在需要进一步调查的问题。然而,正确的设计中包含组合环路。例如,组合环路可能并不敏感。当硬件中存在一个电气路径时会发生这种情况,但是设计人员知道电路永远不会遇到导致该路径被激活的数据,或者周围逻辑以互斥方式设置,以阻止该路径被感知,而与数据输入无关。

对于基于六输入的LUT器件而言,Quartus综合工具在组合环路中通过单个ALUT实现所有锁存器的输入。因此,当单个输入发生变化时,用户指定的和推断表中的所有锁存器都没有时序危险。

如果 Quartus 综合报告将锁存器列为安全锁存器,则其他优化,如适配器中的物理综合网表优化,将保持无危险性能。为了确保无危害行为,一次只能更改一个控制输入。同时更改两个输入,如同时取消置位和复位,或者同时改变数据和使能,可以使任何锁存器产生错误的行为。

Quartus综合工具从Verilog HDL中的always块和VHDL中的process描述中推断锁存器。然而,Quartus综合工具不会从Verilog HDL的连续分配或VHDL中的并发信号分配中推断锁存器。这些规则与寄存器推断相同。Quartus 综合工具只从 always 块和 process 描述中推断寄存器/触发器。

置位和复位锁存器的 Verilog HDL 描述如代码清单 1-10 所示,适配后的网表结构如图1.17所示。

图1.17 带有置位和复位锁存器适配后的网表结构

代码清单1-10 置位和复位锁存器的Verilog HDL描述

从图 1.17 中可知,第二个 LOGIC_CELL_COMB 构成了组合环路。很明显,符合锁存器的构成要素。

对于case语句非全条件的Verilog HDL描述,如代码清单1-11所示,适配后的网表结构如图1.18所示。

代码清单1-11 对于case语句非全条件的Verilog HDL描述

图1.18 对于case语句非全条件描述适配后的网表结构

从图 1.18 中可知,由于在 case 语句块中缺少全条件描述语句,所以生成了锁存器结构。尝试在case语句块前面加上full_case属性,得到适配后的网表结构如图1.19所示。很明显,由于在case前面添加了full_case属性,使得最终生成的网表结构中未出现锁存器。

图1.19 对于case语句非全条件描述加上full_case属性适配后的网表结构

1.1.4 LAB的互联架构

一个LAB中有10个ALM,每个ALM有4个输出,因此每个LAB能驱动40个ALM输出。两组 20 个 ALM 输出可以通过直接链接互联来直接驱动相邻的 LAB。直接链接连接功能将使用的行和列互联降低到最小,因此提供了更高的性能和灵活性。

通过使用行和列互联,以及同一个LAB内的ALM输出,本地互联驱动相同LAB内的ALM。

通过使用直接链路连接,来自左侧或右侧相邻的LAB、MLAB、M20K块或数字信号处理(Digital Signal Processing,DSP)模块也能驱动LAB的本地互联,如图1.20所示。很明显,这种布线资源为分段结构。

图1.20 Cyclone 10 GX器件内LAB和ALM的资源布局

(1)C4互联纵向跨越4个LAB高度;

(2)C27互联纵向跨越27个LAB高度;

(3)R3互联横向跨越3个LAB宽度;

(4)R6互联横向跨越3个LAB宽度;

(5)R32互联横向跨越32个LAB宽度。

1.1.5 分布式存储器

本节将介绍嵌入式存储器块的性能,重点介绍 MLAB 的原理和使用 MLAB 实现 RAM的方法。

1.嵌入式存储器块的性能

Cyclone 10 GX器件提供两种类型的存储器块,即M20K和640位的MLAB。

1)M20K

专用的块存储器资源。该资源是较大存储器阵列的最理想选择,同时仍然提供了大量独立的端口。

2)640位的存储器逻辑阵列块(Memory Logic Array Blocks,MLAB)

Cyclone 10 GX器件中嵌入式存储器块的容量和分布如表1.3所示。

表1.3 Cyclone 10 GX器件中嵌入式存储器块的容量和分布

每个MLAB支持最大640位的简单双端口SRAM,由两用的LAB配置为增强的存储器块。MLAB 是宽和浅存储器阵列的理想选择。MLAB 针对 DSP 应用和滤波器延迟线移位寄存器的实现进行了优化。每个MLAB由10个ALM组成。在Cyclone 10 GX器件中,可以将这些 ALM 配置为 10 个 32×2 的模块,每个 MLAB 可以提供一个 32×20 的简单双端口SRAM模块。

嵌入式存储器块的性能参数如表1.4所示。

表1.4 嵌入式存储器块的性能参数

续表

2.嵌入式存储器块的配置

嵌入式存储器块所支持的存储模式如表1.5所示。

表1.5 嵌入式存储器块所支持的存储模式

为了避免破坏存储器块的内容,请勿在读取或写入器件时违反任何存储器块的建立或保持时间。如果在单端口 RAM、简单双端口 RAM、真正双端口RAM或者ROM模式中使用存储器块,则必须遵守该规则。

Cyclone 10 GX器件中嵌入式存储器块的单端口配置如表1.6所示。

表1.6 Cyclone 10 GX器件中嵌入式存储器块的单端口配置

Cyclone 10 GX 器件中嵌入式存储器块的简单双端口配置如表 1.7 所示。对于混合宽度的配置,只有M20K支持该配置方式。

表1.7 Cyclone 10 GX器件中嵌入式存储器块的简单双端口配置

Cyclone 10 GX 器件中嵌入式存储器块的真正双端口配置如表 1.8 所示。对于混合宽度的配置,只有M20K支持该配置方式。

表1.8 Cyclone 10 GX器件中嵌入式存储器块的真正双端口配置

3.嵌入式存储器块的时钟模式

在不同的嵌入式存储器块的配置模式下所支持的时钟模式如表1.9所示。

表1.9 不同的嵌入式存储器块的配置模式所支持的时钟模式

在 MLAB 内,不支持时钟使能信号用于写地址、字节使能和数据输入寄存器。

1)单时钟模式

在该模式下,单个时钟和时钟使能信号控制存储器块的所有寄存器。

2)读/写时钟模式

在该模式下,每个读端口和写端口都有独立的时钟。读时钟控制数据输出、读地址和读使能寄存器。写时钟控制数据输入、写地址、写使能和字节使能寄存器。

3)输入/输出时钟模式

在该模式下,每个读端口和写端口都有独立的时钟。输入时钟控制与输入到存储器块的数据有关的所有寄存器,包括数据、地址、字节使能、读使能和写使能。一个输出时钟控制数据输出寄存器。

4)独立时钟模式

在该模式下,每个端口(A 和 B)都有一个单独的时钟。时钟 A 控制端口 A 侧的所有寄存器,时钟B控制端口B侧的所有寄存器。

可以为不同的输入和输出寄存器创建独立的时钟使能,以关闭特定寄存器以实现降低功耗的目的。在参数编辑器中,单击“更多选项”(在时钟使能选项旁)以设置所喜欢的可用独立时钟使能。

在所有的时钟模式下,异步清除只能用于输出锁存器和输出寄存器。对于独立时钟模式,它可以用于所有端口。

如果使用读/写时钟模式对同一地址位置执行同时读/写操作,则输出的读取数据未知。如果要求输出的读数据为一个已知值,使用单时钟或输入/输出时钟模式,并且在 IP 核参数编辑器中选择适当的写期间读行为。

以下时钟模式支持独立时钟使能:

(1)读/写时钟模式,支持所有的读和写时钟;

(2)独立时钟模式,支持所有端口的寄存器。

为了降低功耗,可以通过使用时钟使能关闭特定寄存器。

4.嵌入式存储器块的字节使能

嵌入式存储器块支持字节使能控制,包括:

(1)字节使能控制屏蔽输入数据,这样只写入指定字节的数据。未写入的字节保留以前写入的值。

(2)写使能(wren)信号和字节使能(byteena)信号一起控制 RAM 块的写操作。默认情况下,byteena信号为高电平(使能),并且只有wren信号控制写入。

(3)字节使能寄存器没有清除端口。

(4)如果使用奇偶校验,则在M20K存储器块中,字节使能功能控制8个数据位和2个奇偶校验位;在MLAB上,字节使能功能控制最宽模式下的所有10位。

(5)byteena信号的LSB与数据总线的LSB相对应。

(6)字节使能信号位高电平有效。

×20数据宽度模式下的byteena信号如表1.10所示。×40数据宽度模式下的byteena信号如表1.11所示。

表1.10×20数据宽度模式下的byteena信号

表1.11×40数据宽度模式下的byteena信号

在M20K存储器块或者MLAB中,当字节使能位设置为0时,嵌入存储 IP 将对应的数据字节输出设置为无关值。必须确保总是选中选项Get X’s for write masked bytes instead of old data when byte enable。

5.嵌入式存储器块的上电状态或存储器初始化

上电时嵌入式存储器块不同的初始状态如表1.12所示。

表1.12 上电时嵌入式存储器块不同的初始状态

默认,除非指定.mif文件,否则Quartus软件将Cyclone 10 GX器件内的RAM单元初始化为零。

所用的存储块支持使用.mif 文件进行初始化。可以在 Quartus 软件中创建.mif 文件,并且在设计中例化存储器块时指定它们使用RAM IP核。特别注意,即使存储器块已经预初始化(如使用.mif文件),但是在上电时仍然清零。

6.使用MLAB实现RAM

使用Quartus 软件,在软件实现中,MLAB 支持下面的64 深度模式,包括64(深度)×8 (宽度)、64(深度)×9(宽度)和64(深度)×10(宽度)。

为了推断 RAM 的功能,综合工具识别某些类型的 HDL 代码并将检测到的代码映射到指定技术的实现。对于具有专用RAM模块的器件,Quartus软件使用Intel FPGA IP核以对准器件存储器架构。

下面以一个 16(深度)×4(宽度)的存储器使用 MLAB 的 Verilog HDL 描述为例,如代码清单 1-12 所示。在该设计中,使用了属性 ramstyle="mlab",强制 RAM 使用MLAB资源。

代码清单1-12 一个16(深度)×4(宽度)存储器使用MLAB的Verilog HDL描述

该存储器适配后的顶层网表结构(顶层)如图1.21 所示。双击图中名字为“mem_rtl_0”的元件符号,展开其内部结构,如图1.22所示。

该描述实现单时钟,简单双端口同步 RAM,它实现写期间读行为,其输出模式为旧数据,关于这部分内容的详细介绍,请参看 1.2.1 节中定制的写期间读行为。

双击图 1.22 中名字为“auto_generated”的模块符号,展开其内部的具体结构,如图 1.23 所示。需要特别指出的是,在器件的工作期间,不能使用复位信号清除 Intel FPGA存储器块中的RAM内容。如果在HDL代码中描述了RA,其具有用于RAM内容的一个复位信号,则逻辑在常规逻辑单元而不是在一个存储器块中实现。不要将RAM的读/写操作放置在包含一个复位信号的always模块或者process模块中。要指定存储器块的内容,则需要器件在工作期间初始化存储器或者将数据写到RAM。

除复位信号外,其他控制逻辑也会阻止综合工具将存储器逻辑推断为存储器块。例如,如果在读地址寄存器上使用时钟使能,则可以更改RAM的输出锁存器,从而会导致综合后的RAM与HDL描述不匹配。使用地址停止特性作为一个读地址时钟使能以避免这个限制。

7.使用MLAB实现移位寄存器

为了推断FPGA内中的移位寄存器,综合工具检测一组具有相同特征的移位寄存器,并将它们转化为一个Intel FPGA移位寄存器IP核。

图1.21 存储器适配后的网表结构(顶层)

图1.22 mem_rtl_0的内部结构

图1.23 mem_rtl_0内部的具体结构

为了检测,所有移位寄存器必须具有以下特征:

(1)使用相同的时钟和时钟使能;

(2)没有其他第二级信号;

(3)相同间距的抽头,至少间隔3个寄存器。

综合工具只为要写具有专用 RAM 块的器件识别移位寄存器。Quartus 软件使用下面的向导:

(1) Quartus 软件根据寄存器的总线宽度( w)、每个抽头之间的长度( l)或抽头数(n)确定是否推断Intel FPGA移位寄存器IP核。

(2)如果Quartus软件中的综合属性Auto Shift Register Recognition选项设置为Auto,通过使用以下规则,Quartus综合工具将确定在RAM块中实现哪个移位寄存器。

① 优化技术设置。

② 关于设计的逻辑核RAM利用率信息。

③ 来自定时驱动综合的时序信息。

(3)如果寄存器的总线宽度是 1(w=1),如果抽头的个数乘以每个抽头之间的长度大于或等于64(n×l>64),Quartus综合推断移位寄存器IP核。

(4)如果寄存的总线宽度大于 1(w>1),寄存器的总线宽度乘以每个抽头之间的长度大于或等于32(w×n×l>32),Quartus综合推断寄存器IP核。

(5)如果每个抽头之间的长度(l)不是 2 的幂次方,则 Quartus 综合需要外部逻辑(LE 或 ALM)来解码读和写计数器,因为移位寄存器的大小不同。这种额外的解码逻辑消除了在存储器中实现移位寄存器的性能和利用优势。

Quartus综合映射到FPGA移位寄存器IP核的寄存器,以及RAM中的寄存器不适用于仿真工具的Verilog HDL或VHDL输出文件,因为它们的节点名字在综合后将不存在。

编译器无法为使用移位使能信号的移位寄存器使用 MLAB 存储器块资源进行实现;取而代之,编译器使用专用的 RAM 块。通过使用ramstyle属性,控制实现移位寄存器的存储器结构。

一个串入/串出16位长度移位寄存器的Verilog HDL描述如代码清单1-13所示,适配后的网表结构如图1.24所示。

图1.24 串入/串出16位长度移位寄存器适配后的网表结构

代码清单1-13 一个串入/串出16位长度移位寄存器的Verilog HDL描述

在“Advanced Analysis&Synthesis Settings”对话框中,将 Allow Any Shift Register Size For Recognition设置为On。