Cyclone IV代FPGA的可编程逻辑资源

本文详细介绍了CycloneIV FPGA的逻辑阵列模块(LAB)结构,每个LAB由16个逻辑单元(LE)组成,每个LE包含LUT和D触发器。LE可以实现组合逻辑、时序逻辑、寄存器反馈和寄存器套包模式。此外,文章还探讨了LE的输出信号和工作模式,以及在FPGA设计中的应用。
摘要由CSDN通过智能技术生成

一、LAB 概括

  看本文之前,希望了解查找表的原理,不懂的可以看一下上一篇,查找表实现组合逻辑的原理

  Cyclone IV 代 FPGA 的逻辑阵列模块(LAB)由 16 个逻辑单元(LE)组成,每个 LE 包括一个四输入查找表(LUT)和一个 D 触发器。其 LAB 的结构如下图所示(包括 2 个 LAB ):

在这里插入图片描述

图1 Cyclone IV 器件中的 LAB 结构

  每个 LAB 包括 16 个 LE、LAB 控制信号、LE 进位链、寄存器链、本地互联。本地互联在同一个 LAB 的 LE 之间传输信号,寄存器链连接把一个 LE 寄存器的输出传输到 LAB 中相邻的 LE 寄存器上。

  图 2 为 Cyclone IV 的 FPGA 达到芯片资源分布图,图中蓝色小方框就是 LAB,浅黄色是 M9K 逻辑资源,白色为 DSP 硬件乘法器资源,芯片四周分布 IO 管脚,锁相环 PLL 分布在芯片的四个角。
在这里插入图片描述

图2 chip planner查看 Cyclone IV 芯片结构图

  将图 2 蓝色方框放大可见图 3 中 1 个 LAB 包括 16 个 LE,分为上下两组,各 8 个 LE 。
在这里插入图片描述

图3 chip planner查看 LAB 内部 LE分布图

二、LAB 互联

  LAB 本地互联是由列和行互联以及 LE 在相同的 LAB 中的输出端驱动的。邻近的 LAB, 锁相环 (PLL),M9K RAM模块和嵌入式乘法器由左到右通过直接链接连接也可以驱动 LAB 的本地互联。每个 LE 通过加速本地和直接链接互联可以驱动多达 48 个的 LE 。
在这里插入图片描述

图4 在 Cyclone IV 器件中的直连连接方式

三、LAB 控制信号

  每个 LAB 都包含专用的逻辑以控制各自 LE。控制信号包括:两个时钟、两个时钟使能 、两个异步清零、一个同步清零、一个同步加载。寄存器套包(LE 的LUT 与寄存器分别功能互不相关)和同步加载不能被同时使用。同步清零和同步加载是 LAB-wide 信号,其影响所有寄存器上的 LAB。

  每个 LAB 可以使用两个时钟和两个时钟使能信号。时钟和时钟使能信号在各个 LAB 上是相连接的,必须同时使用。如果 LAB 同时使用上升沿和下降沿时钟,也使用 LAB-wide 时钟信号。释放 时钟使能信号关闭 LAB-wide 时钟。

  LAB 行时钟 [5…0] 和 LAB 本地的互联生成 LAB-wide 控制信号。MultiTrack 互联固有的低偏移除数据分配之外还可以实现时钟和控制信号分配。
在这里插入图片描述

图5 Cyclone IV 器件 LAB-Wide 控制信号

  每个 LAB 支持多达两个异步清零信号 (labclr1 和 labclr2),而只包含一个同步清零信号,这也是 altera 推荐使用异步复位的一个原因。

  一个 LAB-wide 异步加载信号不可被用为寄存器的预置信号控制逻辑。寄存器预置是用 NOT 门推回(push-back)的技术完成的。Cyclone IV 器件仅支持预置或异步清零信号。

  除了清零端口外,Cyclone IV 器件提供一个芯片级重置管脚 (DEV_CLRn) 对器件中所有的寄存器重置。

四、LE逻辑单元

  前面讲解了 LAB 相关内容,接下来就应该关注 LAB 的组成单元 LE 的结构了。不管是要学习时序约束还是面试之类的,了解FPGA工作原理,这部分都相当重要。

  Cyclone IV 的 LE 包括一个四输入查找表(LUT),一个 D 触发器,一个进位链,一个寄存器链。LE 的输出是可以驱动本地、行、列、寄存器链和直联的数据传输路径的。其中 LE 是支持将功能不相关的组合逻辑和触发器打拍放在同一个 LE 中实现,也支持将触发器输出作为查找表输入。LE的组成如图 6 所示:
在这里插入图片描述

图6 Cyclone IV 器件中的 LE

  从前面知道 LAB 有八个控制信号,使用这些控制信号就可以控制 LE,同样 LE 中也有这八个信号对应的端口(引脚),触发器有时钟和时钟使能端口,而这两个端口可以接 LAB 的时钟信号 1 或者时钟信号 2,但是时钟使能与时钟信号必须对应连接,即 LAB 使用时钟信号 1 作为这个 LE 的时钟信号时,时钟使能信号也必须使用时钟使能信号 1。

  触发器(DFF)的异步复位端口(CLRN)由 Asynchronous Clear Logic 选择使用 LAB 的异步复位1(labclr1)或者异步复位2(labclr2),另外芯片的DEV_CLRn 是芯片级的异步复位管脚,该引脚为低电平时,FPGA 所有的 D 触发器也会全部清零。特别注意:这个管脚跟平时使用的复位管脚是不相同的,这个管脚不需要在程序的敏感列表中实现,并且需要在 Quartus 中进行相应设置,而平时使用的 rst_n 信号多半是使用的空闲的时钟信号,程序中该信号出现在敏感列表中,对应的其实就是 LAB 控制 LE 异步复位的 labclr1 或者 labclr2 引脚,具体是哪个其实也是 Quartus 在对设计进行综合时自己决定的,设计人员无法干预。

  注:细心的人可能观察到了 DFF 的 CLRN 端口是低电平有效的,所以 Altera 才推荐使用低电平进行复位,如果使用高电平,会在复位路径中插入反相器,增加延迟,不利于时序。

  而 LAB 控制 LE 触发器(DFF)的同步复位和同步加载是通过 Synchronous Load and Clear Logic 的同步加载和同步复位信号实现的。对比触发器的异步复位和同步复位知,DFF 是有独立的异步复位引脚,使用同步复位时,会在复位路径中引入逻辑电路,造成数据传输延迟,即本器件推荐使用异步低电平复位。

  上面描述了 LAB 与 LE 相关的信号,这些信号基本上都与 D 触发器有关,接下来了解一下 LE 能完成的功能,以及 LE 的输入信号以及 LE 的输出信号。

1、LE完成组合逻辑

  组合逻辑运算是由查找表 LUT 完成的,图 7 黄色路径是使用 LE 实现组合逻辑的信号路径,四个输入先将数据传输到查找表 (LUT),查找表输出数据根据需要驱动的类型选择三条红色路径中的一条(后面会说为什么有三条路径)。

在这里插入图片描述

图7 LE 完成组合逻辑时信号传输路径

  对应情况如下面的四输入与门代码就可以使用上述电路综合完成。

module a (
    input           clk     ,
    input           rst_n   ,
    input   [3 : 0] din     ,
    output          dout    
);

assign dout = &din;

endmodule

  综合的四输入与门如下所示,右击选择使用chip planner打开。
在这里插入图片描述

图8 在 RTL 界面打开 Chip planner 查看对应器件

  找到相应的 LE,一般使用到的 LE 所在的 LAB 会呈深蓝色,未使用的是浅蓝色,逻辑简单时可以快速查找,双击下图 LE,即可观察 LE 内部电路到内部电路只有 LUT 被使用了,DFF 部分没有蓝色连线,即没有被使用。如果不清楚 LUT 为什么可以实现与门、或门这些逻辑,可以查看前一篇文章。

  查找表实现四输入与门的信号流向如图 9 所示,与图 7 理论一致。
在这里插入图片描述

图9 查找表实现四输入与门信号流向

2、LE完成对输入信号延迟一个时钟

  图 11 是单独使用 LE 的 D 触发器时的信号输入路径,此时信号输入可以有两种情况,如果输入信号来自同一个 LAB 中其余 LE 中触发器的输出,则可以通过橙色路径进行输入,其余情况通过红色路径进行输入,输入信号经蓝色路径到达 D 触发器的数据端口 D,触发器输出数据会有三种情况,四个路径输出,即绿色路径,如果输出是直接驱动触发器,则可以通过 Register Chain Output 路径进行输出,其余情况与组合逻辑输出类似。
在这里插入图片描述

图10 LE 单独使用 D 触发器时信号流向

  以下代码是将输入信号 din 通过 3 个 D 触发器延迟 3 个时钟后输出,理论上就可以综合得到上述电路。

module a (
    input   clk     ,
    input   rst_n   ,
    input   din     ,
    output  dout    ,
    output  dout_pos
);
    reg [2 : 0] din_ff  ;

    always@(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin
            din_ff <= 3'd0;
        end
        else begin
            din_ff <= {din_ff[1:0],din};
        end
    end

    assign dout = din_ff[2];

endmodule

  但是实际上 chip planner 查看到的 LE 使用情况如下所示。LE 的查找表和 D 触发器都被使用了,如图 11 所示:
在这里插入图片描述

图11 LE使用情况

  双击 LE 打开内部结构如图 12 所示:
在这里插入图片描述

图12 LE单独使用 D 触发器的综合结果

  分析:查找表的输入只有一端被使用,根据查找表原理知,查找表只有一个输入时,输出与输入相同,或者输出与输入相反。此处查找表的输出肯定与输入是相同的,即此时查找表与导线是等效的。图 13 是此模块消耗的逻辑资源,可知消耗的查找表(LUT)资源为 0,只消耗了 2 个寄存器(触发器)资源,也证明了 chip planner 显示的这种方式是不消耗查找表的,与没有使用查找表的效果是相同的。

在这里插入图片描述

图13 该模块资源消耗图

  尽管很多时候预想综合单独综合出 D 触发器,但是在通过 chip planner 观察时,还是有情况会只显示使用了 D 触发器。如下代码对输入信号最低位延迟 3 个时钟输出,高 2 位进行与运算,此时对 din[0] 延迟的第三个 D 触发器的 chip planner 视图就只使用了 D 触发器。

module a (
    input           clk     ,
    input           rst_n   ,
    input   [2 : 0] din     ,
    output          dout    ,
    output          dout_pos
);
    reg[2:0] din_ff;

    always@(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin
            din_ff <= 3'd0;
        end
        else begin
            din_ff <= {din_ff[1:0],din[0]};
        end
    end

    assign dout = din_ff[2];

    assign dout_pos = ~din[2] & din[1];

endmodule

  上述模块综合之后的RTL视图、LE使用情况如下几图所示:
在这里插入图片描述

图14 综合的 RTL 视图

在这里插入图片描述

图15 Chip planner视图的 LE

在这里插入图片描述

图16 LE 内部数据流向

  上图就与图一致了,模块资源消耗除了增加与门的地方比之前多使用了一个 LUT 之外,其余资源都是一致的,这也说明之前虽然 chip planner 显示使用了 LUT,但是实际上跟没有使用的效果是一致的,也许是 chip planner 只能将一些特定的写法显示成上述电路吧。向 intel 的技术支持询问此问题之后,也没有给出具体回答,有知道的可以讨论。

3、LE完成时序逻辑运算

  图 17 是 LE 实现时序逻辑(LUT 完成组合逻辑,将组合逻辑输出作为触发器输入)时信号传输路径,输入信号与组合逻辑传输时相同,只是将组合逻辑输出作为触发器的输入,输出路径与单独使用触发器时输出路径一致。
[]

图17 LE 完成时序逻辑时信号传输路径

  下面代码将 4bit 的输入信号 din 按位相与,之后寄存一个时钟进行输出,就可以综合得到上述电路。

module a (
    input               clk     ,
    input               rst_n   ,
    input       [3 : 0] din     ,
    output  reg         dout
);
    always@(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin
            dout <= 1'd0;
        end
        else begin
            dout <= & din;
        end
    end

endmodule

综合得到RTL视图如下:

图18 RTL 视图
在这里插入图片描述
图19 LE信号传输路径

在这里插入图片描述

图20 该模块资源消耗
  这种使用方式是比较常见的,综合结果也与预想的一致,当输入信号少于 4 个时,空余的 LUT 输入端不使用即可,只需要设置被使用的 LUT 对应位数据即可。当输入数据多余 4 位或者输出数据多余一位时,将使用多个 LE 并联完成相应功能。而 LE 并联的个数越多,一个完整的多位输入得分为多个路径才能到输出。但实际情况中,因布局布线的影响,路径的延迟很难保持一致,从而导致输出结果错误。通常会加一级寄存器(D触发器)同步之后在输出。如果此时还要保证运行在高频率的时钟下,还需要做其它处理。

4、寄存器反馈

  可能有人也注意到了寄存器的输出可以返回到 LUT 的输入,即图 21 中 Register Feedbac 路径,这种现象被称为寄存器的反馈模式。信号先通过黄色路径以及橙色路径通过 D 触发进行延时,如果 D 触发器的输出进行组合逻辑运算,此时 LE 的LUT 没有被使用时,综合工具就可能会在这个 LUT 中完成组合逻辑运算,把 D 触发器的输出通过 Register Feedbac 路径作为 LUT 输入完成组合逻辑运算后直接输出。
在这里插入图片描述

图21 寄存器反馈数据流向

  下面程序是对异步单 bit 信号上升沿检测常用的操作,先将异步信号延迟三个时钟,在最后两拍对边沿进行检测,代码如下:

module a (
    input   clk     ,
    input   rst_n   ,
    input   din     ,
    output  dout_pos
);
    reg [2:0] din_ff;

    always@(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin
            din_ff <= 3'd0;
        end
        else begin
            din_ff <= {din_ff[1:0],din};
        end
    end

    assign dout_pos = ~din_ff[2] & din_ff[1];

endmodule

综合的RTL视图如图22:
在这里插入图片描述

图22 RTL视图

   右击与门选择使用 chip planner 打开,该与门位于下图所示 LE 中。
在这里插入图片描述

图23 LE视图

  双击打开该 LE,LE 的内部信号走向如下图 24 所示:
在这里插入图片描述

图24 LE内部信号流向图

  din_ff[1] 信号经过 D 触发器延迟一个时钟得到 din_ff[2] 信号,之后将 D 触发器输出输入到此 LE 的 LUT 中与 din_ff[1] 完成组合逻辑运算。这种寄存器反馈模式因为 D 触发器与 LUT 的数据传输路径在 LE 内部,可以提升传输效率,以及提高资源利用率。最终本模块资源消耗 3 个 LE,1 个 LUT,如下图 25 所示:

在这里插入图片描述

图25 该模块资源消耗图

5、寄存器套包

  从数据手册知道,LE 还存在一种被称为寄存器套包的工作模式,原文为“允许 LUT 驱动一个输出端,当寄存器驱动另一个输出端时。这 个特性称为寄存器套包”。我的理解就是一个运算只有组合逻辑,另一个只需要 D 触发器延迟打拍时,综合工具 Quartus 在综合时就可以将这两部分在一个 LE 中实现,LUT 完成组合逻辑,D 触发器完成延迟打拍,这两部分的输入信号和输出信号都没有联系。理论上就是下面这段程序的情况,此模块需要完成 din[1] 与 din[0] 与运算,把 din[2] 延迟一个时钟输出,这两部分没有联系。加法使用组合逻辑,延迟一拍就是使用 D 触发器。

module a (
    input               clk     ,
    input               rst_n   ,
    input       [2 : 0] din     ,
    output  reg         dout    ,
    output              add
);
    always@(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin
            dout <= 1'd0;
        end
        else begin
            dout <= din[2];
        end
    end
    
    assign add = din[0] & din[1];

endmodule

  综合后的结果和预期有很大差距,组合逻辑和时序逻辑分别使用了不同的 LE,两个 LE 内部如下图 26 所示,都使用了 LUT,但是从最终综合结果查看,本模块又只消耗了一个 LUT,与前面只是用 D 触发器时结果一致,不知道是什么原因 Quartus 没有将触发器和查找表融合到一个 LE 中。
在这里插入图片描述

图26 LUT完成加法运算
在这里插入图片描述
图27 D触发器对 din[2] 打拍

在这里插入图片描述

图28 资源消耗

  数据手册还指出在此模式下,LE 的同步加载信号是不可以使用的,这是为什么?手册没有给出原因,从手册中 LE 的电路图这部分只有一个方框,没有实际电路,所以查看不了原因,但是 Quartus 里面看到的 LUT 内部电路却有这部分电路,如下图 29 方框部分所示。
在这里插入图片描述

图29 同步加载信号

  当同步加载信号有效时,数据选择器会将 LE 的第三个输入作为 D 触发器的输入。处于寄存器套包时,LUT 是完成独立组合逻辑的,此时 LE 的输入应该是都作为 LUT 的输入,所以此时如果同步加载信号有效就会有冲突,此时 D 触发器的输入应该是来自寄存器链的输入,不能来自 LUT 输入或者 LUT 的输出。

6、LE功能小结

  综上,LE 工作的五种状态可以由图 30 进行简要的总结。
在这里插入图片描述

图30 LE简化图

  1、通过 LE 四输入端 A、B、C、D 和 LUT输出的绿色路径与 LE 输出红色路径可以完成组合逻辑电路。

  2、LE 输入信号通过 C 端经过黑色、蓝色、黄色路径直接到达 D 触发器的输入端,之后经过天蓝色路径输出,LE 输出数据被延迟一个时钟周期。

  注:前面提到输入也可能会穿过查找表到达 D 触发器输入端,但是并不会消耗查找表资源,查找表充当导线作用。

  3、LE 输入信号经过黑线输入查找表完成组合逻辑运算,查找表输出经过绿线、黄线进入 D 触发器寄存,D 触发器经过天蓝色路径输出 LE,完成时序逻辑。

  4、LE输入信号经过C端口,通过黑线、蓝线、黄线直接输入到 D 触发器,D触发器的输出经过天蓝色路径、橙色路径、紫色路径进入查找表完成组合逻辑运算,查找表输出经过黄色路径、红色路径输出 LE,完成 LE 的反馈模式。

  5、当查找表完成组合逻辑运算,D 触发器完成时序逻辑运算不相关,但是位于同一个 LE 实现时,就是寄存器的套包模式,前文做了详细说明,此模式为了节省资源而存在。

注:触发器输入还可能通过寄存器链进行传输。

五、LE输出信号

  很多人在对 LE 进行分析时会忽略输出部分,就是不考虑为什么 LUT 和 DFF 能够同时作为 LE 的输出信号,输出不同的数据,这其实跟输出部分结构有关,如下图 31 所示:
在这里插入图片描述

图31 LE 输出端口

  不管是 LUT 还是寄存器输出都可以驱动行、列、直连的布线资源,还可以驱动本地布线资源,而 D 触发器还可以驱动一路寄存器链输出,寄存器链可以直接与同一个 LAB 中相邻 LE 的 D 触发器输入相连。LUT 输出和 D 触发器输出具体使用哪种布线资源,综合工具通过数据选择器进行控制,所以 LUT 和 DFF 就可以选择不同的布线资源同时作为 LE 的两路输出。

六、LE工作模式

  Quartus 可以根据用户程序选择合适的功能,不需要认为干预,如果有需求,也是可以创建特定功能的,但手册没有说方法,可以忽略。Cyclone IV 的 LE 只有正常模式和算术模式两种工作模式。这里会涉及进位链相关知识,鉴于本篇过长以及没有准备相关例子,先不对该部分进行讲解,后面会进行补充。

  注:需要 Cyclone IV、Cyclone V 代 FPGA中英文手册的在公众号回复 Cyclone IV手册或者 Cyclone V手册即可。


  如果对文章内容理解有疑惑或者对代码不理解,可以在评论区或者后台留言,看到后均会回复!

  如果本文对您有帮助,还请多多点赞👍、评论💬和收藏⭐!您的支持是我更新的最大动力!将持续更新工程!

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

电路_fpga

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值