標題: 錯誤使用派生時鐘對邏輯時序的影響 [打印本頁]

作者: 51黑專家    時間: 2016-4-15 03:33
標題: 錯誤使用派生時鐘對邏輯時序的影響

項目代碼編譯后打印如下信息:

Info: Clock "CLK48M" has Internalfmax of 67.47 MHz between source register "GLUE_LGC:glue|MCLK" anddestination register "img_lgc:img|N2DSP" (period= 14.822 ns)

信號由MCLKN2DSP這條通道限定了時針的最高速度只能到67.47MHz

查看相關(guān)代碼中存在如下代碼段:

always @( posedge CLK48M )

         begin

                   CLKDIV<= CLKDIV + 1;                            //clock divider

         end

always @(posedge CLKDIV[5])        

         begin

                   MCLKB3<= MCLK_EXT;

                   MCLKB2<= MCLKB3;

                   MCLKB<= MCLKB2;

                   MCLK<= MCLKB | MCLKB2 | MCLKB3;

         End

該代碼段是對MCLK_EXT做一個簡單的防抖處理,相當于使用CLK48M衍生的一個時鐘CLKDIV[5]。

MCLK在其它模塊中又使用CLK48M系統(tǒng)時鐘做了一次鎖存,于是相當于在兩個CLK48M時鐘之間要完成CLKDIV[5]的轉(zhuǎn)換,再用CLKDIV[5]的上升沿去觸發(fā)MCLK的轉(zhuǎn)換,再輸出到目的寄存器。此過程占用時間較長,而CLKDIV[5]所耗的時間顯然是多余的。

修改代碼后如下:

always @( posedge CLK48M )

         begin

                   CLKDIV<= CLKDIV + 1;                            //clock divider

                   if(CLKDIV == 6'b100000)

                            begin

                                     MCLKB3<= MCLK_EXT;

                                     MCLKB2<= MCLKB3;

                                     MCLKB<= MCLKB2;

                                     MCLK<= MCLKB | MCLKB2 | MCLKB3;

                            end

         end

兩個從邏輯功能上看是一樣的,但修改后因為只使用CLK48M時鐘,邏輯都是以CLK48M為觸發(fā)時鐘,省去了一級觸發(fā)器的延時,于是大大縮短了從源到目的寄存器的延時。提高了最高時鐘速率。編譯后打印CLK48M系統(tǒng)時鐘最高頻率信息如下:

Info: Clock "CLK48M" has Internalfmax of 77.08 MHz between source register "img_lgc:img|DATABUF[13]"and destination register "img_lgc:img|CAM_D[6]" (period= 12.974 ns)

可以看到CLK48M最高頻率可以達到77.08M,這個頻率是由"img_lgc:img|DATABUF[13]""img_lgc:img|CAM_D[6]"之間的路徑?jīng)Q定的。后面再繼續(xù)針對該網(wǎng)絡(luò)做優(yōu)化。

這種使用衍生時鐘的方法是很多人邏輯設(shè)計中存在的錯誤(因為對時序影響非常嚴重,所以這里稱它為一個錯誤也不為過),因為比較有典型性,所以特意整理了一下,希望引起初級邏輯工程師的注意。








歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1