原创 【博客大赛】探寻FPGA LAB底层资源、复位、上电初值

2014-3-8 11:34 3085 11 18 分类: FPGA/CPLD 文集: FPGA

一、LAB内部资源

Cyclone III 每个LAB包括 16个LE ,每个LAB 还包括 LAB control signals、LE carry chains、Register chains、Local interconnect,需要对 LAB control signals 有所了解。

每个 LAB 的 LAB control signals 包括 Two Clocks、 Two clock enables、Two asynchronous  clears、One synchronous clear、one synchronous load,这些信号都是 LAB-wide 作用的。

LAB-wide: 比如 某个 LE的 register 使用的时钟是 clk1,那么这个 clk1 的作用域是整个LAB,此 LAB内任何一个 register都连接了此 clk1,或者说 clk1走的是 LAB内的时钟网络,注意,虽然作用域是整个 LAB,但是任意某个 LE 可以选择不用此时钟。这就像,家里的水龙头,整栋楼使用的是同一个供水管道(作用域:整栋楼),但是对于各家各户,提供给你们家的只是一个水龙头(接口),你可以选择打开或者不用。对于Cyclone III 每个LAB 有 Two clocks ,这就是说 这个楼有两个供水管道,每户人家可以选择打开水龙头A 或者水龙头B ,或者不用水。但是,想打开水龙头C ,对不起,这栋楼只有两个供水管道(假设每个管道只提供给各户一个接口)。

有了上边的概念,一切就简单了。

Two clocks : 两个时钟域的 不同 LEs,可以位于同一个LAB模块内,但是三个时钟域的 不同LEs,绝对不同位于同一个LAB中,编译时,布局布线时,编译器会自动把这些 LEs分配到不同的LAB内,如果通过 Chip Planner ECO 改动不同时钟域(三个以上)的 LEs 到同一个LAB 编译时会 报错;

One synchronous clear : 同一个 LAB 只有一个 同步复位线,不同同步复位的 LEs 不能位于一个 LAB 内 !

其它 LAB内控制信号亦如此 !

二、谈一谈 复位 的问题

1、在 assignment -setting -Device and Pins -General 中 Enable device-wide reset(DEV_CLRn) ,打勾,使能 全局清零 管脚,不打勾,这个脚就是普通 IO 脚,这个脚只能chip-wide 寄存器 清零,不能置 1 ,一般不用此脚当复位脚 !因为复位后有些初值不希望是 0 ,而且 这个复位脚只能对寄存器清 0 ,对组合逻辑 无效 。

2、对于有些系列的FPGA的LE 有 同步复位,同步置位端,这种情况使用同步复/置位,比较省资源,但是对于没有同步复位端的FPGA,在程序中使用同步复/置位,会占用大量的组合逻辑资源,所以不推荐使用 同步复/置位。

 对于Cyclone III ,LE 有sclr和sload 端,但是即使程序使用的同步复位,编译器默认也不会使用 sclr端口,反而会用很多 LUT 资源实现同步复位功能,设置编译器:Analysis $ Synthesis Setting -more setting - Fource use synchronous clear signals ,这样才会编译成 使用 sclr专用端口的同步复位;对于同步置位,由于软件中没有对应的设置,所以即使程序写的同步置位,也很难在编译时使用sload端口。所以,不推荐使用这种方式 !

3、异步复位,异步复位同步释放 是推荐的方式 !

三、全局时钟网络

 Cyclone III 有20个全局时钟网络 ,GCLKs 。

 注意: 全局资源只有这20个全局时钟网络,任何走全局线的信号都是用的这20个GCLKs中的某一个,不是只有全局时钟才用全局时钟资源。全局资源可以连接到chip中任意一个LE,相当于这个小区都是用的这个管道。

有个住宅小区(chip),30栋楼(30个LAB),有个很粗的送水管道(全局时钟网络GCLK,chip-wide)接到各栋楼,每栋楼又有细管道(clock,clr,sclr,LAB-wide)接此粗管道到各户人家。

哪些用的全局资源,view report -Fitter -Resource Section -Glogal % Other fast signals / Non-Global High fan-out signals 可以看到具体的情况(下图),如果想改某个信号到全局线上(比如fan-out太多),可以右键,locate in assignment editor 设置即可。一般按照编译器默认的分配方式即可。

20140306094052805.jpg

四、上电初始值

 以 Cyclone III 为例 ,signaltap 实测结果

(1)程序中有异步 复位 的情况

always@(posedge clk or negedge reset)
if(!reset)
  dataout1<=4'd5;
else ...... 

  异步复位/置位 上电就等于复位初始值;异步置位的寄存器后边接有反相器,实现置位功能,因为只有异步复位端。

output reg [3:0] dataout1=4'd3;

always@(posedge clk or negedge rst_n )
if(!rst_n)
 begin
 dataout1<=4'd1;
 end    

 上电等于 4'd1。

(2) 同步

 always@(posedge clk )
if(!rst_n)
 begin
 dataout2<=4'd5;
 dataout1<=4'd1;

end

同步复位/置位 上电不等于复位初始值,全是0;

output reg [3:0] dataout1=4'd3;

always@(posedge clk )
if(!rst_n)
 begin
 dataout1<=4'd1;
 end    

 上电等于 4'd3 。

(3)

output dataout2<=4'd8;

上电等于 4'd8。

(4)网上有人说 在 Analysis&Synthesis setting 设置pow up don't care 可以对上电 初值设置,试了试,没有任何效果 !!

从datasheet 了解到 FPGA芯片内有 POR Circuitry ,上电后,对寄存器reset(复位清0),所以实际上上电后,寄存器都是 0 ,异步置位的情况,在寄存器后加了反相器,实现上电置位的功能,而同步置位比较复杂,则实现不了。

 上边的结果是实测的,可能只适用于Cyclone III系列。

 

五、异步复位同步释放,上电初值

 reg reset;
 always@(posedge clk or negedge rst_n)
 if(!rst_n)
  reset<=1'b0;
  else reset<=rst_n; 

always@(posedge clk )//or negedge reset)
if(!reset)
 begin
 dataout1<=4'd0;
 end 

   always@(posedge clk1  or negedge reset1)
   if(!reset1)
   begin dataout2<=4'd0; end
  else if(state==state0)
    dataout2<=4'd5;  

  寄存器 reset ,dataout1,dataout2 不能位于同一个 LAB ,原因:

  reset 寄存器本省需要aclr 信号 rst_n,rst_n占用一个异步复位线(LAB-wide),reset又作为dataout1的aclr,所以reset的输出会占用另一个异步复位线(LAB-wide),dataout2需要reset1作为aclr,然而,一个LAB 只有两条 异步复位线,所以资源不够用 !

 reset ,dataout1 ,dataout2中任意两个都可以在同一个 LAB中 !

六、

output reg [3:0] dataout1=4'd3;

always@(posedge clk )
if(!reset)
 begin

 dataout1<=4'd0;

 end 

即使选中 Fource use synchronous clear signals,对于 dataout1[1:0]这两位,也不会接reset到专用同步清零sclr端,因为上电默认这两位是 1 ,按照异步清零的方式,在后边加了反相器,所以连到sclr 会出现同步复位变成 1 的情况;这两位会使用 LUT资源,实现同步复位,上电置位,不会有任何冲突 !

 dataout1[3:2] 的专用 sclr 接reset 没有任何问题。

 

 

 

文章评论7条评论)

登录后参与讨论

pengchengcheng082_593158939 2014-9-14 20:46

最稳妥的办法是有外部复位电路,这样系统才完整,避免一些意想不到的情况发生;不同系列的,不同厂家的芯片在上电时对于初值的处理方式也会不同,所以建议有复位电路

用户1697878 2014-9-14 16:54

我曾经遇到CycloneIII外部最开始没焊接复位电路,FPGA正常工作,然而过了一段时间后,FPGA一直陷入复位状态跳不出来,焊上复位就又正常了,请问博主觉得是什么原因呢,具体描述请看我在阿莫论坛上的提问http://www.amobbs.com/thread-5595291-1-1.html

用户1697878 2014-9-14 16:50

不错 学习了

残弈悟恩 2014-5-2 11:00

真是通俗易懂啊。

用户1711475 2014-4-28 17:10

不错,写的很生动细致,比较容易理解

用户1668914 2014-3-23 21:18

写得很好,学习了,谢谢

Alwin 2014-3-20 17:59

写得不错。
相关推荐阅读
pengchengcheng082_593158939 2015-08-21 16:26
Linux 下 的 vi 编辑器
一、按ESC键 跳到命令模式,然后: :w 保存文件但不退出vi :q 不保存文件,退出vi :wq 保存文件并退出vi :q! 不保存文件,强制退出vi :w! 强制保存,不推出...
pengchengcheng082_593158939 2015-07-28 15:57
面向对象和面向过程区别
转自 http://blog.sina.com.cn/s/blog_4dd5955301000a2m.html     面向对象和面向过程的区别,实在是难用一两句话说明白。   ...
pengchengcheng082_593158939 2015-05-23 10:39
后仿真能否被形式验证(Formal Verification)和静态时序分析(Static Timing Analysis)所取代
转自 http://www.cnblogs.com/jyaray/archive/2011/04/26/2029856.html 验证的主要目的:就是检查时间模型是否满足时间要求,是否实现了时...
pengchengcheng082_593158939 2015-05-19 11:18
两种代码方式
下面的两段程序等价,RTL图以及综合后的结果 完全一样。看似简单,其实是两种不同的思维方式。在复杂电路中能体现出两种方式各自的特点,第一种容易理解,第二种则结构更清晰,更接近综合后的结果。以前习惯用上...
pengchengcheng082_593158939 2015-05-14 16:28
Linux 下 的 cc 和 gcc
转自 http://www.cnblogs.com/zhouyinhui/archive/2010/02/01/1661078.html   在Linux下一会看到cc,另一会又看到gcc...
pengchengcheng082_593158939 2015-05-13 17:19
mips 编译器
1、linux 系统下编程的编译器 GNU toolchain(GNU工具链)是一个包含了由GNU项目所产生的各种编程工具的集合。这些工具形成了一条工具链,用于开发应用程序和操作系统。  ...
我要评论
7
11
关闭 站长推荐上一条 /2 下一条