勇敢的芯伴你玩轉Altera FPGA連載60:經(jīng)典模式流水燈實(shí)驗

發(fā)布時(shí)間:2018-4-3 20:34    發(fā)布者:rousong1989
勇敢的芯伴你玩轉Altera FPGA連載60:經(jīng)典模式流水燈實(shí)驗
特權同學(xué),版權所有
配套例程和更多資料下載鏈接:
http://pan.baidu.com/s/1i5LMUUD
         本實(shí)例使用一個(gè)撥碼開(kāi)關(guān)和2個(gè)獨立按鍵控制流水燈的各種不同變化模式。模式流水燈功能示意如圖8.15所示。
圖8.15 模式流水燈功能示意圖
這里我們需要注意,當撥碼開(kāi)關(guān)SW3處于OFF時(shí), LED停止不動(dòng),只有一個(gè)LED處于點(diǎn)亮,并且點(diǎn)亮的LED不會(huì )變化;而SW3處于ON狀態(tài)時(shí),流水燈處于流動(dòng)狀態(tài)。按鍵S1被按下后,LED流動(dòng)方向是從上到下(D9到D2方向);導航按鍵S2被按下后,LED流動(dòng)方向是從下到上(D2到D9)。
         本實(shí)例代碼雖然比之前幾個(gè)實(shí)例都要長(cháng),但是我們可以把它們解析來(lái)看,其實(shí)也不復雜。首先,接口部分代碼如下,除了時(shí)鐘和復位信號,還有撥碼開(kāi)關(guān)switch[0]、2個(gè)獨立按鍵key_v[1]和key_v[0]、8個(gè)LED指示燈信號led[7:0]。
module cy4(
            input ext_clk_25m, //外部輸入25MHz時(shí)鐘信號
            input ext_rst_n,   //外部輸入復位信號,低電平有效
            input[0:0] switch, //撥碼開(kāi)關(guān)SW3輸入,ON -- 低電平;OFF-- 高電平
            input[1:0] key_v,  //S1/S2兩個(gè)按鍵輸入,未按下為高電平,按下后為低電平
            output reg[7:0] led    //8個(gè)LED指示燈接口   
        );
//-------------------------------------
//按鍵抖動(dòng)判斷邏輯
wire key;   //所有按鍵值相與的結果,用于按鍵觸發(fā)判斷
reg[3:0] keyr;  //按鍵值key的緩存寄存器
assign key = key_v[0] & key_v[1];
always @(posedge ext_clk_25m or negedge ext_rst_n)
    if (!ext_rst_n) keyr <=4'b1111;
    else keyr <= {keyr[2:0],key};
wire key_neg = ~keyr[2] & keyr[3]; //有按鍵被按下  
wire key_pos = keyr[2] & ~keyr[3]; //有按鍵被釋放
//-------------------------------------
//定時(shí)計數邏輯,用于對按鍵的消抖判斷
reg[19:0]  cnt;
always @ (posedge ext_clk_25m or negedge ext_rst_n)
   if (!ext_rst_n) cnt <= 20'd0;   
    else if(key_pos || key_neg) cnt<=20'd0;
    else if(cnt < 20'd999_999) cnt<= cnt + 1'b1;
    else cnt <= 20'd0;
  
reg[1:0] key_value[1:0];
always @(posedge ext_clk_25m or negedge ext_rst_n)
    if (!ext_rst_n) begin
        key_value[0] <= 2'b11;
        key_value[1] <= 2'b11;
    end
    else if(cnt == 20'd999_999) begin  //定時(shí)鍵值采集
        key_value[0] <= key_v;
        key_value[1] <=key_value[0];   
    end
wire[1:0] key_press = key_value[1] & ~key_value[0];       //消抖后按鍵值變化標志位   
    有了按鍵值標志信號key_press,我們接下來(lái)就用它來(lái)控制LED流水燈的2個(gè)指示信號,即LED流水燈工作使能信號led_en和LED流水燈方向控制信號led_dir。
//------------------------------------
//流水燈開(kāi)啟、停止和流動(dòng)方向控制開(kāi)關(guān)、按鍵值采集
reg led_en;     //LED流水燈工作使能信號,高電平有效
reg led_dir;    //LED流水燈方向控制信號,1--從高到低流動(dòng),0--從低到高流動(dòng)
always @ (posedge ext_clk_25m or negedge ext_rst_n)
    if(!ext_rst_n) begin
        led_en <= 1'b0;
        led_dir <= 1'b0;
    end
    else begin
        //流水燈開(kāi)啟/停止控制
        if(!switch[0]) led_en <= 1'b1;
        else led_en <= 1'b0;
        //流水燈方向控制
        if(key_press[0]) led_dir <=1'b0;  //從低到高流動(dòng)
        else if(key_press[1]) led_dir<= 1'b1; //從高到低流動(dòng)
        else ;
    end
    最后兩個(gè)always語(yǔ)句,前者對24bit計數器delay做循環(huán)計數,用于產(chǎn)生LED流水燈變化的切換頻率;后者則根據led_en和led_dir信號控制8個(gè)LED流水燈實(shí)現最終的工作與否以及流動(dòng)方向控制。
//------------------------------------
//LED流水燈變化延時(shí)計數器
reg[23:0] delay;   
always @ (posedge ext_clk_25m or negedge ext_rst_n)
    if(!ext_rst_n) delay <= 24'd0;
    else delay <= delay+1'b1;  
//-------------------------------------
//流水燈開(kāi)啟、停止和流動(dòng)切換控制
always @ (posedge ext_clk_25m or negedge ext_rst_n)
    if(!ext_rst_n) led <=8'b1111_1110;   
    else if((delay == 24'h3fffff)&& led_en) begin
        case (led_dir)
            1'b0: led <={led[6:0],led[7]};    //從低到高流動(dòng)  
            1'b1: led <={led[0],led[7:1]};    //從高到低流動(dòng)
            default: ;
        endcase
    end
    else ;
endmodule

本文地址:http://selenalain.com/thread-524215-1-1.html     【打印本頁(yè)】

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

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復 返回頂部 返回列表
午夜高清国产拍精品福利|亚洲色精品88色婷婷七月丁香|91久久精品无码一区|99久久国语露脸精品|动漫卡通亚洲综合专区48页