一、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 设置即可。一般按照编译器默认的分配方式即可。
四、上电初始值
以 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 没有任何问题。
pengchengcheng082_593158939 2014-9-14 20:46
用户1697878 2014-9-14 16:54
用户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