逻辑阵列块(Logic Array Block,LAB)由基本构件块——自适应逻辑模块(Adaptive Logic Module,ALM)构成。通过配置LAB,可以实现逻辑功能、算术功能和寄存器功能。
Cyclone 10 GX器件中1/4可用的LAB可用作存储器LAB(Memory LAB,MLAB)。某些器件有更多的MLAB。
LAB为可配置的逻辑块,它由一组逻辑资源构成。每个LAB包含用于将控制信号驱动其ALM的专用逻辑。MLAB是LAB的超集,包含所有LAB的特性。Cyclone 10 GX器件中ALM的内部结构如图1.1所示。从图中可知,每个ALM由上下两半部分组成,上/下半部包含下面逻辑设计资源:
图1.1 Cyclone 10 GX器件中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个输入功能的任何函数。
每个ALM内的LUT可以工作在下面中的任何一种模式,包括普通模式、扩展LUT模式、算术模式和共享算术模式。
在该模式中,允许在一个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.5 一个具有五输入和两输出的逻辑函数适配后的网表结构
代码清单1-2 一个具有五输入和两输出逻辑函数的Verilog HDL描述
对于两个五输入的函数封装到一个ALM的情况,函数必须至少要有两个公共的输入。公共的输入是dataa和datab。用五输入函数来组合一个四输入函数要求一个公共输入,即dataa或datab。
思考与练习1-2: 分析图1.5给出的结构,以及在ALM上的布局和布线。
一个具有六输入和两输出逻辑函数的Verilog HDL描述如代码清单1-3所示,适配后的网表结构如图 1.6所示。
图1.6 一个具有六输入和两输出的逻辑函数适配后的网表结构
代码清单1-3 一个具有六输入和两输出逻辑函数的Verilog HDL描述
在使用一个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上的布局和布线。
当实现七输入函数时,则使用扩展LUT模式。通过使用下面的输入,即dataa、datab、datac、datad、datae0、datae1和dataf0/dataf1,可以在一个ALM内实现一个七输入的函数。如果使用dataf0,则输出可以驱动寄存器0/寄存器1;如果使用dataf1,则输出可以驱动寄存器2/寄存器3。
一个具有七输入和两输出逻辑函数的Verilog HDL描述如代码清单1-4所示,适配后的网表结构如图 1.7所示。
图1.7 一个具有七输入和两输出的逻辑函数适配后的网表结构
代码清单1-4 一个具有七输入和两输出逻辑函数的Verilog HDL描述
思考与练习1-4: 分析图1.7给出的网表结构,以及在ALM上的布局和布线。
在算术模式下,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上的布局和布线,观察进位链的连接。
在共享算术模式中,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.11 一个带有进位输出的3个四位二进制无符号数加法适配后的网表结构
从图1.1可知,每个LAB包含用于将控制信号驱动到其ALM的专用逻辑,并有两个独特的时钟源和3个时钟使能信号。
通过使用两个时钟源和3个时钟使能信号,LAB控制块最多能生成3个时钟。一个反相的时钟可以看作单个的时钟源。每个始终与时钟使能信号相关联。当时钟使能信号无效时,将关闭对应LAB宽度的时钟,如图1.12所示。
图1.12 Cyclone 10 GX器件的ALB宽度控制信号
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的输出。
一个带异步复位寄存器的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。
在此特别指出,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.18 对于case语句非全条件描述适配后的网表结构
代码清单1-11 对于case语句非全条件的Verilog HDL描述
从图1.18中可知,由于在case语句块中缺少全条件描述语句,所以生成了锁存器结构。尝试在case语句块前面加上full_case属性,得到适配后的网表结构如图1.19所示。很明显,由于在case前面添加了full_case属性,使得最终生成的网表结构中未出现锁存器。
图1.19 对于case语句非全条件描述加上full_case属性适配后的网表结构
一个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宽度。
本节将介绍嵌入式存储器块的性能,重点介绍MLAB的原理和使用MLAB实现RAM的方法。
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 嵌入式存储器块的性能参数
续表
嵌入式存储器块所支持的存储模式如表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器件中嵌入式存储器块的真正双端口配置
在不同的嵌入式存储器块的配置模式下所支持的时钟模式如表1.9所示。
表1.9 不同的嵌入式存储器块的配置模式所支持的时钟模式
注
在MLAB内,不支持时钟使能信号用于写地址、字节使能和数据输入寄存器。
1)单时钟模式
在该模式下,单个时钟和时钟使能信号控制存储器块的所有寄存器。
2)读/写时钟模式
在该模式下,每个读端口和写端口都有独立的时钟。读时钟控制数据输出、读地址和读使能寄存器。写时钟控制数据输入、写地址、写使能和字节使能寄存器。
3)输入/输出时钟模式
在该模式下,每个读端口和写端口都有独立的时钟。输入时钟控制与输入到存储器块的数据有关的所有寄存器,包括数据、地址、字节使能、读使能和写使能。一个输出时钟控制数据输出寄存器。
4)独立时钟模式
在该模式下,每个端口(A和B)都有一个单独的时钟。时钟A控制端口A侧的所有寄存器,时钟B控制端口B侧的所有寄存器。
注
可以为不同的输入和输出寄存器创建独立的时钟使能,以关闭特定寄存器以实现降低功耗的目的。在参数编辑器中,单击“更多选项”(在时钟使能选项旁)以设置所喜欢的可用独立时钟使能。
在所有的时钟模式下,异步清除只能用于输出锁存器和输出寄存器。对于独立时钟模式,它可以用于所有端口。
如果使用读/写时钟模式对同一地址位置执行同时读/写操作,则输出的读取数据未知。如果要求输出的读数据为一个已知值,使用单时钟或输入/输出时钟模式,并且在IP核参数编辑器中选择适当的写期间读行为。
以下时钟模式支持独立时钟使能:
(1)读/写时钟模式,支持所有的读和写时钟;
(2)独立时钟模式,支持所有端口的寄存器。
为了降低功耗,可以通过使用时钟使能关闭特定寄存器。
嵌入式存储器块支持字节使能控制,包括:
(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。
上电时嵌入式存储器块不同的初始状态如表1.12所示。
表1.12 上电时嵌入式存储器块不同的初始状态
默认,除非指定.mif文件,否则Quartus软件将Cyclone 10 GX器件内的RAM单元初始化为零。
所用的存储块支持使用.mif文件进行初始化。可以在Quartus软件中创建.mif文件,并且在设计中例化存储器块时指定它们使用RAM IP核。特别注意,即使存储器块已经预初始化(如使用.mif文件),但是在上电时仍然清零。
使用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所示。
图1.22 mem_rtl_0的内部结构
图1.21 存储器适配后的网表结构(顶层)
注
该描述实现单时钟,简单双端口同步RAM,它实现写期间读行为,其输出模式为旧数据,关于这部分内容的详细介绍,请参看1.2.1节中定制的写期间读行为。
双击图1.22中名字为“auto_generated”的模块符号,展开其内部的具体结构,如图1.23所示。需要特别指出的是,在器件的工作期间,不能使用复位信号清除Intel FPGA存储器块中的RAM内容。如果在HDL代码中描述了RA,其具有用于RAM内容的一个复位信号,则逻辑在常规逻辑单元而不是在一个存储器块中实现。不要将RAM的读/写操作放置在包含一个复位信号的always模块或者process模块中。要指定存储器块的内容,则需要器件在工作期间初始化存储器或者将数据写到RAM。
图1.23 mem_rtl_0内部的具体结构
除复位信号外,其他控制逻辑也会阻止综合工具将存储器逻辑推断为存储器块。例如,如果在读地址寄存器上使用时钟使能,则可以更改RAM的输出锁存器,从而会导致综合后的RAM与HDL描述不匹配。使用地址停止特性作为一个读地址时钟使能以避免这个限制。
为了推断FPGA内中的移位寄存器,综合工具检测一组具有相同特征的移位寄存器,并将它们转化为一个Intel FPGA移位寄存器IP核。
为了检测,所有移位寄存器必须具有以下特征:
(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。