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

          新聞中心

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

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

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

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

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

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

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

          2.實(shí)例目標(biāo)

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

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

          原理簡介

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

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

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

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

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

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

          方向A

          方向B

          紅燈亮

          黃燈亮或綠燈亮

          直行綠燈亮

          紅燈亮

          黃燈亮

          紅燈亮

          左轉(zhuǎn)燈

          紅燈亮

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

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

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

          代碼分析

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

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

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

          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ù)時(shí)間初始化值,紅燈的值由另一個(gè)方向的黃燈和綠燈計(jì)算得出。

          always @(EN)

          if(!EN) begin //使能信號(hào)EN無效時(shí),對交通燈的計(jì)數(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 //使能有效時(shí),交通燈開始工作

          if(!tempa) begin

          tempa=1;

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

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

          numa=agreen; //直行綠燈亮

          LAMPA=2; //輸出0010

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

          end

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

          numa=ayellow; //黃燈亮

          LAMPA=4; //輸出0100

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

          end

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

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

          LAMPA=1; //輸出0001

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

          end

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

          numa=ayellow; //黃燈亮

          LAMPA=4; //輸出0100

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

          end

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

          numa=ared; //紅燈亮

          LAMPA=8; //輸出1000

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

          end

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

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

          endcase

          end

          else begin //每一個(gè)狀態(tài)的倒計(jì)時(shí)

          if(numa>1) //判斷倒計(jì)時(shí)未歸零時(shí)分別對高地位進(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; //倒計(jì)時(shí)結(jié)束,返回?zé)魻顟B(tài)變化判斷,將進(jìn)入下一個(gè)狀態(tài)

          end

          end

          else begin

          LAMPA=4b1000; //使能無效時(shí),紅燈亮

          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 //倒計(jì)時(shí)

          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

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



          評(píng)論


          相關(guān)推薦

          技術(shù)專區(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); })();