第一篇:基于FPGA的彩燈控制器設計
鄭州輕工業學院
可編程數字系統設計
題 目 學生姓名 專業班級 學 號 院(系)指導教師 完成時間
基于FPGA的彩燈控制器的設計 張煥煥 電子信息工程10-2班 電氣信息工程學院
基于FPGA的彩燈控制器設計
摘 要
隨著科技的發展 , 在現代生活中, 彩燈作為一種景觀應用越來越多。而在電子電路設計領域中,電子設計自動化(EDA)工具已成為主要的設計手段,VHDL語言則是EDA的關鍵技術之一,它采用自頂向下的設計方法,即從系統總體要求出發,自上至下地將設計任務分解為不同的功能模塊,最后將各功能模塊連接形成頂層模塊,完成系統硬件的整體設計。本文介紹了基于EDA技的多路彩燈控制器的設計與分析。在MAX+PLUSII環境下采用VHDL語言實現,論述了基于VHDL語言和FPGA芯片的數字系統設計思想和實現過程。電子設計自動化技術EDA的發展給電子系統的設計帶來了革命性的變化,EDA軟件設計工具,硬件描述語言,可編程邏輯器件使得EDA技術的應用走向普及。FPGA是新型的可編程邏輯器件,采用FPGA進行產品開發可以靈活地進行模塊配置,大大縮短了產品開發周期,也有利于產品向小型化,集成化的方向發展。
關鍵詞: VHDL 彩燈 仿真
1、概述
1.1、設計目的:
設計一個彩燈控制器,使彩燈(LED管)可以實現四種花樣循環變化及兩種不同頻率的閃爍,有復位開關。整個系統有七個輸入信號CLK,CLR,A,B,C,D,OPT,六個輸出信號控制六個彩燈。OPT的高低電平控制彩燈閃爍的快慢,A,B,C,D控制各種不同花樣彩燈的變換。此彩燈控制系統設定有四種花樣變化。四種花樣分別為:a.彩燈從左到右逐次亮起,再逐次從右到左熄滅;b.彩燈兩邊同時亮兩個,再逐次向中間亮;c.彩燈從左到右兩個兩個的亮,再從右到左兩個兩個逐次的亮;d.彩燈中間兩個亮,再同時向兩邊散開。
1.2、設計要求:
? 掌握FPGA 的程序設計方法。? 掌握硬件描述語言語法。
? 程序設計完成后要求在軟件中實現功能仿真。
2、系統設計
2.1、設計原理:
整個系統共有七個輸入信號:基準時鐘信號CLK,系統清零信號(復位信號)CLR,彩燈節奏快慢選擇開關OPT;共有4個輸出信號Q[3..0],分別用于控制四路彩燈。據此,我們可將整個彩燈控制器CDKZQ分為四大部分:彩燈花樣控制部分、分頻部分、定時部分和計數部分。當各個模塊均完成上述操作之后,形成最后的四路彩燈顯示系統,并且進行仿真。仿真通過,即可下載到指定的FPGA芯片里面,并進行實際連線,進行最后的硬件測試。把分頻部分的不同頻率的時鐘信號CP輸送到計數部分 ,從而控制彩燈閃爍速度的快慢 ,定時部分控制每種速度維持的時間長短。
圖表 1 2.
2、設計方案:
在電路中以 1 代表燈亮,以 0 代表燈滅,由 0、1按不同的規律組合代表不同的燈光圖案,同時使其選擇不同的頻率,從而實現多種圖案多種頻率的花樣功能顯示。在該電路中只需簡單的修改程序就可以靈活地調整彩燈圖案和變化方式。下面就以一個四路彩燈控制系統的實現為例進行簡單說明。此四路彩燈控制系統設定有四種花樣變化。彩燈圖案狀態變換的速度有快、慢兩種。
3、程序仿真過程
start compilation先編譯
generate functional simulation netlist然后生成功能仿真網絡表 assignments–setting—simulation setting設置成功能仿真 然后新建一個vector waveform file 通過view—utility windows--node finder 把輸入輸出管腳添加進波形仿真圖里 點擊start simulation 得到仿真圖WAVEFORM1:
由圖可見:正常情況下 燈按照花樣abcd的順序循環d在80NS---120NS的高電平使得花樣變為D花樣,D高電平結束,燈順序進行A花樣。
OPT 在80NS---170NS高電平使得燈變換速度提高2倍 但是001100和100000這兩種燈的狀態任然占用了兩個時鐘周期,這是因為花樣d和花樣a狀態轉換之間沒有立即銜接,導致220NS處CLR高電平使得燈全部清0,不再變化DIV2是二分頻輸出,由圖可見是輸入時鐘CLK的二分頻
4、實驗結果分析
實驗表明 ,此設計方法能夠滿足多種不同花樣彩燈的變化要求 ,并且該方法便于擴展不同變化模式的彩燈花樣,同時又實現了彩燈的兩種不同頻率的閃爍。如果不按任何按鍵時候,燈就按四種花樣順序循環跑,如果按下某個鍵再松開,比如按下C鍵然后松開,那么不管之前燈跑到哪個花樣,按鍵后燈就會從C代表的花樣處開始跑,然后是D花樣,然后是A花樣,依次循環。但是A,B,C,D認為是按下會彈起的按鍵,因為這個程序里,如果一直按著按鍵不松手,會導致燈只是反復跑一個花樣。比如按著B鍵不松手,那么就會反復跑B花樣。還有不能允許同時按下兩個鍵,三個鍵,4個鍵,也就是說,同一時刻ABCD只能有一個是高電平,否則會出錯,因為這個程序并沒有防錯機制。
5、心得體會
本次設計的課題是彩燈控制器的設計,當拿到這個課題的時候經過分析就知道關鍵是計數器和分頻器的使用,分頻的方法有很多種,對于同一種功能的實現,用VHDL可以采用多種方式進行描述,每種方式之間各有優劣,本次設計只采用了其中較簡單的一種,應盡量用最簡潔的語言寫出所需功能的程序。
通過這次課程設計對EDA技術有了更進一步的熟悉,VHDL 語言和C語言等其他語言還是有很大的區別。VHDL是EDA技術的重要組成部分,其具有與具體硬件電路無關和與設計平臺無關的特性,并且具有良好的電路行為描述和系統描述的能力,并在語言易讀性和層次化、結構化設計方面,表現了強大的生命力和應用潛力。其主要的也是最大的優點就在于設計者可以專心致力于其功能的實現,而不需要對不影響功能的與工藝有關的因素花費過多的時間和精力。在實際操作中發現設計和課本上的知識有很大聯系,但又高于課本,一個簡單的原理要把它應用以及和其他功能綜合起來就有些困難。通過設計也鞏固了我們的書本知識以及通過借閱書籍和上網查找資料,也豐富了自己對EDA的了解。
6、致謝
7、參考文獻
[1] 周潤景.基于QuartusⅡ的FPGA/CPLD數字系統設計實例[M].電子工業出版社.2007,8
[2] 潘松 黃繼業.EDA技術實用教程(第二版).北京:科學出版社,2006.9 [3] 林明權 馬維旻 VHDL數字控制系統設計范例.電子工業出版社2003,1 [4] 褚振勇.FPGA設計及應用(第三版)[M].西安電子科技大學出版社.2012,4
8、附錄
彩燈控制器的源程序
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity horseracelamp is port(clk:in std_logic;clr:in std_logic;a:in std_logic;b:in std_logic;c:in std_logic;d:in std_logic;opt:in std_logic;q:out std_logic_vector(5 downto 0);div2:out std_logic);end;architecture one of horseracelamp is
type states is(s0,s1,s2,s3);
signal present:states;
signal q1:std_logic_vector(5 downto 0);
signal count:std_logic_vector(3 downto 0);
signal halfclk:std_logic_vector(1 downto 0);
signal clkin:std_logic_vector(1 downto 0);begin
process(clk)--------------------該進程實現二分頻 begin if clk'event and clk='1' then
halfclk<=halfclk+1;end if;end process;
process(opt)---------------------該進程實現OPT高時候用原來的時鐘,OPT低的時候用二分頻后的時鐘,信號CLKIN(0)會傳遞到下一個進程里
begin
if opt='0' then
clkin(0)<=halfclk(0);
else
clkin(0)<=clk;
end if;
end process;
process(clk,clr,a,b,c,d)
------------S1,S2,S3,S4分別對應
A,B,C,D四種花樣,它們之間會自動按順序循環,也
會因為A,B,C,D中某個置高而改變循環順序,所以用了大量的IF ELSIF語句
begin if clr='1' then
present<=s0;
q1<=(others=>'0');elsif clkin(0)'event and clkin(0)='1' then
case present is
when s0=>if q1=“000000”then
q1<=“100000”;else
if count=“1100” then
count<=(others=>'0');q1<=“100001”;present<=s1;
elsif b='1'then
count<=(others=>'0');
q1<=“100001”;
present<=s1;
elsif c='1'then
count<=(others=>'0');
q1<=“110000”;
present<=s2;
elsif d='1'then count<=(others=>'0');
q1<=“001100”;
present<=s3;
else
case count is when “0000”=>q1<=“100000”;when “0001”=>q1<=“110000”;when “0010”=>q1<=“111000”;when “0011”=>q1<=“111100”;when “0100”=>q1<=“111110”;when “0101”=>q1<=“111111”;when “0110”=>q1<=“111110”;when “0111”=>q1<=“111100”;when “1000”=>q1<=“111000”;when “1001”=>q1<=“110000”;when “1010”=>q1<=“100000”;when “1011”=>q1<=“000000”;when others=>null;end case;
count<=count+1;present<=s0;
end if;end if;
when s1=>if count=“0011” then
count<=(others=>'0');q1<=“110000”;present<=s2;elsif a='1'then
count<=(others=>'0');
q1<=“100000”;
present<=s0;
elsif c='1'then
count<=(others=>'0');
q1<=“110000”;
present<=s2;
elsif d='1'then count<=(others=>'0');
q1<=“001100”;
present<=s3;
else
case count is when “0000”=>q1<=“100001”;when “0001”=>q1<=“110011”;when “0010”=>q1<=“111111”;when others=>null;end case;
count<=count+1;present<=s1;
end if;
when s2=>if count=“0110” then
count<=(others=>'0');q1<=“001100”;present<=s3;elsif a='1'then
count<=(others=>'0');
q1<=“100000”;
present<=s0;
elsif b='1'then
count<=(others=>'0');
q1<=“100001”;
present<=s1;
elsif d='1'then count<=(others=>'0');
q1<=“001100”;
present<=s3;
else
case count is
when “0000”=>q1<=“110000”;when “0001”=>q1<=“111100”;when “0010”=>q1<=“111111”;when “0011”=>q1<=“000011”;when “0100”=>q1<=“001100”;when “0101”=>q1<=“110000”;when others=>null;end case;
count<=count+1;present<=s2;
end if;
when s3=>if count=“0011” then
count<=(others=>'0');q1<=“100000”;present<=s0;elsif a='1'then
count<=(others=>'0');
q1<=“100000”;
present<=s0;
elsif b='1'then
count<=(others=>'0');
q1<=“100001”;
present<=s1;
elsif c='1'then count<=(others=>'0');
q1<=“110000”;
present<=s2;
else
case count is when “0000”=>q1<=“001100”;when “0001”=>q1<=“010010”;when “0010”=>q1<=“100001”;when others=>null;end case;
count<=count+1;present<=s3;
end if;
end case;
end if;
end process;
div2<=halfclk(0);
q<=q1;
end;
第二篇:基于FPGA的彩燈控制器設計
《EDA原理及應用》 課程設計報告
課題名稱: 基于數碼管顯示的彩燈控制器 院 系: 機電工程學院
專 業: 電子信息工程
學生姓名: 陳納爽 學生學號: 201033285123
彩燈及數碼管顯示控制
摘 要
隨著科技的發展 , 在現代生活中, 彩燈作為一種景觀應用越來越多。而在電子電路設計領域中,電子設計自動化(EDA)工具已成為主要的設計手段,VHDL語言則是EDA的關鍵技術之一,它采用自頂向下的設計方法,即從系統總體要求出發,自上至下地將設計任務分解為不同的功能模塊,最后將各功能模塊連接形成頂層模塊,完成系統硬件的整體設計。本文介紹了基于EDA技的多路彩燈控制器的設計與分析。在MAX+PLUSII環境下采用VHDL語言實現,論述了基于VHDL語言和FPGA芯片的數字系統設計思想和實現過程。電子設計自動化技術EDA的發展給電子系統的設計帶來了革命性的變化,EDA軟件設計工具,硬件描述語言,可編程邏輯器件使得EDA技術的應用走向普及。FPGA是新型的可編程邏輯器件,采用FPGA進行產品開發可以靈活地進行模塊配置,大大縮短了產品開發周期,也有利于產品向小型化,集成化的方向發展。
關鍵詞: VHDL 彩燈 仿真
1、概述
1.1、設計目的:
設計一個彩燈控制器,使彩燈(LED管)可以實現彩燈逐漸增多及兩種不同頻率的閃爍,有復位開關。整個系統有四個輸入信號clk,option,fan,clr,三個輸出信號控制倆個八路彩燈及數碼管顯示。option的高低電平控制彩燈閃爍的快慢,fan的高低電平控制彩燈的逐漸增多減少。
1.2、設計要求:
? 掌握FPGA 的程序設計方法。? 掌握硬件描述語言語法。
? 程序設計完成后要求在軟件中實現功能仿真。
2、系統設計
2.1、設計原理:
整個系統共有四個輸入信號:基準時鐘信號clk,系統清零信號(復位信號)clr,彩燈節奏快慢選擇開關option;共有3個輸出信號ledout[7..0],shuguan[6..0],doubleled[7..0],分別用于控制彩燈及數碼管的顯示。據此,我們可將整個彩燈控制器CDKZQ分為四大部分:彩燈花樣控制部分、分頻部分、定時部分和計數部分。當各個模塊均完成上述操作之后,形成最后的彩燈顯示系統,并且進行仿真。仿真通過,即可下載到指定的FPGA芯片里面,并進行實際連線,進行最后的硬件測試。把分頻部分的不同頻率的時鐘信號CP輸送到計數部分 ,從而控制彩燈閃爍速度的快慢 ,定時部分控制每種速度維持的時間長短。
原理圖
模塊原理圖
管腳圖
2.2、設計方案:
在電路中以 1 代表燈亮,以 0 代表燈滅,由 0、1按不同的規律組合代表不同的燈光圖案,同時使其選擇不同的頻率,從而實現多種圖案多種頻率的花樣功能顯示。在該電路中只需簡單的修改程序就可以靈活地調整彩燈圖案和變化方式。下面就以一個彩燈控制系統的實現為例進行簡單說明。此彩燈控制系統設定有兩種花樣變化。彩燈圖案狀態變換的速度有快、慢兩種。
3、程序仿真圖
start compilation先編譯
generate functional simulation netlist然后生成功能仿真網絡表 assignments–setting—simulation setting設置成功能仿真 然后新建一個vector waveform file 通過view—utility windows--node finder 把輸入輸出管腳添加進波形仿真圖里 點擊start simulation 得到仿真圖WAVEFORM1:
4、實驗結果分析
實驗表明 ,此設計方法能夠滿足多種不同花樣彩燈的變化要求 ,并且該方法便于擴展不同變化模式的彩燈花樣,同時又實現了彩燈的兩種不同頻率的閃爍。如果不按任何按鍵時候,燈就按四種花樣順序循環跑,如果按下某個鍵再松開,比如按下C鍵然后松開,那么不管之前燈跑到哪個花樣,按鍵后燈就會從C代表的花樣處開始跑,然后是D花樣,然后是A花樣,依次循環。但是A,B,C,D認為是按下會彈起的按鍵,因為這個程序里,如果一直按著按鍵不松手,會導致燈只是反復跑一個花樣。比如按著B鍵不松手,那么就會反復跑B花樣。還有不能允許同時按下兩個鍵,三個鍵,4個鍵,也就是說,同一時刻ABCD只能有一個是高電平,否則會出錯,因為這個程序并沒有防錯機制。
5、心得體會
本次設計的課題是彩燈控制器的設計,當拿到這個課題的時候經過分析就知道關鍵是計數器和分頻器的使用,分頻的方法有很多種,對于同一種功能的實現,用VHDL可以采用多種方式進行描述,每種方式之間各有優劣,本次設計只采用了其中較簡單的一種,應盡量用最簡潔的語言寫出所需功能的程序。
通過這次課程設計對EDA技術有了更進一步的熟悉,VHDL 語言和C語言等其他語言還是有很大的區別。VHDL是EDA技術的重要組成部分,其具有與具體硬件電路無關和與設計平臺無關的特性,并且具有良好的電路行為描述和系統描述的能力,并在語言易讀性和層次化、結構化設計方面,表現了強大的生命力和應用潛力。其主要的也是最大的優點就在于設計者可以專心致力于其功能的實現,而不需要對不影響功能的與工藝有關的因素花費過多的時間和精力。在實際操作中發現設計和課本上的知識有很大聯系,但又高于課本,一個簡單的原理要把它應用以及和其他功能綜合起來就有些困難。通過設計也鞏固了我們的書本知識以及通過借閱書籍和上網查找資料,也豐富了自己對EDA的了解。
6、致謝
7、參考文獻
[1] 周潤景.基于QuartusⅡ的FPGA/CPLD數字系統設計實例[M].電子工業出版社.2007,8
[2] 潘松 黃繼業.EDA技術實用教程(第二版).北京:科學出版社,2006.9 [3] 林明權 馬維旻 VHDL數字控制系統設計范例.電子工業出版社2003,1 [4] 褚振勇.FPGA設計及應用(第三版)[M].西安電子科技大學出版社.2012,4
8、附錄
彩燈顯示控制器的源程序
library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;
----Uncomment the following library declaration if instantiating----any Xilinx primitives in this code.--library UNISIM;--use UNISIM.VComponents.all;
entity colorled is
Port(clk : in STD_LOGIC;
clr : in STD_LOGIC;
option : in STD_LOGIC;
fan:in std_logic;
ledout:out STD_LOGIC_VECTOR(7 downto 0);
shuma:out std_logic_vector(6 downto 0);
doubleled:out std_logic_vector(7 downto 0));end colorled;architecture rtl of colorled is component timer is port(clk : in std_logic;
clr : in std_logic;
option : in std_logic;fan:in std_logic;fanout:out std_logic;clkout : out std_logic);end component timer;component shower is port(clk : in std_logic;
clr : in std_logic;
fanin:in std_logic;ledout:out std_logic_vector(7 downto 0);shuma:out std_logic_vector(6 downto 0);
doubleled:out std_logic_vector(7 downto 0));end component shower;signal clk_tmp:std_logic;signal fan_tmp:std_logic;begin U1:timer port map(clk,clr,option,fan,fan_tmp,clk_tmp);U2:shower port map(clk_tmp,clr,fan_tmp,ledout,shuma,doubleled);end rtl;以上為頂層文件代碼
以下為分頻計數模塊及彩燈顯示控制模塊的代碼 library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;----Uncomment the following library declaration if instantiating----any Xilinx primitives in this code.--library UNISIM;--use UNISIM.VComponents.all;entity timer is
Port(clk : in STD_LOGIC;--時鐘
clr : in STD_LOGIC;--復位
fan:in std_logic;
fanout:out std_logic;
option : in STD_LOGIC;--快慢分頻
clkout : out STD_LOGIC);--輸出時鐘 end timer;architecture rtl of timer is signal clk_tmp:std_logic;signal fan_tmp:std_logic;--signal counter:std_logic_vector(1 downto 0);--計數器 signal counter:integer range 0 to 16000000;begin process(clk,clr,option)begin
if clr='1' then
clk_tmp<='0';
counter<=0;elsif clk'event and clk='1' then
if option='0' then--四分頻
if counter=16000000 then
counter<=0;clk_tmp<=not clk_tmp;else
counter<=counter+1;
end if;
else--八分頻
if counter=8000000 then
counter<=0;clk_tmp<=not clk_tmp;else
counter<=counter+1;end if;
end if;end if;end process;--begin--
if clr='1' then--
clk_tmp<='0';--
counter<=“00”;--elsif clk'event and clk='1' then--
if option='0' then--四分頻----------
if counter=“01” then
counter<=“00”;clk_tmp<=not clk_tmp;else
counter<=counter+'1';------------------
end if;
else--八分頻
if counter=“11” then
counter<=“00”;clk_tmp<=not clk_tmp;else
counter<=counter+'1';end if;
end if;--end if;--end process;clkout<=clk_tmp;--輸出分頻時鐘 fan_tmp<=fan;fanout<=fan_tmp;end rtl;
library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;----Uncomment the following library declaration if instantiating----any Xilinx primitives in this code.--library UNISIM;--use UNISIM.VComponents.all;
entity shower is
Port(clk : in STD_LOGIC;
clr : in STD_LOGIC;
fanin:in std_logic;
ledout:out STD_LOGIC_VECTOR(7 downto 0);出
doubleled:out std_logic_vector(7 downto 0));
shuma:out std_logic_vector(6 downto 0);--8位彩燈輸end shower;
architecture rtl of shower is type states is
(s0,s1,s2,s3,s4,s5,s6,s7);--Moore狀態 signal state:states;begin process(clk,clr,fanin)begin
if clr='1' then
state<=s0;
ledout<=“00000000”;
doubleled<=“00000000”;
shuma<=“0000000”;
elsif clk'event and clk='1' then
case state is
when s0=>
if fanin='1' then
state<=s7;
ledout<=“11111110”;
doubleled<=“11111110”;
shuma<=“1111001”;
else
state<=s1;
ledout<=“00000000”;
doubleled<=“00000000”;
shuma<=“0000000”;end if;when s1=> if fanin='1' then
state<=s0;
ledout<=“00000000”;
doubleled<=“00000000”;
shuma<=“0000000”;else
state<=s2;
ledout<=“10000000”;
doubleled<=“10000000”;
shuma<=“1111000”;
end if;
when s2=> if fanin='1' then
state<=s1;
ledout<=“10000000”;
doubleled<=“10000000”;
shuma<=“1111000”;
else
state<=s3;
ledout<=“11000000”;
doubleled<=“11000000”;
shuma<=“0000010”;
end if;
when s3=>
if fanin='1' then
state<=s2;
ledout<=“11000000”;
doubleled<=“11000000”;
shuma<=“0000010”;
else
state<=s4;
ledout<=“11100000”;
doubleled<=“11100000”;
shuma<=“0010010”;end if;when s4=> if fanin='1' then
state<=s3;
ledout<=“11100000”;
doubleled<=“11100000”;
shuma<=“0010010”;else
state<=s5;
ledout<=“11110000”;
doubleled<=“11110000”;
shuma<=“0011001”;
end if;when s5=> if fanin='1' then
state<=s4;
ledout<=“11110000”;
doubleled<=“11110000”;
shuma<=“0011001”;else
state<=s6;
ledout<=“11111000”;
doubleled<=“11111000”;
shuma<=“0110000”;end if;when s6=> if fanin='1' then
state<=s5;
ledout<=“11111000”;
doubleled<=“11111000”;
shuma<=“0110000”;else
state<=s7;
ledout<=“11111100”;
doubleled<=“11111100”;
shuma<=“0100100”;end if;
when s7=>
if fanin='1' then
state<=s6;
ledout<=“11111100”;
doubleled<=“11111100”;
shuma<=“0100100”;
else
state<=s0;
ledout<=“11111110”;
doubleled<=“11111110”;
shuma<=“1111001”;
end if;
end case;end if;end process;end rtl;
第三篇:基于FPGA的交通燈控制器設計
數字系統課程設計
基于FPGA的交通控制燈設計
姓名:
學號:
班級:
摘要
隨著社會的發展,城市規模的不斷擴大,城市交通成為制約城市發展的一大因素。人口和汽車日益增長,市區交通也日益擁擠,人們的安全問題當然也日益重要。因此,紅綠交通信號燈成為交管部門管理交通的重要工具之一。有了交通燈,人們的安全出行也有了很大的保障。自從交通燈誕生以來,其內部的電路控制系統就不斷的被改進,設計方法也開始多種多樣,從而使交通燈顯得更加智能化。尤其是近幾年來,隨著電子與計算機技術的飛速發展,電子電路分析和設計方法有了很大的改進,電子設計自動化也已經成為現代電子系統中不可或缺的工具和手段,這些都為交通燈控制系統的設計提供了一定的技術基礎。本課程設計運用erilog HDL語言描述交通控制器,通過狀態機計數法,實現設計所要求的交通燈控制及時間顯示,并最后進行了軟件實現,達到了系統要求的功能。
設計原理
1.1設計要求
設計一個交通控制器,用LED顯示燈表示交通狀態,并以7段數碼顯示器顯示當前狀態剩余秒數 主干道綠燈亮時,支干道紅燈亮;反之亦然,二者交替允許通行,主干道每次放行35s,支干道每次放行25s。每次由綠燈變為紅燈的過程中,亮光的黃燈作為過渡,黃燈的時間為5s。能進行特殊狀態顯示,特殊狀態時東西、南北路口均顯示紅燈狀態。用LED燈顯示倒計時,并且能實現總體清零功能,計數器由初始狀態開始計數,對應狀態的顯示燈亮。能實現特殊狀態的功能顯示,1.2設計思路和原理
本次設計是針對十字路口,進行南北和東西直行情況下交通燈控制。設定東西方向為主干道方向,根據交通燈的亮的規則,在初始狀態下四個方向的都為紅燈亮啟,進入正常工作狀態后,當主干道上綠燈亮時,支干道上紅燈亮,持續35S后,主干道和支干道上的黃燈都亮啟,持續5S后,主干道上紅燈亮啟,支干道上綠燈亮啟持續25S,之后主干道和支干道上的黃燈都亮啟5s,一個循環完成。循環往復的直行這個過程。其過程如下圖所示:
0s主干道方向25s綠燈亮30s紅燈亮黃燈亮65s支干道方向0s紅燈亮35s綠燈亮黃燈亮60s65s
圖1.交通燈點亮時間控制說明
1.3實現方法
本次采用文本編輯法,即利用Verilog HDL語言描述交通控制器,通過狀態機計數法,實現設計所要求的交通燈控制及時間顯示。設計中用兩組紅黃綠LED模擬兩個方向上的交通燈,用4個7段數碼管分別顯示兩個方向上的交通燈剩余時間,控制時鐘由試驗箱上頻率信號提供。
Verilog HDL程序設計
2.1整體設計
根據上章設計原理,交通燈控制的關鍵是各個狀態之間的轉換和進行適當的時間延時,根據狀態機的設計規范,本次設計了三個狀態之間的循環轉化,其真值表及狀態轉化圖如下所示:
狀狀00狀狀00狀狀10狀狀11狀狀01狀狀01狀狀11狀狀10狀狀狀狀狀狀狀狀狀狀001狀狀狀狀狀010狀狀狀狀狀100狀狀狀狀狀010狀狀狀狀狀狀狀狀狀狀100狀狀狀狀狀010狀狀狀狀狀001狀狀狀狀狀010
圖2.交通燈控制狀態轉化
說明:該狀態圖為交通燈在正常情況下的狀態轉化圖,進入控制后,狀態00時主干道綠燈及支干道紅燈亮起,進入狀態01后兩路黃燈亮起,狀態11時主干道紅燈及支干道綠燈亮起。進入10狀態兩路黃燈亮起。結束一個循環,從00狀態重新開始循環。
為實現控制與顯示的功能,需要設計交通燈點亮順序控制程序,倒數計時程序,七段數碼管顯示程序,數碼管顯示掃描程序,其系統結構圖如下所示:
holdrst狀狀狀狀1Hz狀狀狀狀狀狀狀狀狀狀狀狀狀狀狀狀狀狀狀clk1KHz狀狀狀狀狀狀狀1Hz狀狀狀狀狀狀狀狀狀狀狀狀狀狀狀狀狀狀狀狀狀 圖3.交通燈控制系統結構圖
其中rst為復位信號,clk為時鐘信號,hold為特殊情況控制信號,輸入hold時兩個方向紅燈無條件亮起。
2.2 具體設計
根據整體設計要求,編寫各個功能部分Verilog HDL程序,設置各輸入輸出變量說明如下 clk: 為計數時鐘; qclk:為掃描顯示時鐘;
en: 使能信號,為1 的話,則控制器開始工作; rst: 復位信號,為1的話,控制及技術回到初始狀態;
hoid:特殊情況控制信號,為1的話,則兩個方向無條件顯示為紅燈;
light1: 控制主干道方向四盞燈的亮滅;其中,light1[0]~light[2],分別控制主干道方向的 綠燈、黃燈和紅燈;
light2: 控制支干道方向四盞燈的亮滅;其中,light2[0] ~ light2[2],分別控制支干道方向的 綠燈、黃燈和紅燈;
num1: 用于主干道方向燈的時間顯示,8 位,可驅動兩個數碼管; num2: 用于支干道方向燈的時間顯示,8 位,可驅動兩個數碼管; counter:用于數碼管的譯碼輸出; st1,st2:數碼管掃描信號。輸入輸出及中間變量設置如下:
module traffic(en,clk,qclk,rst,rst1,hold,num1,num2,light1,light2,counter,st1,st2);input en,clk,qclk,rst,hold,rst1;output st1,st2;output[7:0] num1,num2;output[6:0]counter;output[2:0] light1,light2;reg tim1,tim2,st1,st2;reg[1:0]state1,state2,ste;reg[2:0]light1,light2;reg[3:0]num;reg[6:0]counter;reg[7:0] num1,num2;reg[7:0] red1,red2,green1,green2,yellow1,yellow2;
1.二極管點亮控制
該部分程序的作用是根據計數器的計數值控制發光二極管的亮、滅,以及輸出倒計時數值給七段數碼管的譯碼電路。此外,當檢測到特殊情況(hold=‘1’)發生時,無條件點亮紅燈的二極管,當檢測到復位信號,兩個方向計數與控制回復到00狀態。因為主、支干道兩個方向二極管點亮的順序與延遲時間不同,顧編寫兩個獨立的部分來控制,具體程序如下: 1)主干道方向 always @(posedge clk)begin
if(rst)//復位與特殊情況控制
begin light1<=3'b001;num1<=green1;end else if(hold)begin light1<=3'b100;num1<=green1;end else if(en)
begin //使能有效開始控制計數
if(!tim1)//
begin //主干道交通燈點亮控制
tim1<=1;
case(state1)
2'b00:begin num1<=green1;light1<=3'b001;state1<=2'b01;end
2'b01:begin num1<=yellow1;light1<=3'b010;state1<=2'b11;end
2'b11:begin num1<=red1;light1<=3'b100;state1<=2'b10;end
2'b10:begin num1<=yellow1;light1<=3'b010;state1<=2'b00;end
default:light1<=3'b100;
endcase
end 2)支干道方向
always @(posedge clk)begin
if(rst)//復位與特殊情況控制
begin
light2<=3'b100;
num2<=red2;
end
else if(hold)
begin
light2<=3'b100;
num2<=red2;
end
else if(en)
begin
if(!tim2)
begin
tim2<=1;
case(state1)
2'b00:begin num2<=red2;light2<=3'b100;state2<=2'b01;end
2'b01:begin num2<=yellow1;light2<=3'b010;state2<=2'b11;end
2'b11:begin num2<=green2;light2<=3'b001;state2<=2'b10;end
2'b10:begin num2<=yellow2;light2<=3'b010;state2<=2'b00;end
default:light2<=3'b100;
endcase
end
2.倒數計時
該部分程序完成二極管發光時延的計數,并將計數結果送到數碼管顯示電路,每切換到一個狀態,計數器的初值都被重置,以實現不同顏色二極管不同的時延要求。本次設計直接用邏輯運算完成2位十進制數的計數,未采用分位器的設計。因為主、支干道上計數器的結構完全相同,顧只列出一路的程序,其具體程序如下所示:
always @(posedge clk)begin else begin //倒數計時
if(num1>0)
if(num1[3:0]==0)
begin
num1[3:0]<=4'b1001;
num1[7:4]<=num1[7:4]-1;
end
else num1[3:0]<=num1[3:0]-1;
if(num1==1)tim1<=0;
end
end
else
begin
light1<=3'b010;
num1=2'b00;
tim1<=0;
end end
3.數碼管的譯碼及掃描顯示
該段程序主要完成4個7段數碼管的譯碼顯示及掃描,使系統能正常顯示主、支干道兩個方向上的剩余時間。譯碼的時鐘頻率要低,為Hz級。掃描的時鐘頻率要高,最低不得小于人眼分辨頻率50Hz,具體程序如下所示: always @(posedge qclk)begin //數碼管掃描
if(rst1)
begin
st1=0;
st2=0;
end else
begin
case({st2,st1})
2'b00:begin num<=num1[3:0];{st2,st1}<=2'b01;end
2'b01:begin num<=num1[7:4];{st2,st1}<=2'b10;end
2'b10:begin num<=num2[3:0];{st2,st1}<=2'b11;end
2'b11:begin num<=num2[7:4];{st2,st1}<=2'b00;end
endcase
end end always @(posedge qclk)begin //數碼管譯碼顯示 case(num)4'b0000: counter<=7'b0111111;//0 4'b0001: counter<=7'b0000110;//1 4'b0010: counter<=7'b1011011;//2 4'b0011: counter<=7'b1001111;//3 4'b0100: counter<=7'b1100110;//4 4'b0101: counter<=7'b1101101;//5 4'b0110: counter<=7'b1111101;//6 4'b0111: counter<=7'b0000111;//7 4'b1000: counter<=7'b1111111;//8 4'b1001: counter<=7'b1101111;//9 default: counter<=7'b0111111;//0 endcase end endmodule 總體程序見程序清單所示
仿真與硬件調試
3.1 波形仿真
在QuartursⅡ軟件下創建工程,新建編輯設計文件,將程序輸入,整體編譯后,新建波形仿真文件。設置仿真時間,時鐘周期,輸入輸出端口,進行波形仿真。具體仿真波形圖及說明如下所示: 仿真截止時間:100us; 時鐘:clk 1us,qclk 0.1us 1.正常工作時波形仿真圖
圖4.正常工作時波形仿真圖
圖形說明
波形仿真主要完成了控制與計數以及數碼管顯示的波形圖。en為低電品時,計數器置初值,高電平時開始正常控制與計數。控制發光二極管首次輸出為“light1=001,light2=100”,表示主干道路綠燈亮,支桿道路紅燈亮,計數器num1和num2從“00110101”開始遞減計數,計數至“00000000”時,進入下一個狀態,控制輸出量為light=010,light2=010,表示主、支干道黃燈均亮起,計數器num1和num2從“00000101”開始計數遞減,計數至”00000000”時進入下一個狀態,light=100,light2=001,表示主干道路紅燈亮,支桿道路綠燈亮。Counter根據num1,num2變化隨時鐘上升沿輸出譯碼后的數據。由于屏幕顯示大小有限,未仿真出一個完整周期。
2.特殊情況仿真波形
圖5.特殊情況仿真波形
圖形說明
當hold輸入高電平時,在時鐘上升沿的控制下,light 1與light2被強制置位為”100”,表示兩路紅燈均亮起
3.復位情況仿真波形
圖6.復位情況仿真波形
圖形說明
當rst輸入高電平時,在時鐘上升沿控制下,計數與控制都回到00狀態,即light1=001,light2=100,計數器num1和num2從“00110101”開始遞減計數。3.2 硬件調試
完成時序仿真確認無誤后,進行實驗箱管腳設置,注意設置完成后一定要再進行一次全局仿真,使程序真正對應于硬件輸出輸出。具體連接說明如下所示
輸入變量:rst、clk、qclk、hold、en 其中en,hold,rst接”0-1”撥碼開關,以穩定的輸出可變化的電平。計數時鐘clk接實驗箱上1Hz時鐘,掃描顯示時鐘qclk接125Khz時鐘。
輸出變量:light1[2:0]、light2[2:0]、counter[6:0]、st1、st2 其中light1[0]、light2[0]分別接綠色的發光二極管;light1[1]、light2[1] 分別接黃色的發光二極管;light1[2]、light2[2]分別接紅色的發光二極管。counter[0]~counter[6],分別接七段數碼管的a~f,st1、st2分別接試驗箱上”4-16”譯碼器的低兩位。
完成接線后將程序燒寫到芯片上,開始功能調試。分辨改變使能信號,復位信號以及特殊情況信號,觀察數碼管以及發光二級管情況。
程序清單
module traffic(en,clk,qclk,rst,rst1,hold,num1,num2,light1,light2,counter,st1,st2);input en,clk,qclk,rst,hold,rst1;output st1,st2;output[7:0] num1,num2;output[6:0]counter;output[2:0] light1,light2;reg tim1,tim2,st1,st2;reg[1:0]state1,state2,ste;reg[2:0]light1,light2;reg[3:0]num;reg[6:0]counter;reg[7:0] num1,num2;reg[7:0] red1,red2,green1,green2,yellow1,yellow2;
always @(en)if(!en)begin //設置計數初值 green1<=8'b00110101;red1<=8'b00100101;yellow1<=8'b00000101;green2<=8'b00100101;red2<=8'b00110101;yellow2<=8'b00000101;end
always @(posedge clk)begin if(rst)//復位與特殊情況控制
begin
light1<=3'b001;num1<=green1;
end else if(hold)
begin
light1<=3'b100;
num1<=green1;
end
else if(en)
begin //使能有效開始控制計數
if(!tim1)//開始控制
begin //主干道交通燈點亮控制
tim1<=1;
case(state1)
2'b00:begin num1<=green1;light1<=3'b001;state1<=2'b01;end
2'b01:begin num1<=yellow1;light1<=3'b010;state1<=2'b11;end
2'b11:begin num1<=red1;light1<=3'b100;state1<=2'b10;end
2'b10:begin num1<=yellow1;light1<=3'b010;state1<=2'b00;end
default:light1<=3'b100;
endcase
end
else
begin //倒數計時
if(num1>0)
if(num1[3:0]==0)
begin
num1[3:0]<=4'b1001;
num1[7:4]<=num1[7:4]-1;
end
else num1[3:0]<=num1[3:0]-1;
if(num1==1)tim1<=0;
end
end
else
begin
light1<=3'b010;
num1=2'b00;
tim1<=0;
end
end
always @(posedge clk)begin
if(rst)//復位與特殊情況控制
begin
light2<=3'b100;
num2<=red2;
end
else if(hold)
begin
light2<=3'b100;
num2<=red2;
end
else if(en)
begin
if(!tim2)
begin
tim2<=1;
case(state1)
2'b00:begin num2<=red2;light2<=3'b100;state2<=2'b01;end
2'b01:begin num2<=yellow1;light2<=3'b010;state2<=2'b11;end
2'b11:begin num2<=green2;light2<=3'b001;state2<=2'b10;end
2'b10:begin num2<=yellow2;light2<=3'b010;state2<=2'b00;end
default:light2<=3'b100;
endcase
end
else
begin //倒數計時
if(num2>0)
if(num2[3:0]==0)
begin
num2[3:0]<=4'b1001;
num2[7:4]<=num2[7:4]-1;
end
else num2[3:0]<=num2[3:0]-1;
if(num2==1)tim2<=0;
end
end
else
begin
tim2<=0;
state2<=2'b00;
light2<=3'b010;
end
end
always @(posedge qclk)begin //數碼管掃描
if(rst1)
begin
st1=0;
st2=0;
end else
begin
case({st2,st1})
2'b00:begin num<=num1[3:0];{st2,st1}<=2'b01;end
2'b01:begin num<=num1[7:4];{st2,st1}<=2'b10;end
2'b10:begin num<=num2[3:0];{st2,st1}<=2'b11;end
2'b11:begin num<=num2[7:4];{st2,st1}<=2'b00;end
endcase
end end always @(posedge qclk)begin //數碼管譯碼顯示 case(num)4'b0000: counter<=7'b0111111;//0 4'b0001: counter<=7'b0000110;//1 4'b0010: counter<=7'b1011011;//2 4'b0011: counter<=7'b1001111;//3 4'b0100: counter<=7'b1100110;//4 4'b0101: counter<=7'b1101101;//5 4'b0110: counter<=7'b1111101;//6 4'b0111: counter<=7'b0000111;//7 4'b1000: counter<=7'b1111111;//8 4'b1001: counter<=7'b1101111;//9 default: counter<=7'b0111111;//0 endcase end endmodule
總結
在設計中采用V erilog HDL語言設計交通燈控制系統, 借助其功能強大的語言結構, 簡明的代碼描述復雜控制邏輯設計, 與工藝無關特性, 在提高工作效率的同時達到求解目的, 并可以通過V erilog HDL 語言的綜合工具進行相應硬件電路生成, 具有傳統邏輯設計方法所無法比擬的優越性。
在設計過程中,覺得最難的部分是波形仿真部分,雖然程序編譯通過但仿真出不了正確的波形,不是計數器無法正常計數,就是控制輸出無法進入到下一個狀態,每次出現問題就必須返回重新修改程序。實踐證明,在編寫一個較復雜的程序時,一開始一定要畫流程圖,弄清楚各個功能及實現它們的邏輯算法,做到心中有數后在開始下筆寫編寫程序。在編寫的時候要尤其要注意語言的規范,如本次設計中編寫的V erilog在Quartus8.1中可以正常生成時序圖,而在低版本的軟件中卻無法生成,原因就是語言使用不規范,在解決這個問題時我總結了一些經驗,首先程序要邏輯清晰,簡潔明了,避免不必要的嵌套與條用,其次要適當地給程序加上注解文字,提高可讀性,以方便之后的程序出錯時進行查找,最后充分利用仿真軟件提供的各項編譯工具與報錯消息,按圖索驥,有方向的完成程序調試。
完成仿真后進行,進行試驗箱上的硬件調試,該步驟主要是要求細心,按照引腳清單,逐一完成連線,本次設計用到兩個時鐘輸入,注意一定要選擇合適頻率的時鐘,以便達到期望的效果。注意觀察實物的現象,看是否滿足設計要求,不滿足時檢查是硬件問題還是程序問題,如果是程序問題,在修改完之后必須要重新編譯,重新燒入。不斷排查錯誤,直至達到滿意的效果。
通過這次課程設計,熟悉了簡單EDA設計的整個流程,加深了對Verilog HDL硬件描述語言的理解,提高了動手能力,并且鍛煉了自己的耐心,收獲頗豐,我會把在本次課程設計中學到的東西應用到今后的工作學習中。
參考資料
[1] 夏宇聞.復雜數字電路與系統的V erilog HDL設計技術 [M ].北京: 北京航空航天大學出版社, 1998 [2] 郭梯云.移動通信[M ].西安: 西安電子科技大學出版社, 1995 [3] [法]M ichelMouly, M arie Bernadet te Pautet1GSM 數字移動通信系統[M ].駱健霞, 顧龍信, 徐云霄譯.北京: 電子工業出版社, 1996 [4] 張毅剛, 喬立巖.虛擬儀器軟件開發環境L abW indow s?CV I 610 編程指南[M ].北京: 機械工業出版社, 2002 [5] 劉國權.GSM 手機的測試[J ].中國無線電管理, 2003 [6] 俞定玖, 劉湘慧.GSM 數字蜂窩移動交換系統測試[J ].電信科學, 2000 [7] 張明.V erilog HDL 實用教程[M ].成都: 電子科技大學出版社, 1999 [8] Hyde D C.Bucknell Handbook on V erilog HDL 1Computer Science Department, Bucknell U niversity L ew is burg, 1995 [9] 康華光.電子技術基礎(數字部分)[M ].北京: 高等教育出版社, 1988
第四篇:EDA課程設計彩燈控制器
沈陽理工大學EDA技術課程設計報告
1設計目的
熟練掌握EDA技術利用計算機方面的課程解決專業課程方面點具體問題,達到解決問題,完成課程設計任務,培養實踐的目的。
2設計要求和任務
利用所學的EDA設計方法設計彩燈控制器,熟練使用使用QUARTUSII應用軟件,進一步學習使用VHDL語言、原理圖等EDA設計方法進行綜合題目的方法。
功能要求: 1.要有多種花型變化(至少4種).2.多種花型可以自動變換,循環往復.3.彩燈變換的快慢節拍可以選擇.4.具有清零開關.總體設計思路及原理描述
3.1功能描述
在電路中以 1 代表燈亮,以 0 代表燈滅,由 0,1按不同的規律組合代表不同的燈光圖案,同時使其選擇不同的頻率,從而實現多種圖案多種頻率的花樣功能顯示。在該電路中只需簡單的修改程序就可以靈活地調整彩燈圖案和變化方式。下面就以一個十六路彩燈控制系統的實現為例進行簡單說明。此十六路彩燈控制系統設定有六種花樣變化 ,這六種花樣可以進行自動切換 ,并且每種花樣可以選擇不同的頻率。
3.2設計原理
用VHDL進行設計 ,首先應該了解 ,VHDL語言一種全方位硬件描述語言 ,包括系統行為級 ,寄存傳輸級和邏輯門級多個設計層次。應充分利用DL “自頂向下” 的設計優點以及層次化的設計概層次概念對于設計復雜的數字系統是非常
沈陽理工大學EDA技術課程設計報告
有用它使得人們可以從簡單的單元入手 ,逐漸構成龐大而復雜的系統。首先應進行系統模塊的劃分 ,規定每一模塊的功能以及各個模塊之間的接口。最終設計方案為:以一個十六路彩燈花樣控制器、一個四頻率輸出分頻器 ,一個四選一控制器和一個時間選擇器總共四部分來完成設計。四選一控制器從分頻器選擇不同頻率的時鐘信號輸送到彩燈花樣控制器 ,從而達到控制彩燈閃爍速度的快慢 ,時間選擇器控制每種速度維持的時間長短。整個十六路彩燈控制系統設計的模塊圖如圖 1所示
圖一
4分層次方案設計及代碼描述
4.1子模塊及其功能
本次設計分為四個子模塊 ,即十六路彩燈花樣控制器、四頻率輸出分頻器 ,四選一控制器和時間選擇器 ,其子模塊及其功能如下: 2
沈陽理工大學EDA技術課程設計報告
4.1.1四頻率輸出分頻器
在本次設計中 ,設計了六種花樣 ,要求這六種花樣以不同的頻率顯示 ,而只有一個輸入的時鐘信號 ,所以對所輸入的時鐘信號進行 2 分頻 ,4 分頻 ,8分頻 ,16分頻 ,得到四種頻率信號 ,CLKDIV模塊用來完成此功能。
4.1.2時間選擇器
時間選擇器實際上是兩個分頻器 ,其中一個頻率是另一個頻率的兩倍。本來這兩個分頻器是可以在上述的四頻率輸出器中實現的 ,但為了方便地為四選一控制器提供不同的時間選擇條件 ,就將這兩個分頻器獨立開來。這兩個輸出的時鐘信號組合起來就可以為四選一控制器提供 00,01,10,11 四個時間選擇條件 ,如
下圖三所示。
圖二
4.1.3四選一控制器
四選一控制器功能是從分頻器中選擇不同頻率的時鐘信號送給彩燈控制器 ,實現彩燈閃爍的頻率變化。
4.1.4彩燈控制器
彩燈控制電路是整個設計的核心 ,它負責整個設計的輸出效果即各種彩燈圖案的樣式變化。該程序充分地說明了用 VHDL設計電路的 “彈” 性 ,即可通過改變程序中輸出變量 Q 的位數來改變彩燈的數目。其中 ,P1進程對燈閃的速度控制有兩種方式可改變燈閃的速度:一是改變外部時鐘的賦值 ,二是改變信號U 的位數。P2進程能進行彩燈的圖案控制 ,改變 s的位數即可改變要控制圖案的數目 ,改變輸出變量 Q 的組合即可變幻彩燈圖案。
最后 ,當各個模塊均完成上述操作之后 ,即可利用MAXPLUS2的原理圖輸
沈陽理工大學EDA技術課程設計報告
入 ,調用各個元器件(底層文件),以原理圖的形式形成最后的十六路彩燈顯示系統(頂層文件),并且進行仿真。仿真通過 ,即可下載到指定的 CPLD芯片里面 ,并進行實際連線 ,進行最后的硬件測試。當然 ,可以將各個模塊所生成的元件符號存放在元件庫中 ,用以被其它人或其它的設計所重復調用 ,以簡化后面的設計。
4.2 代碼描述
4.2.1 時序控制電路部分
程序如下: library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity timecontrol is--定義實體 port(clk: in std_logic;--時鐘信號 clr: in std_logic;--復位信號 opt: in std_logic;--快慢控制信號 clkout: out std_logic--輸出時鐘信號);end timecontrol;architecture one of timecontrol is signal clk_tmp: std_logic;signal counter: std_logic_vector(1 downto 0);--定義計數器 begin process(clk,clr,opt)begin 4
沈陽理工大學EDA技術課程設計報告
if clr='0' then--清零 clk_tmp<='0';counter<=“00”;elsif clk'event and clk='1' then if opt='0' then--四分頻 if counter=“01” then counter<=“00”;clk_tmp<=not clk_tmp;else counter<=counter+'1';end if;else--八分頻 if counter=“11” then counter<=“00”;clk_tmp<=not clk_tmp;else counter<=counter+'1';end if;end if;end if;end process;clkout<=clk_tmp;--輸出分頻后的信號 end architecture one;
4.2.2顯示控制電路部分
程序如下: library ieee;use ieee.std_logic_1164.all;
沈陽理工大學EDA技術課程設計報告
entity showcontrol is port(clk: in std_logic;--輸入時鐘信號 clr: in std_logic;--復位信號
led: out std_logic_vector(15 downto 0));--彩燈輸出
end showcontrol;architecture one1 of showcontrol is type states is--狀態機狀態列舉(s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15);signal state: states;begin process(clk,clr)begin
if clr='0'then state<=s0;led<=“***0”;elsif clk'event and clk='1'then case state is when s0=>state<=s1;led<= “***1”;when s1=> state<=s2;led<=“***1”;when s2=> state<=s3;led<=“***0”;when s3=> state<=s4;led<=“***1”;when s4=> state<=s5;6
沈陽理工大學EDA技術課程設計報告
led<=“***0”;when s5=>state<=s6;led<=“***1”;when s6=>state<=s7;led<=“***0”;when s7=>state<=s8;led<=“***1”;when s8=>state<=s9;led<=“***0”;when s9=>state<=s10;led<=“***1”;when s10=>state<=s11;led<=“***0”;when s11=>state<=s12;led<=“***1”;when s12=>state<=s13;led<=“***0”;when s13=>state<=s14;led<=“***1”;when s14=>state<=s15;led<=“***0”;when s15=>state<=s0;led<=“***1”;when others=>null;end case;end if;end process;end architecture one1;
沈陽理工大學EDA技術課程設計報告
4.2.3頂層電路部分
程序如下:
library ieee;use ieee.std_logic_1164.all;entity root is port(clk: in std_logic;clr: in std_logic;opt:in std_logic;led: out std_logic_vector(15 downto 0));--八路彩燈輸出 end colorled;architecture one3 of root is component timecontrol is--定義元件:時序控制電路 port(clk: in std_logic;clr: in std_logic;opt:in std_logic;clkout: out std_logic);end component timecontrol;component showcontrol is--定義元件:顯示電路
port(clk: in std_logic;clr: in std_logic;led: out std_logic_vector(15 downto 0));end component showcontrol;signal clk_tmp: std_logic;begin u1: timecontrol port map(clk=>clk,clr=>clr,opt=>opt,clkout=>clk_tmp);--例化時序控制模塊
沈陽理工大學EDA技術課程設計報告
u2: showcontrol port map(clk=>clk_tmp,clr=>clr,led=>led);--例化顯示電路模塊 end architecture one3;
5各模塊的時序仿真圖
5.1時序控制電路timecontrol的仿真圖如下:
圖三
功能:時序控制電路metronome的功能是,用OPT控制輸入信號CKL_IN的快慢節拍。而CLR是控制開關。且從圖中可以看出,當復位信號為高電平時,電路時鐘輸出清零,當快慢信號OPT為低電平時,時序控制電路四分頻起作用,當快慢信號OPT為高電平時,時序控制電路八分頻起作用,仿真結果符合電路要求。
沈陽理工大學EDA技術課程設計報告
5.2 顯示控制電路showcontrol的仿真圖如下:
圖四
功能:顯示控制電路showcontrol的功能是控制花形的。且從圖中可以看出,當復位信號有效時彩燈輸出為零,否則,顯示電路在十六種不同狀態間轉換。
5.3 頂層電路root系統的仿真圖如下:
沈陽理工大學EDA技術課程設計報告
圖五
功能:整個電路root系統是把showcontrol與timecontrol綜合成一個電路。且從圖中可以看出,從圖中可以看出當OPT為高電平時彩燈狀態轉換慢,為低電平時轉換要快,當復位信號有效時,所用輸出都清零。
6總結
通過這次課程設計使我懂得了理論與實際相結合是很重要的,通過這次的課程設計,發現自己的實踐經驗還是不足的,以后多應該以理論為基礎,然后應用到實踐中來,從理論中得出結論,才能提高自己的實際動手能力和獨立思考的能力。
在這次的課程設計里深入的接觸了運用電子集成元器件制作多路彩燈的過程,并和同學一起討論用軟件制作出了這一個多路彩燈控制系統。正所謂“紙上談兵終覺淺,覺知此事要躬行。”學習任何知識,都要進行實踐,只有那樣才能達到事半功倍的效果。
沈陽理工大學EDA技術課程設計報告 參考文獻
《EDA技術與數字系統設計》
鄒彥主編
電子工業出版社
《EDA技術實用教程》,潘松、黃繼業,科學出版社 《數字電子技術基礎》(第五版),閻石,高等教育出版社
《電子設計自動化(EDA)手冊》,王丹、童如松,電子工業出版社 《EDA技術程設計》,劉江海,華中科技大學出版社
第五篇:eda課程設計-彩燈控制器
1.設計目的
學習EDA開發軟件和MAX+plus Ⅱ的使用方法,熟悉可編程邏輯器件的使用,通過制作來了解彩燈控制系統。2.設計題目描述和要求
1)設計一個彩燈控制器,使彩燈(LED管)能連續發出四種以上不同的顯示形式;
2)隨著彩燈顯示圖案的變化,發出不同的音響聲。3)擴充其它功能。3.設計原理 3.1 方案論證
這次的彩燈設計采用的是分模塊來完成的,包括分頻器、計數器、選擇器、彩燈控制器。其中彩燈控制器是用來輸出不同的花樣,彩燈控制器的輸出則是用一個32進制的計數器來控制,揚聲器的輸出時用不同的頻率來控制,所以用了一個集成分頻器來使輸入的頻率被分為幾種不同的頻率,不同頻率的選擇性的輸出則是用一個4選一的選擇器來控制。基于上述的介紹本次的彩燈控制采用的模式6來進行顯示。
圖3-1-1 模式6結構圖
3.2 模塊設計
1)集成分頻器模塊
設計要求顯示不同的彩燈的時候要伴隨不同的音樂,所以設計分頻器來用不同的頻率控制不同的音樂輸出。模塊說明:
Rst:輸入信號 復位信號 用來復位集成分頻器的輸出使輸出為“0”,及沒有音樂輸出。
Clk:輸入信號 模塊的功能即為分頻輸入的頻率信號。
Clk_
4、clk_
6、clk_
8、clk_10:輸出信號 即為分頻模塊對輸入信號clk的分頻,分別為1/4分頻輸出、1/6分頻輸出、1/8分頻輸出、1/10分頻輸出。
圖3-2-1 集成分頻器
2)32進制計數器模塊
32進制模塊用來控制彩燈輸出模塊,即確定彩燈控制器的不同的輸出。Rst:輸入信號 復位信號 用來復位32進制使其輸出為“00000”。Clk:輸入信號 用來給模塊提供工作頻率。
Count_out[4..0]:輸出信號 即為32進制計數器的輸出。
圖3-2-2 32進制計數器
3)彩燈控制模塊
彩燈控制模塊用來直接控制彩燈的輸出,使彩燈表現出不同的花樣。Rst:輸入信號 使彩燈控制模塊的輸出為“00000000”,即讓彩燈無輸出。Input[4..0]:輸入信號 不同的輸入使彩燈控制模塊有不同的輸出即彩燈顯示出不同的花樣。
Output[7..0]:輸出信號 直接與彩燈相連來控制彩燈。
圖3-2-3 彩燈控制模塊 4)4選1選擇器模塊
Rst:輸入信號 復位信號 使選擇器的輸出為“0”。In1、in2、in3、in4:輸入信號 接分頻器的輸出。
Inp[1..0]:輸入信號 接4進制計數器的輸出用來控制選擇器的選擇不同的輸入選擇不同的輸出。
Output:輸出信號 直接接揚聲器即輸出的是不同的頻率來控制揚聲器播放音樂。
圖3-2-4 4選1選擇器
5)4進制計數器模塊
4進制計數器作為選擇器的輸入來控制選擇器選擇不同的頻率作為輸出控制揚聲器工作。
Clk:輸入信號 來為計數器提供工作頻率。
Rst:輸入信號 復位信號 使計數器的輸出為“00”。
圖3-2-5 4進制計數器
3.3 系統結構
整個系統就是各個分模塊組成來實現最后的彩燈控制功能,系統又兩個時鐘來控制一個是控制32進制計數器即控制彩燈控制模塊來實現彩燈的不同輸出,另一個時鐘為分頻器的輸入來進行分頻處理,最后用來控制揚聲器發出不同的音樂,具體分頻處理的時鐘的頻率比實現彩燈控制的時鐘頻率要高。
圖 3-3-1 系統功能模塊
4.總結
這次的EDA課程設計有一周的時間,在這一周的時間里我們充分合理的安排了自己的時間來使本次的課程設計能夠順利的完成,當然我們在本次的設計中并不是一帆風順的,我們遇到了一些的問題,例如我們開始時用的文本的方式用一個總的程序來完成,可以在設計的過程中我們發現程序編到后面變量越到很容易搞混淆同時各個進程間的聯系也越來越模糊以至于后面我們自己都不知道程序的整體框圖是什么,導致后面不能夠繼續下去,后面我們再一次對我們這次的設計題目進行了分析和整理,最后我和我的同伴決定采用分模塊的方式來完成本次的課題設計,當然最重要的是分析各個模塊間的關系。最后我們采用上面分析的結構框圖。最后我們的設計很成功,仿真和硬件測試都是正確的,實現了我們的設計要求和目的。
在這次設計中我們收獲了很多,首先最直接的收獲就是我們鞏固了這門課程所學過的知識,把它運用到了實踐當中,并且學到了很多在書本撒和那個所沒有學到的知識,通過查閱相關資料進一步加深了對EDA的了。總的來說,通過這次課程設計不僅鍛煉了我們的動手和動腦能力,也使我懂得了理論與實際相結合的重要性,只有理論知識是遠遠不夠的,要把所學的理論知識與實踐相結合起來,才能提高自己的實際動手能力和獨立思考的能力。在我們的共同努力和指導老師的指引下我們圓滿的完成了彩燈控制器的設計,實現了設計目的。
6附錄一 程序:
---------------分頻器模塊----------LIBRARY ieee;USE ieee.std_logic_1164.all;
ENTITY fenpinqi IS
PORT(clk,rst : IN std_logic;
clk_10,clk_4,clk_6,clk_8 : OUT std_logic);
END fenpinqi;
ARCHITECTURE cd OF fenpinqi IS begin p1:process(clk,rst)
variable a:integer range 0 to 20;
begin if rst='1' then
clk_4<='0';
-----
復位信號控制部分 else if clk'event and clk='1'then
if a>=3 then
a:=0;
clk_4<='1';
else
a:=a+1;
clk_4<='0';
end if;
end if;
end if;end process p1;
p2:process(clk,rst)
variable b:integer range 0 to 20;
begin if rst='1' then
clk_6<='0';
-----
復位信號控制部分
else if clk'event and clk='1'then
if b>=5 then
b:=0;
clk_6<='1';
else
b:=b+1;
clk_6<='0';
end if;
end if;
end if;end process p2;
p3:process(clk,rst)
variable c:integer range 0 to 20;
begin if rst='1' then
clk_8<='0';
-----else if clk'event and clk='1'then
if c>=7 then
c:=0;
clk_8<='1';
else
c:=c+1;
clk_8<='0';
end if;
end if;
end if;end process p3;
p4:process(clk,rst)
variable d:integer range 0 to 20;
begin if rst='1' then
clk_10<='0';
-----else if clk'event and clk='1'then
if d>=9 then
d:=0;
clk_10<='1';
else
復位信號控制部分7
復位信號控制部分
d:=d+1;
clk_10<='0';
end if;
end if;
end if;end process p4;end cd;
---------------4選1選擇器--------LIBRARY ieee;USE ieee.std_logic_1164.all;
ENTITY xzq4_1 IS
PORT(rst:in std_logic;
inp:in integer range 0 to 3;
in1,in2,in3,in4 : In std_logic;
output : OUT std_logic);
END xzq4_1;
ARCHITECTURE a OF xzq4_1 IS
BEGIN
PROCESS(rst,inp)BEGIN
if(rst='1')then output<='0';
else
case inp is
when 0=>output<=in1;
when 1=>output<=in2;
when 2=>output<=in3;
when 3=>output<=in4;
when others=>null;
end case;
end if;
END PROCESS;END a;
------------彩燈控制模塊---------LIBRARY ieee;USE ieee.std_logic_1164.all;
ENTITY caideng IS
PORT(input : IN INTEGER RANGE 0 TO 31;
rst:in std_logic;
output : OUT std_logic_vector(7 downto 0);
sm :out std_logic_vector(6 downto 0));
END caideng;
ARCHITECTURE a OF caideng IS
BEGIN
PROCESS(input)BEGIN
if rst='1' then output<=“00000000”;sm<=“0000000”;
else
case input is
when 0=>output<=“10000000”;sm<=“0000110”;
when 1=>output<=“01000000”;sm<=“0000110”;
when 2=>output<=“00100000”;sm<=“0000110”;
when 3=>output<=“00010000”;sm<=“0000110”;
when 4=>output<=“00001000”;sm<=“0000110”;
when 5=>output<=“00000100”;sm<=“0000110”;
when 6=>output<=“00000010”;sm<=“0000110”;
when 7=>output<=“00000001”;sm<=“0000110”;
when 8=>output<=“00010000”;sm<=“0011011”;
when 9=>output<=“00110000”;sm<=“0011011”;
when 10=>output<=“00111000”;sm<=“0011011”;
when 11=>output<=“01111000”;sm<=“0011011”;
when 12=>output<=“01111100”;sm<=“0011011”;
when 13=>output<=“01111110”;sm<=“0011011”;
when 14=>output<=“11111110”;sm<=“0011011”;
when 15=>output<=“11111111”;sm<=“0011011”;
when 16=>output<=“10000001”;sm<=“1001111”;
when 17=>output<=“11000001”;sm<=“1001111”;
when 18=>output<=“11000011”;sm<=“1001111”;
when 19=>output<=“11100011”;sm<=“0011011”;
when 20=>output<=“11100111”;sm<=“1001111”;
when 21=>output<=“11110111”;sm<=“1001111”;
when 22=>output<=“11111111”;sm<=“1001111”;
when 23=>output<=“00001000”;sm<=“1001111”;
when 24=>output<=“00000001”;sm<=“0100110”;
when 25=>output<=“00000010”;sm<=“0100110”;
when 26=>output<=“00000100”;sm<=“0100110”;
when 27=>output<=“00001000”;sm<=“0100110”;
when 28=>output<=“00010000”;sm<=“0100110”;
when 29=>output<=“00100000”;sm<=“0100110”;
when 30=>output<=“01000000”;sm<=“0100110”;
when 31=>output<=“10000000”;sm<=“0100110”;
when others=>null;
end case;
end if;
end process;end a;
-------------32進制計數器模塊----
LIBRARY ieee;USE ieee.std_logic_1164.all;
ENTITY counter_32 IS
PORT(clk,rst : IN std_logic;
count_out : OUT integer range 0 to 31);
END counter_32;
ARCHITECTURE a OF counter_32 IS BEGIN PROCESS(rst,clk)
variable temp:integer range 0 to 32;BEGIN
IF rst='1' THEN
temp:=0;
ELSIF(clk'event and clk='1')THEN
temp:=temp+1;
if(temp=32)then
temp:=0;
end if;
END IF;
count_out<=temp;END PROCESS;
END a;
------------4進制計數器模塊---LIBRARY ieee;USE ieee.std_logic_1164.all;
ENTITY counter_4 IS
PORT(clk,rst : IN std_logic;
count_out : OUT integer range 0 to 3);
END counter_4;
ARCHITECTURE a OF counter_4 IS BEGIN
PROCESS(rst,clk)
variable temp:integer range 0 to 32;BEGIN
IF rst='1' THEN
temp:=0;
ELSIF(clk'event and clk='1')THEN
temp:=temp+1;
if(temp=4)then
temp:=0;
end if;
END IF;
count_out<=temp;END PROCESS;END a;
7附錄二 編譯
7附錄三 時序仿真