第一篇:EDA設計報告
EDA
多 功 能 數 字 時 鐘
專業:11級應用電子技術 班級:二班
學號:110372021307 姓名:賀成林 指導老師:祝宏
日期:2012年6月29日
一、實驗目的
1、課程設計是一實踐教學環節,是針對《數字電子技術》課程的要求,結合實踐對學生進行綜合設計性訓練,在自學和實踐訓練中培養學生理論聯系實踐和實踐動手能力,獨立地解決實際問題能力。
2、通過課程設計是使學生熟悉和了解可編程專用數字邏輯電路的設計、開發流程,熟悉和了解現代EDA設計工具,掌握數字電子系統層次化的設計方法。
已知條件:MAX+Plus軟件
基本功能:
1、以數字形式顯示時、分、秒的時間;
2、小時計數器為24進制;
3、分秒計數器為60進制。
二、實驗要求、綜合應用《數字電子技術基礎》課程中的理論知識去獨立地完成一個設計課題;
2、熟悉和了解現代EDA設計、編程、編譯、仿真及下載技術的全過程。
三、EDA 技術介紹
1、EDA 技術概況
EDA 是電子設計自動化(Electronic Design Automation)的縮寫,在 20 世 紀 90 年代初從計算機輔助設計(CAD)、計算機輔助制造(CAM)、計算機輔助測試(CAT)和計算機輔助工程(CAE)的概念發展而來的。EDA 技術就是以計算機為工 具,設計者在 EDA 軟件平臺上,用硬件描述語言 HDL 完成設計文件,然后由計算機 自動地完成邏輯編譯、化簡、分割、綜合、優化、布局、布線和仿真,直至對于特 定目標芯片的適配編譯、邏輯映射和編程下載等工作。EDA 技術的出現,極大地提 高了電路設計的效率和可*性,減輕了設計者的勞動強度。
2、ALTERA QUARTUS II 軟件介紹
Quartus II 是 Altera 公司的綜合性 PLD 開發軟件,支持原理圖、VHDL、VerilogHDL 以及 AHDL(Altera Hardware Description Language)等多種 設計輸入形式,內嵌自有的綜合器以及仿真器,可以完成從設計輸入到硬件 配置的完整 PLD 設計流程。
四、關鍵詞
數字計數器、動態顯示、快速校分、整點報時、時段控制。
五、實驗步驟
1、秒計數器是60進制的。當下面的74161到9時等下一個脈沖來是向上面的74161計數,到5時將兩個74161共同預置。從而實現00—59秒的計數功能。
電路圖如下:
進行編譯及波形仿真,如下圖: 將上述文件保存并打包,如圖:
2、分計數器是60進制的。功能如秒計數器。其電路圖如下:
波形圖仿真及打包圖如下:
3、小時計數器是24進制的。當下面的74161到9時等下一個脈沖來是向上面的74161計數。但是等到上面的記到2時下面的將不能超過4,所以等上面的記到2,下面的記到4時就將兩個74161共同預置。從而實現00—24秒的計數功能。
原理圖如下:
仿真的波形圖及打包的文件圖如下:
4、校時。校時是通過加快時分的計數速度來快速校準時間的。實際上我們把秒脈沖cps加到分計數和時計數上,是他們加快計數速度。所以其中我們需要通過開關來選擇。
原理圖及打包圖如下:
5、時段控制:時段控制是通過7485集成電路的數據比較來控制的。
原理圖及打包圖如下:
6、整點報時:整點報時是通過整點時的二進制數據規律來報時的。
原理圖及打包圖如下:
7、將時分秒打包文件連成多功能數字電路圖如下:
8、多功能數字鐘硬件測試原理圖如下:
9、部分制作過程圖,如下:
六、實驗工具
裝有QuartusⅡ軟件的電腦,EDA開發板,相關EDA設計方面的書籍。
七、設計中遇到問題及解決方法
1、實驗后期的引腳分配及下載方法不當,實驗所用電腦沒有
quartus11.0 的 驅動。耗費時間較多。解決方法:參閱西安電子科技大學出版社出版的《數字電路設計及 Verilog HDL 實現》第 394 頁關于引腳分配和下載驗證的介紹;
2、下載驗證過程中時段控制部分有錯誤,原代碼在軟件上仿真沒有錯誤,但是下載到實驗板驗證時,出現錯誤。解決方法:通過去請教同學及查閱相關資料得到解決。
八、特點和實用性
利用 QuartusII 軟件,結合所學的數字電路的知識設計一個 24 時多功能數 字鐘,具有正常分、秒計時,動態顯示、快速校分、整點報時、時段控制的功能。分析整個電路的工作原理,分別說明各子模塊的設計原理和調試、仿真、編 程下載的過程,并對最終結果進行總結,最后提出在實驗過程中出現的問題和解 決的方案。通過實驗掌握一些邏輯組合器件的基本功能和用法,同時體會利用軟件設計 電路的方便快捷,避免硬件布線的繁瑣,提高效率。
九、心得體會
1、設計必須要有整體概念,提前熟悉軟件。剛開始時沒頭緒,不知道該怎 樣分塊,進度很慢,加上對軟件不是很熟悉,比如:封裝要注意哪些,哪些不能 運行,哪些是不正確的操作等等,走了很多冤枉路。
2、設計的模塊要分塊調試,免得等所有都完工了再調試出錯,那樣的話很 難確定是什么出錯,更加沒頭緒。有必要的話做一部分后就送到平臺上調試,這 樣會大大減少出錯率。
3、沒有硬件軟件化的概念,開始設計時沒有總體的規劃,不知道什么是可行 的,什么是封裝,怎樣使搭配組合最優化。
4、遇到問題先自己摸索,查閱資料要有技巧,避免沒有目的和思路。明白 自己要解決什么問題。同時請教老師,和同學交流。良好的溝通很重要。針對本次的畢業設計,用我國著名的數學家的話概括一下我的感受: “科學上沒有平坦的大道,真理長河中有無數礁石險灘。只有不為畏攀登的采藥者,只有不怕 巨浪的弄潮兒,才能登上高峰采得仙草,深入水底覓得驪珠。”
十、參閱教材及文獻
1、蔣立平編著《數字電路》.南京理工大學翻印;
2、南京理工大學電子技術中心編著.《EDA 設計實驗指導書》 南京理工大學,2008 年;
3、譚會生,張昌凡.《EDA 技術及應用》.西安電子科技大學出版社,2001年;
4、《數字電路設計及 Verilog HDL 實現》 西安電子科技大學出版社出版;
5、《電子線路實驗設計與仿真講義》。
第二篇:EDA數字鐘設計
數字鐘
一、實驗目的
1、掌握多位計數器相連的設計方法。
2、掌握十進制,六進制,二十四進制計數器的設計方法。
3、掌握揚聲器的驅動及報時的設計。
4、LED燈的花樣顯示。
5、掌握CPLD技術的層次化設計方法。
二、實驗器材
1、主芯片Altera EPF10K10LC84-4。2、8個LED燈。
3、揚聲器。4、4位數碼顯示管。5、8個按鍵開關(清零,調小時,調分鐘)。
三、實驗內容
根據電路特點,運用層次設計概念設計。將此設計任務分成若干模塊,規定每一模塊的功能和各模塊之間的接口。
1、時計時程序: library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;
entity hour is
port(reset,clk : in std_logic;
daout : out std_logic_vector(7 downto 0));end hour;
architecture behav of hour is
signal count : std_logic_vector(3 downto 0);signal counter : std_logic_vector(3 downto 0);begin
p1: process(reset,clk)
begin
if reset='0' then
count<=“0000”;
counter<=“0000”;
elsif(clk'event and clk='1')then
if(counter<2)then
if(count=9)then
count<=“0000”;
counter<=counter + 1;
else
count<=count+1;
end if;
else
if(count=3)
then
counter<=“0000”;
else
count<=count+1;
count<=“0000”;
end if;
end if;
end if;
end process;
daout(7 downto 4)<=counter;daout(3 downto 0)<=count;
end behav;
2、分計時程序: library ieee;
use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;
entity minute is
port(reset,clk,sethour: in std_logic;
daout : out std_logic_vector(7 downto 0);
enhour : out std_logic);end minute;
architecture behav of minute is
signal count : std_logic_vector(3 downto 0);signal counter : std_logic_vector(3 downto 0);signal carry_out1 : std_logic;signal carry_out2 : std_logic;begin
p1: process(reset,clk)begin
if reset='0' then
count<=“0000”;
counter<=“0000”;
elsif(clk'event and clk='1')then
if(counter<5)then
if(count=9)then
count<=“0000”;
counter<=counter + 1;
else
count<=count+1;
end if;
carry_out1<='0';
else
if(count=9)then
count<=“0000”;
counter<=“0000”;
carry_out1<='1';
else
count<=count+1;
carry_out1<='0';
end if;
end if;end if;end process;
p2: process(clk)begin
if(clk'event and clk='0')then
if(counter=0)then
if(count=0)then
carry_out2<='0';
end if;
else
carry_out2<='1';
end if;end if;end process;
daout(7 downto 4)<=counter;daout(3 downto 0)<=count;enhour<=(carry_out1 and carry_out2)or sethour;end behav;
3、秒計時程序: library ieee;
use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;
entity second is
port(reset,clk,setmin : in std_logic;
daout : out std_logic_vector(7 downto 0);
enmin : out std_logic);end second;
architecture behav of second is
signal count : std_logic_vector(3 downto 0);signal counter : std_logic_vector(3 downto 0);signal carry_out1 : std_logic;signal carry_out2 : std_logic;begin
p1: process(reset,clk)begin
if reset='0' then
count<=“0000”;
counter<=“0000”;
elsif(clk'event and clk='1')then
if(counter<5)
then
if
(count=9)
then
count<=“0000”;
counter<=counter + 1;
else
count<=count+1;
end if;
carry_out1<='0';
else
if(count=9)
then
count<=“0000”;
counter<=“0000”;
carry_out1<='1';
else
count<=count+1;
carry_out1<='0';
end if;
end if;end if;end process;daout(7 downto
4)<=counter;
daout(3
downto
0)<=count;enmin<=carry_out1 or setmin;end behav;6
4、alert程序: library ieee;
use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;
entity alert is port(clkspk : in std_logic;
second : in std_logic_vector(7 downto 0);
minute : in std_logic_vector(7 downto 0);
speak : out std_logic;
lamp : out std_logic_vector(8 downto 0));end alert;
architecture behav of alert is signal divclkspk2 : std_logic;begin p1: process(clkspk)begin
if(clkspk'event and clkspk='1')then
divclkspk2<=not divclkspk2;
end if;end process;p2: process(second,minute)begin if(minute=“01011001”)then case second is
when “01010001”=>lamp<=“000000001”;speak<=divclkspk2;when “01010010”=>lamp<=“000000010”;speak<='0';when “01010011”=>lamp<=“000000100”;speak<=divclkspk2;when “01010100”=>lamp<=“000001000”;speak<='0';when “01010101”=>lamp<=“000010000”;speak<=divclkspk2;when “01010110”=>lamp<=“000100000”;speak<='0';when “01010111”=>lamp<=“001000000”;speak<=divclkspk2;when “01011000”=>lamp<=“010000000”;speak<='0';when “01011001”=>lamp<=“100000000”;speak<=clkspk;when others=>lamp<=“000000000”;end case;end if;end process;end behav;8
5、seltime程序 library ieee;
use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;
entity seltime is port(ckdsp : in std_logic;
reset : in std_logic;
second : in std_logic_vector(7 downto 0);
minute : in std_logic_vector(7 downto 0);
hour : in std_logic_vector(7 downto 0);
daout : out std_logic_vector(3 downto 0);
sel : out std_logic_vector(2 downto 0));end seltime;
architecture behav of seltime is signal sec : std_logic_vector(2 downto 0);begin
process(reset,ckdsp)begin
if(reset='0')then sec<=“000”;
elsif(ckdsp'event and ckdsp='1')then
sec<=“000”;else
sec<=sec+1;end if;end if;end process;
process(sec,second,minute,hour)begin case sec is
when “000”=>daout<=second(3 downto 0);when “001”=>daout<=second(7 downto 4);when “011”=>daout<=minute(3 downto 0);when “100”=>daout<=minute(7 downto 4);when “110”=>daout<=hour(3 downto 0);when “111”=>daout<=hour(7 downto 4);when others=>daout<=“1111”;end case;end process;
if(sec=“111”)then
sel<=sec;end behav;
6、deled程序: LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;use ieee.std_logic_unsigned.all;
ENTITY deled IS PORT(S: IN STD_LOGIC_VECTOR(3 DOWNTO 0);
A,B,C,D,E,F,G,H: OUT STD_LOGIC);END deled;
ARCHITECTURE BEHAV OF deled IS
SIGNAL DATA:STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL DOUT:STD_LOGIC_VECTOR(7 DOWNTO 0);BEGIN DATA<=S;PROCESS(DATA)BEGIN
CASE DATA IS
WHEN “0000”=>DOUT<=“00111111”;WHEN “0001”=>DOUT<=“00000110”;WHEN “0010”=>DOUT<=“01011011”;WHEN “0011”=>DOUT<=“01001111”;WHEN “0100”=>DOUT<=“01100110”;WHEN “0101”=>DOUT<=“01101101”;WHEN “0110”=>DOUT<=“01111101”;WHEN “0111”=>DOUT<=“00000111”;WHEN “1000”=>DOUT<=“01111111”;WHEN “1001”=>DOUT<=“01101111”;WHEN “1010”=>DOUT<=“01110111”;WHEN “1011”=>DOUT<=“01111100”;WHEN “1100”=>DOUT<=“00111001”;WHEN “1101”=>DOUT<=“01011110”;WHEN “1110”=>DOUT<=“01111001”;WHEN “1111”=>DOUT<=“01000000”;WHEN OTHERS=>DOUT<=“00000000”;END CASE;END PROCESS;H<=DOUT(7);
G<=DOUT(6);
F<=DOUT(5);
E<=DOUT(4);D<=DOUT(3);C<=DOUT(2);B<=DOUT(1);A<=DOUT(0);END BEHAV;
7、頂層原理圖:
四、實驗結果 頂層原理圖仿真波形:
五、心得體會
1、系統設計進要行充分的方案論證,不可盲目就動手去做;
2、實驗中對每一個細節部分都要全面思考,要對特殊情況進行處理;
3、對于數字系統,要考慮同步、異步問題;
4、數字電路的理論分析要結合時序圖;
5、遇到問題,要順藤摸瓜,分析清楚,不可胡亂改動,每做一次改變都要有充分的理由;
6、模塊化設計方法的優點在于其簡潔性,但是在實驗設計中也發現,在實驗最終電路確定之前,要盡量減少模塊重疊嵌套,因為在總的電路敲定之前,電路還不成熟,很多地方需要改進,如果在開始時就進行多層模塊化,里層模塊電路的修改將影響其外層的全部電路,這樣就是牽一發動全身,很顯然,這樣將導致電 數字鐘課程設計 電路設計的低效,所以在設計過程中,一定要盡量減少超過兩層的模塊;
7、遇到問題花了很長時間沒有解決掉,要學會想他人請教,別人的不經意一點,可能就能把自己帶出思維死區。
第三篇:EDA設計論文
EDA課程設計報告書
交通燈設計
設 計 者: 邱春華 呂云蘭
指導老師: 李 敏
學 號: 09387105 09387114 專業班級:通信工程0911班
摘要………………………………………………………………………………3
1、設計任務………………………………………………………………………4
2、方案選擇與論證………………………………………………………4
3、實現方案原理及說明…………………………………………………………5
4、系統設計詳述…………………………………………………………………6 a、分頻器的設計……………………………………………………………………6 b、控制器的設計……………………………………………………………………7 c、計數器的設計……………………………………………………………………7 d、分位譯碼電路的設計……………………………………………………………8 e、數碼管驅動的設計——綠燈和紅燈驅動………………………………………9 f、數碼管驅動的設計--黃燈驅動……………………………………………9
5、程序設計………………………………………………………………………10 5.1 分頻器的設計…………………………………………………………………10 5.2 控制器的設計…………………………………………………………………10 5.3 計數器的設計…………………………………………………………………11 5.4 分位譯碼電路的設計…………………………………………………………14 5.5數碼管驅動的設計……………………………………………………………15
6、整個系統的構成及仿真圖……………………………………………………17
7、心得體會………………………………………………………………………18
8、參考文獻………………………………………………………………………18
語言實現交通燈的設計
作者:邱春華、呂云蘭
指導老師:李 敏(湖北文理學院理工學院 襄陽 230036)
【摘要】:伴隨著社會的發展以及人類生活水平的提高,汽車的數量在EDA技術的發展和應用領域的擴大與深入,EDA 技術在電子信息、通信、自動控制及計算機應用等領域的重要性日益突出。隨著技術市場與人才市場對DEA 的不斷的增加,交通的問題日益突出,單單依靠人力來指揮交通已經不可行了。所以,設計交通燈來完成這個需求就顯的越加迫切。
【關鍵字】:EDA技術、VHDL語言、交通燈
QuartusII 設計軟件為用戶提供完整的多平臺設計環境,它可以輕易滿足特定設計的需要。它是單芯片可編程系統(SOPC)設計的綜合性環境,EDA技術作為現代電子設計技術的核心,它依賴強大的計算機,在EDA工具軟件平臺上,對以硬件描述語言VHDL為系統邏輯描述手段完成的設計文件,自動地完成邏輯編譯、邏輯簡化、邏輯分割、邏輯綜合,以及邏輯優化和仿真測試,直至實現既定的電子線路系統功能。下面詳細介紹在QUARTUS II軟件環境下開發基于VHDL語言交通燈的設計。、設計任務
a、設計內容
設計一個十字路口的交通燈控制系統,用實驗平臺上的LED 發光二極管顯示車輛通過的方向(甲車道和乙車道各一組),用數碼管顯示該方向的亮燈時間。
b、設計要求:
交通燈按正常狀態依次點亮紅、黃、綠燈,交警可以根據路口車流量的情況分別設置紅、綠、黃燈持續點亮的時間。在紅、綠燈點亮時,能夠顯示其點亮持續的時間。
2、方案選擇與論證
本次實驗設計交通燈設計采用自頂向下、由粗到細, 逐步分解的設計方法, 最頂層電路是指系統的整體要求, 最下層是具體的邏輯電路的實現。自頂向下的設計方法將一個復雜的系統逐漸分解成若干功能模塊, 從而進行設計描述, 并且應用EDA 軟件平臺自動完成各功能模塊的邏輯綜合與優化, 門級電路的布局, 再下載到硬件中實現設計。對于交通燈來說首先是分頻器、控制器、計數器、分位譯碼電路及數碼管驅動的設計,然后能在LED中顯示紅、綠、黃燈的轉化,并帶有數碼管計時功能。通過參考EDA課程設計指導書,有以下方案:
(1)、頂層文件輸入端口:時鐘脈沖信號、復位按鍵及綠燈計數器的計數范圍輸入端t1;輸出端口:兩個車道的紅、綠、黃輸出,及其所對應各燈所輸出時間計數共16個。
(2)、底層文件分為:a.分頻模塊、b.計數器模塊、c.控制器模塊、d.分位譯碼模塊、e.數碼管驅動模塊。
、實現方案原理及說明
從題目中計數值與交通燈的亮滅的關系如圖(1)所示:
圖(1)
交通燈控制器系統框圖如圖2 所示:
圖(2)考慮到黃燈的作用是警示已過停車線的司機盡快離開路口,而路口總寬度不變,因此將其固定為5 秒,而紅燈亮的時間等于綠燈亮的時間加上黃燈亮的時間,因此緊對綠燈點亮時間進行設置就可以同時改變紅燈亮的時間,這里將綠燈所能設置的最長時間設置為40 秒即(0 4、系統設計詳述 其輸入及輸出端口有: clkin——輸入的高頻時鐘脈沖; reset——復位端,高電平有效; t1——綠燈計數器的計數范圍輸入端; r1、g1、y1——分別為第一車道紅、綠、黃燈輸出; r1A、r1B、g1A、g1B、y1A——分別為第一車道紅、綠、黃燈對應的數碼管計數輸出; r2、g2、y2——分別為第二車道紅、綠、黃燈輸出; r2A、r2B、g2A、g2B、y2A——分別為第二車道紅、綠、黃燈對應的數碼管計數輸出; a、分頻器的設計 分頻器實現的是將高頻時鐘信號轉換成低頻的時鐘信號,用于觸發控制器和計數器。該分頻器實現的是一千分頻,將一千赫茲的時鐘信號分頻成一赫茲的時鐘信號。生成的Symbol 文件如圖 圖(3)3 和仿真波形如圖4 所示。 圖(4) b、控制器的設計 控制器的作用是根據計數器的計數值及t1 的輸入數據控制發光二極管的亮、滅,以及輸出正計時數值給七段數碼管的分位譯碼電路。本控制器是利用時鐘沿的下降沿讀取前級計數器的計數值,然后作出反應;生成的實體模塊如圖5 和仿真波形如圖6 所 圖(5)示。 圖(6) c、計數器的設計 計數器rcounter的計數范圍為由t1引腳輸入。計到t1 后,下一個時鐘沿恢復到0,開始下一輪計數。仿真波形如圖當t1 取7 時,計數器計數到7 后清零。實體模塊如圖7 和仿真波形如圖8。計數器grounter和計數器ycounter的實體模塊如圖9 和圖10 所示。 圖(7)圖(9)圖(10) 圖(8) d、分位譯碼電路的設計 由于控制器輸出的正計時數值可能是1 位或者2 位十進制數,因此在七段數碼管的譯碼電路前要加上分位電路(即將其分成2 個1 位的十進制數,如40 分成4 和0,5分為0 和5)。與控制器一樣,分位電路同樣可以由時鐘驅動,也可以設計成純組合邏輯電路。控制器中,引入了寄 圖(11)存器。本電路中分位電路使用組合邏輯電路實現。生成的實體模塊如圖11 及仿真波形如圖12。 圖(12) e、數碼管驅動的設計——綠燈和紅燈驅動 要求數碼管共陽極連接(共陽極的公共端為低電平時,LED 不亮),在設計中為每個數碼管都添加了一個驅動電路,在使用時通過調用模塊來實現。本模塊設計為時序邏 圖(14) 輯電路,采用下降沿觸發。實體模塊如圖14 和仿真波形如圖15。 圖(15) f、數碼管驅動的設計——黃燈驅動 由于黃燈固定時間是5 秒,因此變化范圍是0 至5 秒,七段數碼管只要能顯示0-5 的數就行了,所以單獨用一個數碼管驅動。實體模塊如圖16和仿真波形如圖17。圖(16) 圖(17) 、程序設計 5.1 分頻器的設計 library ieee;use ieee.std_logic_1164.all;entity fredevider is port(clkin:in std_logic;clkout:out std_logic);end;architecture devider of fredevider is constant N:integer:=499;signal counter:integer range 0 to N;signal clk:std_logic;begin process(clkin)begin if rising_edge(clkin)then if counter=N then counter<=0;clk<=not clk;else counter<=counter+1;end if;end if;end process;clkout<=clk;end;5.2 控制器的設計 library ieee;use ieee.std_logic_1164.all;entity control is port(clk :in std_logic;c1,c2,c3:out std_logic;w1,w2,w3:in std_logic;r1,r2 :out std_logic;y1,y2 :out std_logic;g1,g2 :out std_logic;reset :in std_logic);end control;architecture a of control is type state_space is(s3,s2,s1,s0); begin process(clk)begin if reset='1' then state<=s0;else if(clk'event and clk='1')then case state is when s0=> if w1='1' then state<=s1;end if;when s1=> if w2='1' then state<=s2;end if;when s2=> if w3='1' then state<=s3;end if;when s3=> if w2='1' then state<=s0;end if;end case;end if;end if;end process;c1<='1'when state =s0 else '0';c2<='1'when state =s1 or state =s3 else '0';c3<='1'when state =s2 else '0';r1<='1'when state =s1 or state =s0 else '0';y1<='1'when state =s3 else '0';g1<='1'when state =s2 else '0';r2<='1'when state =s2 or state =s3 else '0';y2<='1'when state =s1 else '0';g2<='1'when state =s0 else '0';end a;5.3 計數器的設計 5.3.1 綠燈計數器 library ieee;use ieee.std_logic_1164.all; port(clk :in std_logic;enable :in std_logic;t1 :in integer range 0 to 40;c1 :out std_logic;m1 :out integer range 0 to 5);end gcounter;architecture a of gcounter is begin process(clk)variable cnt : integer range 0 to 40;begin if(clk'event and clk='1')then if enable='1'and cnt library ieee;use ieee.std_logic_1164.all;entity rcounter is port(clk :in std_logic;enable :in std_logic;t1 :in integer range 0 to 40;c2 :out std_logic;m2:out integer range 0 to 32);end rcounter;architecture a of rcounter is constant y:Integer:=5;signal t2: integer range 0 to 45;begin process(clk)variable cnt : integer range 0 to 45; t2<=t1+y;if(clk'event and clk='1')then if enable='1'and cnt library ieee;use ieee.std_logic_1164.all;entity ycounter is port(clk :in std_logic;enable :in std_logic;c3 :out std_logic;m3 :out integer range 0 to 5);end ycounter;architecture a of ycounter is begin process(clk)variable cnt : integer range 0 to 5;begin if(clk'event and clk='1')then if enable='1'and cnt<5 then cnt:=cnt+1;else cnt:=0;end if;if cnt=5 then c3<='1';else c3<='0';end if;end if; end process;end a;5.4 分位譯碼電路設計 5.4.1分位器-1 LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY fenwei1 IS PORT(Numin:IN integer RANGE 0 TO 45;NumA,NumB:OUT Integer RANGE 0 to 9);END;ARCHITECTURE behavior OF fenwei1 IS BEGIN process(Numin)BEGIN IF Numin>=40 THEN NumA<=4;NumB<=Numin-40;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 PROCESS;END;5.4.2分位器-2 LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY fenwei2 IS PORT(Numin:IN integer RANGE 0 TO 45;);END;ARCHITECTURE behavior OF fenwei2 IS BEGIN process(Numin)BEGIN IF Numin>=40 THEN NumC<=4;NumD<=Numin-40;ELSIF Numin>=30 THEN NumC<=3;NumD<=Numin-30;ELSIF Numin>=20 THEN NumC<=2;NumD<=Numin-20;ELSIF Numin>=10 THEN NumC<=1;NumD<=Numin-10;ELSE NumC<=0;NumD<=Numin;END IF;END PROCESS;END;5.5數碼管驅動的設計 5.5.1 紅綠燈驅動 LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY ygqudong IS PORT(clk:in STD_LOGIC;enable :in std_logic;data:IN integer RANGE 0 TO 9;segout: out STD_LOGIC_VECTOR(6 downto 0));END;ARCHITECTURE behavior OF ygqudong IS BEGIN process(Clk,data)BEGIN IF falling_edge(Clk)and enable='1' then case data is when 1=>segout<=“0110000”;when 2=>segout<=“1101101”;when 3=>segout<=“1111001”;when 4=>segout<=“0110011”;when 5=>segout<=“1011011”;when 6=>segout<=“0011111”;when 7=>segout<=“1110000”;when 8=>segout<=“1111111”;when 9=>segout<=“1110011”;when others =>null;END CASE;END IF;END PROCESS;END;5.5.2 黃燈驅動 LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY hqudong IS PORT(clk:in STD_LOGIC;enable :in std_logic;data:IN integer RANGE 0 TO 5;segout: out STD_LOGIC_VECTOR(6 downto 0));END;ARCHITECTURE behavior OF hqudong IS BEGIN process(Clk,data)BEGIN IF falling_edge(Clk)and enable='1' then case data is when 0=>segout<=“1111110”;when 1=>segout<=“0110000”;when 2=>segout<=“1101101”;when 3=>segout<=“1111001”;when 4=>segout<=“0110011”;when 5=>segout<=“1011011”;when others =>null;END CASE;END IF;END PROCESS;END; 、整個系統的構成及仿真圖 圖(18) 圖(19) 結果說明:在圖18 中,綠燈計數器直接接分位譯碼器1,紅燈計數器直接接分位譯碼器2,每個譯碼器分別接兩個驅動電路,然后接輸出。左邊5 個驅動器接的數碼管顯示的是甲車道各個燈亮的時間,右邊5 個驅動器接的數碼管顯示的是乙車道各個燈亮的時間。在19 圖中可以看出甲車道綠燈亮的時間加上黃燈亮 乙車道紅燈亮的時間,乙車道綠燈亮的時間加上黃燈亮的時間等于甲車道紅燈亮的時間。與此同時具有燈亮時間計數顯示,可以看出該系統滿足我們所需的要求。 7、心得體會 一段時間的EDA課程設計,使我們學到了很多,本次課程設計的交通燈所需底層模塊很多,其實現的VHDL語言程序較多,整個過程中調試程序是很重要的,要有很好的耐心,開始編譯時總是會有很多錯誤,比如輸入錯誤、語法錯誤等,發現錯誤之后再一遍一遍的仔細查錯,直到沒有錯誤,然后進行波型仿真。現在,對EDA 的認識有了很大的提高,能夠熟練的使用QuartsII,能夠用VHDL 語言編寫簡單的、實用的小程序,這次EDA 課程設計重點學習了交通燈部分程序的編寫、調試、還有硬件下載、操作等過程。在整個課程設計的過程中,我們查閱了大量的關于EDA 的資料,特別是在網上和圖書館我找到了大量的關于硬件編程的資料。在李敏老師平時認真的授課及嚴格的治學態度下,讓我有了一定的基礎,同時還得感謝老師在實驗課上的細心指導,讓我們學到了很多,受益終生。 【參考文獻】 [1] 潘松, 黃繼業.EDA 技術實用教程[M] 第2版 北京: 科學出版社, 2006 [2] 曹昕燕,周鳳臣,聶春燕.EDA技術實驗與課程設計 北京:清華大學出版社,2006.5 EDA實驗報告 系別: 班級: 姓名: 學號: 目錄 1.EDA介紹 2.Quartus II軟件介紹 3.實習任務 4.封裝引腳圖 5.設計程序 6.結果顯示 7.實習心得 1.EDA介紹 EDA是電子設計自動化(Electronic Design Automation)縮寫。EDA技術是以計算機為工具,根據硬件描述語言HDL(Hardware Description language)完成的設計文件,自動地完成邏輯編譯、化簡、分割、綜合及優化、布局布線、仿真以及對于特定目標芯片的適配編譯和編程下載等工作。硬件描述語言HDL是相對于一般的計算機軟件語言,如:C、PASCAL而言的。HDL語言使用與設計硬件電子系統的計算機語言,它能描述電子系統的邏輯功能、電路結構和連接方式。設計者可利用HDL程序來描述所希望的電路系統,規定器件結構特征和電路的行為方式;然后利用綜合器和適配器將此程序編程能控制FPGA和CPLD內部結構,并實現相應邏輯功能的的門級或更底層的結構網表文件或下載文件。目前,就FPGA/CPLD開發來說,比較常用和流行的HDL主要有ABEL-HDL、AHDL和VHDL[1]。 幾乎所有適于大學生做的數字邏輯電路實驗都可以在計算機上利用EDA(Electronic Design Automatic—電子設計自動化)軟件進行設計、仿真,只有極少量外部配件不能在計算機上進行仿真。因此,在實驗前期階段,即實驗預習階段的主要應用工具是EDA軟件,利用EDA軟件可以設計、仿真實驗課題,進行虛擬實驗。通過虛擬實驗使實驗者在進入真實實驗前就能對預做的實驗有相當的了解,甚至可以預測到實驗的結果。這樣在實際做實驗時,可以把許多設計型實驗的難度降低,同時能有更多的時間讓實驗者動手做實驗,研究問題,提高實驗效率。當前數字電路設計已由計算機輔助設計進入到以計算機為主的設計時代。 2.Quartus II 是Altera公司的綜合性PLD開發軟件,支持原理圖、VHDL、VerilogHDL以及AHDL(Altera Hardware Description Language)等多種設計輸入形式,內嵌自有的綜合器以及仿真器,可以完成從設計輸入到硬件配置的完整PLD設計流程。 Quartus II支持Altera的IP核,包含了LPM/MegaFunction宏功能模塊庫,使用戶可以充分利用成熟的模塊,簡化了設計的復雜性、加快了設計速度。對第三方EDA工具的良好支持也使用戶可以在設計流程的各個階段使用熟悉的第三放EDA工具。 此外,Quartus II 通過和DSP Builder工具與Matlab/Simulink相結合,可以方便地實現各種DSP應用系統;支持Altera的片上可編程系統(SOPC)開發,集系統級設計、嵌入式軟件開發、可編程邏輯設計于一體,是一種綜合性的開發平臺。 Maxplus II 作為Altera的上一代PLD設計軟件,由于其出色的易用性而得到了廣泛的應用。目前Altera已經停止了對Maxplus II 的更新支持,Quartus II 與之相比不僅僅是支持器件類型的豐富和圖形界面的改變。Altera在Quartus II 中包含了許多諸如SignalTap II、Chip Editor和RTL Viewer的設計輔助工具,集成了SOPC和HardCopy設計流程,并且繼承了Maxplus II 友好的圖形界面及簡便的使用方法。 3.1 設計信號發生器使其能在儀器上顯示正弦、三角、方波、鋸齒波(其中的兩種波形) 2設計頻率計使其能測出制定波形的頻率 4.波形發生器封裝引腳圖 5.波形發生器程序(正弦波,方波) Boxing4 LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY boxing4 IS PORT(RIN:in std_logic; clk: IN std_logic;SINT:in std_logic_VECTOR(1 downto 0);--set:in std_logic;--_vector;--(1 downto 0);rs,rw,en,lcdon,lcdbon : OUT STD_LOGIC;YOUT:out std_logic_vector(7 downto 0);data : OUT STD_LOGIC_VECTOR(7 DOWNTO 0));END boxing4;ARCHITECTURE fwm OF boxing4 IS TYPE states IS(clear_display,set_initial,set_cgram,write_cgram,set_addram1,diaplay_cgram,set_addram2,diaplay_cgrom);--clear_display-清屏;--set_initial-初始化設置;--set_cgram-設置 cgram 地址;--write_cgram-字模寫入 cgram;--set_addram1-設置顯示 cgram 字符的 addram 地址;--diaplay_cgram-顯示 cgram 字符;--set_addram2-設置顯示 cgrom 字符的 addram 地址;--diaplay_cgrom-顯示 cgrom 字符 SIGNAL state:states;TYPE ram_array0 IS ARRAY(0 TO 7)OF STD_LOGIC_VECTOR(7 DOWNTO 0);--定義 ram_array0 為二維數組 TYPE ram_array1 IS ARRAY(0 TO 7)OF ram_array0;--定義 ram_array1 為三維數組 SIGNAL lcd_clk : STD_LOGIC;SIGNAL data1,data2,data3:INTEGER RANGE 0 TO 9;--signal n:std_logic;SIGNAL net1,net2:std_logic_vector(7 downto 0);--signal net3:std_logic; COMPONENT choice4_1 PORT(s:in std_logic_vector(1 downto 0); d1,d2: in std_logic_vector(7 downto 0); y: out std_logic_vector(7 downto 0));END COMPONENT;COMPONENT fangbo PORT(clkf,rf:in std_logic; qf:out std_logic_vector(7 downto 0));END COMPONENT;COMPONENT sin PORT(clksin,rsin:in std_logic; da:out std_logic_vector(7 downto 0));END COMPONENT;BEGIN u1: fangbo PORT MAP(clkf=>CLK,rf=>RIN,qf=>net1);u2: sin PORT MAP(clksin=>CLK,rsin=>RIN,da=>net2);u3: choice4_1 PORT MAP(s=>SINT,d1=>net1,d2=>net2,y=>YOUT);en <=lcd_clk;rw<= '0';lcdon<='1';lcdbon<='1';data1<=1;data2<=2;data3<=5; PROCESS(clk) CONSTANT m : INTEGER:=50000;--50M 分頻到 1kHz。 VARIABLE cout : INTEGER RANGE 0 TO 50000000:=0;BEGIN IF clk'EVENT AND clk='0' THEN cout:=cout+1; IF cout<=m/2 THEN lcd_clk<='1'; ELSIF cout ELSE cout:=0; END IF; END IF; END PROCESS; PROCESS(lcd_clk)CONSTANT cgram : ram_array1:=(--自定義 8 個 5*8 字符的字模(X“00”,X“0E”,X“00”,X“0E”,X“00”,X“1F”,X“00”,X“00”),--SAN(X“04”,X“1F”,X“04”,X“07”,X“05”,X“09”,X“13”,X“01”),--FANG(X“00”,X“1f”,X“04”,X“04”,X“17”,X“14”,X“14”,X“1f”),--ZHENG(X“0E”,X“02”,X“0E”,X“08”,X“08”,X“0e”,X“02”,X“0e”),--ZUO XIAN(X“04”,X“1E”,X“04”,X“08”,X“1e”,X“04”,X“09”,X“1f”),--YOU XIAN(X“00”,X“13”,X“0A”,X“03”,X“1a”,X“02”,X“0a”,X“13”),--ZUO BO(X“08”,X“1F”,X“09”,X“1E”,X“14”,X“08”,X“14”,X“03”),--YOU BO(X“18”,X“18”,X“07”,X“08”,X“08”,X“08”,X“07”,X“00”)--℃字符數據存儲器); VARIABLE datacnt:INTEGER RANGE 0 TO 15; VARIABLE cnt: STD_LOGIC_VECTOR(7 DOWNTO 0); VARIABLE num:INTEGER RANGE 0 TO 7;BEGIN--wait until net3='0';RISING_EDGE(lcd_clk); IF RISING_EDGE(lcd_clk)THEN --if sint=“00”then case sint is when “11”=> CASE state IS WHEN clear_display=> rs<='0';data<=“00000001”;state<=set_Initial;--清屏 WHEN set_initial=> IF datacnt<3 THEN rs<='0';data<=“00111000”;datacnt:=datacnt+1;--設置功能:8 位,兩行,5×8/每字符,重復 3 次 ELSIF datacnt=3 THEN rs<='0';data<=“00000110”;datacnt:=datacnt+1;--顯示模式:完成一個字符碼傳送后,AC 自動加 1;顯 ELSIF datacnt=4 THEN rs<='0';data<=“00001100”;datacnt:=datacnt+1;--顯示控制:顯示開,光標關,光標不閃爍 ELSE rs<='0';datacnt:=0;state <= set_cgram; END IF; WHEN set_cgram=>rs<='0';--設置 CGRAM 字符地址 data<=“01000000”+cnt;state<=write_cgram;--設置 CGRAM 字符地址 000 IF num <8 THEN cnt:=cnt+“00001000”;--設置 CGRAM 字符地址加 1 END IF; WHEN write_cgram=> rs<='1';--在 指 定 的--CGRAM 字符地址寫入對應的 8 個 5*8 字符字模 data <= cgram(num)(datacnt);datacnt:=datacnt+1;state <= write_cgram;--寫入 CGRAM 字符地址 000 的 5*8--字符字模 IF datacnt=8 THEN num:=num+1;datacnt:=0;state <= set_cgram;--寫入下一個自定義--的 5*8 字符字模 IF num =7 THEN num:=0;cnt:=“00000000”;state<=set_addram1;--8 個 5*8 字符字模寫--入完成 END IF; END IF; WHEN set_addram1=>rs<='0';--設置 ADDRAM 地址 1 data<=“10000000”;state<=diaplay_cgram; WHEN diaplay_cgram=>rs<='1';--顯示 ADDRAM 地址對應的 CGRAM 字符 --if sint=“00”then IF datacnt=0 THEN data<=X“02”;datacnt:=datacnt+1; ELSIF datacnt=1 THEN data<=X“03”;datacnt:=datacnt+1; ELSIF datacnt=2 THEN data <= X“04”;datacnt:=datacnt+1; ELSIF datacnt=3 THEN data<=X“05”;datacnt:=datacnt+1; ELSIF datacnt=4 THEN data<=X“06”;datacnt:=datacnt+1; ELSIF datacnt=5 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=6 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=7 THEN data<=X“46”;datacnt:=datacnt+1; ELSIF datacnt=8 THEN data<=X“3a”;datacnt:=datacnt+1; ELSIF datacnt=9 THEN data<=X“31”;datacnt:=datacnt+1; ELSIF datacnt=10 THEN data<=X“30”;datacnt:=datacnt+1; ELSIF datacnt=11 THEN data<=X“4d”;datacnt:=datacnt+1; ELSIF datacnt=12 THEN data<=X“48”;datacnt:=datacnt+1; ELSIF datacnt=13 THEN data<=CONV_STD_LOGIC_VECTOR(data3+48,8);datacnt:=datacnt+1;--顯示 cgrom 中指定的 ELSIF datacnt=14 THEN data<=X“5a”;datacnt:=datacnt+1; ELSE data<=X“20”;datacnt:=0;state <= set_addram2; END IF; WHEN set_addram2=>rs<='0';--設置 ADDRAM 地址 2 data<=“11000000”;state<=diaplay_cgrom; WHEN diaplay_cgrom=>rs<='1'; IF datacnt=0 THEN data<=X“4A”;datacnt:=datacnt+1; ELSIF datacnt=1 THEN data<=X“41”;datacnt:=datacnt+1; ELSIF datacnt=2 THEN data<=X“43”;datacnt:=datacnt+1; ELSIF datacnt=3 THEN data<=X“4B”;datacnt:=datacnt+1; ELSIF datacnt=4 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=5 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=6 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=7 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=8 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=9 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=10 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=11 THEN data<=CONV_STD_LOGIC_VECTOR(data3+48,8);datacnt:=datacnt+1; ELSIF datacnt=12 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=13 THEN data<=CONV_STD_LOGIC_VECTOR(data2+48,8);datacnt:=datacnt+1; ELSIF datacnt=14 THEN data<=CONV_STD_LOGIC_VECTOR(data1+48,8);datacnt:=datacnt+1; ELSE data<=X“56”;datacnt:=0;state <= set_addram1; END IF; END CASE; --end if; when “01”=> --elsif sint =“01”then CASE state IS WHEN clear_display=> rs<='0';data<=“00000001”;state<=set_Initial;--清屏 WHEN set_initial=> IF datacnt<3 THEN rs<='0';data<=“00111000”;datacnt:=datacnt+1;--設置功能:8 位,兩行,5×8/每字符,重復 3 次 ELSIF datacnt=3 THEN rs<='0';data<=“00000110”;datacnt:=datacnt+1;--顯示模式:完成一個字符碼傳送后,AC 自動加 1;顯 ELSIF datacnt=4 THEN rs<='0';data<=“00001100”;datacnt:=datacnt+1;--顯示控制:顯示開,光標關,光標不閃爍 ELSE rs<='0';datacnt:=0;state <= set_cgram; END IF; WHEN set_cgram=>rs<='0';--設置 CGRAM 字符地址 data<=“01000000”+cnt;state<=write_cgram;--設置 CGRAM 字符地址 000 IF num <8 THEN cnt:=cnt+“00001000”;--設置 CGRAM 字符地址加 1 END IF; WHEN write_cgram=> rs<='1';--在 指 定 的--CGRAM 字符地址寫入對應的 8 個 5*8 字符字模 data <= cgram(num)(datacnt);datacnt:=datacnt+1;state <= write_cgram;--寫入 CGRAM 字符地址 000 的 5*8--字符字模 IF datacnt=8 THEN num:=num+1;datacnt:=0;state <= set_cgram;--寫入下一個自定義--的 5*8 字符字模 IF num =7 THEN num:=0;cnt:=“00000000”;state<=set_addram1;--8 個 5*8 字符字模寫--入完成 END IF; END IF; WHEN set_addram1=>rs<='0';--設置 ADDRAM 地址 1 data<=“10000000”;state<=diaplay_cgram; WHEN diaplay_cgram=>rs<='1';--顯示 ADDRAM 地址對應的 CGRAM 字符 --if sint=“00”then IF datacnt=0 THEN data<=X“01”;datacnt:=datacnt+1; ELSIF datacnt=1 THEN data<=X“05”;datacnt:=datacnt+1; ELSIF datacnt=2 THEN data <= X“06”;datacnt:=datacnt+1; ELSIF datacnt=3 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=4 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=5 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=6 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=7 THEN data<=X“46”;datacnt:=datacnt+1; ELSIF datacnt=8 THEN data<=X“3a”;datacnt:=datacnt+1; ELSIF datacnt=9 THEN data<=X“31”;datacnt:=datacnt+1; ELSIF datacnt=10 THEN data<=X“30”;datacnt:=datacnt+1; ELSIF datacnt=11 THEN data<=X“4d”;datacnt:=datacnt+1; ELSIF datacnt=12 THEN data<=X“48”;datacnt:=datacnt+1; ELSIF datacnt=13 THEN data<=CONV_STD_LOGIC_VECTOR(data3+48,8);datacnt:=datacnt+1;--顯示 cgrom 中指定的 ELSIF datacnt=14 THEN data<=X“5a”;datacnt:=datacnt+1; ELSE data<=X“20”;datacnt:=0;state <= set_addram2; END IF; WHEN set_addram2=>rs<='0';--設置 ADDRAM 地址 2 data<=“11000000”;state<=diaplay_cgrom; WHEN diaplay_cgrom=>rs<='1'; IF datacnt=0 THEN data<=X“4A”;datacnt:=datacnt+1; ELSIF datacnt=1 THEN data<=X“41”;datacnt:=datacnt+1; ELSIF datacnt=2 THEN data<=X“43”;datacnt:=datacnt+1; ELSIF datacnt=3 THEN data<=X“4B”;datacnt:=datacnt+1; ELSIF datacnt=4 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=5 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=6 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=7 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=8 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=9 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=10 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=11 THEN data<=CONV_STD_LOGIC_VECTOR(data3+48,8);datacnt:=datacnt+1; ELSIF datacnt=12 THEN data<=X“20”;datacnt:=datacnt+1; ELSIF datacnt=13 THEN data<=CONV_STD_LOGIC_VECTOR(data2+48,8);datacnt:=datacnt+1; ELSIF datacnt=14 THEN data<=CONV_STD_LOGIC_VECTOR(data1+48,8);datacnt:=datacnt+1; ELSE data<=X“56”;datacnt:=0;state <= set_addram1; END IF; END CASE; --end if; when others =>null; end case; END IF;end process;END fwm; Choice4-1 library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all; --程序包 entity choice4_1 is --定義實體 port(s:in std_logic_vector(1 downto 0); --信號選擇端口s d1,d2: in std_logic_vector(7 downto 0);--d1d2d3d4分別連接四個波形發生模塊 y: out std_logic_vector(7 downto 0));--定義輸出信號端口 end choice4_1;architecture behav of choice4_1 is --結構體 begin process(s) begin case s is --case when語句進行信號位的選擇 when “01”=>y<=d1; when “11”=>y<=d2; when others=>null; end case;end process; --進程結束 end behav; --結構體結束 fangbo library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity fangbo is port(clkf,rf:in std_logic;qf:out std_logic_vector(7 downto 0));end entity;architecture behav of fangbo is signal a:bit;begin process(clkf,rf)--計數分頻 variable cnt:integer range 0 to 256;begin if(rf='0')then a<='0';elsif clkf'event and clkf='1' then if cnt<255 then--進行分頻 cnt:=cnt+1;else cnt:=0;a<=not a;end if;end if;end process;process(clkf,a)--信號輸出 begin if clkf'event and clkf='1' then if a='1' then qf<=“11111111”;else qf<=“00000000”;end if;end if;end process;end behav; sin library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity sin is port(clksin,rsin:in std_logic;da:out BIT_vector(7 downto 0));end entity;architecture behav of sin is signal a:bit;begin process(clksin,rsin)--計數分頻 variable cnt:integer range 0 to 256;begin if(rsin='0')then a<='0';elsif clksin'event and clksin='1' then if cnt<4 then--進行分頻 cnt:=cnt+1;else cnt:=0;a<=not a;end if;end if;end process;--process(clksin,a)process(a) variable tmp:std_logic_vector(7 downto 0);variable d:BIT_vector(7 downto 0);begin--if a='0' then--d:=“00000000”;--elsif clksin'event and clksin='1' then if a'event and a='1' then if tmp=“00111111” then tmp:=“00000000”;else tmp:=tmp+1;end if;case tmp is when “00000000”=>d:=“11111111”;when “00000001”=>d:=“11111110”;when “00000010”=>d:=“11111100”;when “00000011”=>d:=“11111001”;when “00000100”=>d:=“11110101”;when “00000101”=>d:=“11101111”;when “00000110”=>d:=“11101001”;when “00000111”=>d:=“11100001”;when “00001000”=>d:=“11011001”;when “00001001”=>d:=“11001111”;when “00001010”=>d:=“11000101”;when “00001011”=>d:=“10111010”;when “00001100”=>d:=“10101110”;when “00001101”=>d:=“10100010”;when “00001110”=>d:=“10010110”;when “00001111”=>d:=“10001010”;when “00010000”=>d:=“01111100”;when “00010001”=>d:=“01100000”;when “00010010”=>d:=“01100011”;when “00010011”=>d:=“01010111”;when “00010100”=>d:=“01001011”;when “00010101”=>d:=“01000000”;when “00010110”=>d:=“00110101”;when “00010111”=>d:=“00101011”;when “00011000”=>d:=“00100010”;when “00011001”=>d:=“00011010”;when “00011010”=>d:=“00010011”;when “00011011”=>d:=“00001101”;when “00011100”=>d:=“00001000”;when “00011101”=>d:=“00000001”;when “00011110”=>d:=“00000001”;when “00011111”=>d:=“00000000”;when “00100000”=>d:=“00000000”;when “00100001”=>d:=“00000001”;when “00100010”=>d:=“00000001”;when “00100011”=>d:=“00001000”;when “00100100”=>d:=“00001101”;when “00100101”=>d:=“00010011”;when “00100110”=>d:=“00011010”;when “00100111”=>d:=“00100010”;when “00101000”=>d:=“00101011”;when “00101001”=>d:=“00110101”;when “00101010”=>d:=“01000000”;when “00101011”=>d:=“01001011”;when “00101100”=>d:=“01010111”;when “00101101”=>d:=“01100011”;when “00101110”=>d:=“01100000”;when “00101111”=>d:=“01111100”;when “00110000”=>d:=“10001001”;when “00110001”=>d:=“10010110”;when “00110010”=>d:=“10100010”;when “00110011”=>d:=“10101110”;when “00110100”=>d:=“10111010”;when “00110101”=>d:=“11000101”;when “00110110”=>d:=“11011001”;when “00110111”=>d:=“11011001”;when “00111000”=>d:=“11100001”;when “00111001”=>d:=“11101001”;when “00111010”=>d:=“11101111”;when “00111011”=>d:=“11110101”;when “00111100”=>d:=“11111001”;when “00111101”=>d:=“11111100”;when “00111110”=>d:=“11111110”;when “00111111”=>d:=“11111111”;when others=>null;end case;end if;da<=d SRL 1;--幅度調整 end process;end behav; 頻率計 1、頻率產生器: library ieee;use ieee.std_logic_1164.all;library lpm;use lpm.lpm_components.all;entity lpm_counter0 is port(clock: in std_logic;q: out std_logic_vector(26 downto 0));end lpm_counter0;architecture syn of lpm_counter0 is signal sub_wire0 : std_logic_vector(26 downto 0);component lpm_counter generic(lpm_direction : string; lpm_port_updown : string;lpm_type : string;lpm_width : natural);port(clock : in std_logic; q : out std_logic_vector(26 downto 0));end component;begin q <= sub_wire0(26 downto 0);lpm_counter_component : lpm_counter generic map(lpm_direction => “up”,lpm_port_updown => “port_unused”,lpm_type => “lpm_counter”,lpm_width => 27)port map(clock => clock,q => sub_wire0);end syn; 2、測頻控制信號發生器 library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity testpl is port(clk:in std_logic;--1Hz信號 tsten:out std_logic;--計數器使能信號 clr_cnt:out std_logic;--計數器清零信號 load:out std_logic);--鎖存器輸出控制信號 end testpl;architecture art of testpl is signal div2clk:std_logic;begin process(clk)begin if clk'event and clk='1'then div2clk<=not div2clk;--div2clk為0.5Hz end if;end process;process(clk ,div2clk)begin if(clk='0'and div2clk='0')then clr_cnt<='1';--當div2clk與clk同時為零時計數器清零 else clr_cnt<='0';--當div2clk處于的高電平時計數器計數 end if;end process;load<=not div2clk;--鎖存器輸出與計數器使能信號反相 tsten<=div2clk;end art; 3、有時鐘使能的十進制計數器 library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt10 is port(clk,clr,en: in std_logic;--clk:計數器時鐘,clr:清零信號,en:計數使能信號 q: out std_logic_vector(3 downto 0);--q:4位計數結果輸出 c10: out std_logic);--計數進位 end cnt10;architecture art of cnt10 is signal cqi: std_logic_vector(3 downto 0);begin process(clk,clr)begin if clr='1' then cqi<=“0000”;--當輸入的clr_cnt為低電平1時清零 elsif clk'event and clk='1' then if en='1' then--當輸入的tesen為高電平1時允許計數 if(cqi<9)then cqi<=cqi+1;else cqi<=“0000”;--等于9則計數器清零 end if;--當輸入的tesen為低電平0時禁止計數,鎖定計數值 end if;end if;end process;--產生進位 process(cqi)begin if cqi=“1001” then c10<='1';--當加的9時產生進位輸出 else c10<='0';end if;end process;q<=cqi;end art;4、16位鎖存器 library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity reg16b is port(load: in std_logic;--輸出鎖存控制信號 din: in std_logic_vector(15 downto 0);dout: out std_logic_vector(15 downto 0));end reg16b;architecture art of reg16b is begin process(load,din)begin if load'event and load='1'then--load為高電平時teten為低電平,計數器禁止 dout<=din;--鎖存輸入的數據 end if;end process;end art; 5、數碼管控制器 library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity ledcom is port(clk:in std_logic;--數碼管掃描頻率 datain: in std_logic_vector(15 downto 0);--鎖存器輸入的16位信號 dataout: out std_logic_vector(3 downto 0);-輸出至譯碼器的4位信號 com: out std_logic_vector(3 downto 0));--輸出數碼管選擇信號 end ledcom;architecture art of ledcom is signal comclk: std_logic_vector(1 downto 0);begin--comclk同掃描頻率clk循環變化 process(clk)begin if rising_edge(clk)then if comclk>=3 then comclk <=“00”; else comclk<=comclk+1;end if;end if;end process;--數碼管選擇 process(comclk)begin case comclk is when “00” => com<=“1000”;when “01” => com<=“0100”;when “10” => com<=“0010”;when “11” => com<=“0001”;when others =>NULL;end case;end process;--對應數碼管的輸出 process(comclk,datain)begin case comclk is when “11”=> dataout<=datain(3 downto 0);when “10”=> dataout<=datain(7 downto 4);when “01”=> dataout<=datain(11 downto 8);when “00”=> dataout<=datain(15 downto 12);when others =>NULL;end case;end process;end art; 6、七段數碼管的譯碼器 library IEEE;use IEEE.std_logic_1164.all;entity ymq is port(d_in: in std_logic_vector(3 downto 0);--數碼管控制器輸入四位信號 d_out: out std_logic_vector(7 downto 0));--輸出8位信號 end ymq;--第8位d_out[7]為逗號 architecture art of ymq is begin process(d_in)begin case d_in is--第8位為1高電平逗號不顯示 when “0000” => d_out<=“11000000”;--0 when “0001” => d_out<=“11111001”;--1 when “0010” => d_out<=“10100100”;--2 when “0011” => d_out<=“10110000”;--3 when “0100” => d_out<=“10011001”;--4 when “0101” => d_out<=“10010010”;--5 when “0110” => d_out<=“10000010”;--6 when “0111” => d_out<=“11111000”;--7 when “1000” => d_out<=“10000000”;--8 when “1001” => d_out<=“10010000”;--9 when others =>NULL;end case;end process;end art; 7、元件聲明及例化將各個元器件依據設計相連 library ieee;use ieee.std_logic_1164.all;entity lx is port(clk: in std_logic;led: out std_logic_vector(7 downto 0);ledc: out std_logic_vector(3 downto 0));end lx;architecture art of lx is component lpm_counter0--待調用的頻率生成器端口定義 PORT(clock: IN STD_LOGIC;q: OUT STD_LOGIC_VECTOR(26 DOWNTO 0));end component;--十進制計數器 component cnt10--待調用的有時鐘使能的十進制計數器端口定義 port(clk,clr,en: in std_logic;q: out std_logic_vector(3 downto 0);c10: out std_logic);end component;--16位鎖存器 component reg16b--待調用的32位鎖存器端口定義 port(load: in std_logic;din: in std_logic_vector(15 downto 0);dout: out std_logic_vector(15 downto 0));end component;--測頻控制器 component testpl--待調用的測頻控制信號發生器端口定義 port(clk:in std_logic;tsten:out std_logic;clr_cnt:out std_logic;load:out std_logic);end component;--數碼管選擇器 component ledcom--待調用的數碼管選擇器端口定義 port(clk:in std_logic;datain: in std_logic_vector(15 downto 0);dataout: out std_logic_vector(3 downto 0);com: out std_logic_vector(3 downto 0));end component;--譯碼器 component ymq--待調用的譯碼器端口定義 port(d_in: in std_logic_vector(3 downto 0);d_out: out std_logic_vector(7 downto 0));end component;signal clk1,clk2,clk3: std_logic;--clk1為1Hz信號,clk2為被測信號,clk3為數碼管掃描信號 signal tsten,clr,load: std_logic;signal c1,c2,c3,c4: std_logic;signal qout,rout: std_logic_vector(15 downto 0);signal datao: std_logic_vector(3 downto 0);begin u0:testpl port map(clk1,tsten,clr,load);u1:cnt10 port map(clk2,clr,tsten,qout(3 downto 0),c1);u2:cnt10 port map(c1,clr,tsten,qout(7 downto 4),c2);u3:cnt10 port map(c2,clr,tsten,qout(11 downto 8),c3);u4:cnt10 port map(c3,clr,tsten,qout(15 downto 12),c4);u5:reg16b port map(load,qout(15 downto 0),rout);u6:ledcom port map(clk3,rout,datao,ledc);u8:ymq port map(datao,led);u9:lpm_counter0 port map(clk,q(25)=>clk1,q(15)=>clk2,q(17)=>clk3);end art; 6.結果顯示 7.實習心得 貴州師范大學學生 實習報告 科目:EDA實習 專業: 電氣工程及其自動化 班級: 10電氣 姓名: 李啟應 學號: 101401010202 實驗項目名稱:數字電子鐘的設計 實驗項目性質:普通試驗 所屬課程名稱:VHDL程序設計 一、實驗目的 學習VHDL語言的一些基本特點。2 掌握VHDL程序的基本結構。3掌握VHDL程序設計方法。要能夠用vhdl語言讀懂并編寫eda程序,對eda設計的總體框架能有較好的把握,掌握各模塊的調用方式。 二、實驗內容和要求 設計一個數字時鐘,顯示時(2位),分(2位),秒(2位),具體要求是:具有時分秒計數顯示功能,以24小時循環計時;數碼管動態顯示時,分,秒;具有清零功能。 在軟件工具平臺上,進行VHDL語言的各模塊編程輸入、編譯實現和仿真驗證。 三、實驗主要儀器設備和材料 計算機,開發環境MAX-PLUSII,ZY11EDA實驗系統,VHDL語言。 四、實驗方法、步驟及結果測試 1、設計思路: 數字鐘的主體是計數器,它記錄并顯示接收到的秒脈沖個數,其中秒和分位60進制計數器,小時為24進制計數器,分別產生3位BCD碼。BCD碼經譯碼,驅動后接數碼顯示電路。 根據實驗要求,將設計分為5個主要部分,時功能模塊、分功能模塊、秒功能模塊、掃描儀功能模塊和7段LED功能模塊。在時、分、秒模塊中,包括復位和預置數,其主要思路如下: 秒鐘的模塊:設計一個60進制的計數器,以clk為其時鐘信號,每60個clk后產 生一個進位信號CF給分鐘模塊,作為分鐘進程的響應信號。秒鐘模塊VHDL程序見附錄1: 仿真波形如下: 封裝如下圖: 分鐘的模塊:同理于秒鐘的模塊,設計一個60進制的計數器,以CFM為其時鐘信號,每60個CFM后產生一個進位信號CFM給小時模塊,作為小時模塊進程的響應信號。分鐘模塊VHDL程序見附錄二: 仿真波形如下: 封裝如下圖: 小時的模塊:為24進制計數器,在分的進位信號CFM的激發下計數,從0到23的時候產生一個信號CFH,全部清0,重新開始計時。小時模塊VHDL程序見附錄三: 仿真波形如下: 封裝如下圖: 掃描儀模塊:在掃描儀內部,有一個3-8譯碼器的片選信號,當3-8譯碼器的片選信號為000時,片選信號選中7段LED模塊中的秒的個位,當3-8譯碼器的片選信號為001時,片選信號選中7段LED模塊中的秒的十位,當3-8譯碼器的片選信號為010時,片選信號選中7段LED模塊中的分的個位,當3-8譯碼器的片選信號為011時,片選信號選中7段LED模塊中的分的十位,當3-8譯碼器的片選信號為100時,片選信號選中7段LED模塊中的時的個位,當3-8譯碼器的片選信號為101時,片選信號選中7段LED模塊中的時的十位,就這樣動態掃描,當輸入的時鐘信號頻率很高的時候,就形成了我們的時鐘。 掃描儀模塊VHDL程序見附錄四: 仿真波形如下: 封裝如下圖: 7段LED模塊:根據動態掃描儀的片選信號來依次點亮我們所需的時間。7段LED模塊VHDL程序見附錄五: 仿真波形如下: 封裝如下圖: 綜合以上5大模塊,把它們用線連接起來就得到我們的總的電路圖:如下圖所示: 其工作原理為:掃描儀3-8譯碼器的片選信號根據時分秒的輸入選中7段LED模塊,然后再由時分秒中產生的3位BCD碼來輸出秒的個位,十位、時的個位,十位、小時的個位,十位。 4.總結: 在實驗這兩周的時間里,我們做過DC觸發器、DQ觸發器、3-8譯碼器、二選一電路和四選一電路等,最后綜合做了數字時鐘電路,通過這次實習,我對用VHDL來編程有了更深的了解,在要編程的時候,我學會了分模塊進行,因為一開始的時候設計一個時鐘系統比較麻煩,沒有分模塊之前總是會有差錯,而之后思路就會比較清晰,有明確的方案,在對照書本里的編程規則與語句,就完成了這次的設計,總之就是獲益良多。附錄1:秒鐘模塊VHDL程序 library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity second is port(clk,reset:in std_logic;cf:out std_logic;second1_out:out std_logic_vector(3 downto 0);second10_out:out std_logic_vector(2 downto 0));end entity second;architecture one of second is signal second1n:std_logic_vector(3 downto 0);signal second10n:std_logic_vector(2 downto 0);begin second1_out<=second1n;second10_out<=second10n;process(clk,reset)begin if(reset='1')then second1n<=“0000”;second10n<=“000”;elsif(clk' event and clk='1')then if(second1n=“1001”)then 7 second1n<=“0000”;if(second10n=“101”)then second10n<=“000”;cf<='1';else second10n<=second10n+1;end if;else second1n<=second1n+1;end if;end if;end process;end architecture one;附錄二:分鐘模塊VHDL程序 library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity minute is port(clk,reset:in std_logic;cf:out std_logic;minute1_out:out std_logic_vector(3 downto 0);minute10_out:out std_logic_vector(2 downto 0));end entity minute;architecture one of minute is signal minute1n:std_logic_vector(3 downto 0);signal minute10n:std_logic_vector(2 downto 0);begin minute1_out<=minute1n;minute10_out<=minute10n;process(clk,reset)begin if(reset='1')then minute1n<=“0000”;minute10n<=“000”;elsif(clk' event and clk='1')then if(minute1n=“1001”)then minute1n<=“0000”;if(minute10n=“101”)then minute10n<=“000”;cf<='1';else minute10n<=minute10n+1;end if;else minute1n<=minute1n+1;end if;end if;end process;end architecture one;附錄三:小時模塊VHDL程序 library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity hour is port(clk,reset:in std_logic;hour1_out:out std_logic_vector(3 downto 0);hour10_out:out std_logic_vector(1 downto 0));end entity hour;architecture one of hour is signal hour1n:std_logic_vector(3 downto 0);signal hour10n:std_logic_vector(1 downto 0);begin hour1_out<=hour1n;hour10_out<=hour10n;process(clk,reset)begin if(reset='1')then hour1n<=“0000”;hour10n<=“00”;elsif(clk' event and clk='1')then if(hour1n=“1001”or(hour1n=“0011”and hour10n=“0010”))then hour1n<=“0000”;if(hour10n=“10”)then hour10n<=“00”;else hour10n<=hour10n+1;end if;else hour1n<=hour1n+1;end if;end if;end process;end architecture one;附錄四:掃描儀模塊VHDL程序 library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity saomiaoyi is port(clk:in std_logic;reset:in std_logic;second1,minute1,hour1:in std_logic_vector(3 downto 0);second_10,minute_10:in std_logic_vector(2 downto 0);hour_10:in std_logic_vector(1 downto 0);dataout:out std_logic_vector(3 downto 0);sel:out std_logic_vector(2 downto 0));end entity saomiaoyi;architecture one of saomiaoyi is signal count:std_logic_vector(2 downto 0);begin sel<=count;process(clk,reset)begin if(reset='1')then dataout<=“0000”;elsif(clk'event and clk='1')then if count>=“101” then count<=“000”;else count<=count+1;end if;end if;case count is when“000”=>dataout<=second1;when“001”=>dataout<='0'& second_10;when“010”=>dataout<=minute1;when“011”=>dataout<='0'& minute_10;when“100”=>dataout<=hour1;when others =>dataout<=“00”& hour_10;end case;end process;end architecture one; 附錄五:7段LED模塊VHDL程序 LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY led_7 IS PORT(A:IN STD_LOGIC_VECTOR(3 DOWNTO 0);LED7S:OUT STD_LOGIC_VECTOR(6 DOWNTO 0));END entity led_7;ARCHITECTURE one OF led_7 IS BEGIN PROCESS(A)BEGIN CASE A(3 DOWNTO 0)IS WHEN “0000” => LED7S <= “0111111”;--X“3F” 0 WHEN “0001” => LED7S <= “0000110”;--X“06” 1 WHEN “0010” => LED7S <= “1011011”;--X“5B” 2 WHEN “0011” => LED7S <= “1001111”;--X“4F” 3 WHEN “0100” => LED7S <= “1100110”;--X“66” 4 WHEN “0101” => LED7S <= “1101101”;--X“6D” 5 WHEN “0110” => LED7S <= “1111101”;--X“7D” 6 WHEN “0111” => LED7S <= “0000111”;--X“07” 7 WHEN “1000” => LED7S <= “1111111”;--X“7F” 8 WHEN “1001” => LED7S <= “1101111”;--X“6F” 9 WHEN OTHERS => NULL;END CASE;END PROCESS;END ARCHITECTURE one;第四篇:EDA實習報告
第五篇:EDA實習報告