Xilinx FPGA 内部结构深入分析(3)

2018-12-04 22:12

这就要求所以写操作必须同时反映到两个LUT,要完成这一点,必须令写使能、写地址、写数据同时反映到两个LUT。

观察图12的两个LUT的WS (写使能)、WG-WF (写地址)、D1 (写数据) 的级联关系就明白了。

好了,到此我们保证了写操作的正确性和两块LUT的内容一致性。 那么读操作怎么完成呢?

我们观察到,除了WG-WF,还有一个名为A[4:1]的地址总线。 这个地址总线独立于写地址总线,从而确保了独立的读操作。 然后读出的数据由LUT的D端输出。

作为Dualport RAM使用的时候,读数据从下端LUT的D口输出。

最后,介绍一个使用注意: 1. INIT属性用于初始化RAM;

2. 如果只要ROM功能,则SliceL也可以提供;

3. 全局写使能信号GWE在配置阶段关闭,可以防止对RAM初始值的干扰;

总之,通过上面的内容我们明白了,SliceM和SliceL在存储支持上的最大区别: - SliceL只能支持读功能,比如 ROM - SliceM则支持读写以及DualPort实现,因此在读写地址独立和输入数据通道等方面做了增强

移位寄存器 - 构造

Slice-M的LUT有个优势,就是可以构造16位的移位寄存器。 由于一个SliceM内有两个LUT,所以可以级联构造32位寄存器。

进一步,一个CLB内有上下两个SliceM,可以构造64位的移位寄存器。 事实上,以此类推,多个CLB可以进一步构造更长的移位寄存器。

- 例化

要使用移位寄存器可以使用SRL16 (Shift Register LUT 16 bit),他有很多变种,可以构造出多种形式的近似的移位寄存器。

他的输出有两个,一个是可寻址的输出,这是可变长度的移位寄存器的输出。

另外一个名为MC15,是LUT中的最后一个比特,用于多个移位寄存器级联时使用。 因为级联的上级SR总是从最后一个比特连到下一个SR。 移位寄存器有原语,好像是SSRL16,大家可以试用一下。 在Xilinx的技术文档中可以找到更多的SR形式。

- 不包括FF

很多人疑惑,SR中是否有FF存在,其实图25清楚的回答了这个问题。 可以看到SR是完全由SliceM的LUT实现的,FF不在其内。 当然可以在SR之外和FF连接,构造更长的SR。

Block RAM 概览

在spartan3E系列中,每个FPGA基本有4-36个BRAM。

每个这样的BRAM都是DualPort的、可配置的18Kbit存储器。 为什么是18Kbit呢,可以这样记忆,16K做数据,2K做校验位。

当然你一定要放18K数据也是可以的,但是涉及初衷肯定是考虑了校验位的需要。

所以以后如果使用小的内存就用我们前面讲过的Slice(LUT)分布式RAM。 如果要大块的,就不要麻烦了,直接例化BRAM。

BRAM有几种主要的可配置项:

- 初始值(比如可以放启动软件代码)

- 端口aspect ratio,这个我会在后面介绍,简单讲就是输入输出数据长度的不对称配置 - 写状态下的数据输出模式 - 单端口双端口配置

BRAM的片上位置

BRAM和乘法器相邻,两者一起以1~2纵列的形式放在FPGA内部。 根据FPGA的大小,有些只有1列,有些有2列。

每个BRAM都和一个18x18的乘法器相邻。

BRAM的A口上端16位和乘法器A口上端16位共享。 BRAM的B口上端16位和乘法器B口上端16位共享。 不知道这样做的目的是什么,请大家补充

BRAM的端口结构

BRAM被配置为双端口结构。

每个端口都有其独立的数据、控制、时钟总线。

根据这个特点,一个BRAM可以有四种基本的读写数据通路: - 只从A端口读和写 - 只从B端口读和写 - A写B读 - B写A读

通过原语调用BRAM

BRAM的调用原语有两种,一种是当做dual port 调用,一种是当做single port 调用。

当dual port 调用时,使用原语 RAMB16_S[wa]_S[wb],例如

- RAMB16_S9_S18:双端口RAM,A端口宽度为9,B端口宽度为18

当single port 调用时,使用原语 RAMB16_S[w],例如 - RAMB16_S18:单端口RAM,端口宽度为18

BRAM端口宽度比

和很多人先入为主的印象不一样,BRAM是支持灵活的端口宽度的。 端口A和端口B相互独立,两者可以配置成为不同的宽度。

通过寻址单位(A/B端口各不相同)的适配,两侧都能实现正确寻址。

比如一侧宽,一侧窄,则在窄的一侧寻址时,宽的数据被分割成窄的数据单元。 相反的,在宽的一侧寻址时,窄的数据被合并成宽的数据单元。

图28非常经典。建议大家反复欣赏。

假设A端口宽度为36位,则一个36位数据(4个字节,以及4个相应校验位)只占1个寻址单元。

现在来对B端口宽度的各种情况进行假设:

- 36位:和A端口一样,原来的36位仍然占用一个寻址单元

- 18位:原36位数据(含校验位)均匀的一分为二(2 x {2字节+2比特校验}),占用2个寻址单元。

- 09位:原36位数据(含校验位)均匀的一分为四(4 x {1字节+1比特校验}),占用4个寻址单元。

- 04位:原36位数据的4比特校验位被丢弃,原数据分割为(8 x 4比特),占用8个寻址单元。

- 02位:原36位数据的4比特校验位被丢弃,原数据分割为(16 x 2比特),占用16个寻址单元。

- 01位:原36位数据的4比特校验位被丢弃,原数据分割为(32 x 1比特),占用32个寻址单元。

注意:当宽度小于8比特时,因为原来的字节校验无法继承下来,所以校验信息被丢弃。

BRAM属性定义

- INITxx (INIT00~INIT3F) 初始化BRAM数据位,在配置阶段载入,每个初始化字符串定义32个Hex值,总共16Kbit。(貌似有笔误,INIT7F才符合)

- INITPxx (INITP00~INITP0F) 初始化BRAM校验位,在配置阶段载入,每个初始化字符串定义32个Hex值,总共2Kbit。

- INIT(单端口) INITA / INITB (双端口)

数据输出锁存初始化,是一个和端口宽度匹配的Hex值。

- SRVAL(单端口) SRVAL_A / SRVAL_B (双端口)

数据输出锁存同步重置,是一个和端口宽度匹配的Hex值,用于重置输出锁存值。

- WRITE_MODE

数据输出锁存行为(写操作下):有先读、先写、不变,一共三种模式

写操作下的数据输出锁存行为 这是紧接着上面的内容写的。

在写操作下,数据如何输出,一般不怎么关心。

但是在特殊的应用下,设置不同的模式,可能可以提供到便利。 我们只要大概理解就行了。 - 先写

这种模式下,正在写的数据穿肠而过,直接输出。 -先读

这种模式下,写地址处的原数据被读出。用于保护原始数据非常有用。 - 不变

这种模式下,写操作前的输出数据被锁存并持续输出,整个写操作期间都不改变。

BRAM到此就结束了,想想真的没有什么内容。

专用乘法器

FPGA在数字信号处理方面比DSP的功能要弱。

但是为了争取更多用户,FPGA也把DSP的核心——专用乘法器带入了芯片。

一个典型的乘法器有着 18X18 => 36 的输入输出结构。

两个输入端口和一个输出端口都有可选的寄存器,用于适配不同的应用需求。

调用乘法器的原语是 MULT18x18SIO,并有两类最常用的属性:

1. 寄存器属性:通过设置AREG / BREG / PREG 属性为 1/0 来包含或者去除端口的寄存器。

2. B操作数级联属性:通过设置B_INPUT属性为 DIRECT / CASCADE 来选择B操作数是直接输入还是共享自下级乘法器。

B操作数的共享是Xilinx乘法器的一大特点,主要是为了FIR滤波器的实现考虑。 为了支持这一点,有一些特殊的构造:

- 有一个BCOUT(B Cascade OUTput)输出端口,这个端口是最终B操作数的直接输出(BREG=1时,则是寄存器输出)

- 除了B端口还有一个BCIN(B Cascade INput)输入端口,连着下面乘法器的BCOUT输出,通过B_INPUT属性来选择真正的B操作数

可见,通过上面的这个B操作数特殊构造,最底层的B操作数,可以一直级联上去,被所

有乘法器共享。

B操作数级联的两个典型应用就是:

- 带有BREG时,B操作数在乘法器之间形成移位寄存器,构成典型的 direct-form FIR 滤波

- 没有BREG时,B操作数在乘法器之间并行共享使用,构成典型的 transpose FIR 滤波 和前面介绍的Slice结构一样,所有的构造都是有目的的,都是为了运算服务的。

DCM

基本把整个datasheet看完了,除了时序和切换部分。 不过这里的进度远远落后,看来得加快速度了。

DCM 是数字时钟管理的缩写。

要使用DCM可以通过CoreGen定制,也可以通过DCM系列原语来定制。这里不做展开。

在早期的FPGA中,DCM的数量不多。 最早的是在FPGA的上下两端各有一个。 然后发展成上相两端各有两个。

在Spartan3E中,上下左右四边各有两个。

一个典型的DCM由4部分构成 - 延迟锁相环 DLL - 数字频率合成 DFS - 相移 PS - 状态逻辑

我想记住主要的两个是DLL和DFS,一个帮助实现相移和简单的倍分频,一个实现M/D倍的频率合成。

最后介绍一下DCM的主要功能: - 消除clock skew - 频率合成 - 相移

接下来会展开研究。

DLL 最重要的功能 deskew

数字锁相环从结构来看是一个基于计数器的延迟线。

他接受两个时钟输入,然后比较差异,根据差异来调整有效延迟线的长短。

调整延迟线的主要目的是同步两个时钟——clk0和clk_fb。

为了对齐这两个时钟,DLL执行下列步骤 1. clk0先通过时钟网络传输到所有同步寄存器 2. 然后时钟反馈到clk_fb端口

3. 内部控制模块比较两者的相位差异,这个差异就是包含DCM在内的整个时钟分配网络引入的skew

4. 控制模块调整延迟单元来消除skew 5. 相位对齐后置位LOCKED。

DLL 的主要属性

1. CLK_FEEDBACK:设置时clk0还是clk2x反馈,或者不反馈。

2. CLKIN_DIVIDE_BY_2:对于输入频率过高的情况,如果超出了DCM的接受范围,可以设置这个属性(TRUE/FALSE)


Xilinx FPGA 内部结构深入分析(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:部编版版一年级下册道德与法治《家人的爱》说课稿

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: