|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
關于同步設計的一些疑惑,請幫忙! |
| 作者:melodec 欄目:EDA技術(shù) |
同步設計是不是就是引入一個外部時鐘,然后在設計中所有的PROCESS都以這個外部時鐘為敏感量。 例如下面的這段程序,功能是clk_in經(jīng)過8分頻得到clk_out輸出,其中clk_syn是外部時鐘。 divider :PROCESS begin wait until rising_edge(clk_syn); if reset='0' then count<="000"; elsif rising_edge(clk_in) then count<=count+1; end if; end PROCESS; clk_out<=count(2); 偶就很疑惑,怎么保證clk_syn的上升沿能夠采到rising_edge(clk_in)呢? 是不是clk_syn時鐘的頻率必須保證高頻? |
| 2樓: | >>參與討論 |
| 作者: xuanzhu 于 2005/6/22 10:00:00 發(fā)布:
同步設計意味著系統(tǒng)中只有一個主時鐘 而其他時鐘都是該主時鐘產(chǎn)生的 你這個模塊里,clk_syn的上升沿是肯定采不到rising_edge(clk_in)了,怎么能用主時鐘沿去采子時鐘沿呢,采信號電平還差不多,另外就是敏感信號的問題。 順便問一句:你的clk_in和clk_syn到底什么關系啊,感覺有點莫名其妙的 |
|
| 3樓: | >>參與討論 |
| 作者: melodec 于 2005/6/22 12:32:00 發(fā)布:
clk_in和clk_syn之間是沒有關系的,都是外部時鐘,不同源 clk_syn是40M的時鐘 clk_in是8.192M的時鐘 上面的代碼實現(xiàn)的8分頻仿真出來是有錯誤的。 可是我的系統(tǒng)里面不止一個外部時鐘啊,怎么才能做出同步設計? 我的整個系統(tǒng)里面reset是全局復位信號,如果我用異步復位,跑出來頻率就不符合要求,改用同步復位,可是因為系統(tǒng)中有多個時鐘,例如 PROCESS begin wait until rising_edge(clk_in); if reset='0' then count<="000"; else count<=count+1; end if; end PROCESS; clk_out<=count(2); PROCESS begin wait until rising_edge(clk_syn) if reset='0' then gcount<="00"; else gcount<=gcount+1; end if; end PROCESS; 這樣實現(xiàn)的同步復位因為時鐘是不同的,所以系統(tǒng)還是跑不到需要的頻率。 我還試過先用clk_syn將clk_in通過dff打一下,可是這么出來的8分頻就不準了。 請問該怎么解決? 如果用采信號電平的方法,該怎么實現(xiàn)分頻?請大俠教教我,謝謝! |
|
| 4樓: | >>參與討論 |
| 作者: xuanzhu 于 2005/6/22 17:05:00 發(fā)布:
俺也是菜鳥,大家一起討論 這里兩個時鐘相差不多,如果用clk_syn通過dff來同步clk_in,得到的新clk_in肯定是不準的,除非兩個時鐘相差10幾倍或者幾十倍。 這里我有兩個問題 1:為什么采用異步復位會使跑出來的頻率不符合要求,具體是什么要求 2:同步復位為什么會導致系統(tǒng)跑不到所需要的頻率。 我覺得分頻信號與復位是為同步或異步?jīng)]有關系,而且clk_syn對clk_in的分頻也不會有任何影響。 上面的回帖關于同步設計可能說得有點問題,應該是只有一個主時鐘,其他時鐘都同步到該主時鐘。另外我說的采信號電平的意思是某個時鐘沿只能采到另一個信號的電平,不是說采信號電平是這個問題的解決方式。 PS: 如果方便的話,站內(nèi)聯(lián)系 |
|
| 5樓: | >>參與討論 |
| 作者: melodec 于 2005/6/22 17:18:00 發(fā)布:
謝謝你的幫忙! 我覺得我好像找到原因了,因為設計里面還有這么一段,系統(tǒng)跑不快就因為它。 這是當采用異步復位時候的代碼 gbuffer1_rw: PROCESS(reset, rx_cpld_cs, gbuffer_en(1)) begin if reset='0' then gbuffer1(31 downto 0)<="00000000000000000000000000000000"; elsif rx_cpld_cs='0' and gbuffer_en(1)='0' then if gbuffer_en(0) = '0' then gbuffer1(31 downto 16)<= r_d(15 downto 0); elsif gbuffer_en(0) = '1' then gbuffer1(15 downto 0)<= r_d(15 downto 0); end if; end if; end PROCESS; 這樣系統(tǒng)只能跑到40多M 后來我還是采用異步復位,改成了 PROCESS(reset,pin109) begin if reset='0' then gbuffer1(31 downto 0)<="00000000000000000000000000000000"; elsif rising_edge(pin109) then if rx_cpld_cs='0' and gbuffer_en(1)='0' then if gbuffer_en(0) = '0' then gbuffer1(31 downto 16)<= r_d(15 downto 0); elsif gbuffer_en(0) = '1' then gbuffer1(15 downto 0)<= r_d(15 downto 0); end if; end if; end if; end PROCESS; 系統(tǒng)就能跑到60多M了。 |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 www.udpf.com.cn 浙ICP證030469號 |