时钟是整个电路最重要、最特别的信号,体系内大部分器材的动作都是在时钟的跳变沿上进行, 这就要求时钟信号时延差要十分小, 不然就或许形成时序逻辑状况犯错;因而明晰FPGA规划中决议体系时钟的要素,尽量较小时钟的延时对确保规划的安稳性有十分重要的含义。
1.1 树立时刻与坚持时刻
树立时刻(Tsu:set up time)是指在时钟沿到来之前数据从不安稳到安稳所需的时刻,假如树立的时刻不满意要求那么数据将不能在这个时钟上升沿被安稳的打入触发器;坚持时刻(Th:hold time)是指数据安稳后坚持的时刻,假如坚持时刻不满意要求那么数据相同也不能被安稳的打入触发器。树立与坚持时刻的简略示意图如下图1所示。
图1 坚持时刻与树立时刻的示意图
在FPGA规划的同一个模块中常常是包括组合逻辑与时序逻辑,为了确保在这些逻辑的接口处数据能安稳的被处理,那么对树立时刻与坚持时刻树立明晰的概念十分重要。下面在认识了树立时刻与坚持时刻的概念上考虑如下的问题。
图2 同步规划中的一个底子模型
图2为一致选用一个时钟的同步规划中一个底子的模型。图中Tco是触发器的数据输出的延时;Tdelay是组合逻辑的延时;Tsetup是触发器的树立时刻;Tpd为时钟的延时。假如榜首个触发器D1树立时刻最大为T1max,最小为T1min,组合逻辑的延时最大为T2max,最小为T2min。问第二个触发器D2立时刻T3与坚持时刻T4应该满意什么条件,或许是知道了T3与T4那么能容许的最大时钟周期是多少。这个问题是在规划中有必要考虑的问题,只要弄清了这个问题才干确保所规划的组合逻辑的延时是否满意了要求。
下面通过时序图来剖析:设榜首个触发器的输入为D1,输出为Q1,第二个触发器的输入为D2,输出为Q2;
时钟一致在上升沿进行采样,为了便于剖析咱们评论两种状况即榜首:假定时钟的延时Tpd为零,其实这种状况在FPGA规划中是常常满意的,因为在FPGA规划中一般是选用一致的体系时钟,也便是使用从大局时钟管脚输入的时钟,这样在内部时钟的延时彻底能够忽略不计。这种状况下不用考虑坚持时刻,因为每个数据都是坚持一个时钟节拍一同又有线路的延时,也便是都是依据CLOCK的推迟远小于数据的推迟基础上,所以坚持时刻都能满意要求,重点是要关怀树立时刻,此刻假如D2的树立时刻满意要求那么时序图应该如图3所示。
从图中能够看出假如:
T-Tco-Tdelay>T3
即: Tdelay T-Tco-T3
那么就满意了树立时刻的要求,其间T为时钟的周期,这种状况下第二个触发器就能在第二个时钟的升沿就能安稳的采到D2,时序图如图3所示。
图3 符合要求的时序图
假如组合逻辑的延时过大使得
T-Tco-Tdelay
那么将不满意要求,第二个触发器就在第二个时钟的升沿将采到的是一个不定态,如图4所示。那么电路将不能正常的作业。
图4 组合逻辑的延时过大时序不满意要求
然后能够推出
T-Tco-T2max>=T3
这也便是要求的D2的树立时刻。
从上面的时序图中也能够看出,D2的树立时刻与坚持时刻与D1的树立与坚持时刻是没有联系的,而只和D2前面的组合逻辑和D1的数据传输延时有关,这也是一个很重要的定论。阐明晰延时没有叠加效应。
第二种状况假如时钟存在延时,这种状况下就要考虑坚持时刻了,一同也需求考虑树立时刻。时钟呈现较大的延时多是选用了异步时钟的规划办法,这种办法较难确保数据的同步性,所以实践的规划中很少选用。此刻假如树立时刻与坚持时刻都满意要求那么输出的时序如图5所示。
图5 时钟存在延时但满意时序
从图5中能够简单的看出对树立时刻放宽了Tpd,所以D2的树立时刻需满意要求:
Tpd+T-Tco-T2max>=T3
因为树立时刻与坚持时刻的和是安稳的一个时钟周期,假如时钟有延时,一同数据的延时也较小那么树立时刻必定是增大的,坚持时刻就会随之减小,假如减小到不满意D2的坚持时刻要求时就不能收集到正确的数据,如图6所示。
这时即T-(Tpd-Tco-T2min)
T-(Tpd+T-Tco-T2min)>=T4 即Tco+T2min-Tpd>=T4
从上式也能够看出假如Tpd=0也便是时钟的延时为0那么相同是要求Tco+T2min>T4,可是在实践的使用中因为T2的延时也便是线路的延时远远大于触发器的坚持时刻即T4所以不用要联系坚持时刻。
图6 时钟存在延时且坚持时刻不满意要求
综上所述,假如不考虑时钟的延时那么只需关怀树立时刻,假如考虑时钟的延时那么更需关怀坚持时刻。下面即将剖析在FPGA规划中怎么进步同步体系中的作业时钟。
1.2 怎么进步同步体系中的作业时钟
从上面的剖析能够看出同步体系时对D2树立时刻T3的要求为:
T-Tco-T2max>=T3
所以很简单推出T>=T3+Tco+T2max,其间T3为D2的树立时刻Tset,T2为组合逻辑的延时。在一个规划中T3和Tco都是由器材决议的固定值,可控的也只要T2也就时输入端组合逻辑的延时,所以通过尽量来减小T2就能够进步体系的作业时钟。为了到达减小T2在规划中能够用下面不同的几种办法归纳来完结。
1.2.1 通过改变走线的办法来减小延时
以altera的器材为例,咱们在quartus里边的timing closure floorplan能够看到有 许多条条块块,咱们能够将条条块块按行和按列分,每一个条块代表1个LAB,每个LAB里 有8个或许是10个LE。它们的走线时延的联系如下:同一个LAB中(最快) 同列或许同行 不同行且不同列。 咱们通过给归纳器加恰当的束缚(束缚要适量,一般以加5%裕量较为适宜,比方电路 作业在100Mhz,则加束缚加到105Mhz就能够了,过大的束缚作用反而欠好,且极大添加归纳时刻)能够将相关的逻辑在布线时尽量布的挨近一点,然后削减走线的时延。
1.2.2 通过拆分组合逻辑的办法来减小延时
因为一般同步电路都不止一级锁存(如图8),而要使电路安稳作业,时钟周期有必要满意最大延时要求,缩短最长延时途径,才可进步电路的作业频率。如图7所示:咱们能够将较大的组合逻辑分解为较小的几块,中心刺进触发器,这样能够进步电路的作业频率。这也是所谓“流水线”(pipelining)技能的底子原理。
关于图8的上半部分,它时钟频率受制于第二个较大的组合逻辑的延时,通过恰当的办法平均分配组合逻辑,能够避免在两个触发器之间呈现过大的延时,消除速度瓶颈。
图7 切开组合逻辑
图8 搬运组合逻辑
那么在规划中怎么拆分组合逻辑呢,更好的办法要在实践中不断的堆集,可是一些杰出的规划思维和办法也需求把握。咱们知道,现在大部分FPGA都依据4输入LUT的,假如一个输出对应的判别条件大于四输入的话就要由多个LUT级联才干完结,这样就引进一级组合逻辑时延,咱们要削减组合逻辑,无非便是要输入条件尽或许的少,这样就能够级联的LUT更少,然后削减了组合逻辑引起的时延。
咱们平常传闻的流水便是一种通过切开大的组合逻辑(在其间刺进一级或多级D触发器,然后使寄存器与寄存器之间的组合逻辑削减)来进步作业频率的办法。比方一个32 位的计数器,该计数器的进位链很长,必定会下降作业频率,咱们能够将其切开成4位和 8位的计数,每逢4位的计数器计到15后触发一次8位的计数器,这样就完结了计数器的切开,也进步了作业频率。
在状况机中,一般也要将大的计数器移到状况机外,因为计数器这东西一般是常常 是大于4输入的,假如再和其它条件一同做为状况的跳变判据的话,必定会添加LUT的级 联,然后增大组合逻辑。以一个6输入的计数器为例,咱们原期望当计数器计到111100后 状况跳变,现在咱们将计数器放到状况机外,当计数器计到111011后产生个enable信号 去触发状况跳变,这样就将组合逻辑削减了。状况机一般包括三个模块,一个输出模块,一个决议下个状况是什么的模块和一个保存当时状况的模块。组成三个模块所选用的逻辑也各不相同。输出模块一般既包括组合逻辑又包括时序逻辑;决议下一个状况是什么的模块一般又组合逻辑构成;保存现在状况的一般由时序逻辑构成。三个模块的联系如下图9所示。
图9 状况机的组成
一切一般写状况机时也依照这三个模块将状况机分红三部分来写,如下面便是一种杰出的状况机规划办法:
/*—————————————————–
This is FSM demo program
Design Name : arbiter
File Name : arbiter2.v
—————————————————–*/
module arbiter2 (
clock , // clock
reset , // Active high, syn reset
req_0 , // Request 0
req_1 , // Request 1
gnt_0 ,
gnt_1);
//————-Input Ports—————————–
input clock ;
input reset ;
input req_0 ;
input req_1 ;
//————-Output Ports—————————-
output gnt_0 ;
output gnt_1 ;
//————-Input ports Data Type——————-
wire clock ;
wire reset ;
wire req_0 ;
wire req_1 ;
//————-Output Ports Data Type——————
reg gnt_0 ;
reg gnt_1 ;
//————-Internal Constants————————–
parameter SIZE = 3 ;
parameter IDLE = 3‘b001 ,
GNT0 = 3’b010 ,
GNT1 = 3‘b100 ;
//————-Internal Variables—————————
reg [SIZE-1:0] state ;// Seq part of the FSM
wire [SIZE-1:0] next_state ;// combo part of FSM
//———-Code startes Here————————
assign next_state = fsm_function(req_0, req_1);
function [SIZE-1:0] fsm_function;
input req_0;
input req_1;
case(state)
IDLE : if (req_0 == 1’b1)
fsm_function = GNT0;
else if (req_1 == 1‘b1)
fsm_function= GNT1;
else
fsm_function = IDLE;
GNT0 : if (req_0 == 1’b1)
fsm_function = GNT0;
else
fsm_function = IDLE;
GNT1 : if (req_1 == 1‘b1)
fsm_function = GNT1;
else
fsm_function =IDLE;
default : fsm_function = IDLE;
endcase
endfunction
always@(posedge clock)
begin
if (reset == 1’b1)
state =IDLE;
else
state =next_state;
end
//———-Output Logic—————————–
always @ (posedge clock)
begin
if (reset == 1‘b1) begin
gnt_0 = #1 1’b0;
gnt_1 = #1 1‘b0;
end
else begin
case(state)
IDLE : begin
gnt_0 = #1 1’b0;
gnt_1 = #1 1‘b0;
end
GNT0 : begin
gnt_0 = #1 1’b1;
gnt_1 = #1 1‘b0;
end
GNT1 : begin
gnt_0 = #1 1’b0;
gnt_1 = #1 1‘b1;
end
default : begin
gnt_0 = #1 1’b0;
gnt_1 = #1 1‘b0;
end
endcase
end
end // End Of Block OUTPUT_
endmodule
状况机一般要写成3段式,然后避免呈现过大的组合逻辑。
上面说的都是能够通过流水的办法切开组合逻辑的状况,可是有些状况下咱们是很 难去切开组合逻辑的,在这些状况下咱们又该怎么做呢?
状况机便是这么一个比如,咱们不能通过往状况译码组合逻辑中加入流水。假如我 们的规划中有一个几十个状况的状况机,它的状况译码逻辑将十分之巨大,毫无疑问, 这极有或许是规划中的要害途径。那咱们该怎么做呢?仍是老思路,削减组合逻辑。我 们能够对状况的输出进行剖析,对它们进行从头分类,并依据这个从头界说成一组组小 状况机,通过对输入进行挑选(case句子)并去触发相应的小状况机,然后完结了将大的 状况机切开成小的状况机。在ATA6的规范中(硬盘的规范),输入的指令大概有20十种 ,每一个指令又对应许多种状况,假如用一个大的状况机(状况套状况)去做那是不行幻想的,咱们能够通过case句子去对指令进行译码,并触发相应的状况机,这样做下来 这一个模块的频率就能够跑得比较高了。
总结:进步作业频率的实质便是要削减寄存器到寄存器的时延,最有用的办法便是 避免呈现大的组合逻辑,也便是要尽量去满意四输入的条件,削减LUT级联的数量。咱们 能够通过加束缚、流水、切开状况的办法进步作业频率。
在FPGA中进行时钟规划时也要留意一下几点:
一个模块尽量只用一个时钟,这儿的一个模块是指一个module或许是一个entity。在多时钟域的规划中涉及到跨时钟域的规划中最好有专门一个模块做时钟域的隔 离。这样做能够让归纳器归纳出更优的成果。
除非是低功耗规划,不然不要用门控时钟–这会添加规划的不安稳性,在要用到门控时钟的当地,也要将门控信号用时钟的下降沿 打一拍再输出与时钟相与。
制止用计数器分频后的信号做其它模块的时钟,而要用改成时钟使能的办法,不然这种时钟满天飞的办法对规划的可靠性极为晦气,也大大添加了静态时序剖析的复杂性。
1.4 不一同钟域之间的同步
当一个规划中的两个模块别离用的是两个作业时钟,那么在它们的接口处就作业在异步形式,这时为了确保数据能正确的处理那么就要对两个模块进行同步。
这儿的不同的时钟域一般是以下的两种状况:
1、 两个时钟的频率不同;
2、 尽管两个时钟的频率相同,可是它们是两个独立的时钟,其相位没有任何联系。
别离如下两个图所示:
图10 两个时钟的频率彻底不同
图11两个时钟的频率相同,但相位不相关
两个时钟域之间传输的数据依据不同的位宽一般选用不同的同步的办法。
1、单bit之间的同步且发送的每个pulse至少有1个周期宽度的状况
这类同步主要是用于一些操控信号自己的同步。一般的选用办法便是输出数据在接纳的模块中使用两个触发器选用体系时钟打两拍,如下图12所示。关于这种同步需求阐明以下几点。
图12 一位同步器规划
(1)图12中的同步电路其实叫“一位同步器”,它只能用来对一位异步信号进行同步,并且这个信号的宽度有必要大于本级时钟的脉冲宽度,不然有或许底子采不到这个异步信号。
(2)为什么图一中的同步电路只能用来对一位异步信号进行同步呢? (a)当有两个或更多的异步信号(操控或地址)一同进入本时域来操控本时域的电路时,假如这些信号别离都用图12中的同步电路来同步就会呈现问题,因为连线推迟或其他推迟使两个或更多的异步信号(操控或地址)之间产生了skew,那么这个skew通过图12的同步器同步进入本时域后,会产生很大的skew或产生竞赛,导致本时域电路犯错。
呈现的问题如下图13所示:
图13 同步多个操控信号时犯错
(b)假如是异步数据总线要进入本时域,相同不能用图12的电路,因为数据的改变是很随机的,其0的宽度或1的宽度和本时域时钟脉冲无关,所以图12的电路或许会采不到正确数据。
(3)留意,第二个触发器并不是避免“亚稳态的产生”,确切的说,该电路能够避免亚稳态的传达。也便是说,一旦榜首个触发器产生了亚稳态(或许性存在),因为有了第二个
触发器,亚稳态不会传达到第二个触发器今后的电路中去。
(4)榜首级触发器产生了亚稳态,需求一个恢复时刻来安稳下来,或许叫退出亚稳态。当恢复时刻加上第二级触发器的树立时刻(更准确的,还要减去clock skew)小于等于时钟周期的时分(这个条件仍是很简单满意的,一般要求两级触发器尽量挨近,中心没有任何组合逻辑,时钟的skew较小),第二级触发器就能够安稳的采样,得到安稳的确认的数据了,避免了亚稳态的传达。
(5)FF2是采样了FF1的输出,当然是FF1输出什么,FF2就输出什么。只是推迟了1个周期。留意,亚稳态之所以叫做亚稳态,是指一旦FF1进入,其输出电平不定,或许正确也或许过错。所以有必要阐明的是,尽管这种办法能够避免亚稳态的传达,可是并不能确保两级触发器之后的数据是正确的,因而,这种电路都有必定数量的过错电平数据,所以,仅适用于少数关于过错不灵敏的当地。关于灵敏的电路,能够选用双口RAM或FIFO。
2 输入pulse有或许小于一个时钟周期宽度状况下的同步电路
对2的状况一般选用如下图14的反应电路。该电路的剖析如下:假定输入的数据是高电平,那么因为榜首个触发器FF1是高电平清零,一切输出也是高电平,选用正确。假如输入是第电平那么被FF1被强制清零,这个时分输出位零。这样就确保了输出的正确性。
图14输入pulse有或许小于一个时钟周期宽度状况下的同步电路