<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                [TOC] >## 硬件原則 **硬件原則**主要針對HDL代碼編寫而言:Verilog是采用了C語言形式的硬件的抽象,它的本質作用在于描述硬件,它的最終實現結果是芯片內部的實際電路。**所以評判一段HDL代碼的優劣的最終標準是:其描述并實現的硬件電路的性能,包括面積和速度兩個方面**。</br> 初學者片面追求代碼的整潔、簡短,是錯誤的,是與HDL的標準背道而馳的。正確的編碼方法,首先要做到**對所需實現的硬件電路胸有成竹**,對該部分的硬件的結構和連接十分清晰,然后再用適當的HDL語句表達出來即可。 >## 幾個典型的例子 ### 異步復位 ``` module test ( input clk, input rst_n, input data_in, output reg out ); always @ (posedge clk or negedge rst_n) if(!rst_n) out <= 1'b0; else out <= data_in; endmodule ``` ![](https://img.kancloud.cn/e9/50/e95006566b43c19acd1f9f832f504647_380x196.png) 可以看到FPGA的寄存器都有一個異步的清零端(CLR),在異步復位的設計中這個端口一般就是接低電平有效的復位信號rst_n。 即使說你的設計中是高電平復位,那么實際綜合后會把你的復位信號反向后接這個CLR端。 ### 同步復位 ``` module test ( input clk, input rst_n, input data_in, output reg out ); always @ (posedge clk ) if(!rst_n) out <= 1'b0; else out <= data_in; endmodule ``` ![](https://img.kancloud.cn/d6/f9/d6f958de3e55070f3e9b4c3de6811560_487x182.png) 和異步復位相比,同步復位沒有用上寄存器的CLR端口,綜合出來的實際電路只是把復位信號rst_n作為了輸入邏輯的使能信號。那么,這樣的同步復位勢必會額外增加FPGA內部的資源消耗</br> 那么同步復位和異步復位到底孰優孰劣呢? 只能說,各有優缺點。同步復位的好在于它只在時鐘信號clk的上升沿觸發進行系統是否復位的判斷,這降低了亞穩態出現的概率;它的不好上面也說了,在于它需要消耗更多的器件資源,這是我們不希望看到的。FPGA的寄存器有支持異步復位專用的端口,采用異步復位的端口無需額外增加器件資源的消耗,但是異步復位也存在著隱患。異步時鐘域的亞穩態問題同樣的存在與異步復位信號和系統時鐘信號之間。 ### 兩級寄存器異步復位 ``` module test ( input clk, input rst_n, input a, output reg c ); reg b; always @ (posedge clk or negedge rst_n) if(!rst_n) b <= 1'b0; else b <= a; always @ (posedge clk or negedge rst_n) if(!rst_n) c <= 1'b0; else c <= b; endmodule ``` ![](https://img.kancloud.cn/06/40/06403b23ba986113e9b1ac030303fc46_512x224.png) ### 異步復位、同步釋放 ``` module test ( input clk, input rst_n, input a, output reg c ); reg b,rst_nr; always @ (posedge clk) rst_nr <= rst_n; always @ (posedge clk or negedge rst_nr) if(!rst_nr) b <= 1'b0; else b <= a; always @ (posedge clk or negedge rst_nr) if(!rst_nr) c <= 1'b0; else c <= b; endmodule ``` ![](https://img.kancloud.cn/be/c8/bec83a82b6bf8bab24641d5894bb4a02_637x234.png) 如此一來,既解決了同步復位的資源消耗問題,也解決了異步復位的亞穩態問題。其根本思想,也是將異步信號同步化。 **最好的異步復位、同步釋放--------復位方法**
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看