FPGA設計技巧之計數器


     近日根據RF系統,本着節約FPGA內部邏輯資源以及引腳優化的角度,根據計數器的特征,記錄個人的一些偶得。

1. 時鍾分頻

      在項目中經常會遇到需要時鍾分頻,除了使用PLL或DLL;有時所需的分頻時鍾較多,不適宜采用過多的PLL或DLL,此時采用計數器即為較好的解決方案。

      下面以50 MHz的時鍾分頻產生1KHz的脈沖以及1Hz的時鍾信號為例來進行闡述。為避免產生時鍾偏移(skew),在設計時鍾分頻時,須使用主時鍾作為節拍。

          //////////////////////////////////////////////////////////

          /***************** 50000 = 500*100 **********************/

         always @(posedge  clk_50M) begin

                if(!rst_n||cnt100 == 7'd100)        cnt100 <= 7'd0;

                else                                            cnt100 <= cnt100 + 7'd1;

         end

 

         always @(posedge clk_50M) begin

                 if(!rst_n||cnt500 == 10'd500)      cnt500 <= 10'd0;

                else if(cnt100 == 7'd100)              cnt500 <= cnt500 + 10'd1;

                else                                             cnt500 <= cnt500;

         end 

 

         always @(posedge clk_50M) begin

                 if(cnt500 == 10'd500)               clk_1K <= 1;

                 else                                         clk_1K <= 0;

         end

          //////////////////////////////////////////////////////////

         /************* 50000000 = 500*100*1000 ******************/

         always @(posedge clk_50M) begin

                 if(!rst_n||cnt1K == 10'd499)       cnt1K <= 10'd0;

                 else if(clk_1K)                             cnt1K <= cnt1K + 10'd1;

                 else                                           cnt1K <= cnt1K;

         end

 

         always @(posedge clk_50M) begin

                 if(!rst_n)                                            clk_1Hz <= 0;

                 else if(cnt1K == 10'd249 && clk_1K)     clk_1Hz <= ~ clk_1Hz;

                 else                                                    clk_1Hz <= clk_1Hz;

         end

 

2. 數據通路選擇

     在某些系統設計中,經常需要選擇數據通路,並確定該數據通路數據的有效性。以下以4位計數器為例簡要介紹。

     reg    [3:0]           cnt;

     // 0000  0001  0010  0011  0100  0101  0110  0111 ……

      always @(posedge clk) begin

             if(!rst_n)          cnt <= 4’d1;

             else                  cnt <= cnt + 4’d1;

       end

2.1  數據通路模型

      如圖1所示,為4通道數據通路模型。                                                                                                圖1  數據通路模型

2.2    數據通路有效

2.2.1 數據通路歷經2個時鍾有效

        assign  datadv = cnt[0];

        assign  datapath = cnt[2:1];

        仿真如圖2所示。

                                                                                               圖2  數據通路歷經2個時鍾周期仿真圖

2.2.2  數據通路歷經4個時鍾有效

         assign  datadv = cnt[1]&cnt[0];

         assign  datapath = cnt[3:2];

         仿真如圖3所示。

                                                                                              圖3  數據通路歷經4個時鍾周期仿真圖


免責聲明!

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



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