1. 程式人生 > >verilog非同步復位,同步釋放

verilog非同步復位,同步釋放

<div id="article_content" class="article_content clearfix csdn-tracking-statistics" data-pid="blog" data-mod="popu_307" data-dsm="post">
                                            <div class="markdown_views prism-atom-one-dark">
                            <!-- flowchart 箭頭圖示 勿刪 -->
                            <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path></svg>
                            &gt; <div id="article_content" class="article_content csdn-tracking-statistics">

<div>
<p><strong>【Verilog】 同步復位和非同步復位比較&nbsp;</strong></p>
</div>

<table>
<tbody>
<tr>
<td>
<p>&nbsp;</p>
</td>
<td>
<p>同步復位&nbsp;sync</p>
</td>
<td>
<p>非同步復位&nbsp;async</p>
</td>
</tr>
<tr>
<td>
<p>特點</p>
</td>
<td>
<p>復位訊號只有在時鐘上升沿到來時才能有效。</p>
</td>
<td>
<p>無論時鐘沿是否到來,只要復位訊號有效,就進行復位。</p>
</td>
</tr>
<tr>
<td>
<p>Verilog描述</p>
</td>
<td>
<p>

[email protected](posedge CLK)</p>
</td>
<td>
<p>[email protected](posedge CLK , negedge Rst_n)</p>
</td>
</tr>
<tr>
<td>
<p>優點</p>
</td>
<td>
<p>1)&nbsp;&nbsp;利於模擬器模擬。</p>
<p>2)&nbsp;&nbsp;因為只有在時鐘有效電平到來時才有效,所以可以濾除高於時鐘頻率的毛刺。</p>
<p>3)&nbsp;&nbsp;可以使所設計的系統成為100%的同步時序電路,有利於時序分析。</p>
</td>
<td>
<p>1)&nbsp;&nbsp;設計相對簡單。</p>
<p>2)&nbsp;&nbsp;因為大多數目標器件庫的dff都有非同步復位埠,因此採用非同步復位可以節省資源。</p>
<p>3)&nbsp;&nbsp;非同步復位訊號識別方便,而且可以很方便的使用FPGA的全域性復位埠GSR。</p>
</td>
</tr>
<tr>
<td>
<p>缺點</p>
</td>
<td>
<p>1)&nbsp;&nbsp;復位訊號的有效時長必須大於時鐘週期,才能真正被系統識別並完成復位任務。同時還要考慮,諸如:clk skew,組合邏輯路徑延時,復位延時等因素。</p>
<p>&nbsp;</p>
<p>2)&nbsp;&nbsp;由於大多數的邏輯器件的目標庫內的DFF都只有非同步復位埠,所以,倘若採用同步復位的話,綜合器就會在暫存器的資料輸入埠插入組合邏輯,這樣就會耗費較多的邏輯資源。&nbsp;</p>
</td>
<td>
<p>1)&nbsp;&nbsp;復位訊號容易受到毛刺的影響。</p>
<p>&nbsp;</p>
<p>2)&nbsp;&nbsp;在復位訊號釋放(release)的時候容易出現問題。具體就是說:若復位釋放剛好在時鐘有效沿附近時,很容易使暫存器輸出出現亞穩態,從而導致亞穩態。</p>
</td>
</tr>
<tr>
<td>
<p>總結</p>
</td>
<td width="465" colspan="2">
<p>&nbsp;</p>
<p>推薦使用非同步復位,同步釋放的方式,而且復位訊號低電平有效。</p>
</td>
</tr>
</tbody>
</table>

<p>相關討論:</p>

<p>1、同步電路和非同步電路的區別是什麼?&nbsp;<br>
非同步電路主要是組合邏輯電路,用於產生地址譯碼器、FIFO或RAM的讀寫控制訊號脈衝,但它同時也用在時序電路中,此時它沒有統一的時鐘,狀態變化的時刻是不穩定的,通常輸入訊號只在電路處於穩定狀態時才發生變化。也就是說一個時刻允許一個輸入發生變化,以避免輸入訊號之間造成的競爭冒險。電路的穩定需要有可靠的建立時間和保持時間,待下面介紹。<br>
&nbsp; &nbsp;&nbsp; &nbsp;同步電路是由時序電路(暫存器和各種觸發器)和組合邏輯電路構成的電路,其所有操作都是在嚴格的時鐘控制下完成的。這些時序電路共享同一個時鐘CLK,而所有的狀態變化都是在時鐘的上升沿(或下降沿)完成的。比如D觸發器,當上升延到來時,暫存器把D端的電平傳到Q輸出端。<br>
在同步電路設計中一般採用D觸發器,非同步電路設計中一般採用Latch。</p>

<p>2、什麼是同步邏輯和非同步邏輯?&nbsp;<br>
同步邏輯是時鐘之間有固定的因果關係。非同步邏輯是各時鐘之間沒有固定的因果關係。<br>
電路設計可分類為同步電路和非同步電路設計。同步電路利用時鐘脈衝使其子系統同步運作,而非同步電路不使用時鐘脈衝做同步,其子系統是使用特殊的“開始”和“完成”訊號使之同步。由於非同步電路具有下列優點–無時鐘歪斜問題、低電源消耗、平均效能而非最差效能、模組性、可組合和可複用性–因此近年來對非同步電路研究增加快速,論文發表數以倍增,而Intel Pentium 4處理器設計,也開始採用非同步電路設計。<br>
非同步電路主要是組合邏輯電路,用於產生地址譯碼器、FIFO或RAM的讀寫控制訊號脈衝,其邏輯輸出與任何時鐘訊號都沒有關係,譯碼輸出產生的毛刺通常是可以監控的。同步電路是由時序電路(暫存器和各種觸發器)和組合邏輯電路構成的電路,其所有操作都是在嚴格的時鐘控制下完成的。這些時序電路共享同一個時鐘CLK,而所有的狀態變化都是在時鐘的上升沿(或下降沿)完成的。</p>

<p>&nbsp;</p>

<p>3、什麼是”線與”邏輯,要實現它,在硬體特性上有什麼具體要求?&nbsp;<br>
線與邏輯是兩個輸出訊號相連可以實現與的功能。在硬體上,要用oc門來實現(漏極或者集電極開路),由於不用oc門可能使灌電流過大,而燒壞邏輯閘,同時在輸出埠應加一個上拉電阻。(線或則是下拉電阻)</p>

<p>4、什麼是Setup&nbsp;和Holdup時間?&nbsp;</p>

<p>5、setup和holdup時間,區別.&nbsp;</p>

<p>6、解釋setup time和hold time的定義和在時鐘訊號延遲時的變化。</p>

<p>&nbsp;</p>

<p>7、解釋setup和hold timeviolation,畫圖說明,並說明解決辦法。<br>
時間(Setup Time)和保持時間(Hold time)。建立時間是指在時鐘邊沿前,資料訊號需要保持不變的時間。保持時間是指時鐘跳變邊沿後資料訊號需要保持不變的時間。如果不滿足建立和保持時間的話,那麼DFF將不能正確地取樣到資料,將會出現metastability的情況。如果資料訊號在時鐘沿觸發前後持續的時間均超過建立和保持時間,那麼超過量就分別被稱為建立時間裕量和保持時間裕量。</p>

<p><br>
8、說說對數字邏輯中的競爭和冒險的理解,並舉例說明競爭和冒險怎樣消除。</p>

<p>9、什麼是競爭與冒險現象?怎樣判斷?如何消除?&nbsp;<br>
在組合邏輯中,由於門的輸入訊號通路中經過了不同的延時,導致到達該門的時間不一致叫競爭。產生毛刺叫冒險。如果布林式中有相反的訊號則可能產生競爭和冒險現象。解決方法:一是添加布爾式的(冗餘)消去項,但是不能避免功能冒險,二是在晶片外部加電容。三是增加選通電路</p>

<p>&nbsp;</p>

<p>在組合邏輯中,由於多少輸入訊號變化先後不同、訊號傳輸的路徑不同,或是各種器件延遲時間不同(這種現象稱為競爭)都有可能造成輸出波形產生不應有的尖脈衝(俗稱毛刺),這種現象成為冒險。</p>

<p>10、你知道那些常用邏輯電平?TTL與COMS電平可以直接互連嗎?</p>

<p>&nbsp;</p>

<p>常用邏輯電平:TTL、CMOS、LVTTL、LVCMOS、ECL(Emitter Coupled Logic)、PECL(Pseudo/PositiveEmitter Coupled Logic)、LVDS(Low Voltage Differential Signaling)、GTL(GunningTransceiver Logic)、BTL(Backplane Transceiver Logic)、ETL(enhancedtransceiver logic)、GTLP(Gunning
 Transceiver Logic Plus);RS232、RS422、RS485(12V,5V,3.3V);TTL和CMOS不可以直接互連,由於TTL是在0.3-3.6V之間,而CMOS則是有在12V的有在5V的。CMOS輸出接到TTL是可以直接互連。TTL接到CMOS需要在輸出埠加一上拉電阻接到5V或者12V。<br>
cmos的高低電平分別為:Vih&gt;=0.7VDD,Vil&lt;=0.3VDD;Voh&gt;=0.9VDD,Vol&lt;=0.1VDD.<br>
ttl的為:Vih&gt;=2.0v,Vil&lt;=0.8v;Voh&gt;=2.4v,Vol&lt;=0.4v.<br>
用cmos可直接驅動ttl;加上拉電阻後,ttl可驅動cmos.<br>
1、當TTL電路驅動COMS電路時,如果TTL電路輸出的高電平低於COMS電路的最低高電平(一般為3.5V),這時就需要在TTL的輸出端接上拉電阻,以提高輸出高電平的值。<br>
2、OC閘電路必須加上拉電阻,以提高輸出的搞電平值。<br>
3、為加大輸出引腳的驅動能力,有的微控制器管腳上也常使用上拉電阻。<br>
4、在COMS晶片上,為了防止靜電造成損壞,不用的管腳不能懸空,一般接上拉電阻產生降低輸入阻抗,提供洩荷通路。<br>
5、晶片的管腳加上拉電阻來提高輸出電平,從而提高晶片輸入訊號的噪聲容限增強抗干擾能力。<br>
6、提高匯流排的抗電磁干擾能力。管腳懸空就比較容易接受外界的電磁干擾。<br>
7、長線傳輸中電阻不匹配容易引起反射波干擾,加上下拉電阻是電阻匹配,有效的抑制反射波干擾。<br>
上拉電阻阻值的選擇原則包括:<br>
1、從節約功耗及晶片的灌電流能力考慮應當足夠大;電阻大,電流小。<br>
2、從確保足夠的驅動電流考慮應當足夠小;電阻小,電流大。<br>
3、對於高速電路,過大的上拉電阻可能邊沿變平緩。綜合考慮<br>
以上三點,通常在1k到10k之間選取。對下拉電阻也有類似道理<br>
//OC閘電路必須加上拉電阻,以提高輸出的搞電平值。<br>
OC閘電路要輸出“1”時才需要加上拉電阻不加根本就沒有高電平<br>
在有時我們用OC門作驅動(例如控制一個LED)灌電流工作時就可以不加上拉電阻<br>
OC門可以實現“線與”運算<br>
OC門就是&nbsp;&nbsp;集電極開路輸出<br>
總之加上拉電阻能夠提高驅動能力。<br>
11、如何解決亞穩態。?<br>
亞穩態是指觸發器無法在某個規定時間段內達到一個可確認的狀態。當一個觸發器進入亞穩態時,既無法預測該單元的輸出電平,也無法預測何時輸出才能穩定在某個正確的電平上。在這個穩定期間,觸發器輸出一些中間級電平,或者可能處於振盪狀態,並且這種無用的輸出電平可以沿訊號通道上的各個觸發器級聯式傳播下去。<br>
解決方法:<br>
1降低系統時鐘頻率<br>
2用反應更快的FF<br>
3引入同步機制,防止亞穩態傳播<br>
4改善時鐘質量,用邊沿變化快速的時鐘訊號<br>
關鍵是器件使用比較好的工藝和時鐘週期的裕量要大。亞穩態寄存用d只是一個辦法,有時候通過not,buf等都能達到訊號過濾的效果</p>

<p>12、IC設計中同步復位與非同步復位的區別。<br>
同步復位在時鐘沿採復位訊號,完成復位動作。非同步復位不管時鐘,只要復位訊號滿足條件,就完成復位動作。非同步復位對復位訊號要求比較高,不能有毛刺,如果其與時鐘關係不確定,也可能出現亞穩態。</p>

<p>&nbsp;</p>

<p>13、MOORE&nbsp;與&nbsp;MEELEY狀態機的特徵。<br>
&nbsp; &nbsp;Moore狀態機的輸出僅與當前狀態值有關,且只在時鐘邊沿到來時才會有狀態變化. Mealy狀態機的輸出不僅與當前狀態值有關,而且與當前輸入值有關,這<br>
<br>
14、多時域設計中,如何處理訊號跨時域。<br>
不同的時鐘域之間訊號通訊時需要進行同步處理,這樣可以防止新時鐘域中第一級觸發器的亞穩態訊號對下級邏輯造成影響,其中對於單個控制訊號可以用兩級同步器,如電平、邊沿檢測和脈衝,對多位訊號可以用FIFO,雙口RAM,握手訊號等。<br>
跨時域的訊號要經過同步器同步,防止亞穩態傳播。例如:時鐘域1中的一個訊號,要送到時鐘域2,那麼在這個訊號送到時鐘域2之前,要先經過時鐘域2的同步器同步後,才能進入時鐘域2。這個同步器就是兩級d觸發器,其時鐘為時鐘域2的時鐘。這樣做是怕時鐘域1中的這個訊號,可能不滿足時鐘域2中觸發器的建立保持時間,而產生亞穩態,因為它們之間沒有必然關係,是非同步的。這樣做只能防止亞穩態傳播,但不能保證採進來的資料的正確性。所以通常只同步很少位數的訊號。比如控制訊號,或地址。當同步的是地址時,一般該地址應採用格雷碼,因為格雷碼每次只變一位,相當於每次只有一個同步器在起作用,這樣可以降低出錯概率,象非同步FIFO的設計中,比較讀寫地址的大小時,就是用這種方法。如果兩個時鐘域之間傳送大量的資料,可以用非同步FIFO來解決問題。<br>
我們可以在跨越Clock Domain時加上一個低電平使能的LockupLatch以確保Timing能正確無誤。</p>

<h2 id="verilog裡的同步復位與非同步復位轉"><span>Verilog</span><span>裡的同步復位與非同步復位(轉)</span></h2>

<h5 id="1同步復位synchronousreset"><span>&nbsp;</span><span>1.</span><span>同步復位</span><span>(SynchronousReset)</span></h5>

<p><span>來看一個簡單的同步復位的</span><span>D</span><span>觸發器,</span><span>Verilog</span><span>程式碼如下:</span></p>

<p><span>module d_ff (clk,&nbsp;</span>rst_n,&nbsp;datain,&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataout&nbsp;&nbsp;&nbsp;&nbsp;&lt;= datain;<br>
&nbsp;&nbsp;&nbsp;&nbsp;end<br>
endmodule</p>

<p><span>綜合後的</span><span>RTL</span><span>圖表如下:</span></p>

<p><span><a target="_blank"></a></span></p>

<p><span>Altera</span><span>的</span><span>MAXII</span><span>系列的</span><span>CPLD</span><span>中,</span><span>register</span><span>沒有同步復位資源,所以同步復位訊號需要通過額外的邏輯電路實現,</span><span><a target="_blank"></a></span></p>

<p><span>同步復位的優點:</span></p>

<p><span>1). </span><span>抗干擾性高,可以剔除復位訊號中週期短於時鐘週期的毛刺;</span></p>

<p><span>2). </span><span>有利於靜態時序分析工具的分析;</span></p>

<p><span>3). </span><span>有利於基於週期的模擬工具的模擬。</span></p>

<p><span>同步復位缺點:</span></p>

<p><span>1). </span><span>佔用更多的邏輯資源;</span></p>

<p><span>2). </span><span>對復位訊號的脈衝寬度有要求,必須大於指定的時鐘週期,由於線路上的延遲,可能需要多個時鐘週期的復位脈衝寬度,且很難保證復位訊號到達各個暫存器的時序;</span></p>

<p><span>3). </span><span>同步復位依賴於時鐘,如果電路中的時鐘訊號出現問題,無法完成復位。</span></p>

<h5 id="2-非同步復位asynchronous-reset"><span>2. </span><span>非同步復位</span><span>(Asynchronous Reset)</span></h5>

<p><span>來看一個簡單的非同步復位的</span><span>D</span><span>觸發器,</span><span>Verilog</span><span>程式碼如下:</span></p>

<p><span>module prac (&nbsp;</span>clk,&nbsp;&nbsp;&nbsp;&nbsp;rst_n,&nbsp;&nbsp;&nbsp;datain,&nbsp;&nbsp;&nbsp;&nbsp;dataout&nbsp;);<br>
&nbsp;&nbsp;&nbsp;&nbsp;input&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clk;<br>
&nbsp;&nbsp;&nbsp;&nbsp;input&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rst_n;<br>
&nbsp;&nbsp;&nbsp;&nbsp;input&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;datain;<br>
&nbsp;&nbsp;&nbsp;&nbsp;output&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataout;<br>
&nbsp;&nbsp;&nbsp;&nbsp;reg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataout;<br>
&nbsp;&nbsp;&nbsp;&nbsp;always @(posedge&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataout&nbsp;&nbsp;&nbsp;&nbsp;&lt;= datain;<br>
&nbsp;&nbsp;&nbsp;&nbsp;end<br>
endmodule</p>

<p><span>綜合後的</span><span>RTL</span><span>圖表如下:</span></p>

<p><span><a target="_blank"></a></span></p>

<p><span>非同步復位的優點:</span></p>

<p><span>1). </span><span>無需額外的邏輯資源,實現簡單,而且</span><span>CPLD</span><span>有針對復位訊號的全域性不限資源,可以保證復位管腳到各個暫存器的</span><span>clock skew</span><span>最小</span><span>(</span><span>注意不是到各個暫存器的延遲最小</span><span>)</span><span>;</span></p>

<p><span>2). </span><span>復位訊號不依賴於時鐘。</span></p>

<p><span>同步復位缺點:</span></p>

<p><span>1). </span><span>復位訊號容易受到外界的干擾;</span></p>

<p><span>2). </span><span>復位訊號釋放的隨機性,可能導致時序違規,使電路處於亞穩態,如下圖。</span></p>

<p><span><a target="_blank"></a></span></p>

<h5 id="3-非同步復位同步釋放asynchronous-reset-synchronous-release"><span>3. </span><span>非同步復位同步釋放</span><span>(Asynchronous Reset Synchronous Release)</span></h5>

<p><span>這種復位方式在文獻中還有一種稱謂:</span><span>SynchronizedAsynchronous Reset</span><span>,這種稱謂應該在國外的技術人員中比較流行,與</span><span>Altera</span><span>的工程師交流過程中,他們一直使用</span><span>Synchronized
 AsynchronousReset</span><span>這種稱謂</span><span>(</span><span>當然也可能是個人的習慣</span><span>)</span><span>。</span></p>

<p><span>來看一個</span><span>SynchronizedAsynchronous Reset</span><span>例子,</span><span>Verilog</span><span>程式碼如下:</span></p>

<p><span>module prac (&nbsp;</span>clk,&nbsp;reset_n,&nbsp;&nbsp;dataa,&nbsp;&nbsp;&nbsp;datab,&nbsp;&nbsp;&nbsp;outa, &nbsp;outb&nbsp;);<br>
&nbsp;&nbsp;&nbsp;&nbsp;input&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clk;<br>
&nbsp;&nbsp;&nbsp;&nbsp;input&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reset_n;<br>
&nbsp;&nbsp;&nbsp;&nbsp;input&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataa;<br>
&nbsp;&nbsp;&nbsp;&nbsp;input&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;datab;<br>
&nbsp;&nbsp;&nbsp;&nbsp;output&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outa;<br>
&nbsp;&nbsp;&nbsp;&nbsp;output&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outb;<br>
&nbsp;&nbsp;&nbsp;&nbsp;reg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reg1;<br>
&nbsp;&nbsp;&nbsp;&nbsp;reg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reg2;<br>
&nbsp;&nbsp;&nbsp;&nbsp;reg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reg3;<br>
&nbsp;&nbsp;&nbsp;&nbsp;reg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reg4;<br>
&nbsp;&nbsp;&nbsp;&nbsp;assign&nbsp;&nbsp;&nbsp;&nbsp;outa&nbsp;&nbsp;&nbsp;&nbsp;=&gt;
&nbsp;&nbsp;&nbsp;&nbsp;assign&nbsp;&nbsp;&nbsp;&nbsp;rst_n&nbsp;&nbsp;&nbsp;&nbsp;= reg4;<br>
&nbsp;&nbsp;&nbsp;&nbsp;always @(posedge&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reg4&nbsp;&nbsp;&nbsp;&nbsp;&lt;= 1’b0;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reg3&nbsp;&nbsp;&nbsp;&nbsp;&lt;= 1’b1;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reg4&nbsp;&nbsp;&nbsp;&nbsp;&lt;= reg3;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br>
&nbsp;&nbsp;&nbsp;&nbsp;end</p>

<p><span>&nbsp;&nbsp;&nbsp;&nbsp;</span>always @ (posedge&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reg2&nbsp;&nbsp;&nbsp;&nbsp;&lt;= 1’b0;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reg1&nbsp;&nbsp;&nbsp;&nbsp;&lt;=&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br>
&nbsp;&nbsp;&nbsp;&nbsp;end<br>
endmodule</p>

<p><span>綜合後的</span><span>RTL</span><span>圖表如下:</span></p>

<p><span><a target="_blank"></a></span></p>

<p><span>此文來源於《</span><span>Implementationand Timing of Reset Circuits in Altera FPGAs</span><span>》,例子程式可能程式碼與原始碼略有出入,</span><span>RTL</span><span>圖是用</span><span>QuartusII
 8.1</span><span>綜合的,與原文也有出入。</span></p>

<p><strong>非同步復位、同步釋放</strong></p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FPGA設計中常見的復位方式即同步復位和非同步復位。在深入探討亞穩態這個概念之前, 很多人並沒有對所謂的同步復位和非同步復位有太多的注意,而在實踐中充分感受了亞穩態的危害之後,回過頭來細細品味《Verilog HDL設計與驗證》一書中關於復位的章節,可謂受益匪淺。</p>

<p>&nbsp;&nbsp;&nbsp; 在以前的程式碼裡大多使用的是非同步復位。</p>

<p>&nbsp;&nbsp;&nbsp; <strong>一個簡單的非同步復位的例子</strong></p>

<p>always @ (posedge clk or negedgerst_n)</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!rst_n)b &lt;= 1’b0;</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elseb &lt;= a;</p>

<p>&nbsp;</p>

<p><a target="_blank"></a></p>

<p>&nbsp;&nbsp;&nbsp; 我們可以看到FPGA的暫存器都有一個非同步的清零端(CLR),在非同步復位的設計中這個埠一般就是接低電平有效的復位訊號rst_n。即使說你的設計中是高電平復位,那麼實際綜合後會把你的復位訊號反向後接這個CLR端。</p>

<p>&nbsp;&nbsp;&nbsp; <strong>一個簡單的同步復位的例子</strong></p>

<p>always @ (posedge clk)</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!rst_n)b &lt;= 1’b0;</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elseb &lt;= a;</p>

<p>&nbsp;</p>

<p><a target="_blank"></a>&nbsp;</p>

<p>&nbsp;&nbsp;&nbsp; 和非同步復位相比,同步復位沒有用上暫存器的CLR埠,綜合出來的實際電路只是把復位訊號rst_n作為了輸入邏輯的使能訊號。那麼,這樣的同步復位勢必會額外增加FPGA內部的資源消耗。</p>

<p>&nbsp;</p>

<p>&nbsp;&nbsp;&nbsp; 那麼同步復位和非同步復位到底孰優孰劣呢?</p>

<p>&nbsp;&nbsp;&nbsp; 只能說,各有優缺點。同步復位的好在於它只在時鐘訊號clk的上升沿觸發進行系統是否復位的判斷,這降低了亞穩態出現的概率;它的不好上面也說了,在於它需要消耗更多的器件資源,這是我們不希望看到的。FPGA的暫存器有支援非同步復位專用的埠,採用非同步復位的埠無需額外增加器件資源的消耗,但是非同步復位也存在著隱患,特權同學過去從沒有意識到也沒有見識過。非同步時鐘域的亞穩態問題同樣的存在與非同步復位訊號和系統時鐘訊號之間。</p>

<p>&nbsp;</p>

<p>&nbsp;&nbsp;&nbsp; 再看下面一個兩級暫存器非同步復位的例子</p>

<p>&nbsp;</p>

<p>always @ (posedge clk or negedgerst_n)</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!rst_n)b &lt;= 1’b0;</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elseb &lt;= a;</p>

<p>&nbsp;&nbsp;&nbsp; </p>

<p>always @ (posedge clk or negedgerst_n)</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!rst_n)c &lt;= 1’b0;</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elsec &lt;= b;&nbsp;&nbsp; </p>

<p>&nbsp;</p>

<p><a target="_blank"></a></p>

<p>&nbsp;&nbsp;&nbsp; 正常情況下,clk的上升沿c更新為b,b更新為a。一旦進入復位,b,c都清零;但是我們不能確定復位訊號rst_n會在什麼時候結束。如果結束於b_reg0和c_reg0的{launch edge –stup,launchedge+hold}時間只外,那麼一切都會正常。但如果恰恰相反,會出現什麼情況呢? rst_n的上升變化出現在了clk上升的建立保持時間上,此時clk檢測到的rst_n的狀態就會是一個亞穩態(是0是1不確定)。從程式碼裡我們看到如果此時b_reg0和c_reg0認為rst_n為0,那麼依然保持復位清零,而如果認為rst_n為1,那麼就跳出復位。因為此時的rst_n的不確定性,就可能出現4種情況,即b_reg0和c_reg0都復位或者都跳出復位,再或者一個復位一個跳出復位。那麼後者就會造成了系統工作不同步的問題,在這個簡單的兩級非同步復位例項中這種危害表現的並不明顯,但是我們試想一個大的工程專案裡眾多的暫存器出現如此情況又會是如何一番景象呢?</p>

<p>&nbsp;&nbsp;&nbsp; 上面的分析似乎都讓人意識到同步復位和非同步復位都不可靠,那麼如何將兩者結合,取長補短呢。</p>

<p>&nbsp;</p>

<p>&nbsp;&nbsp;&nbsp; <strong>非同步復位、同步釋放</strong></p>

<p><strong>&nbsp;</strong></p>

<p>always @ (posedge clk)</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rst_nr&lt;= rst_n;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //現將非同步復位訊號用同步時鐘打一拍</p>

<p>&nbsp;</p>

<p>always @ (posedge clk or negedgerst_nr)</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!rst_nr)b &lt;= 1’b0;</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elseb &lt;= a;</p>

<p>&nbsp;&nbsp;&nbsp; </p>

<p>always @ (posedge clk or negedgerst_nr)</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!rst_nr)c &lt;= 1’b0;</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elsec &lt;= b;&nbsp;&nbsp; </p>

<p>&nbsp;</p>

<p><a target="_blank"></a></p>

<p>&nbsp;&nbsp;&nbsp; 如此一來,既解決了同步復位的資源消耗問題,也解決了非同步復位的亞穩態問題。其根本思想,也是將非同步訊號同步化。</p>

<p>&nbsp;</p>

<p>&nbsp;&nbsp;&nbsp; 另外特權同學請教過IC設計部一位資深專家,他們在設計中常用的復位方式和上面的方法類似,大體如下:</p>

<p>&nbsp;</p>

<p><a target="_blank"></a></p>

<p><strong>&nbsp;</strong></p>

<p><strong>VHDL與Verilog中的同步和非同步復位</strong></p>

<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>這兩種復位方式的區別主要看是否需要時鐘的參與:非同步復位不需要時鐘的參與,只要復位訊號一有效就立即執行復位操作;同步訊號需要時鐘參與,只有當時鐘有效沿來時,復位訊號才有效。</span></p>

<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>同步復位的最大好處是有效防止復位訊號的毛刺引起的誤復位操作,只要毛刺不在時鐘有效沿附近出現,就不會影響電路正常工作;而若是非同步復位,其復位訊號的毛刺會立即引起電路復位。</span></p>

<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>非同步復位可以在沒有時鐘的情況下完成復位,所以可以使電路在上電的時候完成對系統的復位,而且非同步復位所消耗的資源比同步復位少。一般的,只要能保證復位訊號的穩定,我們建議使用非同步復位。</span></p>

<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>我們看一下同步和非同步復位在</span><span>VHDL</span><span>和</span><span>Verilog</span><span>下的實現細節:</span></p>

<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VHDL:</span></p>

<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PROCESS(clk,reset)—</span><span>同步復位</span></p>

<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BEGIN</span></p>

<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If(rising_edge(clk)) then</span></p>

<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If(reset=’1’) then—</span><span>復位訊號在時鐘有效沿下進行判斷</span></p>

<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;–</span><span>執行復位操作</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></p>

<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End if;</span></p>

<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End if;</span></p>

<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;END</span></p>

<p><span>&nbsp;</span></p>

<p><span>&nbsp;&nbsp;</span><span>&nbsp;&nbsp;&nbsp;&nbsp; PROCESS(clk,reset)—</span><span>非同步復位</span></p>

<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BEGIN</span></p>

<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If(reset=’1’) then—</span><span>復位訊號在不需要在時鐘有效沿下進行判斷</span></p>

<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;–</span><span>執行復位操作</span></p>

<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elsif(rising_edge(clk)) then</span></p>

<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;……….&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></p>

<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End if;</span></p>

<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;END</span></p>

<p><span>&nbsp;</span></p>

<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span> Verilog</span><span>:</span></p>

<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;always @ (posedge clk or posedge reset)//</span><span>非同步復位,在敏感訊號里加復位訊號</span></p>

<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(reset)</span></p>

<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin</span></p>

<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//</span><span>執行復位操作</span></p>

<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end</span></p>

<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else</span></p>

<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin</span></p>

<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;……</span></p>

<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end</span></p>

<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;always @ </span><span>(</span><span>posedgeclk</span><span>)</span><span>//</span><span>同步復位,在敏感訊號不用加復位訊號</span></p>

<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(reset)</span></p>

<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin</span></p>

<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//</span><span>執行復位操作</span></p>

<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end</span></p>

<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else</span></p>

<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin</span></p>

<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;……</span></p>

<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End</span></p>

<p><span>&nbsp;</span></p>

<p><span>同步復位和非同步復位的比較</span></p>

<p><span>各自的優缺點:</span></p>

<p><span>1</span><span>、總的來說,同步復位的優點大概有</span><span>3</span><span>條:</span></p>

<p><span>a</span><span>、有利於模擬器的模擬。</span></p>

<p><span>b</span><span>、可以使所設計的系統成為</span><span>100%</span><span>的同步時序電路,這便大大有利於時序分析,而且綜合出來的</span><span>fmax</span><span>一般較高。</span></p>

<p><span>c</span><span>、因為他只有在時鐘有效電平到來時才有效,所以可以濾除高於時鐘頻率的毛刺。他的缺點也有不少,主要有以下幾條:</span></p>

<p><span>a</span><span>、復位訊號的有效時長必須大於時鐘週期,才能真正被系統識別並完成復位任務。同時還要考慮,諸如:</span><span>clk skew,</span><span>組合邏輯路徑延時</span><span>,</span><span>復位延時等因素。</span></p>

<p><span>b</span><span>、由於大多數的邏輯器件的目標庫內的</span><span>DFF</span><span>都只有非同步復位埠,所以,倘若採用同步復位的話,綜合器就會在暫存器的資料輸入埠插入組合邏輯,這樣就會耗費較多的邏輯資源。</span></p>

<p><span>2</span><span>、對於非同步復位來說,他的優點也有三條,都是相對應的</span></p>

<p><span>a</span><span>、大多數目標器件庫的</span><span>dff</span><span>都有非同步復位埠,因此採用非同步復位可以節省資源。</span><span><br>
b</span><span>、設計相對簡單。</span></p>

<p><span>c</span><span>、非同步復位訊號識別方便,而且可以很方便的使用</span><span>FPGA</span><span>的全域性復位埠</span><span>GSR</span><span>。</span></p>

<p><span>缺點:</span></p>

<p><span>a</span><span>、在復位訊號釋放</span><span>(release)</span><span>的時候容易出現問題。具體就是說:倘若復位釋放時恰恰在時鐘有效沿附近,就很容易使暫存器輸出出現亞穩態,從而導致亞穩態。</span></p>

<p><span>b</span><span>、復位訊號容易受到毛刺的影響。</span></p>

<p><span>三、總結:</span></p>

<p><span>所以說,一般都推薦使用非同步復位,同步釋放的方式,而且復位訊號低電平有效。這樣就可以兩全其美了。</span></p>

<p><span>推薦的復位方式</span></p>

<p><span>所謂推薦的復位方式就是上文中所說的:</span><span>“</span><span>非同步復位,同步釋放</span><span>”</span><span>。這就結合了雙方面的優點,很好的克服了非同步復位的缺點(因為非同步復位的問題主要出現在復位訊號釋放的時候,具體原因可見上文)。</span></p>

<p><span>其實做起來也並不難,我推薦一種我經常使用的方式吧:那就是在非同步復位鍵後加上一個所謂的</span><span>“reset synchronizer”,</span><span>這樣就可以使非同步復位訊號同步化,然後,再用經過處理的復位訊號去作用系統,就可以保證比較穩定了。</span><span>reset
 sychronizer</span><span>的</span><span>Verilog</span><span>程式碼如下:</span></p>

<p><span>moduleReset_Synchronizer(output reg rst_n, input&nbsp; clk, asyncrst_n);</span></p>

<p><span>reg rff1;</span></p>

<p><span>always @ (posedge clk ,negedge asyncrst_n) begin</span></p>

<p><span>if (!asyncrst_n) {rst_n,rff1}&lt;= 2’b0;</span></p>

<p><span>else {rst_n,rff1} &lt;={rff1,1’b1};</span></p>

<p><span>end</span></p>

<p><span>endmodule</span></p>

<p><span>大家可以看到,這就是一個</span><span>dff</span><span>,非同步復位訊號直接接在它的非同步復位埠上(低電平有效),然後資料輸入端</span><span>rff1</span><span>一直為高電平</span><span>‘1’</span><span>。倘若非同步復位訊號有效的話,觸發器就會復位,輸出為低,從而復位後繼系統。但是,又由於這屬於時鐘沿觸發,當復位訊號釋放時,觸發器的輸出要延遲一個時鐘週期才能恢復成</span><span>‘1’</span><span>,因此使得復位訊號的釋放與時鐘沿同步化。</span><span>&nbsp;&nbsp;</span><span>此外,還有一種方法更為直接,就是直接在非同步復位訊號後加一個</span><span>D</span><span>觸發器,然後用</span><span>D</span><span>觸發器的輸出作為後級系統的復位訊號,也能達到相同的效果。這裡就不多說了。</span></p>

<p><span>3</span><span>:多時鐘系統中復位的處理方法)</span></p>

<p><span>這是一個很實際的問題,因為在較大型的系統中,一個時鐘驅動訊號顯然不能滿足要求,一定會根據系統的要求用多個同源時鐘(當然也可以是非同源了)去驅動系統的不同部分。那麼在這樣的多時鐘系統中,復位鍵怎麼設定?它的穩定與否直接關係到了整個系統的穩定性,因此要格外注意(在我看來,復位訊號在同步時序系統中的地位和時鐘訊號一樣重要)。下面就說一下具體的處理方法,當然所遵循的原則就仍應該是上文的</span><span>“</span><span>非同步復位,同步釋放</span><span>”</span><span>:</span></p>

<p><span>1.non-coordinated resetremoval</span><span>:顧名思義,就是同一個系統中的多個同源時鐘域的復位訊號,由彼此獨立的</span><span>“reset synchronizer”</span><span>驅動。當非同步復位訊號有效時,各時鐘域同時復位,但是復位釋放的時間由各自的驅動時鐘決定,也是就說:時鐘快的先釋放,時鐘慢的後釋放,但是各復位訊號之間沒有先後關係。</span></p>

<p><span>2.sequence coordinated resetremoval:</span><span>這是相對於上述方式來說的,也就是說各時鐘域的復位訊號彼此相關,各個部分系統雖然也同時復位,但是卻分級釋放。而分級的順序可由各個</span><span>“reset synchronizer”</span><span>的級聯方式決定。可以先復位前級,再復位後級,也可以反過來。反正方式很靈活,需要根據實際需要而定。由於圖片上傳問題,我只能用程式表示了,大家湊或看吧,哈哈</span></p>

<p><span>例子:三級復位系統</span><span>,</span><span>系統中的時鐘分別為</span><span>1M,2M,11M:</span></p>

<p><span>第一級</span><span>Reset_Sychronizer</span><span>程式</span><span>:</span></p>

<p><span>moduleReset_Synchronizer(output reg rst_n, input&nbsp; clk, asyncrst_n);<br>
&nbsp;reg rff1;<br>
always @ (posedge clk , negedge asyncrst_n)</span></p>

<p><span>begin</span></p>

<p><span>if (!asyncrst_n) {rst_n,rff1}&lt;= 2’b0;</span></p>

<p><span>else {rst_n,rff1} &lt;={rff1,1’b1};</span></p>

<p><span>end</span></p>

<p><span>endmodule</span></p>

<p><span>第</span><span>2</span><span>,</span><span>3</span><span>級的</span><span>Reset_Sychronizer</span><span>程式:</span></p>

<p><span>moduleReset_Synchronizer2(output reg rst_n, input&nbsp; clk, asyncrst_n,d);</span></p>

<p><span>reg rff1;</span></p>

<p><span>always @ (posedge clk ,negedge asyncrst_n) begin</span></p>

<p><span>if (!asyncrst_n) {rst_n,rff1}&lt;= 2’b0;</span></p>

<p><span>else {rst_n,rff1} &lt;={rff1,d};</span></p>

<p><span>end</span></p>

<p><span>endmodule</span></p>

<p><span>頂層模組的源程式:</span></p>

<p><span>include”Reset_Synchronizer.v”</span></p>

<p><span>include”Reset_Synchronizer2.v”</span></p>

<p><span>moduleAsynRstTree_Trans</span></p>

<p><span>(input&nbsp; Clk1M,Clk2M,Clk11M,SysRst_n,&nbsp; output SysRst1M_n,SysRst2M_n,SysRst11M_n);</span></p>

<p><span>Reset_SynchronizerRst1M(.clk(Clk1M),. asyncrst_n(SysRst_n),.rst_n(SysRst1M_n));<br>
&nbsp; Reset_Synchronizer2Rst2M(.clk(Clk2M),.d(SysRst1M_n),.asyncrst_n(SysRst_n),.rst_n(SysRst2M_n));<br>
Reset_Synchronizer2Rst11M(.clk(Clk11M),.d(SysRst2M_n),. asyncrst_n(SysRst_n),.rst_n(SysRst11M_n));</span></p>

<p><span>Endmodule</span></p>

<p><span>&nbsp;</span></p>

<p>&nbsp;</p>

<p> <br>
            </p></div> <br>
          轉載自:<a href="http://blog.csdn.net/kobesdu/article/details/16356997" rel="nofollow" target="_blank">http://blog.csdn.net/kobesdu/article/details/16356997</a>            </div>
                        <link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-8cccb36679.css" rel="stylesheet">
                </div>

相關推薦

verilog非同步復位同步釋放

<div id="article_content" class="article_content clearfix csdn-tracking-statistics" data-pid="blog" data-mod="popu_307" data-dsm="post

非同步復位同步釋放的理解

非同步復位,同步釋放的理解 文章轉自: https://blog.csdn.net/u011729865/article/details/49281713   什麼情況下復位訊號需要做非同步復位同步釋放處理 非同步復位同步釋放原理 利用前面兩級

復位最佳方式:非同步復位同步釋放

最近在FPGA討論群裡放入一段程式碼讓精英分析一下可行性,結果被鄙視了,並且引起了精英們的大討論 ,總結一下: 起因是我在一個工程中混雜使用同步復位,非同步復位; 非同步:  always @(posedge clk or negedge rst_n )        

為什麼要非同步復位同步釋放

                                一個簡單的非同步復位的例子  1 module test 2 ( 3  input clk, 4  input rst_n, 5  input data_in, 6  output reg out 7 ); 8  alw

FPGA基礎之非同步復位同步釋放電路的詳細解釋

版權宣告:轉載請註明出處:http://blog.csdn.net/lg2lh https://blog.csdn.net/lg2lh/article/details/8488224 假設rst_async_n撤除時發生在clk上升沿,如果如下電路則可能發生亞穩態事件。  

非同步復位同步釋放電路的詳細解釋

1、首先給出非同步復位訊號亞穩態的原因:   復位結束也就是釋放的時刻恰在時鐘上升沿的建立時間和保持時間之間時無法決定現在的復位狀態是1還是0,造成亞穩態。   下面是具體解釋:   在帶有復位端的D觸發器中,當reset訊號“復位”有效時,它可以直接驅動最後一級的與非門,

Verilog同步復位非同步復位非同步復位同步釋放

簡介 在實際的工程中選擇復位策略之前必須考慮許多設計方面的問題,如使用同步復位或者非同步復位或者非同步復位同步釋放(Asynchronous Reset Synchronous Release或者Synchronized Asynchronous Reset),以及

非同步復位同步復位非同步復位同步釋放的比較

原文地址:http://www.cnblogs.com/yfwblog/p/4793118.htm 簡介 在實際的工程中選擇復位策略之前必須考慮許多設計方面的問題,如使用同步復位或者非同步復位或者非同步復位同步釋放(Asynchronous Reset Synchro

LBS——JS非同步事件同步執行(Promise方法應用)

此方法主要解決,多條非同步事件,同步執行的問題 (如高德api 前臺糾偏方法500點限制問題) AMap.GraspRoad() 高德糾偏能座標糾偏至道路線上,但是方法座標引數限制在500個, 可用此方法解決點上限問題 /* <script type="text/javasc

Verilog同步復位非同步復位比較 async vs. sync

  同步復位 sync 非同步復位 async 特點 復位訊號只有在時鐘上升沿到來時才能有效。 無論時鐘沿是否到來,只要復位訊號有效,就進行復位。

FPGA基礎知識11(FPGA非同步復位同步釋放解析)

需求說明:IC設計基礎 內容       :非同步復位,同步釋放 來自       :時間的詩 FPGA開發中,一種最常用的復位技術就是“非同步復位同步釋放”,這個技術比較難以理解,很多資料對其說得並不透徹,沒有講到本質,但是它又很重要,所以對它必須理解,這

FPGA非同步復位同步釋放的詳細解釋

假設rst_async_n撤除時發生在clk上升沿,如果如下電路則可能發生亞穩態事件。 如圖第一個方框內是非同步復位和同步釋放電路。有兩個D觸發器構成。第一級D觸發器的輸入時VCC,第二級觸發器輸出是可以非同步復位,同步釋放後的復位訊號。 電路目的:方式復位訊號撤除時產生亞穩態事件。 所謂非同

verilog同步復位非同步復位

1、阻塞賦值操作符用等號(即 = )表示。“阻塞”是指在程序語句(initial和always)中,當前的賦值語句阻斷了其後的語句,也就是說後面的語句必須等到當前的賦值語句執行完畢才能執行。而且阻塞賦值可以看成是一步完成的,即:計算等號右邊的值並同時賦給左邊變數。例如: 當執行“x=next_x;”時,x會

FPGA非同步復位同步釋放使用兩級D觸發器的意義

       如圖是器件工作時的電壓變化,當reset_n在Recovery Time Check+Removal Time Check時間段內發生變化時會產生一個非高非低的訊號,稱之為亞穩態。如果電路有亞穩態存在會對之後的電路產生無法預測的錯誤,通過比較可得在各模組之間

含PLL的lock訊號的非同步復位同步釋放

下圖展示了該結構: 結構分為三部分,分別是PLL的非同步復位同步釋放,PLL模組,和系統的非同步復位同步釋放。          PLL模組由IP核產生,使用非同步復位,當鎖定時候,Locked訊號置位。          非同步復位同步釋放部分當iRstN訊號低電平,

FPGA非同步復位同步釋放解析

FPGA開發中,一種最常用的復位技術就是“非同步復位同步釋放”,這個技術比較難以理解,很多資料對其說得並不透徹,沒有講到本質,但是它又很重要,所以對它必須理解,這裡給出我的看法。 講到這個之前,我們要先熟悉recovery time和removal time的概念。如下

socket阻塞與非阻塞同步非同步、I/O模型(轉載只為查閱方便若有侵權立刪)

socket阻塞與非阻塞,同步與非同步 作者:huangguisu     1. 概念理解        在進行網路程式設計時,我們常常見到同步(Sync)/非同步(Async),阻塞(Block)/非阻塞(Unbl

談IO中的阻塞和非阻塞同步非同步及三種IO模型

什麼是同步和非同步?        燒水,我們都是通過熱水壺來燒水的。在很久之前,科技還沒有這麼發達的時候,如果我們要燒水,需要把水壺放到火爐上,我們通過觀察水壺內的水的沸騰程度來判斷水有沒有燒開。隨著科技的發展,現在市面上的水壺都有了提醒功能,當我們把水壺插電

阻塞非阻塞同步非同步

也許很多朋友在學習NIO的時候都會感覺有點吃力,對裡面的很多概念都感覺不是那麼明朗。在進入Java NIO程式設計之前,我們今天先來討論一些比較基礎的知識:I/O模型。下面本文先從同步和非同步的概念 說起,然後接著闡述了阻塞和非阻塞的區別,接著介紹了阻塞IO和非阻塞IO的區別,然後介紹了同步IO和非同步

組塞式非阻塞式同步非同步

請求描述: `阻塞/非阻塞` 和 `同步/非同步` 不是一個概念。舉幾個簡單的例子。          當程序呼叫一個進行IO操作的API時(比如read函式),在資料沒有到達前,read 會掛起,程序會卡住。在資料讀取完畢返回給