在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > Verilog HDL基礎(chǔ)之:實例5 交通燈控制器

            Verilog HDL基礎(chǔ)之:實例5 交通燈控制器

            作者: 時間:2017-06-05 來源:網(wǎng)絡(luò) 收藏

            本文引用地址:http://www.biyoush.com/article/201706/348840.htm

            實例的內(nèi)容及目標(biāo)

            1.實例的主要訓(xùn)練內(nèi)容

            本實例通過Verilog HDL語言設(shè)計一個簡易的交通等控制器,實現(xiàn)一個具有兩個方向、共8個燈并具有時間倒計時功能的交通燈功能。

            2.實例目標(biāo)

            通過本實例,讀者應(yīng)達(dá)到下面的目標(biāo)。

            • 掌握Verilog設(shè)計一個交通等控制器的方法。
            • 初步掌握Verilog語言的設(shè)計方法。

            原理簡介

            交通燈是城市交通中不可缺少的重要工具,是城市交通秩序的重要保障。本實例就是實現(xiàn)一個常見的十字路口交通燈功能。讀者通過學(xué)習(xí)這個,可以實現(xiàn)一個更加完整的交通燈。例如實現(xiàn)實時配置各種燈的時間,手動控制各個燈的狀態(tài)等。

            一個十字路口的交通一般分為兩個方向,每個方向具有紅燈、綠燈和黃燈3種,另外每個方向還具有左轉(zhuǎn)燈,因此每個方向具有4個燈。

            這個交通燈還為每一個燈的狀態(tài)設(shè)計了倒計時數(shù)碼管顯示功能??梢詾槊恳粋€燈的狀態(tài)設(shè)置一個初始值,燈狀態(tài)改變后,開始按照這個初始值倒計時。倒計時歸零后,燈的狀態(tài)將會改變至下一個狀態(tài)。

            值得注意的是,交通燈兩個方向的燈的狀態(tài)是相關(guān)的。也就是說,每個方向的燈的狀態(tài)影響著另外一個方向的燈的狀態(tài),這樣才能夠協(xié)調(diào)兩個方向的車流。如果每個方向的燈是獨立變化的,那么交通燈就沒有了意義。

            如表1所示是兩個方向(假設(shè)為A,B方向)燈的狀態(tài)的對應(yīng)情況。

            表1 交通燈兩個方向燈狀態(tài)對應(yīng)表

            方向A

            方向B

            紅燈亮

            黃燈亮或綠燈亮

            直行綠燈亮

            紅燈亮

            黃燈亮

            紅燈亮

            左轉(zhuǎn)燈

            紅燈亮

            在實際的交通系統(tǒng)中,直行綠燈、左轉(zhuǎn)綠燈和紅燈的變化之間都應(yīng)該有黃燈作為緩沖,以保證交通的安全。因此假如我們假設(shè)方向A的黃燈亮的時間持續(xù)5s,直行綠燈燈亮的時間持續(xù)40s,左轉(zhuǎn)燈燈亮的時間持續(xù)15s,則方向B紅燈燈亮的時間持續(xù)為(直行綠燈+黃燈+左轉(zhuǎn)綠燈+黃燈)所消耗的時間,一共為65s。

            同樣假設(shè)方向B黃燈亮的時間持續(xù)5s,直行綠燈燈亮的時間持續(xù)30s,左轉(zhuǎn)燈燈亮的時間持續(xù)15s,則方向B紅燈燈亮的時間持續(xù)為(直行綠燈+黃燈+左轉(zhuǎn)綠燈+黃燈)所消耗的時間,一共為55s。

            具體時間參數(shù)的設(shè)定讀者可以根據(jù)需要進(jìn)行修改,但是一定要保證兩個方向的燈的狀態(tài)符合表1的要求。

            代碼分析

            下面給出的Verilog HDL源代碼,首先介紹交通燈端口信號的定義及說明,讀者可以通過這些端口將此交通燈模塊實例化至自己的工程設(shè)計中。

            • CLK:同步時鐘。
            • EN:使能信號,為高電平時,控制器開始工作。
            • LAMPA:控制A方向4盞燈的狀態(tài);其中,LAMPA0~LAMPA3分別控制A 方向的左拐燈、綠燈、黃燈和紅燈。
            • LAMPB:控制B方向4盞燈的狀態(tài);其中,LAMPB0~LAMPB3分別控制B 方向的左拐燈、綠燈、黃燈和紅燈。
            • ACOUNT:用于A方向燈的時間顯示,8位,可驅(qū)動兩個數(shù)碼管。
            • BCOUNT:用于B方向燈的時間顯示,8位,可驅(qū)動兩個數(shù)碼管。

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

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

            output[7:0] ACOUNT,BCOUNT;

            output[3:0] LAMPA,LAMPB;

            input CLK,EN; //內(nèi)部信號說明

            reg[7:0] numa,numb; //ACOUNT和BCOUNT的內(nèi)部信號

            reg tempa,tempb;

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

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

            reg[3:0] LAMPA,LAMPB;

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

            always @(EN)

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

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

            ayellow =8d5; //5 s

            agreen =8d40; //40 s

            aleft =8d15; //15 s

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

            byellow =8d5; //5 s

            bleft =8d15; //15 s

            bgreen =8d30; //30 s

            end

            assign ACOUNT=numa; //8位數(shù)碼管輸出

            assign BCOUNT=numb; //8位數(shù)碼管輸出

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

            always @(posedge CLK) begin

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

            if(!tempa) begin

            tempa=1;

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

            0: begin //狀態(tài)0

            numa=agreen; //直行綠燈亮

            LAMPA=2; //輸出0010

            counta=1; //進(jìn)入下一個狀態(tài)

            end

            1: begin //狀態(tài)1

            numa=ayellow; //黃燈亮

            LAMPA=4; //輸出0100

            counta=2; //進(jìn)入下一個狀態(tài)

            end

            2: begin //狀態(tài)2

            numa=aleft; //左轉(zhuǎn)綠燈亮

            LAMPA=1; //輸出0001

            counta=3; //進(jìn)入下一個狀態(tài)

            end

            3: begin //狀態(tài)3

            numa=ayellow; //黃燈亮

            LAMPA=4; //輸出0100

            counta=4; //進(jìn)入下一個狀態(tài)

            end

            4: begin //狀態(tài)4

            numa=ared; //紅燈亮

            LAMPA=8; //輸出1000

            counta=0; //進(jìn)入下一個狀態(tài)(狀態(tài)0)

            end

            default: //默認(rèn)狀態(tài)

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

            endcase

            end

            else begin //每一個狀態(tài)的倒計時

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

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

            numa[3:0]=4b1001;

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

            end

            else

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

            if (numa==2)

            tempa=0; //倒計時結(jié)束,返回?zé)魻顟B(tài)變化判斷,將進(jìn)入下一個狀態(tài)

            end

            end

            else begin

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

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

            tempa=0; //進(jìn)入狀態(tài)變化判斷

            end

            end

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

            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=4b1000;

            tempb=0;

            countb=0;

            end

            end

            endmodule

            通過上面這個Verilog HDL模塊,基本實現(xiàn)了的基本功能。讀者可將此設(shè)計應(yīng)用于實際的硬件系統(tǒng)中,通過晶振、、開關(guān)、LED燈及數(shù)碼管等資源即可完成硬件實現(xiàn)。



            評論


            相關(guān)推薦

            技術(shù)專區(qū)

            關(guān)閉