10

时钟系统

时序分析——公共时钟(内同步,外同步),源同步

时钟系统可以分为公共时钟和源同步时钟,公共同步又可以分为内同步和外同步,内同步典型的即为CPU与SDRAM系统的读写。

clip_image001[10]

建立时间:要求接收端的数据信号必须先于时钟信号到达。
时钟信号的延时:Tdelay = Tco_clka + Tflt_clka4

数据信号的延时:Tdata_delay = Tco_clkb + Tflt_clkb + Tco_data + Tflt_data
公共时钟中第一个时钟用来将数据锁存到驱动端输出端,第二个时钟周期则将数据锁存到接收端内部。意味着第一个数据到达接收端的时间应该早于第二个时钟到达接收端的时间,才能有足够的建立时间裕量。因此:Tclka_delay = Tcycle + Tco_clka + Tflt_clka
Tclka_delay_min – Tdata_delay_max – Tsetup – Tmargin > 0
即:Tcycle +(Tco_clka_min – Tco_clkb_max)+(Tflt_clka_min – Tflt_clkb_max) – Tco_data_max - Tflt_data_max – Tsetup – Tmargin >0

若是考虑时钟的抖动,偏移等情况则需将这部分时间扣除。
保持时间:要求有效数据信号必须在下一个数据信号到达之前锁存到接收端的触发器中,这就要求接收时钟信号clka的延时要小于接收端数据信号的延时。具体的说就是第二个时钟信号必须先于第二个数据信号到达接收端。
因此:Tdata_delay_min – Tdelay_max – Thold – Th_margin > 0

即: (Tco_clkb_min – Tco_clka_max)+(Tflt_clkb_min – Tflt_clka_max)+ Tco_data_min + Tflt_data_min – Thold – Th_margin > 0

若是考虑时钟的抖动,偏移等情况则需将这部分时间扣除。

从2个公式可看出,对于人为可控的调整项只有三个:Tflt_clka,Tflt_clkb,Tflt_data.这样就可以通过调整PCB走线来使这三项满足时序的要求。

2.内同步时钟

clip_image002[10]

指一种时钟或者选通信号和数据信号同时从驱动芯片产生并同步传输到接收端。它不同于公共时钟同步那样采用独立的时钟源

从上图可以轻易的看出内同步时钟的工作原理,时钟信号clk的输出采用缓冲器输出,是因为可以同步CPU高速器件和存储器低速器件间的数据读写;数据信号也是从驱动端发出的,参考的时钟是驱动端的时钟信号,则有一个缓冲的延迟Tco_data在里头。这个参数可在数据手册中查得,有最大,最小值。这样我们就可通过控制PCB走线来轻易使Tflt_data和Tflt_clka来满足时序的要求。Tdelay表示驱动端的采样数据对应的时钟信号发出时间比所采样的数据信号发出时间的延后的时间

建立时间:数据信号需在采样时钟信号之前到达接收端。

Tdelay +(Tflt_clk_min – Tflt_data_max)- Tsetup – Ts_margin > 0

在这里,由于数据信号和时钟信号都是由发送端产生,而数据信号的发送也必须以时钟信号为参考。因此,采样当前数据信号的时钟会落后驱动发送该数据信号的时钟一个周期,

则Tdelay = Tcycle – Tco_data_max

则建立时间为:

Tcycle – Tco_data_max +( Tflt_clk_min – Tflt_data_max)- Tsetup – Ts_margin > 0

保持时间:前一个采样时钟必须比后一个数据信号先到达接收端。

这里,前一个采样时钟即为后一个数据信号的发送参考时钟,因此,他们从走线上开始有效传输的时间之差即为数据信号的缓冲延时时间,即Tco_data,则满足:

Tco_data_min+ (Tflt_data_min – Tflt_clka_max) – Thold – Th_margin > 0

clip_image003[10]

clip_image004[10]

通过时序图可以CPU与SDRAM的内同步系统中得到CPU读SDRAM的过程:

CPU首先发送一个时钟信号到SDRAM,触发SDRAM发送数据到CPU端, CPU发出的第2个时钟信号采样前一个信号触发而发送到CPU端的数据信号,从而完成一个读数据的过程。为了满足时序要求,则要求第1个被触发的数据信号必须在CPU发出第2个时钟信号之前到达CPU端,这是建立时间;第1个数据信号在第2个时间信号触发采样后所保持的时间为数据的保持时间,即第2个数据信号到达CPU端之前的部分时间,这段时间包括第2个时钟信号的飞行时间,第2个数据飞行时间以及第一个数据发出时的保持时间。
则可以得到CPU读SDRAM的时序要求为:

建立时间: Tcycle – Tflt_clk – Tflt-data – Tacc – Tsetup – Ts_margin > 0

保持时间: Tflt_clk + Tflt_data + Toh – Thold – Th_margin > 0

3.源同步:

发送数据的时钟信号也由驱动端发出,而且和驱动端发出的参考时钟信号保持一个固有的相位差。
若定义Tvb为在器件内数据信号先于时间采样点的时间,即驱动端数据在时钟有效前多少时间有效,为驱动端的建立时间;Tva为第二个数据信号落后于第一个采样点的时间,即驱动端数据在时钟有效后保持有效的时间,为发送端保持时间。则有:
Tvb = Tdelay + Tco_clk – Tco_data  Tva = Tcycle – Tdelay– Tco-clk + Tco_data

则有:

源同步写时序:

建立时间:Tvb + (Tflt_data_min–Tflt_clk_max)-Tsetup–Ts_margin> 0

保持时间:Tva +(Tflt_clk_min–Tflt_data_max)–Thold–Th_margin> 0

源同步读时序:

建立时间:Tvb + Tflt_clk_min + Tflt_data_min – Tsetup – Ts_margin > 0

保持时间:Tva – Tflt_clk_max – Tflt_data_max – Thold – Th_margin > 0

内同步不同于源同步时钟系统的地方在于:内同步系统中数据通过寄存器输出,时钟通过缓冲器输出;而源同步系统中数据与时钟信号都是通过寄存器输出,并且保持同等相位差,一般保持时钟正好在数据中间。

 

posted on 2012-06-07 15:40  believe  阅读(583)  评论(0编辑  收藏  举报

导航

/* * Name: SyntaxHighlighter.brushes.Verilog * Author: Yuphone Chang * Email: yuphone@qq.com/ * Create Date: 5.18, 2010 */ SyntaxHighlighter.brushes.Verilog = function() { var datatypes = 'reg integar unsigned ' + 'wire tri wand triand tri0 tri1 supply0 supply1 trireg ' + 'parameter specparam defparam event '; var primitives = 'and nand or nor xor xnor ' + 'buf not ' + 'bufif0 bufif1 notif0 notif1 ' 'pullup pulldown ' + 'pmos rpmos nmos rnmos '; var keywords = 'module endmodule ' + 'input output inout ' + 'begin end ' + 'assign deassign always initial genvar ' + 'forever repeat disable wait ' + 'function endfunction' + 'task ' + 'endtask ' + 'generate endgenerate ' + 'specify endspecify ' + 'posedge negedge ' + 'if else for while ' + 'case casex casez endcase default ' + 'include timescale ' + 'ifdef endif ' + 'celldefine endcelldefine ' + 'attribute ' 'fork join '; var functions = 'display displayb displayo displayh ' + 'write writeb writeo writeh ' + 'strobe strobeb strobeh strobeo ' + 'monitor monitorb monitoro monitorh ' + 'fopen fclose ' + 'readmemb readmemh ' + 'finish stop ' + 'time stime realtime timeformat ' + 'printtimescale ' + 'setup hold setuphold skew recovery period width '; this.regexList = [ // one line comments { regex: SyntaxHighlighter.regexLib.singleLineCComments,css: 'comments' }, // multiline comments { regex: SyntaxHighlighter.regexLib.multiLineCComments, css: 'comments' }, // double quoted strings { regex: SyntaxHighlighter.regexLib.doubleQuotedString, css: 'string' }, // single quoted strings { regex: SyntaxHighlighter.regexLib.singleQuotedString, css: 'string' }, // constants { regex: new RegExp("[0-9]+['][bBoOdDhHeEfFtT][0-9a-fA-FzZxX_]+", 'g'), css: 'constants' }, // datatypes { regex: new RegExp(this.getKeywords(datatypes), 'gm'), css: 'color1 bold' }, // primitives { regex: new RegExp(this.getKeywords(primitives), 'gm'), css: 'color2 bold' }, // keywords { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword bold' }, // functions { regex: new RegExp(this.getKeywords(functions), 'gm'), css: 'functions bold' } ]; }; SyntaxHighlighter.brushes.Verilog.prototype = new SyntaxHighlighter.Highlighter(); SyntaxHighlighter.brushes.Verilog.aliases = ['verilog', 'v'];