色偷偷偷久久伊人大杳蕉,色爽交视频免费观看,欧美扒开腿做爽爽爽a片,欧美孕交alscan巨交xxx,日日碰狠狠躁久久躁蜜桃

x
x

勇敢的芯伴你玩轉(zhuǎn)Altera FPGA連載62:基于PLL分頻計數(shù)的LED閃爍實(shí)例

發(fā)布時間:2018-4-19 19:04    發(fā)布者:rousong1989
勇敢的芯伴你玩轉(zhuǎn)Altera FPGA連載62基于PLL分頻計數(shù)的LED閃爍實(shí)例
特權(quán)同學(xué),版權(quán)所有
配套例程和更多資料下載鏈接:
http://pan.baidu.com/s/1i5LMUUD
如圖8.17所示,本實(shí)例將用到FPGA內(nèi)部的PLL資源,輸入FPGA引腳上的25MHz時鐘,配置PLL使其輸出4路分別為12.5MHz、25MHz、50MHz和100MHz的時鐘信號,這4路時鐘信號又分別驅(qū)動4個不同位寬的計數(shù)器不停的計數(shù)工作,這些計數(shù)器的最高位最終輸出用于控制4個不同的LED亮滅。由于這4個時鐘頻率都有一定的倍數(shù)關(guān)系,所以我們也很容易通過調(diào)整合理的計數(shù)器位寬,達(dá)到4個LED閃爍一致的控制。
圖8.17 基于PLL分頻計數(shù)的LED閃爍功能框圖
cy4.v模塊代碼解析
         先來看cy4.v模塊的代碼,它是工程的頂層模塊,主要做接口定義和模塊例化,一般不會在這個模塊中做任何的具體邏輯設(shè)計。
         首先是接口部分,只有時鐘、復(fù)位和8個LED信號。
module cy4(
            input ext_clk_25m, //外部輸入25MHz時鐘信號
            input ext_rst_n,   //外部輸入復(fù)位信號,低電平有效
            output[7:0] led    //8個LED指示燈接口   
        );                                                
         接著這里申明5個wire類型的信號,所有在不同模塊間接口的信號,在它們的上級模塊中都必須定義為wire類型,這里有4個不同頻率的時鐘以及由PLL的lock信號引出的復(fù)位信號sys_rst_n。
wire clk_12m5;  //PLL輸出12.5MHz時鐘
wire clk_25m;   //PLL輸出25MHz時鐘
wire clk_50m;   //PLL輸出50MHz時鐘
wire clk_100m;  //PLL輸出100MHz時鐘
wire sys_rst_n; //PLL輸出的locked信號,作為FPGA內(nèi)部的復(fù)位信號,低電平復(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個LED閃爍控制模塊的例化,它們的源碼都是led_controller.v模塊,但它們的名稱不一樣,分別為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)用只有一個函數(shù),分時復(fù)用;而FPGA的這種代碼例化卻會實(shí)現(xiàn)4個完全一樣的硬件邏輯。當(dāng)然了,這4個模塊還略有不同,就是兩個名稱中間的“#(n)”,n有23、24、25和26,這個是輸入到led_controller.v模塊的一個參數(shù),大家別急,后面我們馬上就會提到它。
//-------------------------------------
//12.5MHz時鐘進(jìn)行分頻閃爍,計數(shù)器為23位                                                         
led_controller  #(23)       uut_led_controller_clk12m5(
                               .clk(clk_12m5),    //時鐘信號
                               .rst_n(sys_rst_n), //復(fù)位信號,低電平有效
                               .sled(led[0])      //LED指示燈接口   
                           );
//-------------------------------------
//25MHz時鐘進(jìn)行分頻閃爍,計數(shù)器為24位                                                           
led_controller  #(24)       uut_led_controller_clk25m(
                               .clk(clk_25m),     //時鐘信號
                               .rst_n(sys_rst_n), //復(fù)位信號,低電平有效
                               .sled(led[1])      //LED指示燈接口   
                           );
        
//-------------------------------------
//25MHz時鐘進(jìn)行分頻閃爍,計數(shù)器為25位                                                           
led_controller  #(25)       uut_led_controller_clk50m(
                               .clk(clk_50m),     //時鐘信號
                               .rst_n(sys_rst_n), //復(fù)位信號,低電平有效
                               .sled(led[2])      //LED指示燈接口   
                           );
        
//-------------------------------------
//25MHz時鐘進(jìn)行分頻閃爍,計數(shù)器為26位                                                           
led_controller  #(26)       uut_led_controller_clk100m(
                               .clk(clk_100m),    //時鐘信號
                               .rst_n(sys_rst_n), //復(fù)位信號,低電平有效
                               .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;”這樣的定義,若是例化這個模塊的上層接口中不定義“#(n)”,則表示“parameter CNT_HIGH = 24;”語句生效,若是定義的“#(n)”中的n值與代碼中定義的24不同,那么以n為最終值。
module led_controller(
            input clk,      //時鐘信號
            input rst_n,    //復(fù)位信號,低電平有效
            output sled     //LED指示燈接口   
        );                                                
   
parameter CNT_HIGH = 24;   //計數(shù)器最高位
//-------------------------------------
reg[(CNT_HIGH-1):0] cnt;       //24位計數(shù)器      
    //cnt計數(shù)器進(jìn)行循環(huán)計數(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

本文地址:http://www.54549.cn/thread-524727-1-1.html     【打印本頁】

本站部分文章為轉(zhuǎn)載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀點(diǎn)和對其真實(shí)性負(fù)責(zé);文章版權(quán)歸原作者及原出處所有,如涉及作品內(nèi)容、版權(quán)和其它問題,我們將根據(jù)著作權(quán)人的要求,第一時間更正或刪除。
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表