找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 5570|回復(fù): 2
收起左側(cè)

基于FPGA的交通燈設(shè)計(jì) 附分頻主控譯碼VHDL源程序

[復(fù)制鏈接]
ID:556863 發(fā)表于 2020-11-16 20:07 | 顯示全部樓層 |閱讀模式

設(shè)計(jì)一個(gè)十字路口交通控制系統(tǒng),要求如下:

(1)東西、南北兩個(gè)方向均有綠燈、黃燈、紅燈指示,其持續(xù)時(shí)間分別為35秒、5秒、40秒,交通燈運(yùn)行的切換示意圖如圖1所示。

圖1 交通燈運(yùn)行切換示意圖

(2)系統(tǒng)設(shè)有時(shí)鐘,以倒計(jì)時(shí)的方式顯示每一路允許通行的時(shí)間。

3系統(tǒng)設(shè)計(jì)方案

本設(shè)計(jì)是基于FPGA的交通燈的設(shè)計(jì),故系統(tǒng)設(shè)計(jì)方案采用自上而下的頂層設(shè)計(jì),將整體設(shè)計(jì)方案分成若干個(gè)模塊分別進(jìn)行設(shè)計(jì),然后采用硬件語(yǔ)言VHDL生成元件和構(gòu)建原理圖的方式進(jìn)行整體設(shè)計(jì)。根據(jù)設(shè)計(jì)的任務(wù)要求,由系統(tǒng)內(nèi)部時(shí)鐘信號(hào)提供計(jì)時(shí)時(shí)間。而紅綠燈正常的工作由倒計(jì)時(shí)的時(shí)間控制,且倒計(jì)時(shí)的時(shí)間顯示由數(shù)碼管控制。故此本系統(tǒng)設(shè)計(jì)方案可以分為五個(gè)模塊:分頻器模塊,主控制器模塊,提取顯示值模塊,動(dòng)態(tài)掃描模塊,譯碼器模塊。其系統(tǒng)設(shè)計(jì)方案如圖2所示。

圖2  系統(tǒng)整體框圖

其中分頻器模塊用于24MHz分頻為1Hz;主控器模塊用于計(jì)時(shí)和控制紅綠燈的亮滅;提取顯示值模塊用于把倒計(jì)時(shí)兩位數(shù)時(shí)間能分別顯示在兩個(gè)數(shù)碼管上;動(dòng)態(tài)掃描模塊用于人眼能清晰地看出四位數(shù)碼管同時(shí)倒計(jì)時(shí)的時(shí)間;譯碼器模塊用于把倒計(jì)時(shí)的時(shí)間在數(shù)碼管顯示出來(lái)。

4 各模塊設(shè)計(jì)及仿真

4.1主控制器模塊

設(shè)計(jì)主控器的作用是根據(jù)計(jì)數(shù)器值控制發(fā)光二極管的亮滅以及輸出計(jì)數(shù)值。其中主控制器的計(jì)數(shù)范圍0——40。倒計(jì)時(shí)從40到1完成一次循環(huán)。其主控器模塊元件如圖3所示。

圖3 主控器模塊元件

主控器模塊的CLOCK是輸入端,當(dāng)時(shí)鐘信號(hào)接收到1Hz的脈沖時(shí),主控器開始計(jì)數(shù)的功能;REST是輸入端,進(jìn)行單獨(dú)控制,當(dāng)人為控制輸入高電平‘1’時(shí),A,B兩路紅燈亮起,停止計(jì)時(shí),交通燈的狀態(tài)進(jìn)行復(fù)位;NUMA,NUMB是輸出端,功能是計(jì)數(shù)值給七段數(shù)碼管的提取顯示值電路;六個(gè)指示燈也是輸出端,其功能根據(jù)倒計(jì)時(shí)值,顯示A,B路的紅綠燈亮滅。即A路35s倒計(jì)時(shí)顯示綠燈亮,5s倒計(jì)時(shí)顯示黃燈亮?xí)r,B路口40s倒計(jì)時(shí)顯示紅燈亮,B路口 35s倒計(jì)時(shí)顯示綠燈亮,然后5s黃燈亮?xí)r,A路口40s倒計(jì)時(shí)顯示紅燈亮。其仿真結(jié)果如圖4所示,通過(guò)觀察仿真,滿足設(shè)計(jì)需求,完成了實(shí)驗(yàn)預(yù)期效果。

圖4 主控器仿真圖

4.2  分頻器模塊

分頻器的設(shè)計(jì)是為了實(shí)現(xiàn)將高頻時(shí)鐘信號(hào)轉(zhuǎn)換成低頻的時(shí)鐘信號(hào),作用于主控器、提取顯示值和動(dòng)態(tài)掃描顯示電路。動(dòng)態(tài)掃描電路需要高頻率時(shí)鐘信號(hào),而主控器,提取顯示值則需要低頻率的時(shí)鐘信號(hào),才能精確計(jì)時(shí)和顯示。其分頻模塊如圖5所示。

圖5 分頻器模塊

分頻器模塊的輸入端CLK24M選用是24Mhz高頻率時(shí)鐘,其作用于動(dòng)態(tài)掃描。輸出端CLK1Hz則是通過(guò)分頻先將24Mhz經(jīng)過(guò)48分頻到500khz,在500000分頻到1hz。而主控器電路需要分頻成1hz低頻率用于計(jì)時(shí)。其仿真結(jié)果如圖6所示。通過(guò)觀察仿真,滿足設(shè)計(jì)需求,完成了實(shí)驗(yàn)預(yù)期效果。


圖6 24mhz分頻1hz時(shí)序仿真圖

4.3  提取顯示值模塊

提取顯示值模塊也可以稱為數(shù)碼管分位模塊,設(shè)計(jì)提取顯示值模塊是主控器輸出的倒計(jì)時(shí)數(shù)值是1位或者2位數(shù),而一個(gè)七段數(shù)碼管只能顯示一位數(shù)。為了倒計(jì)時(shí)能顯示兩位數(shù),所以在七段數(shù)碼管的譯碼電路前加一個(gè)分位電路。其模塊生成的元件如圖7所示。

圖7 提取顯示值模塊元件

其模塊輸入端CLK是接收1Hz的脈沖信號(hào),為了和主控器同步。輸入端numin與主控器的numa相連,其作用是為了把計(jì)數(shù)的兩位數(shù)值能分開顯示在兩個(gè)數(shù)碼管上。輸出端numa,numb是把輸入的兩位數(shù)分開輸出,即兩位數(shù)分成十位和個(gè)位。其仿真結(jié)果如圖8所示。通過(guò)觀察仿真,滿足設(shè)計(jì)需求,完成了實(shí)驗(yàn)預(yù)期效果。

圖8 提取顯示值仿真圖

4.4 動(dòng)態(tài)掃描模塊

設(shè)計(jì)動(dòng)態(tài)掃描模塊是為了能同時(shí)顯示出四個(gè)數(shù)碼管倒計(jì)時(shí)的動(dòng)態(tài)變化。其原理是利用人眼的余暉效應(yīng),而此時(shí)的脈沖需要高頻率的時(shí)鐘信號(hào)來(lái)點(diǎn)亮數(shù)碼管。其動(dòng)態(tài)掃描模塊如圖9所示。

圖9 動(dòng)態(tài)掃描模塊元件

此模塊元件輸入端clk時(shí)鐘信號(hào)受到24mhz的脈沖信號(hào),其數(shù)碼管中等亮滅速度遠(yuǎn)遠(yuǎn)大于人眼識(shí)別最少時(shí)間13毫秒,所以動(dòng)態(tài)掃描可以讓人眼感受不到閃爍。其中AH,AL,BH,BL表示A,B路的輸入端的高位和低位。當(dāng)輸入端輸入1、2、3、4時(shí),輸出端dout輸出的對(duì)應(yīng)實(shí)驗(yàn)板上的用于顯示倒計(jì)時(shí)的數(shù)碼管的位置。輸出端q為位循環(huán)輸出,顯示數(shù)值。其仿真結(jié)果如圖10所示。通過(guò)觀察仿真,滿足設(shè)計(jì)需求,完成了實(shí)驗(yàn)預(yù)期效果。

圖10 動(dòng)態(tài)掃描時(shí)序仿真圖

4.5 譯碼器模塊

譯碼器模塊的設(shè)計(jì)是將要顯示的數(shù)字轉(zhuǎn)換成能驅(qū)動(dòng)數(shù)碼管的信號(hào),通過(guò)輸入二進(jìn)制數(shù)值,輸出信號(hào)點(diǎn)亮二極管,顯示出倒計(jì)時(shí)的數(shù)值。譯碼器模塊如圖11所示。

圖11 譯碼器模塊元件

此模塊的輸入端dout與動(dòng)態(tài)掃描的輸出端dout相連,是把輸入的四位二進(jìn)制數(shù)轉(zhuǎn)換成輸出端led7s的7位二進(jìn)制信號(hào),用來(lái)驅(qū)動(dòng)數(shù)碼管顯示數(shù)值。其模塊仿真圖如圖12所示。通過(guò)觀察仿真,滿足設(shè)計(jì)需求,完成了實(shí)驗(yàn)預(yù)期效果。

圖12 譯碼器仿真圖

5 頂層電路設(shè)計(jì)

頂層電路的工作流程:24MHz經(jīng)過(guò)兩次48分頻和500000分頻產(chǎn)生1hz的脈沖信號(hào)作用于主控器模塊和提取顯示值模塊。主控器模塊控制紅綠燈的亮、滅和計(jì)數(shù),提取顯示值模塊用于把計(jì)數(shù)的兩位數(shù)分成十位和個(gè)位顯示。24MHz高頻率的時(shí)鐘信號(hào)作用于動(dòng)態(tài)掃描模塊,用來(lái)能同時(shí)顯示出四個(gè)數(shù)碼管倒計(jì)時(shí)的動(dòng)態(tài)變化。譯碼器模塊作用于數(shù)碼管來(lái)顯示數(shù)值。其頂層電路設(shè)計(jì)如圖13所示。

圖13 頂層電路設(shè)計(jì)

引腳配置如圖14所示。

圖14 引腳分配圖

通過(guò)對(duì)頂層電路的仿真,仿真結(jié)果如圖15所示。通過(guò)觀察仿真,滿足設(shè)計(jì)需求,完成了實(shí)驗(yàn)預(yù)期。

圖15 頂層電路仿真圖

6功能擴(kuò)展

根據(jù)進(jìn)一步的實(shí)驗(yàn)要求,聯(lián)系實(shí)際交通信號(hào)的燈的運(yùn)轉(zhuǎn)模式,添加緊急控制、閃爍、左轉(zhuǎn)和右三個(gè)狀態(tài)作為本次實(shí)驗(yàn)的功能擴(kuò)展。

(1)緊急控制:當(dāng)東西或南北兩路中的任一路出現(xiàn)特殊情況,系統(tǒng)可由交警手動(dòng)控制立即進(jìn)入特殊運(yùn)行狀態(tài),即紅燈全亮,時(shí)鐘停止計(jì)時(shí),東西、南北兩路所有車輛停止通行;當(dāng)特殊運(yùn)行狀態(tài)結(jié)束后,系統(tǒng)恢復(fù)工作,繼續(xù)正常運(yùn)行。

(2)閃爍:當(dāng)綠燈運(yùn)行結(jié)束需要點(diǎn)亮黃燈或者閃爍綠燈作為點(diǎn)亮紅燈前的過(guò)度狀態(tài)。此功能在原紅綠燈的基礎(chǔ)上進(jìn)行了擴(kuò)展,讓交通燈的變化顯得更人性化。

(3)右轉(zhuǎn)和左轉(zhuǎn):當(dāng)直行時(shí)右轉(zhuǎn)燈點(diǎn)亮10s后,熄滅右轉(zhuǎn)燈后點(diǎn)亮左轉(zhuǎn)向燈亮10s,熄滅左轉(zhuǎn)燈后直行綠燈點(diǎn)亮25s,直行燈熄滅后點(diǎn)亮黃燈閃爍5s,熄滅黃燈后點(diǎn)亮干路紅燈,運(yùn)行50s后循環(huán),支路干路一一對(duì)應(yīng),當(dāng)干路左、右轉(zhuǎn)向燈和直行綠燈亮起至黃燈熄滅,支路的紅燈一直點(diǎn)亮;當(dāng)支路左、右轉(zhuǎn)向燈和直行綠燈亮起至黃燈熄滅,干路的紅燈一直點(diǎn)亮;此功能擴(kuò)展在原任務(wù)基礎(chǔ)上添加左轉(zhuǎn)和右轉(zhuǎn)功能,完善了交通信號(hào)燈的功能。

6.1 擴(kuò)展的主控器模塊

擴(kuò)展的主控制器模塊的主要功能根據(jù)計(jì)數(shù)后的數(shù)值對(duì)輸出端elect分幾種情況控制紅綠燈的狀態(tài),以及輸出端rea7A,rea7B輸出計(jì)數(shù)。其擴(kuò)展后的主控器模塊如圖16所示。

圖16 擴(kuò)展后主控器模塊元件

此模塊的clk時(shí)鐘信號(hào)是接收1hz的脈沖,主控器開始計(jì)數(shù),而輸出端rea7A、rea7B功能是把計(jì)數(shù)的值給7段數(shù)碼管的分位譯碼電路。輸出端elect的功能是根據(jù)計(jì)數(shù)后分類幾種情況后,分別對(duì)紅綠燈進(jìn)行控制。輸入端rest是緊急控制按鍵,對(duì)rest輸入高電平(1)時(shí),A(干路)和B(支路)兩個(gè)路口紅燈亮起,計(jì)數(shù)停止。輸入低電平(0)時(shí),正常工作。對(duì)此模塊進(jìn)行仿真,其仿真結(jié)果如圖17所示。通過(guò)觀察仿真,滿足設(shè)計(jì)需求,完成了實(shí)驗(yàn)預(yù)期效果。

圖17 擴(kuò)展主控器仿真圖

6.2 LED燈控制模塊

LED燈控制模塊的功能是對(duì)直行,左轉(zhuǎn),右轉(zhuǎn),停止指示燈的控制,使其符合紅綠燈規(guī)則。其模塊如圖18所示。

圖18 LED燈控制模塊元件

此模塊中的clk10的時(shí)鐘信號(hào)是接收10hz的脈沖,是為了符合交通燈在遇到黃燈時(shí)閃爍的效果,10hz頻率是0.1s,人眼可以看到其閃爍變化。而輸入端elect是連接擴(kuò)展主控器的輸出端elect,其功能主要是通過(guò)對(duì)不同數(shù)值的選擇,而對(duì)輸出端10種指示燈控制,進(jìn)一步符合紅綠燈規(guī)則。即數(shù)值‘0’情況時(shí),發(fā)生緊急制動(dòng);數(shù)值‘1’情況時(shí),當(dāng)A(干路)右轉(zhuǎn)燈亮,數(shù)值‘2’情況時(shí);當(dāng)A(干路)左轉(zhuǎn)燈亮;數(shù)值‘3’情況時(shí),當(dāng)A(干路)直行燈亮;數(shù)值‘4’情況時(shí),當(dāng)A(干路)黃燈閃爍;在這四種情況下,B(支路)紅燈亮;同理另外四種情況,當(dāng)B(支路)綠燈亮?xí)r,A(干路)紅燈亮路。對(duì)此模塊進(jìn)行仿真,其仿真結(jié)果如圖19所示。通過(guò)觀察仿真,滿足設(shè)計(jì)需求,完成了實(shí)驗(yàn)預(yù)期效果。

圖19 LED燈控制仿真圖

7 擴(kuò)展的頂層設(shè)計(jì)

分頻器模塊,提取顯示值模塊,動(dòng)態(tài)掃描模塊,譯碼器模塊等設(shè)計(jì)都和前面的模塊設(shè)計(jì)一樣,就不再敘述。由于黃燈閃爍需要加一個(gè)10hz的時(shí)鐘信號(hào)脈沖,故多加一個(gè)分頻器。擴(kuò)展后的頂層設(shè)計(jì)流程和上述一樣,不再敘述。其頂層設(shè)計(jì)電路如圖20所示。

圖20 擴(kuò)展后設(shè)計(jì)電路

其引腳分頻如圖21所示。

圖21 引腳分配圖

通過(guò)對(duì)頂層電路的仿真,仿真結(jié)果如圖22所示。通過(guò)觀察仿真,滿足設(shè)計(jì)需求,完成了實(shí)驗(yàn)預(yù)期。

圖22 交通燈控制仿真圖
附錄

分頻器模塊程序:
48分頻:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY fenpin2 IS
PORT(         
      CLK24M : IN  STD_LOGIC;
      CLK500k: OUT STD_LOGIC );
END fenpin2;
ARCHITECTURE BEHAV OF fenpin2 IS
  SIGNAL  COUNTER : INTEGER RANGE 0 TO 23;
  SIGNAL  CLK: STD_LOGIC;

  BEGIN
    PROCESS(CLK24M)  
    BEGIN            
      IF CLK24M'EVENT AND CLK24M='1' THEN
        IF COUNTER=23 THEN
              CLK<= NOT CLK;
              COUNTER <= 0;
        ELSE  COUNTER <= COUNTER+1;
                            END IF;
      END IF;
    END PROCESS;
   CLK500k <= CLK;
END;  
500000分頻:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY fenpin3 IS
PORT(         
      CLK500k : IN  STD_LOGIC;
      CLK1hz: OUT STD_LOGIC );
END;
ARCHITECTURE BEHAV OF fenpin3 IS
  SIGNAL  COUNTER : INTEGER RANGE 0 TO 249999;
  SIGNAL  CLK: STD_LOGIC;
  BEGIN
    PROCESS(CLK500k)  
    BEGIN            
      IF CLK500k'EVENT AND CLK500k='1' THEN
        IF COUNTER=249999 THEN
                                   COUNTER<=0;
              CLK<= NOT CLK;
        ELSE  COUNTER <= COUNTER+1;
                            END IF;
      END IF;
    END PROCESS;
   CLK1hz <= CLK;
END;
24999分頻:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY fenpin1 IS
PORT(         
      CLK500k : IN  STD_LOGIC;
      CLK10hz: OUT STD_LOGIC );
END;
ARCHITECTURE BEHAV OF fenpin1 IS
  SIGNAL  COUNTER : INTEGER RANGE 0 TO 24999;
  SIGNAL  CLK: STD_LOGIC;
  BEGIN
    PROCESS(CLK500k)  
    BEGIN            
      IF CLK500k'EVENT AND CLK500k='1' THEN
        IF COUNTER=24999 THEN
                                   COUNTER<=0;
              CLK<= NOT CLK;
        ELSE  COUNTER <= COUNTER+1;
                            END IF;
      END IF;
    END PROCESS;
   CLK10hz <= CLK;
END;
主控器程序:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY zkq IS
PORT
(CLOCK: IN STD_LOGIC;
RESET: IN STD_LOGIC;
NUMA,NUMB: OUT INTEGER RANGE 0 TO 40;
RedA,GreenA,YellowA: OUT STD_LOGIC;
RedB,GreenB,YellowB: OUT STD_LOGIC
);
END;
ARCHITECTURE CONTROL OF zkq IS
SIGNAL COUNTNUM: INTEGER RANGE 0 TO 80;
BEGIN
PROCESS(CLOCK,RESET)
BEGIN
  IF RESET='1' THEN
    COUNTNUM<=0;
  ELSIF RISING_EDGE(CLOCK) THEN
    IF COUNTNUM=79 THEN
      COUNTNUM<=0;
    ELSE
      COUNTNUM<=COUNTNUM+1;
   END IF;
  END IF;
END PROCESS;
PROCESS(CLOCK)
BEGIN
   IF RISING_EDGE(CLOCK) THEN
              IF RESET='1' THEN
                  RedA<='1';
                            RedB<='1';
         ELSIF COUNTNUM<=34 THEN
         NUMA<=35-COUNTNUM;
         RedA<='0';
         GreenA<='1';
         YellowA<='0';
       ELSIF (COUNTNUM<=39) THEN
         NUMA<=40-COUNTNUM;
         RedA<='0';
         GreenA<='0';
         YellowA<='1';
       ELSE
         NUMA<=80-COUNTNUM;
         RedA<='1';
         GreenA<='0';
         YellowA<='0';
       END IF;
       IF COUNTNUM<=39 THEN
         NUMB<=40-COUNTNUM;
         RedB<='1';
         GreenB<='0';
         YellowB<='0';
       ELSIF COUNTNUM<=74 THEN
         NUMB<=75-COUNTNUM;
         RedB<='0';
         GreenB<='1';
         YellowB<='0';
       ELSE
         NUMB<=80-COUNTNUM;
         RedB<='0';
         GreenB<='0';
         YellowB<='1';
       END IF;
     END IF;
  END PROCESS;
END;
提取顯示值程序:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity xianshi is
port
(
  CLK:IN std_logic;
  numin:in integer range 0 to 40;
  numa,numb:out integer range 0 to 9
);
end;
architecture bhv of xianshi is
begin
process(CLK)
begin
if rising_edge(CLK) then
if numin=40 then
numa <= 4;
numb <= 0;
elsif numin>=30 then
numa <=3;
numb <=numin-30;
elsif numin>=20 then
numa <=2;
numb <=numin-20;
elsif numin>=10 then
numa <=1;
numb <=numin-10;
else
numa <=0;
numb <=numin;
end if;
end if;
end process;
end;
動(dòng)態(tài)掃描程序:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity dongtai is
port(
  AH,AL,BH,BL:in std_logic_vector(3 downto 0);
  clk:in std_logic;
  q:buffer std_logic_vector(2 downto 0);
  dout:out std_logic_vector(3 downto 0)
);
end;
architecture bhv of dongtai is
signal qin:integer range 7 downto 0;
begin
p1:process(clk)
begin
if(clk'event and clk='1') then
if qin>3 then
qin<=0;
else
qin<=qin+1;
end if;
end if;
end process p1;
p2: process(qin,AL,AH,BH,BL)
begin
case qin is
when 0 => dout<=AH(3 downto 0);q<="111";
when 1 => dout<=AL(3 downto 0);q<="110";
when 2 => dout<=BH(3 downto 0);q<="011";
when 3 => dout<=BL(3 downto 0);q<="010";
when others =>null;
end case;
end process p2;
end;
譯碼器程序:
library ieee;
use ieee.std_logic_1164.all;
entity smxs is
port
(
dout:in std_logic_vector(3 downto 0);
led7s:out std_logic_vector(6 downto 0)
);
end;
architecture bhv of smxs is
begin
process(dout)
begin
   case dout is
   when "0000" => led7s <="0111111";
   when "0001" => led7s <="0000110";
   when "0010" =>  led7s <= "1011011" ;
   when "0011" =>  led7s <= "1001111" ;
   when "0100" =>  led7s <= "1100110" ;
   when "0101" =>  led7s <= "1101101" ;
   when "0110" =>  led7s <= "1111101" ;
   when "0111" =>  led7s <= "0000111" ;
   when "1000" =>  led7s <= "1111111" ;
   when "1001" =>  led7s <= "1101111" ;
   when others => led7s <= "0000000" ;
              end case;
              end process;
              end;
擴(kuò)展后的程序
主控器程序:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity kuozkq is
port(

   clk:in std_logic;
              rest:in std_logic;
              elect:out integer range 0 to 8;
              rea7A:out integer range 0 to 100;
              rea7B:out integer range 0 to 100
);
end;
architecture bhv of kuozkq is
begin
process(clk,rest)
variable tep:integer range 0 to 100;
begin
if rest='1' then tep:=100;elect<=0;
else
if clk'event and clk='0' then
if tep>90 then elect<=1;rea7A<=tep-90;rea7B<=tep-50;tep:=tep-1;
elsif tep>80 then elect<=2;rea7A<=tep-80;rea7B<=tep-50;tep:=tep-1;
elsif tep>55 then elect<=3;rea7A<=tep-55;rea7B<=tep-50;tep:=tep-1;
elsif tep>50 then elect<=4;rea7A<=tep-50;rea7B<=tep-50;tep:=tep-1;
elsif tep>40 then elect<=5;rea7A<=tep;rea7B<=tep-40;tep:=tep-1;
elsif tep>30 then elect<=6;rea7A<=tep;rea7B<=tep-30;tep:=tep-1;
elsif tep>5 then elect<=7;rea7A<=tep;rea7B<=tep-5;tep:=tep-1;
elsif tep>0 then elect<=8;rea7A<=tep;rea7B<=tep;tep:=tep-1;
else elect<=8;rea7A<=tep;rea7B<=tep;tep:=100;
end if;
end if;
end if;
end process;
end bhv;
LED控制程序:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity kuoled is
port(
clk10:in std_logic;
elect:in integer range 0 to 8;
redA,greenA,yellowA,rightA,leftA:out std_logic;
redB,greenB,yellowB,rightB,leftB:out std_logic
);
end;
architecture bhv of kuoled  is
begin
process(clk10,elect)
begin
case elect is
when 0 => redA<='1';greenA<='0';yellowA<='0';rightA<='0';leftA<='0';redB<='1';greenB<='0';yellowB<='0';rightB<='0';leftB<='0';
when 1 => redA<='0';greenA<='0';yellowA<='0';rightA<='1';leftA<='0';redB<='1';greenB<='0';yellowB<='0';rightB<='0';leftB<='0';
when 2 => redA<='0';greenA<='0';yellowA<='0';rightA<='0';leftA<='1';redB<='1';greenB<='0';yellowB<='0';rightB<='0';leftB<='0';
when 3 => redA<='0';greenA<='1';yellowA<='0';rightA<='0';leftA<='0';redB<='1';greenB<='0';yellowB<='0';rightB<='0';leftB<='0';
when 4 => redA<='0';greenA<='0';yellowA<=clk10;rightA<='0';leftA<='0';redB<='1';greenB<='0';yellowB<='0';rightB<='0';leftB<='0';
when 5 => redA<='1';greenA<='0';yellowA<='0';rightA<='0';leftA<='0';redB<='0';greenB<='0';yellowB<='0';rightB<='1';leftB<='0';
when 6 => redA<='1';greenA<='0';yellowA<='0';rightA<='0';leftA<='0';redB<='0';greenB<='0';yellowB<='0';rightB<='0';leftB<='1';
when 7 => redA<='1';greenA<='0';yellowA<='0';rightA<='0';leftA<='0';redB<='0';greenB<='1';yellowB<='0';rightB<='0';leftB<='0';
when 8 => redA<='1';greenA<='0';yellowA<='0';rightA<='0';leftA<='0';redB<='0';greenB<='0';yellowB<=clk10;rightB<='0';leftB<='0';
when others =>null;
end case;
end process;
end;
擴(kuò)展的顯示程序:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY xianshi1 IS
PORT
(CLOCK:IN STD_LOGIC;
NUMIN:IN INTEGER RANGE 0 TO 99;
NUMA,NUMB:OUT INTEGER RANGE 0 TO 9
);
END;
ARCHITECTURE bhv OF xianshi1 IS
BEGIN
   PROCESS(CLOCK)
   BEGIN
     IF RISING_EDGE(CLOCK) THEN
               
       IF NUMIN>=10 THEN
         NUMA<=NUMIN/10;
         NUMB<=(NUMIN)rem(10);
                           
       ELSE
                               NUMA<=0;
                                          NUMB<=NUMIN;
       END IF;
     END IF;
   END PROCESS;
END;

以上圖文的Word格式文檔下載(內(nèi)容和本網(wǎng)頁(yè)上的一模一樣,方便大家保存):
基于FPGA的交通燈設(shè)計(jì).doc (2.37 MB, 下載次數(shù): 71)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:999139 發(fā)表于 2023-10-13 16:23 | 顯示全部樓層
請(qǐng)問(wèn)分頻的占空比是多少呀?
回復(fù)

使用道具 舉報(bào)

ID:1121694 發(fā)表于 2024-5-21 14:32 | 顯示全部樓層
我想請(qǐng)問(wèn)以下這些代碼可以在FPGA黑金板DB4CE15上實(shí)現(xiàn)嗎
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表