汽車尾燈控制時序邏輯電路設計畢業論文?
基于VHDL語言的汽車尾燈控制電路的設計 摘要:本課題主要是基于可編程邏輯器件,使用硬件描述語言VHDL,采用“自頂向下”的設計方法編寫程序實現汽車尾燈的控制,并對控制器進行編程下載,它的體積小,功耗低,成本低,安全可靠,能實現控制器的在系統編程,其升級與改進極為方便。 關鍵詞: VHDL 汽車尾燈控制 時鐘信號 1. 尾燈控制電路總框圖, 根據電路總框圖的描述,我們大概可以了解到整個汽車控制尾燈的工作原理,從中我們可以發現當左右轉信號同時有效時,6盞燈的閃爍是通過一個與非門實現的。并且可以獲知本次設計的汽車尾燈控制電路主要分為三個模塊,即控制模塊,左轉LFTA模塊和右轉RITA模塊。了解到這幾點,就可以對本次設計作較為詳盡的解釋。 2.模塊KONG。 模塊KONG如圖所示,此為整個程序的控制模塊。程序如下: Library ieee; Use ieee.std_logic_1164.all; Entity kong is Port(left,right:in std_logic; Lft,rit,lr:out std_logic); End kong; Architecture kong_logic of kong is Begin Process(left,right) Variable a:std_logic_vector(1 downto 0); Begin A:=left & right; Case a is When”00”=>lft<=’0’; Rit<=’0’; Lr <=’0’; When”10”=>lft<=’1’; Rit<=’0’; Lr <=’0’; When”01”=>rit<=’1’; Lft<=’0’; Lr <=’0’; When other=>rit<=’1’; lft<=’1’; lr<=’1’; end case; end process; end kong_arc; 控制模塊首先使用了庫說明語句:library ieee; Use ieee.std_logic_1164.all 使用ieee庫中的std_logic_1164程序包的全部資源。此控制模塊定義的實體名為kong。在程序中要求實體名與存儲的文件名一致。實體名為kong,則存儲的文件名為kong.vhd。且此段程序包有5個端口,其名稱分別為left. Right. Lft. Rit. Lr 。left 和right的端口方式是輸入,lft, rit, lr 是輸出,他們的端口類型都是std_logic的數據類型。實體說明部分結束以后,就是結構體的說明部分。結構體是整個VHDL語言中至關重要的一個組成部分,這個部分給出模塊的具體說明,指定輸入與輸出之間的行為。結構體對實體的輸入輸出關系可以用三種關進行描述,即行為描述,寄存器傳輸描述和結構描述。只不過結構體的框架是完全一樣的。本結構體中包含有一個進程語句,進程語句中又包含有兩個敏感量process(left ,right),從begin開始到end process結束是一組順序執行語句,ieee標準數據類型“std_logic_vector”定義了兩位位矢量1downto 0,變量為a。程序往下把left和right的與賦值給a,下面便執行case語句了 ,case語句是無序的,所以所有條件表達式的值都是并行處理的。當條件表達式的值為”00”時則把lft ,rit ,lr,都變為0,所有信號都無效。當條件表達式為”10”時,左轉信號lft有效,其它信號都無效,當條件表達式的值為”01”時右轉信號rit有效,其余的無效。若條件表達式為其它的情況的話,那么就將rit ,lft ,lr 全部置1,即全部有效。最后結束case語句 end case .結束進程和結構體語句。 3. 模塊LFTA 源程序: Library ieee; Use ieee.std_logic_1164.all; Entity lfta is Port(en,clk,lr:in std_logic; L2,l1,l0:out std_logic); End lfta; Architecture lft_arc of lfta is Begin Process(clk,en,lr) Variable tmp:std_logic_vector(2 downto 0); Begin If lr=’1’ then Tmp:=”111”; Elsif en=’0’ then Tmp:=”000”; Elsif clk’event and clk=’1’ then If tmp=”000” then Tmp:=”001”; Else Tmp:=tmp(1 downto 0) & ‘0’; End if ; End if; L2<=tmp(2); L1<=tmp(1); L0<=tmp(0); End process; End lft_arc; 模塊LFTA同樣使用了ieee庫語句,定義的實體名為lfta,其共分為六個端口即en,clk,lr,l2,l1,l0,其中en,clk,lr為輸入,l2,l1,l0的端口方式為輸出,而它的端口類型同樣也為std_logic數據類型。LFTA程序中結構體名為lft_arc,實體名為lfta 。結構體中包含有一個進程,共定義了三個敏感量clk,en,lr,設變量名tmp為2 downto 0 的三位位矢量。當左右開關同時接通時lr有效,即lr=1,此時tmp:=”111”右邊的三盞燈全亮起來,當tr=1時但en=0則左邊三盞燈全滅不亮。而如果這兩種情況都不是的話,那么lr=’0’時當時鐘上升沿脈沖到來時,如果tmp=”000”則左邊第一盞燈亮,否則就將tmp(1 downto 0)和’0’的與賦值給tmp,那么依次左邊的三盞燈就能實現從左到右按次序亮滅了。最后將tmp(2)送到l2,tmp(1)送到l1,tmp(0)送到lo,結束程序和結構體。這就是在實現左轉彎的時候執行的程序的全過程。通過對左轉的理解,右轉彎就很容易了,其執行的過程和左轉彎的時候非常相似的 。我們也可發現LFTA模塊的功能是當左轉時控制左邊的三盞燈,當左右轉信號都有效時,輸出為全’1’。下面來看一下右轉彎控制模塊。 4.模塊RITA 源程序: Library ieee; Use ieee.std_logic_1164.all; Entity rita is Port(en,clk,lr:in std_logic; R2,r1,r0:out std_logic); End rita; Architecture rit_arc of rita is Begin Process(clk,en,lr) Variable tmp:std_logic_vector(2 downto 0); Begin If lr=’1’ then Tmp:=”111”; Elsif en=’0’ then Tmp:=”000”; Elsif clk’event and clk=’1’ then If tmp=”000” then Tmp:=”100”; Else Tmp:=’0’ & tmp(2 downto 1); End if; End if ; R2<=tmp(2); R1<=tmp(1); R0<=tmp(0); End process; End rit_arc; 和左轉彎時候的相同,右轉彎時再次使用了ieee的庫說明,這樣我們可以很清楚的理解了右轉彎的原理,此時庫定義的實體名為rita,對于實體名前面已經講過了不再重復了,同樣的程序包中還是使用了6個端口en ,clk,lr,r2,r1,r0. en ,clk, lr的端口方式是輸入,r2,r1,r0的端口方式是輸出。結構體中和左轉時相同引入一個進程同時和三個敏感量:clk,en,lr。變量tmp為2downto 0的三位位矢量。當左右開關同時接通時lr=’1’,那么此時變量tmp=’111’,即右面的三盞燈都有信號,三盞燈全亮。否則lr=’0’,當en=’0’時,tmp=’000’,即三盞燈全滅掉。Elsif clk’event and clk=‘1’即當時鐘脈沖上升沿到來時,en=’1’,如果tmp=”000”,就把”100”送到tmp 此時右邊的第一盞燈亮。否則就把’0’和tmp(2 downto 1)的與送到tmp,則依次為右邊第一盞燈,第二盞,第三盞亮。然后結束if語句。這個之后就和左轉的程序是一樣的了,將tmp(2)中的數值送到r2,將tmp(1)中的數值送到r1,將tmp(0)中的數據送到r0,然后結束進程語句和整個結構體語句。那么到這里整個汽車尾燈的VHDL程序控制就結束了。 5.結論: 本次設計用到了硬件描述語言VHDL實現了對汽車尾燈的控制,總結整個設計程序我們可以發現一些問題; 設計中的優點:基本實現了汽車在運行時候尾燈點亮方式的各種情況。 設計中的不足:由于在行車的時候都是用開關控制的,所以每一個開關應該有一個消除機械振動的裝置,可以利用基本RS觸發器來實現,所以在條件允許的情況下可以對整個設計進行進一步的改進。 6.參考資料: 王振紅 《VHDL數字電路設計與應用實踐教程》 機械工業出版社 2006年1月 彭容修 《數字電子技術基礎》 武漢理工大學出版社 2005年9月 潘松 黃繼業 《EDA技術與VHDL》 清華大學出版社 2006年11月 2009.12.27 library ieee; use ieee.std_logic_1164.all; entity ZHUKONG is Port(left,right:in std_logic; Lft,rit,lr:out std_logic); end; architecture kong_arc of ZHUKONG is begin Process(left,right) Variable a:std_logic_vector(1 downto 0); Begin A:=left & right; Case a is When"00"=>lft<='0'; Rit<='0'; Lr <='0'; When"10"=>lft<='1'; Rit<='0'; Lr <='0'; When"01"=>rit<='1'; Lft<='0'; Lr <='0'; When others=>rit<='1'; lft<='1'; lr<='1'; end case; end process; end kong_arc; library ieee; use ieee.std_logic_1164.all; entity LFTA is Port(en,clk,lr:in std_logic; L2,l1,l0:out std_logic); end; architecture lft_arc of LFTA is begin Process(clk,en,lr) Variable tmp:std_logic_vector(2 downto 0); Begin If lr='1' then Tmp:="111"; Elsif en='0' then Tmp:="000"; Elsif clk'event and clk='1' then If tmp="000" then Tmp:="001"; Else Tmp:=tmp(1 downto 0) & '0'; End if; End if; L2<=tmp(2); L1<=tmp(1); L0<=tmp(0); End process; end lft_arc; library ieee; use ieee.std_logic_1164.all; entity RITA is Port(en,clk,lr:in std_logic; R2,r1,r0:out std_logic); end; architecture rit_arc of RITA is begin Process(clk,en,lr) Variable tmp:std_logic_vector(2 downto 0); Begin If lr='1' then Tmp:="111"; Elsif en='0' then Tmp:="000"; Elsif clk'event and clk='1' then If tmp="000" then Tmp:="100"; Else Tmp:='0' & tmp(2 downto 1); End if; End if ; R2<=tmp(2); R1<=tmp(1); R0<=tmp(0); End process; end rit_arc;