異步時鍾同步的問題(轉)


            很久不寫東西了,因為這個空間里似乎都是做軟件的,而我把ASIC/FPGA認為是硬件電路。所以寫的雖然也是代碼,但是想的確實硬件電路。這讓我在這個軟件人員居多的空間里顯得格格不入。

             寫這個題目,其實是我有些忍不住了。這十幾年來,我面試過很多新人,也帶過很多新人,他們之中很多人的成就都已經超越了我。但是當我們偶爾回顧這個小小的跨越時鍾域的問題時,仍然有很多的困惑和不理解。

             我喜歡用這個題目作為我的面試題目,因為它不是一個簡單的題目,而是涉及到ASIC設計本質的題目,如果細細研究起來,還非常復雜。寫這個東西,希望所有在做ASIC的人,能從一個更高的角度去審視它,並且能因此更深刻的體會做ASIC的嚴謹。

             言歸正傳:

             題目:單根信號線,跨越時鍾域,該怎么處理?

 

           1。 首先給一個最簡單的答案: 用寄存器打兩拍

這里其實有一個很本質的問題需要討論,就是為什么要所存兩拍? 把這個問題插進來說說吧。所有做ASIC的人,都要面對兩個基本的概念:setup time 和 hold time。如果寄存器不滿足這兩個時間,將會出現亞穩態。很多新人以為亞穩態僅僅是邏輯上的障礙,其實亞穩態是實實在在的電路上的問題。 

                 模擬電路中,三極管主要工作在其放大區間,而在數字電路卻是要工作在截至態。亞穩態非常類似模擬電路中的放大態,這個狀態將使得器件的輸出電流被放大,如果這個狀態被傳遞,那么將導致更多的電路處在放大電路的工作狀態中,這將引起巨大的電流和功耗,甚至燒毀芯片,所以,跨時鍾域是一定會出現亞穩態的,但是我們必須要把亞穩態控制在一個很小的范圍內。這就是為什么要在其后面再用一個寄存器的原因。它的功能就是把亞穩態僅僅限制在那一個寄存器的小區域。

                 好了,繼續說邏輯上的事情。這個兩拍的電路很顯然,只適合信號從低頻時鍾跨越到高頻時鍾,那么當高頻時鍾要跨越到低頻時鍾該怎么辦呢?

 

          2.  高頻信號要進入低頻時鍾域,最原始的想法就是  展寬。如果我們知道這兩個時鍾之間的頻率差別,那么用一個計數器去將高頻信號做適當的展寬,使其寬度大於低頻時鍾的一個周期,然后就可以繼續用上述的方法跨域時鍾域了。

                這種方法的本質,是降低時鍾頻率,是把高頻時鍾產生的信號先做了頻率的降低,降低到比原來的低頻時鍾還要低,因此當然就可以用第一種方法了。

                那么,如果我們不能在設計的最初就知道彼此的頻率差異,該怎么辦呢? 通常這個問題,都會讓面試者陷入絕境。

 

        3.  仍然是高頻時鍾域的信號要進入低頻時鍾域,但是我們不能確切的知道兩個時鍾頻率到底差異多少,這時,我們的基本思路還是展寬,只是這個展寬要做成一個能自動適配的功能,當然,這就需要做反饋。我是學自控的,反饋,我很熟悉。

              

 

這里面其實是3組寄存器,reg-1和reg-2是clk-a的時鍾域,其中reg-2的功能就是要把高頻時鍾clk-a產生的信號根據clk-b的頻率來做展寬。

                reg-3和reg-4是兩個寄存器,用來把clk-a的信號跨時鍾域到clk-b中。

                reg-5和reg-6其實也是兩個寄存器,用來把clk-b時鍾域的信號跨越到clk-a,這個信號將作為一個反饋信號,來實現展寬的邏輯,實現這個邏輯的,主要是那一個與門和一個或門。

               具體的邏輯就不說了,只說說思想:這是一個邏輯反饋電路,和模擬電路中的電壓跟隨電路的思考方式不太一致。它的思考邏輯是,如果輸出還沒有得到邏輯1,那么輸入的邏輯1就要保持。但是我們很容易就看出來了,這個電路僅僅可以把一個 高電平脈沖 展寬。那么如何將一個低電平展寬呢?其實簡單的調整一下那個與門和或門的電路就可以了:

 

                 但是這仍然不是一個完全意義上的跨越時鍾域的邏輯。那么能不能做一個完整功能的電路呢?這就要考慮如何把上述這兩種展寬邏輯融合到一起。

 

              4. 融合這兩個電路,就必須先從原理上說清楚一件事情:低頻時鍾是無法完全去采樣高頻信號的,這里面一定會丟失信息。這是無法避免的。

 

如果reg-2的輸出是1,那么我認為目前正在把邏輯1展寬,如果當前reg-2的輸出是0,那么我認為正在把邏輯0展寬。至於短時間內頻繁的出現邏輯1和邏輯0,那么很可能會丟失某些狀態,這也是我們上面說到的,不可避免的問題。

                           

                           說到這里,是不是所有的事情都說完了呢?還沒有,至少我們的思考還不應該結束。

 

                      5.如果一個信號需要跨越時鍾域,但是我們不知道哪個時鍾快,哪個時鍾慢,該怎么辦呢?

                                 呵呵,太忙了,該開會了,誰有好辦法,不妨試試看吧。

                                我等着所有的奇思妙想。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM