標(biāo)題: 錯(cuò)誤使用派生時(shí)鐘對(duì)邏輯時(shí)序的影響 [打印本頁(yè)]
作者: 51黑專家 時(shí)間: 2016-4-15 03:33
標(biāo)題: 錯(cuò)誤使用派生時(shí)鐘對(duì)邏輯時(shí)序的影響
項(xiàng)目代碼編譯后打印如下信息:
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)
信號(hào)由MCLK到N2DSP這條通道限定了時(shí)針的最高速度只能到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
該代碼段是對(duì)MCLK_EXT做一個(gè)簡(jiǎn)單的防抖處理,相當(dāng)于使用CLK48M衍生的一個(gè)時(shí)鐘CLKDIV[5]。
MCLK在其它模塊中又使用CLK48M系統(tǒng)時(shí)鐘做了一次鎖存,于是相當(dāng)于在兩個(gè)CLK48M時(shí)鐘之間要完成CLKDIV[5]的轉(zhuǎn)換,再用CLKDIV[5]的上升沿去觸發(fā)MCLK的轉(zhuǎn)換,再輸出到目的寄存器。此過(guò)程占用時(shí)間較長(zhǎng),而CLKDIV[5]所耗的時(shí)間顯然是多余的。
修改代碼后如下:
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
兩個(gè)從邏輯功能上看是一樣的,但修改后因?yàn)橹皇褂?font face="Calibri">CLK48M時(shí)鐘,邏輯都是以CLK48M為觸發(fā)時(shí)鐘,省去了一級(jí)觸發(fā)器的延時(shí),于是大大縮短了從源到目的寄存器的延時(shí)。提高了最高時(shí)鐘速率。編譯后打印CLK48M系統(tǒng)時(shí)鐘最高頻率信息如下:
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最高頻率可以達(dá)到77.08M,這個(gè)頻率是由"img_lgc:img|DATABUF[13]"到"img_lgc:img|CAM_D[6]"之間的路徑?jīng)Q定的。后面再繼續(xù)針對(duì)該網(wǎng)絡(luò)做優(yōu)化。
這種使用衍生時(shí)鐘的方法是很多人邏輯設(shè)計(jì)中存在的錯(cuò)誤(因?yàn)閷?duì)時(shí)序影響非常嚴(yán)重,所以這里稱它為一個(gè)錯(cuò)誤也不為過(guò)),因?yàn)楸容^有典型性,所以特意整理了一下,希望引起初級(jí)邏輯工程師的注意。
| 歡迎光臨 (http://www.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |