<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > FPGA學(xué)習(xí):PLL分頻計(jì)數(shù)的LED閃爍實(shí)例

          FPGA學(xué)習(xí):PLL分頻計(jì)數(shù)的LED閃爍實(shí)例

          作者: 時(shí)間:2018-04-27 來(lái)源:網(wǎng)絡(luò) 收藏

            如圖8.17所示,本實(shí)例將用到內(nèi)部的資源,輸入引腳上的25MHz時(shí)鐘,配置使其輸出4路分別為12.5MHz、25MHz、50MHz和100MHz的時(shí)鐘信號(hào),這4路時(shí)鐘信號(hào)又分別驅(qū)動(dòng)4個(gè)不同位寬的計(jì)數(shù)器不停的計(jì)數(shù)工作,這些計(jì)數(shù)器的最高位最終輸出用于控制4個(gè)不同的LED亮滅。由于這4個(gè)時(shí)鐘頻率都有一定的倍數(shù)關(guān)系,所以我們也很容易通過(guò)調(diào)整合理的計(jì)數(shù)器位寬,達(dá)到4個(gè)LED閃爍一致的控制。

          本文引用地址:http://www.ex-cimer.com/article/201804/379162.htm

              

          1.jpg

           

            cy4.v模塊代碼解析

            先來(lái)看cy4.v模塊的代碼,它是工程的頂層模塊,主要做接口定義和模塊例化,一般不會(huì)在這個(gè)模塊中做任何的具體邏輯設(shè)計(jì)。

            首先是接口部分,只有時(shí)鐘、復(fù)位和8個(gè)LED信號(hào)。

            module cy4(

            input ext_clk_25m, //外部輸入25MHz時(shí)鐘信號(hào)

            input ext_rst_n, //外部輸入復(fù)位信號(hào),低電平有效

            output[7:0] led //8個(gè)LED指示燈接口

            );

            接著這里申明5個(gè)wire類(lèi)型的信號(hào),所有在不同模塊間接口的信號(hào),在它們的上級(jí)模塊中都必須定義為wire類(lèi)型,這里有4個(gè)不同頻率的時(shí)鐘以及由的lock信號(hào)引出的復(fù)位信號(hào)sys_rst_n。

            wire clk_12m5; //PLL輸出12.5MHz時(shí)鐘

            wire clk_25m; //PLL輸出25MHz時(shí)鐘

            wire clk_50m; //PLL輸出50MHz時(shí)鐘

            wire clk_100m; //PLL輸出100MHz時(shí)鐘

            wire sys_rst_n; //PLL輸出的locked信號(hào),作為內(nèi)部的復(fù)位信號(hào),低電平復(fù)位,高電平正常工作

            PLL是我們配置的IP核模塊,它需要在我們的代碼中例化,如下所示。

            //-------------------------------------

            //PLL例化

            pll_controller pll_controller_inst (

            .areset ( !ext_rst_n ),

            .inclk0 ( ext_clk_25m ),

            .c0 ( clk_12m5 ),

            .c1 ( clk_25m ),

            .c2 ( clk_50m ),

            .c3 ( clk_100m ),

            .locked ( sys_rst_n )

            );

            最后4個(gè)LED閃爍控制模塊的例化,它們的源碼都是led_controller.v模塊,但它們的名稱(chēng)不一樣,分別為uut_led_controller_clk12m5、uut_led_controller_clk25m、uut_led_controller_clk50m、uut_led_controller_clk100m。這樣的定義方式最終實(shí)現(xiàn)效果不同于軟件的函數(shù)調(diào)用,軟件的函數(shù)調(diào)用只有一個(gè)函數(shù),分時(shí)復(fù)用;而FPGA的這種代碼例化卻會(huì)實(shí)現(xiàn)4個(gè)完全一樣的硬件邏輯。當(dāng)然了,這4個(gè)模塊還略有不同,就是兩個(gè)名稱(chēng)中間的“#(n)”,n有23、24、25和26,這個(gè)是輸入到led_controller.v模塊的一個(gè)參數(shù),大家別急,后面我們馬上就會(huì)提到它。

            //-------------------------------------

            //12.5MHz時(shí)鐘進(jìn)行分頻閃爍,計(jì)數(shù)器為23位

            led_controller #(23) uut_led_controller_clk12m5(

            .clk(clk_12m5), //時(shí)鐘信號(hào)

            .rst_n(sys_rst_n), //復(fù)位信號(hào),低電平有效

            .sled(led[0]) //LED指示燈接口

            );

            //-------------------------------------

            //25MHz時(shí)鐘進(jìn)行分頻閃爍,計(jì)數(shù)器為24位

            led_controller #(24) uut_led_controller_clk25m(

            .clk(clk_25m), //時(shí)鐘信號(hào)

            .rst_n(sys_rst_n), //復(fù)位信號(hào),低電平有效

            .sled(led[1]) //LED指示燈接口

            );

            //-------------------------------------

            //25MHz時(shí)鐘進(jìn)行分頻閃爍,計(jì)數(shù)器為25位

            led_controller #(25) uut_led_controller_clk50m(

            .clk(clk_50m), //時(shí)鐘信號(hào)

            .rst_n(sys_rst_n), //復(fù)位信號(hào),低電平有效

            .sled(led[2]) //LED指示燈接口

            );

            //-------------------------------------

            //25MHz時(shí)鐘進(jìn)行分頻閃爍,計(jì)數(shù)器為26位

            led_controller #(26) uut_led_controller_clk100m(

            .clk(clk_100m), //時(shí)鐘信號(hào)

            .rst_n(sys_rst_n), //復(fù)位信號(hào),低電平有效

            .sled(led[3]) //LED指示燈接口

            );

            //-------------------------------------

            //高4位LED指示燈關(guān)閉

            assign led[7:4] = 4'b1111;

            endmodule

            led_controller.v模塊代碼解析

            led_controller.v模塊代碼如下,這里重點(diǎn)注意我們上面剛剛提到的輸入?yún)?shù)。在代碼中,有“parameter CNT_HIGH = 24;”這樣的定義,若是例化這個(gè)模塊的上層接口中不定義“#(n)”,則表示“parameter CNT_HIGH = 24;”語(yǔ)句生效,若是定義的“#(n)”中的n值與代碼中定義的24不同,那么以n為最終值。

            module led_controller(

            input clk, //時(shí)鐘信號(hào)

            input rst_n, //復(fù)位信號(hào),低電平有效

            output sled //LED指示燈接口

            );

            parameter CNT_HIGH = 24; //計(jì)數(shù)器最高位

            //-------------------------------------

            reg[(CNT_HIGH-1):0] cnt; //24位計(jì)數(shù)器

            //cnt計(jì)數(shù)器進(jìn)行循環(huán)計(jì)數(shù)

            always @ (posedge clk or negedge rst_n)

            if(!rst_n) cnt <= 0;

            else cnt <= cnt+1'b1;

            assign sled = cnt[CNT_HIGH-1];

            endmodule

           



          關(guān)鍵詞: FPGA PLL

          評(píng)論


          相關(guān)推薦

          技術(shù)專(zhuān)區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();