新聞中心

        EEPW首頁 > EDA/PCB > 設計應用 > Verilog HDL基礎教程之:實例5 交通燈控制器

        Verilog HDL基礎教程之:實例5 交通燈控制器

        作者: 時間:2013-08-22 來源:網絡 收藏

        下面是交通燈的 源代碼及說明。

        module traffic(CLK,EN,LAMPA,LAMPB,ACOUNT,BCOUNT); //端口說明

        output[7:0] ACOUNT,BCOUNT;

        output[3:0] LAMPA,LAMPB;

        input CLK,EN; //內部信號說明

        reg[7:0] numa,numb; //ACOUNT和BCOUNT的內部信號

        reg tempa,tempb;

        reg[2:0] counta,countb; //方向A和方向B的燈的狀態

        reg[7:0] ared,ayellow,agreen,aleft,bred,byellow,bgreen,bleft;

        reg[3:0] LAMPA,LAMPB;

        //設置各交通燈的持續時間初始化值,紅燈的值由另一個方向的黃燈和綠燈計算得出。

        always @(EN)

        if(!EN) begin //使能信號EN無效時,對交通燈的計數值進行初始化

        ared =8'd55; //55 s , 30 + 5 + 15 + 5

        ayellow =8'd5; //5 s

        agreen =8'd40; //40 s

        aleft =8'd15; //15 s

        bred =8'd65; //65 s , 40 + 5 + 15 + 5

        byellow =8'd5; //5 s

        bleft =8'd15; //15 s

        bgreen =8'd30; //30 s

        end

        assign ACOUNT=numa; //8位數碼管輸出

        assign BCOUNT=numb; //8位數碼管輸出

        //控制A方向4種燈的模塊

        always @(posedge CLK) begin

        if(EN) begin //使能有效時,交通燈開始工作

        if(!tempa) begin

        tempa=1;

        case(counta) //控制燈狀態的順序

        0: begin //狀態0

        numa=agreen; //直行綠燈亮

        LAMPA=2; //輸出0010

        counta=1; //進入下一個狀態

        end

        1: begin //狀態1

        numa=ayellow; //黃燈亮

        LAMPA=4; //輸出0100

        counta=2; //進入下一個狀態

        end

        2: begin //狀態2

        numa=aleft; //左轉綠燈亮

        LAMPA=1; //輸出0001

        counta=3; //進入下一個狀態

        end

        3: begin //狀態3

        numa=ayellow; //黃燈亮

        LAMPA=4; //輸出0100

        counta=4; //進入下一個狀態

        end

        4: begin //狀態4

        numa=ared; //紅燈亮

        LAMPA=8; //輸出1000

        counta=0; //進入下一個狀態(狀態0)

        end

        default: //默認狀態

        LAMPA=8; //紅燈亮,輸出1000

        endcase

        end

        else begin //每一個狀態的倒計時

        if(numa>1) //判斷倒計時未歸零時分別對高地位進行遞減

        if(numa[3:0]==0) begin

        numa[3:0]=4'b1001;

        numa[7:4]=numa[7:4]-1;

        end

        else

        numa[3:0]=numa[3:0]-1;

        if (numa==2)

        tempa=0; //倒計時結束,返回燈狀態變化判斷,將進入下一個狀態

        end

        end

        else begin

        LAMPA=4'b1000; //使能無效時,紅燈亮

        counta=0; //返回方向A的狀態0(綠燈狀態)

        tempa=0; //進入狀態變化判斷

        end

        end

        //控制B方向4種燈的模塊,模塊的語言描述與方向A的描述基本一致,這里不再重復注釋

        always @(posedge CLK) begin

        if (EN) begin

        if(!tempb) begin

        tempb=1;

        case (countb)

        0: begin

        numb=bred;

        LAMPB=8;

        countb=1;

        end

        1: begin

        numb=bgreen;

        LAMPB=2;

        countb=2;

        end

        2: begin

        numb=byellow;

        LAMPB=4;

        countb=3;

        end

        3: begin

        numb=bleft;

        LAMPB=1;

        countb=4;

        end

        4: begin

        numb=byellow;

        LAMPB=4;

        countb=0;

        end

        default:

        LAMPB=8;

        endcase

        end

        else begin //倒計時

        if(numb>1)

        if(!numb[3:0]) begin

        numb[3:0]=9;

        numb[7:4]=numb[7:4]-1;

        end

        else

        numb[3:0]=numb[3:0]-1;

        if(numb==2)

        tempb=0;

        end

        end

        else begin

        LAMPB=4'b1000;

        tempb=0;

        countb=0;

        end

        end

        endmodule

        通過上面這個 模塊,基本實現了交通燈控制器的基本功能。讀者可將此設計應用于實際的硬件系統中,通過晶振、FPGA、開關、LED燈及數碼管等資源即可完成硬件實現。


        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 汶川县| 铜鼓县| 儋州市| 浪卡子县| 安化县| 崇义县| 桂东县| 登封市| 广元市| 马山县| 阆中市| 荆州市| 固阳县| 孟连| 宣汉县| 淅川县| 苏尼特右旗| 米易县| 通州市| 黎城县| 黑水县| 鄂伦春自治旗| 宁波市| 正宁县| 延津县| 文山县| 天祝| 卢湾区| 阆中市| 镶黄旗| 平阴县| 绿春县| 咸阳市| 朝阳县| 东港市| 娄烦县| 定边县| 龙川县| 衡东县| 南平市| 顺义区|