巧用FPGA中资源
随着FPGA的广泛应用,所含的资源也越来越丰富,从基本的逻辑单元、DSP资源和RAM块,甚至CPU硬核都能集成在一块芯片中。在做FPGA设计时,如果针对FPGA中资源进行HDL代码编写,对设计的资源利用和时序都有益。下面主要讲解一下如何巧用FPGA中资源:
1. 移位寄存器
FPGA中的移位寄存器使用在前面的博文中有所论述,Xilinx FPGA中的LUT可以作为SRL使用,主要可参考此博文《Xilinx 7系列FPGA使用之CLB探索》,在此想补充论述一下SRL的延时,首先看一下如下代码,实现了一个19级的移位寄存器。

1 module srl_test(
2 input clk,
3 input rst,
4 input din,
5 output dout
6 );
7 reg din_d;
8 always@(posedge clk) begin
9 if(rst)
10 din_d<=1'b0;
11 else
12 din_d<=din;
13 end
14 reg [18:0] d_sh;
15 always@(posedge clk) begin
16 d_sh<={d_sh[17:0],din_d};
17 end
18 assign dout=d_sh[18];
19 endmodule

综合得到结构如图1所示,其中输入din由FF(din_d)寄存,随后的移位操作由一个SRL32E和FF组成,SRL中A=“10001”,实现了18级移位,因此SRL32E和FF的组合也能实现19级的移位,但是代码中dout是直接assign组合输出,并没有输出寄存,为什么综合得到结构是FF寄存输出,以下分析一下原因。
图1
在FPGA内部时序分析一般以register-to-register为基础模型,首先来看一下图1所示路径,为srl32-to-ff的路径,其数据路径延时报告如图3所示,延时Prop_srlc32e_CLK_Q表示充当移位寄存器的LUT的clk_to_out延时,达到0.97ns,相比于FF的clk_to_out延时(0.24ns)相差甚大,如果没有最后一级的FF寄存,则输出为纯组合逻辑输出,这段路径的延时将会被引入到下一级模块的时序分析中,下一级模块的输入如果也没有输入寄存,则这一段数据路径的延时将会很大,不利于时序收敛;而加入FF寄存,直接切断了数据路径,在这段register-to-register模型中,数据路径延时仅有LUT的clk_to_out延时0.97ns,在一般情况下都能达到时序收敛。因此综合器自动将最后一级移位以FF形式实现,在代码功能不变的前提下,优化了时序;而且这个FF是同一个Slice中的FF,并不会消耗多余的Slice,由于SRL32E和FF处于同一个Slice,它们之间的走线属于内部走线,因此延时将会很小,由延时报告中SRL32E到FF(d_sh_18)的走线延时为0ns可以验证。
图2
图3
移位寄存器综合得到的SRL+FF组合结构体现了综合器的智能,但是此结构仅限于静态地址的移位寄存器实现,动态地址的移位寄存器的Q端是直接组合逻辑输出的,需要人为地在代码中添加FF寄存。
2. Register大搜索
在FPGA中的register资源可以说是无处不在,几乎每个角落都有它的身影,Xilinx 7系列FPGA中,每个Slice中有8个register,除此之外,在DSP48E1、Block RAM蕴藏了很多register,其中在1个DSP48E1中多达上百个。
首先讲解一下如何使用DSP48E1中丰富的register资源,如下两段代码:
综合得到资源利用和性能对比如下表所示,结构如图4所示,其中Code1和Code2都使用了1个DSP48E1资源;Slice Resigter,Code2使用比Code1多了32个,用于输入2*8-bit和输出16-bit信号的寄存,而Code1没有使用额外的Slice的register资源,是因为这些register是在DSP48E1中实现了;并且Code2的Fmax相比于Code1也较差,是因为Code2中结构使用了额外的Slice Resigter,连接乘法器需要外部走线,增加了数据路径延时,而Code1中register与乘法器之间是内部走线,延时可以忽略,因此时序上较好。
Code 1 |
Code 2 |
|
Slice Registers |
0 |
32 |
DSP48E1s |
1 |
1 |
Maximum frequency |
360.750MHz |
253.678MHz |
图4
而比较Code1和Code2的差异,就是复位,Code1中寄存采用的是同步复位,而Code2采用异步复位,因为DSP28E1中的register只支持同步复位,如果采用异步复位,综合器就不会采用DSP48E1中的register实现,而是使用额外的Slice Resgiter,因此建议在使用DSP资源时采用同步复位,这样可以充分使用其中的register资源,对于FPGA资源耗用和性能上都有益。
而使用Block RAM中register资源与DSP类似,复位方式也需要是同步综合器才能识别。
另外还有一处的register可供利用,那就是IOB,通过设置synthesis和map选项,可以将输入和输出的register映射到IOB中的register实现,如图5为选项设置,在synthesis选项中,将-iob设置为Auto或者Yes,在Map选项中,将-pr设置为For Inputs and Outputs。
图5
对上述Code2进行综合实现,得到报告如下,报告显示输入和输出register并没有使用额外的Slice Resigter实现,而是映射到了IOB Flip Flops中,如图6所示为IOB中的register。
Slice Logic Utilization:
Number of Slice Registers: 0 out of 407,600 0%
Number of Slice LUTs: 0 out of 203,800 0%
IO Utilization:
Number of bonded IOBs: 34 out of 500 6%
IOB Flip Flops: 32
图6
综上,在做FPGA设计时,可以充分利用DSP、Block RAM、IOB等资源中的register,不但节省资源而且可以在一定程度上提高性能。
巧用FPGA中资源的更多相关文章
- 在FPGA中使用for循环一定浪费资源吗?
渐渐地,发现自己已经习惯于发现细节,喜欢打破常规,真的非常喜欢这种feel. 相信很多人在书上或者博文上都有提出“在FPGA中使用for语句是很占用资源的”的观点,特权同学也不例外.那么,这种观点正确 ...
- FPGA中改善时序性能的方法_advanced FPGA design
本文内容摘自<advanced FPGA design>对应中文版是 <高级FPGA设计,结构,实现,和优化>第一章中的内容 FPGA中改善时序,我相信也是大家最关心的话题之一 ...
- FPGA中的除法运算及初识AXI总线
FPGA中的硬件逻辑与软件程序的区别,相信大家在做除法运算时会有深入体会.硬件逻辑实现的除法运算会占用较多的资源,电路结构复杂,且通常无法在一个时钟周期内完成.因此FPGA实现除法运算并不是一个&qu ...
- FPGA中的时序分析(一)
谈及此部分,多多少少有一定的难度,笔者写下这篇文章,差不多是在学习FPGA一年之后的成果,尽管当时也是看过类似的文章,但是都没有引起笔者注意,笔者现在再对此知识进行梳理,也发现了有很多不少的收获.笔者 ...
- 转载 fpga中 restoring 和 non-restoring 除法实现。
对于non-restoring方法,主要是用rem和den移位数据比较,rem_d长度为den+nom的总长,den_d长度为den+nom的总长度,rem_d的初始值为{{d_width{1'b0} ...
- FPGA中的仿真
在进行FPGA工程开发中,都会接触到仿真这个环节.FPGA开发一定要仿真,要养成仿真的习惯. 很多初学者或者学艺不精的工程师都比较排斥仿真. 但是,仿真真的很重要! 仿真可以让设计者能够很快知道模块输 ...
- FPGA中RAM使用探索
FPGA中RAM的使用探索.以4bitX4为例,数据位宽为4为,深度为4. 第一种方式,直接调用4bitX4的RAM.编写控制逻辑对齐进行读写. quartus ii 下的编译,资源消耗情况. 85C ...
- FPGA中计数器设计探索
FPGA中计数器设计探索,以计数器为32位为例: 第一种方式,直接定义32位计数器. reg [31:0]count; quartus ii 下的编译,资源消耗情况. 85C模型下的时钟频率. 0C模 ...
- FPGA中的“门”
逻辑门 在ASIC的世界里,衡量器件容量的常用标准是等效门.这是因为不同的厂商在单元库里提供了不同的功能模块,而每个功能模块的实现都要求不同数量的晶体管.这样在两个器件之间比较容量和复杂度就很困难. ...
随机推荐
- Url 简单讲解
eg: http://sb.test.com/login?name=liming&password=twotigers 协议 http https ftp 域名 sb.test.com 则是域 ...
- BZOJ 2246 [SDOI2011]迷宫探险 (记忆化搜索)
题目大意:太长了,略 bzoj luogu 并没有想到三进制状压 题解: 3进制状压陷阱的状态,0表示这种陷阱的状态未知,1已知危险,2已知不危险 然后预处理出在当前状态下,每种陷阱有害的概率,设为$ ...
- ajaxFileUpload 返回的数据报错
$.ajaxFileUpload({ url : '/updateMallGoods', data : { "goodsName":goodsName, "proDesc ...
- 题解 P3369 【【模板】普通平衡树】
在网上某篇神奇的教程和@codesonic 大佬的标程帮助下,我又肝完了Leafy Tree,跑过来写篇题解(好像以前写过一篇?) 什么是Leafy Tree? Leafy Tree由两种节点组成:辅 ...
- Oracle学习总结(7)—— 常用的数据库索引优化语句总结
不管是用C/C++/Java等代码编写的程序,还是SQL编写的数据库脚本,都存在一个持续优化的过程.也就是说,代码优化对于程序员来说,是一个永恒的话题. 近期,我们对之前编写的数据库脚本进行了全面的自 ...
- Java基础学习总结(4)——对象转型
一.对象转型介绍 对象转型分为两种:一种叫向上转型(父类对象的引用或者叫基类对象的引用指向子类对象,这就是向上转型),另一种叫向下转型.转型的意思是:如把float类型转成int类型,把double类 ...
- c++_benchMark_vector_list_deque
title: c++_benchMark_vector_list_deque date: 2015-08-01 22:32:39 作者:titer1 + ZhangYu 出处:www.drysalte ...
- Ryu基本操作的REST API调用演示样例
import urllib2 import json def get_all_switches(): url = "http://127.0.0.1:8080/v1.0/topology/s ...
- GetKeyState(), GetAsyncKeystate(), GetKeyboardSlate()
GetKeyState.GetAsyncKeyState.GetKeyboardState函数的差别: 1.BOOL GetKeyboardState( PBYTE lpKeyState );获得全部 ...
- Linux中的find命令
.递归查找(find 命令 是递归遍历文件夹的) 命令:find . -name “*.txt” //当前路径下递归查找以.txt结尾的文件夹 .不递归查找 find . -name “*.txt” ...