FPGA中的基础逻辑单元--Xilinx

Xilinx FPGA的组成部分

本文是以Xilinx Kintex UltraScale+ 系列为参考所写,其他系列有所不同,可以参考相应的user guide文档。

Xilinx家的FPGA有这么些基本组成部分:

  1. Configurable Logic Block (CLB)可编程逻辑块
  2. Block Memory存储器
  3. DSP数字信号处理器
  4. Transceivers收发器
  5. I/O pins输入输出端口

参考文档:Xilinx UltraScale architecture.

从Implemented Design中可以看到FPGA中资源大致分布如下。中间蓝色是CLB可编程逻辑块、DSP或BRAM,两侧的彩色矩形块是I/O接口和收发器,划分的方块是不同的时钟域
implemented design

Configurable Logic Block (CLB)可编程逻辑块

CLB是FPGA内部实现可编程性的主要成分,其中可以包括:

  1. LUT查找表
  2. 高速算术逻辑
  3. 分布式存储distributed memory或移位寄存器shift register logic (SRL) ability

具体内容可以参考这个:UG574 CLB

Look-Up Table (LUT)查找表

每个CLB中包含一个slice,每个slice提供8个6输入查找表LUT和16个寄存器(slice就是CLB中一个小的分割,有的CLB中有两个,不知道怎么翻译这个词)。每个6输入LUT可以被设置成1个6输入查找表或者2个5输入查找表。可以这么配置的原因跟LUT结构有关。
LUT查找表
上图是一个4输入查找表的结构,[ABCD]作为4位二进制输入,总共有24=16种输入,每种输入对应的1位输出就存在左侧的寄存器中,因此查找表可以完成每一种二进制逻辑。在右侧可以看到一个4输入LUT其实是两个3输入LUT再加上一个2路复用器MUX,最后的MUX由新加入的一位控制,如果要拆开就把两个3输入LUT的结果绕开最后的MUX输出即可。同样就可以理解6输入LUT拆分成两个5输入LUT的原因。

之前介绍Altera的ALM时说过,LUT太深或太浅都不好,太深需要很多寄存器,而且MUX层数太多,延迟严重;太浅不方便配置逻辑,浪费过多空间。A家和X家根据客户实际使用情况调查过之后得到的结论相同,6输入LUT目前来说是最平衡的,如果需要的话就拆成小的LUT,一般以6输入为主。

LUT的输出如下,O6是作为6输入LUT的结果,O5是作为两个5输入LUT的结果,有2位。它的结果可以直接作为slice的输出,也可以传递到寄存器中储存。而存入寄存器的数据也可以不经过LUT,直接从外界读取。
LUT6
Xilinx的Toolchain会自动配置这部分内容,但是了解细节可以更好的利用FPGA中的资源,比如下面三段代码,第一段只用上了LUT查找表输出,第二段绕过了LUT输入到寄存器中,而第三段同时用上了LUT查找表和寄存器,可以说是对slice利用率最高的。

// Code 1
wire [1:0] output;
wire [5:0] input;
assign output[0] = input[0]&input[1]|input[2];
assign output[1] = input[3]|input[4]^input[5];
// Code 2
wire clk, rst;
reg [1:0] output;
reg [1:0] input; // Coming from previous registers
always @(posedge clk or posedge rst) begin
	if(rst)
		output <= 2'b00;
	else
		output <= input;
end
// Code 3
wire clk, rst;
reg [1:0] output;
wire [5:0] input;
always @(posedge clk or posedge rst) begin
	if(rst)
		output <= 2'b00;
	else begin
		output[0] <= input[0]&input[1]|input[2];
		output[1] <= input[3]|input[4]^input[5];
	end
end

在project比较小的时候自然不用注意这么多,project大大时候toolchain有一定的能力帮你平衡这些资源利用,这种抠牙缝的手段在FPGA特别小,或者代码太大,或者时钟很高时就有用了。在时钟高时,为了尽可能缩短信号之间的布线距离,能用寄存器缓冲的就要尽量用,但只是用pipeline的形式加入相当于浪费了一些slice中的LUT部分,最好的办法就是把寄存器加在逻辑中间,这样利用率就提高了。比如在不优化的情况下,第二段比第一段代码更高效,时钟环境更好(自己做总比不知道toolchain做了什么要好):

// Code 1
wire clk, rst;
wire [5:0] input;
reg [1:0] pipeline;
reg output;
always @(posedge clk or posedge rst) begin
	if(rst) begin
		pipeline <= 2'b00;
		output <= 1'b0;
	end
	else begin
		pipeline[0] <= &input; // And every bits from input
		pipeline[1] <= pipeline[0]; // Pipeline it
		output <= pipeline[1];
	end
end
// Code 2
wire clk, rst;
wire [5:0] input;
reg [1:0] pipeline;
reg output;
always @(posedge clk or posedge rst) begin
	if(rst) begin
		pipeline <= 2'b00;
		output <= 1'b0;
	end
	else begin
		pipeline[0] <= &input[2:0]; // And first 3 bits from input
		pipeline[1] <= &input[5:3]; // And last 3 bits from input
		output <= pipeline[0] & pipeline[1];
	end
end

高速算术逻辑

和Altera中的ALM相似,Xilinx的slice中也有小的加法器,使得小位数的加法、乘法、计数器可以在其中实现。但是高位数的算术运算就不适合在其中实现了,容易出现各种时钟问题,而且浪费大量逻辑资源,这种运算最好交给之后的DSP资源来实现。

分布式存储distributed memory或移位寄存器shift register logic (SRL) ability

Slice也分两种,前面介绍的是普通的SLICEL (logic),也就是逻辑slice,还有一种是强化了存储功能的SLICEM (memory),也就是存储slice。SLICEM也可以当作SLICEL用,拥有SLICEL的一切功能,但SLICEM添加了地址线write address端口和写使能write enable端口,使得6输入LUT中的26=64个寄存器可以被配置成64-bits RAM,8个6输入LUT合起来就可以是一个512-bit RAM。

SLICE

Xilinx还有一个特殊的设计,可以让这64 bits互相连接变成一个移位寄存器,比起使用后面的register寄存器利用率高很多。举个栗子的话:

// Shift registers
genvar i;
wire [3:0] addr_1 = 4'd15;
wire [41:0] D_1;
wire [41:0] Q_1;
assign D_1 = input;
assign output = Q_1;

// 42bit X 16
generate 
  for(i=0; i<42; i=i+1) begin : Shift
    SRL16E #(
       .INIT(16'h0000),        // Initial contents of shift register
       .IS_CLK_INVERTED(1'b0)  // Optional inversion for CLK
    )
    Shift_UP2_1 (
       .Q(Q_1[i]),     // 1-bit output: SRL Data
       .CE(1'b1),   // 1-bit input: Clock enable
       .CLK(clk), // 1-bit input: Clock
       .D(D_1[i]),     // 1-bit input: SRL Data
       // Depth Selection inputs: A0-A3 select SRL depth
       .A0(addr_1[0]),
       .A1(addr_1[1]),
       .A2(addr_1[2]),
       .A3(addr_1[3]) 
    );
  end
endgenerate

也许有人会想,为什么要考虑那么多小技巧把代码变复杂,硬件编程跟软件编程的不同就在这里,用实际电路的思维来考虑,它的实现情况和用指令集数据库的软件编程有很多不同点。写简单的代码有时候被编译后就变成低效的结构。新手写RTL代码会出现a=b*c;这种,每次看到都会头皮发麻。

因此设计RTL时,推荐这种优化步骤:

  1. 尽量少用reset,并且不要同时用同步reset和异步reset
  2. 寄存器很多,能用尽量用,对时钟环境好(不要用always *,同样看到头皮发麻)
  3. 写寄存器的控制信号简单点,尽量也用寄存器pipeline一下
  4. 移位寄存器比较特殊,不要用复位信号,尽量用上LUT中的SRL,reset信号会让tool避免用SRL
  5. 少于64bits的存储用SLICEM来做,Xilinx tool中一般叫LUTRAM
  6. 位数较高的加法、计数器,以及尽可能所有常常调用的乘法用DSP来实现

Block Memory存储器

在CLB中的LUTRAM之外,Xilinx芯片中的内置存储器就是BRAM存储器了。每个BRAM可以被配置成两个独立的18kb RAM或者一个36kb RAM,每个BRAM有两个独立的读写端口

BRAM
如果一个36kb的BRAM不够用,还可以把多个BRAM连接在一起:

BRAM Cascade

详细可参考:Xilinx BRAM

DSP数字信号处理器

Xilinx的FPGA中高位加法和乘法主要是由DSP数字信号处理器承担的,其结构如下

DSP
根据不同的配置,可以构成一系列公式,比如下面几种
P = ( A ± D ) ∗ B + C P = B 2 + P P = A ± D ± C P=(A\pm D)*B+C\\ P=B^2+P \\ P=A\pm D\pm C P=(A±D)B+CP=B2+PP=A±D±C

和Altera FPGA中的DSP相比,两个乘法器变成一个,多了平方选项和XOR逻辑,以及比较逻辑。相比起来Xilinx FPGA中的DSP虽然集成度没有那么高,但灵活性更高,更方便配置成各种需要的形式,设计FIR这类结构时,可以很明显感受到Xilinx中的DSP设计出的结构复杂度低很多,不需要考虑两个乘法器带来的协同性问题。

调用Xilinx的DSP有比较多的注意事项,代码也相对较长,之后可以单独写一篇。

Transceivers收发器

在Kintex UltraScale+系列中的收发器有Gigabit Transceivers H/Y (GTH/GTY)两种,后面的H和Y代表不同的传输速率,具体是哪个单词没有找到。这些高速收发器可以承担不同的接口任务,常见的有PCIe、SFP、10G网、SATA等。

让传输速率更高一直是通信行业的核心问题,这个毋庸置疑,无论哪种接口,要在FPGA上实现,不可避免的要用到这些收发器。

这里的细节太多,全写一遍可以出一本书,我也只懂些皮毛,这里放一张大概的结构图,挖个坑等我边写边填。
GTH

I/O pins输入输出端口

在Xilinx UltraScale系列中有三种I/O bank,一种是High-performance (HP)高性能、High-density (HD)高密度、High-range(HR)大范围。HP可以满足1.8V以下信号的性能需求,HD可以在支持低速接口的情况下尽可能减小面积,HR可以支持更多的3.3V以下标准。

HP IOB
HR IOB

详细可参考:UG571 SelectIO

总结

在我看来,和Altera的FPGA相比,Xilinx的FPGA与之最大区别就是DSP的不同。虽说两个公司对一些资源的名称不同,分割方式不同,但其逻辑的主体LUT没有太大区别,BRAM的区别也不大,只有DSP有结构上的不同。至于对外的接口,个人认为对内部逻辑影响不大。

  • 11
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 《Xilinx FPGA高级设计及应用-设计者的思想》是一本关于FPGA(现场可编程门阵列)高级设计和应用的教材。该教材旨在帮助读者深入理解FPGA的设计原理和应用方法,并通过设计者的思想来提高设计的效率和质量。 首先,该教材介绍了FPGA的基本概念和结构。FPGA是一种灵活可编程的硬件平台,可以根据需要实现不同的逻辑功能。在设计过程,需要充分了解FPGA架构和资源分配,合理利用各种IP核和资源,实现设计目标。 其次,该教材详细介绍了FPGA高级设计的思想和方法。设计者需要具备深厚的数字电路设计知识和编程技能,理解各种设计模式和优化策略。教材通过实例分析和实践操作,让读者熟悉各种高级设计技术,如时序优化、功耗优化、资源共享等,提高设计的性能和效率。 此外,该教材还介绍了FPGA应用的一些典型场景。FPGA广泛应用于数字信号处理、通信系统、图像处理等领域。教材通过案例分析和实际应用项目,让读者了解FPGA在不同领域的应用需求和设计方法。 最后,该教材强调了设计者的思想和创新能力在FPGA设计的重要性。设计者需要具备解决问题的能力和创造新功能的能力,善于应用各种设计技术和工具。教材通过鼓励读者进行设计实践和思考,培养读者的设计思维和创新精神。 总之,《Xilinx FPGA高级设计及应用-设计者的思想》是一本全面介绍FPGA高级设计和应用的教材。通过学习该教材,读者可以深入理解FPGA的设计原理和应用方法,提升设计的效率和质量。 ### 回答2: 《Xilinx FPGA高级设计及应用-设计者的思想》这本书是一本探讨FPGA高级设计和应用的重要参考资料。书详细介绍了Xilinx FPGA的设计理念和应用方面的重要技术。以下是对该书内容的概括。 首先,这本书介绍了Xilinx FPGA设计基础知识和概念。读者将了解到FPGA的结构、布局和时序控制等基本原理。通过对FPGA的内部架构和工作机制的深入分析,读者可以获得对FPGA设计的深刻理解。 其次,该书详细介绍了FPGA设计的一些高级技术和方法。其,特别强调了纯Verilog和纯VHDL设计的能力,以便读者能够实现更加灵活和高效的设计。此外,书还介绍了如何使用Xilinx Vivado设计套件进行FPGA的设计和开发。 在书的后半部分,作者详细介绍了FPGA设计的一些实际应用。包括如何设计高性能的数字信号处理系统、如何使用FPGA进行图像处理以及如何在FPGA上实现嵌入式系统等。通过这些实际案例的介绍,读者可以学习到如何将FPGA应用于各种不同的领域和应用。 总结起来,《Xilinx FPGA高级设计及应用-设计者的思想》这本书对于想要深入了解FPGA设计和应用的人来说非常有价值。它系统地介绍了FPGA的设计理念和方法,同时通过实际案例的分享,使读者能够更好地应用FPGA到实际的项目。这本书对于FPGA设计者来说是一本不可或缺的指南。 ### 回答3: 《Xilinx FPGA高级设计及应用-设计者的思想》是一本关于FPGA(现场可编程门阵列)的高级设计和应用的书籍。本书主要讨论了在FPGA设计过程设计者的思想和方法。 首先,本书介绍了FPGA的基本知识和原理,包括FPGA的结构、内部资源和编程方式。这为读者提供了一个良好的基础,使他们能够更好地理解后续章节的内容。 其次,本书详细讲解了FPGA的高级设计技术,包括时钟域和时序分析、复位电路设计、数据通路设计以及流水线和并行处理等。这些内容帮助读者掌握了在FPGA设计常用的技术和方法,使他们能够设计出高性能、高可靠性的电路。 另外,本书还介绍了一些高级应用,包括FPGA在数字信号处理(DSP)和通信系统的应用,以及FPGA与其他硬件和软件的接口设计等。这些实际应用案例和设计经验对读者在实际项目运用FPGA非常有帮助。 最后,本书强调了设计者的思想和方法。通过分析真实的FPGA设计案例,读者将了解到在设计过程应该注重哪些方面,如如何优化性能、如何提高可靠性以及如何解决设计的难点和挑战等。这些思想和方法可以帮助读者提高设计水平,更好地应对复杂的FPGA设计任务。 总之,《Xilinx FPGA高级设计及应用-设计者的思想》这本书通过详细介绍FPGA的高级设计和实际应用以及设计者的思想和方法,帮助读者全面了解和掌握FPGA的设计技术,提高设计水平。无论是对FPGA设计初学者还是有一定经验的设计工程师来说,这本书都是一本难得的参考资料。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值