第一篇:VHDL實驗報告
《創新實驗》實驗報告
—基于VHDL的編程和硬件實現
一、實驗目的 1.2.3.4.熟悉和掌握硬件描述語言VHDL的基本語法及編寫; 掌握軟件Xilinx ISE 10.1的使用; 熟悉SDZ-6電子技術實驗箱的使用;
了解節拍脈沖發生器等基本電路的實現;
5.了解八位二進制計數器的功能與設計; 6.學習鍵盤和七段數碼管顯示的控制和設計。
二、實驗內容
1.Xilinx ISE 10.1軟件的使用;
2.節拍脈沖發生器等基本電路的實現; 3.八位二進制計數器的實現 4.鍵盤掃描及顯示的實現
三、實驗器材
1、PC機
2、SDZ-6電子技術實驗箱
3、正負5V電源
4、I/O接口線
四、軟件的使用
在安裝Xilinx10.1軟件時,需要一個ID號,其實這個ID號是可以重復使用的,幾個同學在官網注冊后就可以共享ID號了。
安裝完成之后就可以使用這個軟件編寫相應的VHDL的程序。1.新建工程
File—>New Project 彈出下面的對話框
輸入工程名后單擊Next。然后根據本實驗的實驗箱進行以下設置。
以后的步驟一般都是單擊Next(有些資料上會介紹有些這些步驟的具體功能,但對于本實驗不必用到),最后單擊Finish,完成新建一個工程。在窗口的左邊會出現剛剛新建的工程,如下:
2.新建一個VHDL的源文件。
在上圖中,右擊工程選擇New Source,彈出如下對話框。
在對畫框的左邊選擇VHDL Module,輸入文件的名字(改名字最好是你定義的實體的名字)。單擊Next。出現下面的對話框。
該對話框主要是對外部端口的編輯。可以直接跳過,即單擊Next,在源文件上編輯端口。然后在接下來的對話框中單擊Finish。完成建立一個源文件。窗口右邊就會出現剛才編輯的源文件。
3.編寫和編譯代碼
將事先編好的代碼復制到源文件里,然后保存文件。選中左邊的文件名,在窗體的左邊出現如下編輯文檔內容。
選擇Synthesize —XST—》Check Syntax,雙擊Check Syntax,開始編譯源文件。
4.軟件仿真
其實仿真這一步可要可不要,很多程序都不需要仿真,有些程序即使仿真出錯,但是最后結果卻可以出來。因此,我們做實驗時很少仿真,此處也不再贅述了。
5.綜合
首先根據實驗箱的安排布局,找到程序中外部接口的對應實驗箱上的接口,進行接口對應,雙擊如下圖所示的選項。
出現接口窗口如下,進行設置(具體參見老師發的文檔SDZ電子實驗箱的使用說明文檔)保存,關閉即可
然后如下圖從Implement Design開始依次雙擊綜合。
6.下載
雙擊Configure Target Device綜合完成之后,就出現下載對話框。右擊鼠標鍵盤選擇Add Xilinx Device,選擇.bit文件。然后右擊選擇Program,就將程序燒錄到實驗板上了。
五、節拍脈沖發生器電路實現
1、實驗題目:
參照時標系統的設計方法,用組合邏輯方法設計一個簡單的節拍脈沖發生器,產生圖1-6所示的節拍脈沖,并用單脈沖驗證設計的正確性。在實驗報告中畫出完整電路,寫出W1、W0和N1的表達式。
圖1-6 簡單的節拍脈沖發生器一周期的波形
設計提示:
1、由波形圖求出節拍脈沖W1和W0的表達式,進而組合成N1的表達式。
2、注意節拍電平T1和T0的翻轉時刻應在M0下降沿與M的上升沿同時出現的時刻。
3、注意D觸發器的觸發翻轉要求。
2、實驗步驟:
1.根據題目確定輸出結果的邏輯表達式
W1?M*M0*T1
W0?M*M0*T1*S
N1?W1?W0
2.畫出電路圖
3.確定輸入輸出的外部端口 輸入端口:M(由時鐘產生)輸出端口:W1,W0,N1 4.根據電路圖寫代碼 5.編譯,調試
3、實驗代碼 library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;——頭文件
entity clk_div is
Port(clk : in STD_LOGIC;
w0 : out STD_LOGIC;
w1 : out STD_LOGIC;
N1 : out STD_LOGIC);end clk_div;
architecture Behavioral of clk_div is signal count : std_logic_vector(3 downto 0):=“0000”;signal a : std_logic;signal b : std_logic;signal temp : integer range 0 to 50;signal Q : std_logic;begin process(clk,Q)
begin if(clk'event and clk='1')then
——對clk進行分頻
temp <= temp+1;if(temp =49)then
Q <= not Q;
end if;temp <= 0;end if;if(Q'event and Q='1')then
if(count =“1111”)then
count <=(others =>'0');else
count <=count+1;end if;end if;a <=(not clk and count(0))and count(1);
b <=(not clk and count(0))and(not count(1)and count(2));end process;w1 <= a;w0 <= b;N1 <=a or b;end Behavioral;
4、硬件實現與注意事項
硬件實現主要說的是外部端口和實驗箱的對應問題。M:接的是時鐘脈沖,即P150 W1:接LED燈顯示結果,即P45 W0:接LED燈顯示結果,即P44 N1:接LED燈顯示結果,即P47 注意事項:
1.時鐘脈沖頻率太高,結果會顯示的很快,因此首先對CLK進行50倍的分頻。將頻率降低以便觀察結果。2.由于時鐘頻率過高,可能仿真不出來,因此就不必仿真。3.可能有些組編譯通過但在綜合時出現錯誤(是有關BUF的),這時就需要在CLK之前接入一個緩沖器。具體的加入代碼如下: library UNISIM;
——頭文件 use UNISIM.VComponents.all;entity test is
Port(clk : in STD_LOGIC;end test;
architecture Behavioral of test is signal ck:std_logic;
component IBUF
——定義緩沖器
port(I:in STD_LOGIC;
O:out STD_LOGIC);end component;begin UO:IBUF port map(I=>clk,O=>ck);——以后的ck代替clk 六、八位二進制計數器的實現 1. 實驗題目
請用VHDL編寫一個八位二進制計數器,具有異步清零功能、同步置數、計數功能。實驗驗證時,須用單脈沖進行驗證。計數器的輸出顯示在顯示器上。〖顯示器可以是:①七段數碼顯示器,②LED發光二極管。〗
2. 實驗代碼
library IEEE;
——頭文件 use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;library UNISIM;use UNISIM.VComponents.all;
entity Counter8 is
Port(set : in STD_LOGIC;
——低電平置數
reset : in STD_LOGIC;
——低電平異步清零
key : out STD_LOGIC;
——鍵盤輸出口
clk : in STD_LOGIC;
——鍵盤的輸入口,當成單脈沖使用
co : OUT STD_LOGIC;
——進位
architecture example of Counter8 is signal ck: std_logic;signal cc: std_logic;signal down : STD_LOGIC_VECTOR(7 DOWNTO 0):=“00000000”;signal kk : std_logic:='0';put : in STD_LOGIC_VECTOR(7 DOWNTO 0);——置數
load : OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
——LED顯示
end Counter8;
component IBUF
——設置緩沖器 port(I : in STD_LOGIC;
O : out STD_LOGIC);end component;
begin
key <=kk;load <=down;co <=cc;U0:IBUF port map(I=>clk,O=>ck);p0:PROCESS(ck)begin if(ck' event and ck='0')then
IF(set ='0')THEN
——低電平置數 down <=put;ELSE
down <=down+1;END IF;END IF;
IF(reset ='0')then
——低電平異步清零 down <=“00000000”;END IF;if(down=“11111111”)then
——進位設置 cc <='1';else cc <='0';end if;end process p0;end example;
3. 硬件實現與注意事項 硬件實現:
clk:接鍵盤的行或列,即P 29
key :接鍵盤的行或列與clk相對應,即P34 reset :接數字開關,即P62 set:接數字開關,即P61 co :接電平顯示,即P45 put(0-7):全部接數字開關,即P73 P74 P70 P71 P68 P69 P63 P67 load(0-7):全部接電平顯示,即P59 P60 P57 P58 P48 P49 P46 P47
注意事項: 1.由于在綜合時出了問題,本實驗在輸入clk之前加入了一個緩沖器 2.在實驗中發現數字開關的抖動比鍵盤大,就選用鍵盤作為單脈沖。3.本實驗在題目的基礎上,新增了進位顯示功能。
七、鍵盤掃描及顯示的實現 1.實驗題目
請用VHDL編寫一個鍵盤掃描程序,對實驗箱上的4×4鍵盤(藍色部分)進行掃描。當有某個鍵被按下時,該鍵的鍵值被顯示在顯示器上。〖顯示器可以是:①七段數碼顯示器,②LED發光二極管。〗
2.實驗代碼
library IEEE;
——頭文件 use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;library UNISIM;use UNISIM.VComponents.all;
ENTITY KEYDIS IS
PORT(clk
: IN std_logic;
——掃描時鐘
row
: OUT std_logic_vector(3 DOWNTO 0);
column : IN std_logic_vector(3 DOWNTO 0);
dyp
: OUT std_logic_vector(7 DOWNTO 1));
——數碼管顯示 END KEYDIS;
ARCHITECTURE arch OF KEYDIS IS SIGNAL div_cnt : std_logic_vector(1 downto 0):=“00”;SIGNAL scan_key : std_logic_vector(3 DOWNTO 0):=“1110”;SIGNAL key_code : std_logic_vector(3 DOWNTO 0):=“0000”;
SIGNAL dyp_tmp : std_logic_vector(7 DOWNTO 1):=“0000001”;SIGNAL COUNT : INTEGER range 0 TO 30;signal ck : std_logic;component IBUF
——緩沖器的聲明
port(I:in STD_LOGIC;
O:out STD_LOGIC);end component;BEGIN U1:IBUF port map(I=>clk,O=>ck);row <= scan_key;dyp <= dyp_tmp;PROCESS(ck)BEGIN
IF(ck' EVENT AND ck = '1')THEN
div_cnt <= div_cnt + 1;
END IF;
IF(ck' EVENT AND ck = '1')THEN
COUNT <= COUNT + 1;
PROCESS(div_cnt(1 downto 0))
——掃描行(out)輸出,和時鐘頻率一樣
BEGIN
CASE div_cnt(1 downto 0)IS
WHEN “00”=>
scan_key<=“1110”;WHEN “01”=> scan_key<=“1101”;WHEN “10”=> scan_key<=“1011”;WHEN “11”=>
IF COUNT = 30 THEN COUNT <= 0;END IF;END IF;END PROCESS;
scan_key<=“0111”;
WHEN OTHERS =>
NULL;
END CASE;END PROCESS;
PROCESS(ck)BEGIN IF(ck'EVENT AND ck='1')THEN
CASE scan_key IS
WHEN “1110” =>
CASE column IS
WHEN “1110” =>
key_code <= “0000”;
——編碼器輸入
WHEN “1101” =>
key_code <= “0001”;
WHEN “1011” =>
key_code <= “0010”;
WHEN “0111” =>
key_code <= “0011”;
WHEN OTHERS =>
NULL;
END CASE;
WHEN “1101” =>
CASE column IS
WHEN “1110” =>
key_code <= “0100”;
WHEN “1101” =>
key_code <= “0101”;
WHEN “1011” =>
key_code <= “0110”;
WHEN “0111” =>
key_code
WHEN OTHERS =>
NULL;
END CASE;
WHEN “1011” =>
CASE column IS
WHEN “1110” =>
key_code
WHEN “1101” =>
key_code
WHEN “1011” =>
key_code
WHEN “0111” =>
key_code
WHEN OTHERS =>
NULL;
END CASE;
WHEN “0111” =>
CASE column IS
WHEN “1110” =>
key_code
WHEN “1101” =>
key_code
WHEN “1011” =>
key_code
WHEN “0111” =>
key_code
WHEN OTHERS =>
NULL;
END CASE;
WHEN OTHERS =>
key_code <= “1111”;
END CASE;
END IF;
<= “0111”;
<= “1000”;
<= “1001”;
<= “1010”;
<= “1011”;
<= “1100”;
<= “1101”;
<= “1110”;
<= “1111”;
END PROCESS;
--顯示鍵值
PROCESS(key_code)
BEGIN--延時防抖動
IF COUNT = 0 THEN--
IF key_code = NOT “0000” THEN
CASE key_code IS
WHEN “0000” =>
dyp_tmp <= “1111110”;
WHEN “0001” =>
dyp_tmp <= “0110000”;
WHEN “0010” =>
dyp_tmp <= “1101101”;
WHEN “0011” =>
dyp_tmp <= “1111001”;
WHEN “0100” =>
dyp_tmp <= “0110011”;
WHEN “0101” =>
dyp_tmp <= “1011011”;
WHEN “0110” =>
dyp_tmp <= “1011111”;
WHEN “0111” =>
dyp_tmp <= “1110000”;
WHEN “1000” =>
dyp_tmp <= “1111111”;
WHEN “1001” =>
dyp_tmp <= “1111011”;
WHEN “1010” =>
dyp_tmp <= “1110111”;
WHEN “1011” =>
dyp_tmp <= “0011111”;
WHEN “1100” =>
dyp_tmp <= “1001110”;
WHEN “1101” =>
dyp_tmp <= “0111101”;
WHEN “1110” =>
dyp_tmp <= “1001111”;
WHEN “1111” =>
dyp_tmp <= “1000111”;
WHEN OTHERS =>
NULL;
END CASE;
——編碼器輸出并且數碼管顯示
END IF;--END IF;
END PROCESS;END arch;
3.硬件實現與注意事項 硬件實現:
clk:接掃描時鐘,即P150 column(0-3):對應于鍵盤的列值,即P34 P33 P36 P35 row(0-3): 對應于鍵盤的行值,即P30 P31 P27 P29 dyp(1-7):對應于數碼管顯示,即P123 P125 P127 P129 P132 P133 P134 注意事項:
1.掃描時鐘與顯示時鐘是不對應的,掃描的時鐘快一些,顯示時鐘是在掃描時鐘基礎上的延時,該功能由參數COUNT實現。掃描程序和顯示程序是分開寫的。2.行和列其實沒什么區別,只要按照正確的秩序來排列column和row結果就出正確。從另一方面,要得到正確的,希望的掃描數值,就必須安排好這行和列。以上的硬件實現的安排,是我們組測試了幾遍的結果。3.代碼中有很多語法如When else、With select、Case,其中有很多的技巧值得我們舉一反三的。比如,鍵盤掃描時如何顯示1110 1101 1011 0111,我們可以用移位寄存器實現,也可以像程序代碼那樣引入一個變量div_cnt,讓其跟著掃描脈沖自動循環四位。另外,顯示部分引入了譯碼器的原理實現數碼管的16數值的顯示。
4.本實驗使用靜態數碼管進行顯示。首先用一個數碼管顯示16個鍵值0~f,然后再用雙數碼管顯示鍵值,從01~16顯示鍵盤的鍵值。
5.數碼管顯示參數從高位到地位分別對應實驗箱數碼管的a~f,最后一位是小數點,并且數碼管是共陰的,即高電平是數碼管對應的LED才會發光。實驗箱上的數碼管LED對應關系如下:
八、實驗感想
經過這次的合作,我們深深的體會到團隊合作的重要性。在本次實驗中,我們組遇到了很多困難。不過,我們互幫互助,互相鼓勵,最終我們組還是能在比較快的時間內把實驗結果做出來。
第一次實驗中也就是節拍脈沖發生器電路實現,由于實驗箱上最慢的時鐘頻率是100Hz,結果顯示的太快,就需要對時鐘進行分頻,我們組很快在寫出了分頻的代碼,然后進行編譯和仿真。但是仿真的結果怎么也出不來。當時我們組有三個人就有點不耐煩了,準備放棄下次再弄。但是另外一個同學堅持綜合,下載的步驟,結果就在不經意間出來了。事后我們才知道這個實驗仿真是出不來的,也就是不用仿真這一步的。只要編譯,綜合對了就能下載并且結果正確。我們當時想辛虧組里有一個堅持不懈的人,否則,我們還得拖一個星期才能檢查。
第二次做八位二進制計數器的實現時,我們吸取上次的教訓不做仿真。但是實驗要求需要一個單脈沖,異步清零端,置數端,八個數值顯示。這一算共需要十一個數字開關,但實驗箱上卻只有十個數字開關。不過我們首先先用試驗箱上的100Hz接口代替單脈沖,并對他進行50倍分頻,結果顯示的非常好。然后我們將異步清零放在一個鍵盤上實現,單脈沖放在數字開關上實現,結果抖動的非常厲害。在和別的組同學交流之后,我們組將單脈沖放在鍵盤上實現,抖動現象明顯緩解。另外我們組還在此基礎上增加了一個進位顯示的功能。
在實驗顯示這塊,我們組希望盡可能多用實驗箱上給我們提供的顯示儀器(即LED電平顯示和數碼管顯示)。我們把LED電平顯示安排在八位二進制計數器的實現的實驗上,把數碼管顯示安排在鍵盤掃描及顯示的實現的實驗上。
第三次做鍵盤掃描及顯示的實現的實驗是,由于這次程序比較復雜,我們組采取二種辦法。一個人根據自己所學所看的資料寫代碼(前二個實驗都是我們自己寫的代碼),另一個人在網上收資料。結果我們自己寫的代碼有些不夠嚴謹,結果循環顯示,顯然代碼沒有編好,然后我們組四個就參考網上收的代碼,先將代碼的含義弄清楚,然后我們在對代碼稍作修改,就完成了此次的代碼編寫。這次實驗涉及的知識較前面二個實驗都多一些。比如,如何掃描鍵盤,如何將結果顯示在數碼管上,如何使用數碼管(是共陰的還是共陽的),如何防抖等等。具體看上面的鍵盤掃描及顯示的實現的注意事項。
此次實驗我們基本達到題目的要求,通過這次實驗我們對VHDL有了更清晰的認識。雖然實驗過程中我們成員之間有爭論,綜合、下載、調試時感覺很累,但挺一挺就過去了,困難過后才會感覺到成功的甘甜。
第二篇:VHDL體會
學習心得
——《eda技術實用教程》
本學期對《eda技術實用教程--vhdl版》的學習為我的專業知識學習打開了一個全新的窗口——微電子技術領域。對eda技術,我更是有了全新的認識。
微電子技術的進步主要表現在大規模集成電路加工技術即半導體工藝技術的發展上,使得表征半導體工藝水平的線寬已經達到了納米級。所以,集成電路設計正在不斷地向超大規模、極低功耗和超高速的方向發展。
而現代電子設計技術的核心已日趨轉向基于計算機的電子設計自動化技術,即eda技術。eda技術就是依賴功能強大的計算機,在eda工具軟件平臺上,對以硬件描述語言hdl為系統邏輯描述手段完成的設計文件,自動地完成邏輯編譯、化簡、分割、綜合、布局布線以及邏輯優化和仿真測試,直至實現既定的電子線路系統功能。eda技術使得設計者的工作僅限于利用軟件的方式,即利用硬件描述語言和eda軟件來完成對系統硬件功能的實現,這是電子設計技術的一個巨大進步。eda技術在進入21世紀后,得到了更大的發展。嵌入式處理器軟核的成熟,使得sopc步入大規模應用階段。電子技術領域全方位融入eda技術,除了日益成熟的數字技術外,傳統的電路系統設計建模理念發生了重大的變化。同時,eda使得電子領域各學科的界限更加模糊,更加互為包容。這些都利于設計人員利用eda技術進行電子系統設計,如全定制或半定制asic設計,fpga/cpld開發應用和印制電路板。
從eda技術的特點不難看出,相比于傳統的數字電子系統或ic設計,eda技術擁有獨特的優勢。在傳統的數字電子系統或ic設計中,手工設計占了較大的比例。因此,也存在很多缺點。例如:復雜電路的設計、調試十分困難;由于無法進行硬件系統仿真,如果某一過程存在錯誤,查找和修改十分不便;設計過程中產生大量文檔,不易管理;可移植性差等。相比之下,eda技術有很大不同。它運用hdl對數字系統進行抽象的行為與功能描述到具體的內部線路結構描述,從而可以在電子設計的各個階段、各個層次進行計算機模擬驗證,保證設計過程的正確性,可以大大降低設計成本,縮短設計周期。由于有各類庫的支持,能夠完成各種自動設計過程。它極大地簡化了設計文檔的管理,邏輯設計仿真測試技術也日益強大。vhdl在現在的eda設計中使用最多,也擁有幾乎所有主流eda工具的支持。vhdl作為一個規范語言和建模語言,不僅可以作為系統模擬的建模工具,而且可以作為電路系統的設計工具,可以利用軟件工具將vhdl源碼自動地轉化為文本方式表達的基本邏輯元件連接圖,即網表文件。這種方法顯然對于電路自動設計是一個極大的推進。它具有很強的電路描述和建模能力,能從多個層次對數字系統進行建模和描述,從而大大簡化了硬件設計任務,提高了設計效率和可靠性。eda技術良好的可移植性與可測試性,將所有設計環節納入統一的自頂向下的設計方案中。它不但在整個設計流程上充分利用計算機的自動設計能力、在各個設計層次上利用計算機完成不同內容的仿真模擬,而且在系統板設計結束后仍可利用計算機對硬件系統進行完整的測試。
書中通過大量的圖示對pld硬件特性與編程技術進行了形象的講解,不僅融合了之前學習的關于電路設計的知識還將eda的技術加入其中。對vhdl語言的詳盡講解更是讓我深刻理解了vhdl語言的編程原理。由于本門課程是一門硬件學習課程,所以實驗必不可少。通過課程最后實驗,我體會一些vhdl語言相對于其他編程語言的特點。
相對于其它計算機語言的學習,如c 或匯編語言,vhdl 具有明顯的特點。這不僅僅是由于vhdl 作為一種硬件描述語言的學習需要了解較多的數字邏輯方面的硬件電路知識,包括目標芯片基本結構方面的知識更重要的是由于vhdl 描述的對象始終是客觀的電路系統。由于電路系統內部的子系統乃至部分元器件的工作狀態和工作方式可以是相互獨立、互不相關的,也可以是互為因果的。這表明,在任一時刻,電路系統可以有許多相關和不相關的事件同時并行發生。例如可以在多個獨立的模塊中同時入行不同方式的數據交換和控制信號傳輸,這種并行工作方式是任何一種基于cpu 的軟件程序語言所無法描繪和實現的。傳統的軟件編程語言只能根據cpu 的工作方式,以排隊式指令的形式來對特定的事件和信息進行控制或接收。在cpu 工作的任一時間段內只能完成一種操作。因此,任何復雜的程序在一個單cpu 的計算機中的運行,永遠是單向和一維的。因而程序設計者也幾乎只需以一維的思維模式就可以編程和工作了。vhdl 雖然也含有類似于軟件編程語言的順序描述語句結構,但其工作方式是完全不同的。軟件語言的語句是根據cpu 的順序控制信號,按時鐘節拍對應的指令周期節拍逐條運行的,每運行一條指令都有確定的執行周期。但 vhdl 則不同,從表面上觀,vhdl 的順序語句與軟件語句有相同的行為描述方式,但在標準的仿真執行中有很大的區別。vhdl 的語言描述只是綜合器賴以構成硬件結構的一種依據,但進程語句結構中的順序語句的執行方式決非是按時鐘節拍運行的。實際情況是其中的每一條語句的執行時間幾乎是0(但該語句的運行時間卻不一定為0),即1000 條順序語句與10 條順序語句的執行時間是相同的。在此,語句的運行和執行具有不同的概念(在軟件語言中,它們的概念是相同),的執行是指啟動一條語句,允許它運行一次,而運行就是指該語句完成其設定的功能。
通過實驗,我認識到理論要與實際結合,培養動手動腦能力的重要性,做事情要抱著一絲不茍的態度,這樣才能做好事情。同時也入一步了解到eda的強大之處,硬件電路的優秀的地方,對硬件方面更感興趣了。這門課程的學習,為我以后的專業知識的學習打下了良好的基礎。篇二:vhdl 編程的一些心得體會 vhdl 編程的一些心得體會(轉)vhdl 是由美國國防部為描述電子電路所開發的一種語言,其全稱為(very high speed integrated circuit)hardware description language。與另外一門硬件描述語言 verilog hdl 相比,vhdl 更善于描述高層的一些設計,包括系統級(算法、數據通路、控制)和行為級(寄存器傳輸級),而且 vhdl 具有設計重用、大型設計能力、可讀性強、易于編譯等優點逐漸受到硬件設計者的青睞。但是,vhdl 是一門語法相當嚴格的語言,易學性差,特別是對于剛開始接觸 vhdl 的設計者而言,經常會因某些小細節處理不當導致綜合無法通過。為此本文就其中一些比較典型的問題展開探討,希望對初學者有所幫助,提高學習進度。
一. 關于端口 vhdl 共定義了 5 種類型的端口,分別是 in, out,inout, buffer及 linkage,實際設計時只會用到前四種。in 和 out 端口的使用相對簡單。這里,我們主要講述關于 buffer和inout 使用時的注意事項。
與 out 端口比,buffer 端口具有回讀功能,也即內部反饋,但在設計時最好不要使用 buffer,因為 buffer類型的端口不能連接到其他類型的端口上,無法把包含該類型端口的設計作為子模塊元件例化,不利于大型設計和程序的可讀性。若設計時需要實現某個輸出的回讀功能,可以通過增加中間信號作為緩沖,由該信號完成回讀功能。
雙向端口 inout 是四種端口類型中最為特殊的一種,最難以學習和掌握,為此專門提供一個簡單程序進行闡述,部分程序如下:...? ① datab<=din when ce=’1’ and rd=’0’ else ②(others=>’z’);③ dout<=datab when ce=’1’ and rd=’1’ else ④(others=>’1’);? ? 程序中 datab 為雙向端口,編程時應注意的是,當 datab 作為輸出且空閑時,必須將其設為高阻態掛起,即有類似第②行的語句,否則實現后會造成端口死鎖。而當 datab 作為有效輸入時,datab 輸出必須處于高阻態,對于該例子中即,當 ce=’1’ and rd=’1’時,二.信號和變量
常數、信號和變量是 vhdl 中最主要的對象,分別代表一定的物理意義。常數對應于數字電路中的電源或地;信號對應某條硬件連線;變量通常指臨時數據的局部存儲。信號和變量功能相近,用法上卻有很大不同。
表 1 信號與變量主要區別
信
號 變量
賦值延遲 至少有△延時 無,立即變化 相關信息 有,可以形成波形 無,只有當前值 進程敏
感 是 否 全局性 具有全局性,可存在于多個進程中 只能在某個進程或子程序中有效 相互賦值關系 信號不能給變量賦值 變量可以給信號賦值
對于變量賦值操作無延遲,初學者認為這個特性對 vhdl 設計非常有利,但這只是理論上的。基于以下幾點原因,我們建議,編程時還是應以信號為主,盡量減少變量的使用。
(1)變量賦值無延時是針對進程運行而言的,只是一個理想值,對于變量的操作往往被綜合成為組合邏輯的形式,而硬件上的組合邏輯必然存在輸入到輸出延時。當進程內關于變量的操作越多,其組合邏輯就會變得越大越復雜。假設在一個進程內,有關于變量的 3 個 級連操作,其輸出延時 分別為 5ns,6ns,7ns,則其最快的時鐘只能達到 18ns。相反,采用信號編程,在時鐘控制下,往往綜合成觸發器的形式,特別是對于 fpga 芯片而言,具有豐富的觸發器結構,易形成流水作業,其時鐘頻率只受控于延時最大的那一級,而不會與變量一樣層層累積。假設某個設計為 3 級流水作業,其每一級延時分別為 10ns,11ns,12ns,則其最快時鐘可達 12ns。因此,采用信號反而更能提高設計的速度。(2)由于變量不具備信息的相關性,只有當前值,因此也無法在仿真時觀察其波形和狀態改變情況,無法對設計的運行情況有效驗證,而測試驗證工作量往往會占到整個設計
70%~80%的工作量,采用信號則不會存在這類問題。
(3)變量有效范圍只能局限在單個進程或子程序中,要想將其值帶出與其余進程、子模塊之間相互作用,必須借助信號,這在一定程度上會造成代碼不夠簡潔,可讀性下降等缺點。
當然,變量也具有其特殊的優點,特別是用來描述一些復雜的算法,如圖像處理,多維數組變換等。
三.位(矢量)與邏輯(矢量)bit 或其矢量形式 bit_vector只有’0’和’1’兩種狀態,數字電路中也只有’0’和’1’兩種邏輯,因此會給初學者一個誤區,認為采用位(矢量)則足夠設計之用,而不必像std_logic那樣出現’x’,’u’,’w’各種狀態,增加編程難度。但實際情況卻并非如此,以一個最簡單 d型觸發器設計為例 ? ? ① process(clk)② begin ③ if clk’event and clk=’1’ then ④ q<=d;⑤ end if;⑥ end process;? ? 實際中 clk 對數據端 d的輸入有一定的時間限制,即在 clk 上升沿附近(建立時間和保持時間之內),d必須保持穩定,否則 q輸出會出現亞穩態,如下圖所示。
當 clk 和 d時序關系不滿足時,由于 bit 只有’0’或’1’,系統只能隨機的從’0’和’1’中給 q 輸出,這樣的結果顯然是不可信的;而采用 std_logic 類型,則時序仿真時會輸出為一個’x’,提醒用戶建立保持時間存在問題,應重新安排 d和 clk 之間時序關系。
此外,對于雙向總線設計(前面已提及)、fpga/cpld上電配置等問題,如果沒有’z’,’x’等狀態,根本無法進行設計和有效驗證。
四.關于進程
進程(process)是 vhdl 中最為重要的部分,大部分設計都會用到 process 結構,因此掌握process 的使用顯得尤為重要。以下是初學和使用 process 經常會出錯的例子。1.多余時鐘的引入
在設計時往往會遇到這種情況,需要對外部某個輸入信號進行判斷,當其出現上跳或下跳沿時,執行相應的操作,而該信號不像正常時鐘那樣具有固定占空比和周期,而是很隨機,需要程序設計判斷其上跳沿出現與否。這時,很容易寫出如下程序:
① process(ctl_a)-貪吃蛇
一、課程設計目的
1)鞏固和加深所學電子技術課程的基本知識,提高綜合運用所學知識的能力; 2)培養根據課題需要選用參考書、查閱手冊、圖表和文獻資料的能力,提高學生獨立解決工程實際問題的能力 3)通過設計方案的分析比較、設計計算、元件選擇及電路安裝調試等環節.初步掌握簡單實用電路的工程設計方法。4)提高動手能力.掌握常用儀器設備的正確使用方法,學會對簡單實用電路的實驗調試和對整機指標的測試方法,5)學習vhdl和verilog hdl語言,熟悉de0電路板。提高對軟件與硬件之間關系的認識與了解
二、設計任務與要求
設計任務:設計一個貪吃蛇小游戲
要求和指標:
1.用ps2鍵盤作為輸入設備,用lcd作為顯示器。2.自定義蛇的圖像和老鼠的圖像,用四個按鍵控制蛇的運動方向,完成貪食蛇游戲,蛇撞“墻”、邊或者游戲時間到,游戲結束。3.老鼠出現的地方是隨機的,在某個地點出現的時間是蛇走15步的時間,如果15步之內沒有被吃掉,它就會在其它地方隨機出現。;4.在旁邊顯示得分情況和游戲的剩余時間。
三、方案設計與論證
1、vga顯示
vga標準是一種計算機顯示標準,最初是由ibm公司在1987 年提出的一種
視頻傳輸標準,在彩色顯示器領域得到了廣泛應用。vga管腳中,vga_hs和vga_vs分別是水平掃描信號和豎直掃描信號,vga_r, vga_g和vga_b是顏色控制信號,控制當前顯示的像素色彩。利用水平掃描信號和豎直掃描信號實現二維平面的像素掃描顯示,程序中中我們利用cnt_h與cnt_v信號來控制,以確認程序正確的將色彩輸出到屏幕上。將屏幕分成30*40的矩陣,每個矩陣塊根據不同的值賦予不同的顏色。屏幕是從最左上角的(4,4)坐標開始掃描更新,可以將屏幕視為x-y平面來看,根據矩陣點值賦予不同顏色繪制游戲框架并且實時顯示蛇與老鼠
在做vga顯示前先進行了彩條顯示,以確保顏色顯示正確,結果如下:
根據彩條顯示繪制游戲框架,并定義蛇與老鼠的顏色。
第三篇:VHDL簡答題總結
數據BIT與STD_LOGIC的區別?
Bit只是一個邏輯型變量,只能存在“0”和“1”,不存在不定狀態和高阻態
STD_LOGIC存在U初始值,X不定,0,1,Z高阻 W弱信號不定,L弱信號1,H弱信號0,-不可能情況 2 信號和變量的異同?
延時:變量無延時 信號有延時
位置:變量在PROCESS 信號ARCHITECTUUE SIGNAL BEGIN
信號可以是全局量,只要在構造體中已定義,那么構造體內的所有地方都可以使用;變量是局部量,只能在進程、子程序中定義和使用。如果將結果帶出外部,則必須將變量付給一個信號量才行。3 VHDL基本順序和并行語句有哪些?
順序描述語句:WAIT語句,斷言語句,信號帶入語句,變量賦值語句,IF語句,CASE語句,LOOP語句,NEXT語句,EXIT語句,進程調用語句,NULL語句
并行語句:進程語句,并發信號帶入語句,條件信號帶入語句,選擇信號帶入語句,并發調用語句,塊語句 4 利用VHDL進行硬件設計的流程?
規格設計——行為級描述——行為級仿真——RTL級描述——RTL級仿真——邏輯綜合優化——門及仿真,定時檢查——輸出門級網絡表 5 基本硬件描述語言有哪些?
VHDL和Verilog HDL 及日本電子振興協會開發的UDL/I語言 6 VHDL所包含庫的種類有哪些?
IEEE庫
STD庫是VHDL的標準配置
ASIC邏輯門庫
WORK庫現行作業庫 7 IEEE庫中所包含基本類型轉換函數有那些? STD_LOGIC_1164包集合
TO_STDLOGICVECTOR(A)由BIT_VECTOR變換為STD_LOGIC_VECTOR TO_BITVECTOR(A)由STD_LOGIC_VECTOR轉換為BIT_VECTOR TO_STDLOGIC(A)由BIT轉換為STD_LOGIC TO_BIT(A)由STD_LOGIC轉換為BIT STD_LOGIC_ARITH包集合
CONV_STD_LOGIC_VECTOR(A,位長)由INTEGER、UNSIGNED、SIGNED轉變為STD_LOGIC_VECTOR CON_INTEGER(A)由UNSIGNED、SIGNED轉變為INTEGER STD_LOGIC_UNSIGNED包集合
CONV_INTEGER(A)由STD_LOGIC_VECTOR轉變為INTEGER 8 簡述基本的VHDL的程序結構有那些?
一個完整的VHDL程序包含實體(ENTITY),構造體(ARCHITECTURE),配置(CONFIGURATION),包集合(PACKAGE),庫(LIBRARY)9 VHDL程序包含程序子結構有那些?
子程序是一個VHDL程序模塊,這個模塊利用順序語句來定義和完成算法,因此只能使用順序語句。VHDL子程序與其他軟件語言程序中的子程序的應用目的是相似的,能更有效地完成重復性的工作。子程序有兩種類型,即過程process和函數function 10 簡述when else與if else的差別?
后者只能在進程內部中使用(因為是順序結構),前者的else一定有,但if可以省略,when語句不可嵌套,而if則不然 什么是ASIC及ASIC的特點?
ASIC是指應特定用戶要求和特定電子系統的需要而設計、制造的專用大規模集成電路。ASIC的特點是面向特定用戶的需求,ASIC在批量生產時與通用集成電路相比具有體積更小、功耗更低、可靠性提高、性能提高、保密性增強、成本降低等優點
第四篇:VHDL課程設計報告 頻率計
目錄
1.前言...........................................................................................................................2 2.設計要求...................................................................................................................2 3.整體設計..................................................................................................................3 4.設計原理...................................................................................................................3 5.設計程序...................................................................................................................3
5.1頂層文件.............................................................................................................3 5.2 8位是進制計數器..............................................................................................4 5.3 10進制計數器...................................................................................................5 5.4 測頻控制電路.....................................................................................................6 5.5 32位鎖存器及其控制器.....................................................................................6
6.引腳鎖定...................................................................................................................8 7.綜合結果...................................................................................................................8
7.1 RTL電路.............................................................................................................8 7.2 測頻控制電路.....................................................................................................9 7.3 8位十進制計數器..............................................................................................9 7.3 32位鎖存器......................................................................................................9
8.實驗結果.................................................................................................................10 7.實驗總結...................................................................................................................10 參考文獻......................................................................................................................12
自適應數字頻率計數器設計
1.前言
傳統的數字頻率計一般是由分離元件搭接而成,用到的器件較多,連線比較復雜,而且會產生比較大的延時,造成測量誤差大、可靠性差。后來隨著單片機的大規模的應用, 出現了不少用單片機控制的頻率測量系統。相對于以前用分離元件搭接起來的頻率測量系統, 單片機控制的頻率測量系統在頻率測量范圍、頻率測量精度和頻率測量速度上都有了很大的提高。但由于單片機工作頻率的限制、單片機內部計數器位數的限制等因素, 由單片機控制的頻率測量系統無法在頻率測量范圍、頻率測量精度和頻率測量速度上取得重大突破。若再增加別的器件, 以彌補單片機的不足, 不僅會大大增加系統的復雜性, 而且不利于系統的集成化。以E D A 工具作為開發平臺,運用V H D L 語言,將使整個系統大大簡化,從而提高整體的性能和可靠性。本課題采用的是等精度數字頻率計,在一片FPGA開發板里實現了數字頻率計的絕大部分功能, 它的集成度遠遠超過了以往的數字頻率計。又由于數字頻率計最初的實現形式是用硬件描述語言寫成的程序, 具有通用性和可重用性。所以在外在的條件(如基準頻率的提高, 基準頻率精度的提高)的允許下,只需對源程序作很小的改動, 就可以使數字頻率計的精度提高幾個數量級。同時對于頻率精度要求不高的場合, 可以修改源程序, 使之可以用較小的器件實現, 從而降低系統的整體造價。
2.設計要求
設計一個頻率計,頻率測量范圍為1-9999KHZ,量程分別為10、100、1M三檔,要求如下: a.當讀數大于999時,頻率計處于超量程狀態,下一次測量時,量程自動增大1檔 b.當讀數小于099時,頻率計處于欠量程狀態,下一次測量時,量程自動減小1檔
c.當超過頻率范圍時,顯示器自動溢出
3.整體設計
當被測頻率進入時候,檔位1、2能自動換擋實現功能,在檔位1中,有一個LED燈亮(表示Hz);檔位2中有2個LED燈亮(表示kHz);當計數頻率超出9999kHz的時候,顯示“E”而且LED燈全部熄滅,表示溢出功能。在程序代碼中,必須要清晰表示出計數的運行狀況。
檔位1:當被測頻率為0—9999Hz時候,直接顯示f x的值(單位為Hz); 檔位2:當被測頻率為10k—9999kHz時候,顯示10-9999(單位kHz);
4.設計原理
根據頻率的定義和頻率測量的基本原理,測定信號的頻率必須有一個脈寬為1 秒的輸入信號脈沖計數允許的信號;1 秒計數結束后,計數值被鎖入鎖存器,計數器清0,為下一測頻計數周期作好準備。測頻控制信號可以由一個獨立的發生器來產生。
5.設計程序
5.1頂層文件
LIBRARY IEEE;--頻率計頂層文件 LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY FREQTEST IS PORT(CLK1HZ : IN STD_LOGIC;FSIN : IN STD_LOGIC;DOUT : OUT STD_LOGIC_VECTOR(15 DOWNTO 0);LED : OUT STD_LOGIC_VECTOR(1 DOWNTO 0));END FREQTEST;ARCHITECTURE struc OF FREQTEST IS COMPONENT FTCTRL PORT(CLKK : IN STD_LOGIC;--1Hz CNT_EN : OUT STD_LOGIC;--計數器時鐘使能 RST_CNT : OUT STD_LOGIC;--計數器清零 Load : OUT STD_LOGIC);--輸出鎖存信號 END COMPONENT;COMPONENT COUNTER PORT(FIN : IN STD_LOGIC;--時鐘信號 CLR : IN STD_LOGIC;--清零信號 ENABL : IN STD_LOGIC;--計數使能信號
DOUT : OUT STD_LOGIC_VECTOR(31 DOWNTO 0));--計數結果 END COMPONENT;COMPONENT REG32B PORT(LK : IN STD_LOGIC;DIN : IN STD_LOGIC_VECTOR(31 DOWNTO 0);DOUT : OUT STD_LOGIC_VECTOR(15 DOWNTO 0);LEDOUT : OUT STD_LOGIC_VECTOR(1 DOWNTO 0));END COMPONENT;SIGNAL TSTEN1 : STD_LOGIC;SIGNAL CLR_CNT1 : STD_LOGIC;SIGNAL Load1 : STD_LOGIC;SIGNAL DTO1 : STD_LOGIC_VECTOR(31 DOWNTO 0);SIGNAL CARRY_OUT1 : STD_LOGIC_VECTOR(6 DOWNTO 0);BEGIN U1 : FTCTRL PORT MAP(CLKK =>CLK1HZ,CNT_EN=>TSTEN1, RST_CNT =>CLR_CNT1,Load =>Load1);U2 : REG32B PORT MAP(LK => Load1, DIN=>DTO1, DOUT => DOUT,LEDOUT=>LED);
U3 : COUNTER PORT MAP(FIN => FSIN, CLR => CLR_CNT1, ENABL => TSTEN1, DOUT=>DTO1);END struc;
5.2 8位是進制計數器
LIBRARY IEEE;--8位十進制計數器 USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY COUNTER IS PORT(FIN : IN STD_LOGIC;--時鐘信號 CLR : IN STD_LOGIC;--清零信號 ENABL : IN STD_LOGIC;--計數使能信號
DOUT : OUT STD_LOGIC_VECTOR(31 DOWNTO 0));--計數結果 END COUNTER;ARCHITECTURE behav OF COUNTER IS
COMPONENT COUNTER10 IS PORT(FIN : IN STD_LOGIC;--時鐘信號 CLR : IN STD_LOGIC;--清零信號 ENABL : IN STD_LOGIC;--計數使能信號
DOUT : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);--計數結果 COUT : OUT STD_LOGIC);END COMPONENT;
SIGNAL CLK1,CLK2,CLK3,CLK4,CLK5,CLK6,CLK7: STD_LOGIC;BEGIN u1 : COUNTER10 PORT MAP(FIN=>FIN,CLR=>CLR,ENABL=>ENABL,DOUT=>DOUT(3 DOWNTO 0),COUT=>CLK1);u2 : COUNTER10 PORT MAP(FIN=>CLK1,CLR=>CLR,ENABL=>ENABL,DOUT=>DOUT(7 DOWNTO 4),COUT=>CLK2);u3 : COUNTER10 PORT MAP(FIN=>CLK2,CLR=>CLR,ENABL=>ENABL,DOUT=>DOUT(11 DOWNTO 8),COUT=>CLK3);u4 : COUNTER10 PORT MAP(FIN=>CLK3,CLR=>CLR,ENABL=>ENABL,DOUT=>DOUT(15 DOWNTO 12),COUT=>CLK4);u5 : COUNTER10 PORT MAP(FIN=>CLK4,CLR=>CLR,ENABL=>ENABL,DOUT=>DOUT(19 DOWNTO 16),COUT=>CLK5);u6 : COUNTER10 PORT MAP(FIN=>CLK5,CLR=>CLR,ENABL=>ENABL,DOUT=>DOUT(23 DOWNTO 20),COUT=>CLK6);u7 : COUNTER10 PORT MAP(FIN=>CLK6,CLR=>CLR,ENABL=>ENABL,DOUT=>DOUT(27 DOWNTO 24),COUT=>CLK7);u8 : COUNTER10 PORT MAP(FIN=>CLK7,CLR=>CLR,ENABL=>ENABL,DOUT=>DOUT(31 DOWNTO 28));
END ARCHITECTURE behav;
5.3 10進制計數器
LIBRARY IEEE;--10位計數器 USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY COUNTER10 IS PORT(FIN : IN STD_LOGIC;--時鐘信號 CLR : IN STD_LOGIC;--清零信號 ENABL : IN STD_LOGIC;--計數使能信號
DOUT : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);--計數結果 COUT : OUT STD_LOGIC);END COUNTER10;ARCHITECTURE behav OF COUNTER10 IS SIGNAL CQI : STD_LOGIC_VECTOR(3 DOWNTO 0);BEGIN PROCESS(FIN, CLR, ENABL)BEGIN IF CLR = '1' THEN CQI <=(OTHERS=>'0');--清零 ELSIF FIN'EVENT AND FIN = '1' THEN IF ENABL = '1' THEN IF CQI<9 THEN CQI <= CQI + 1;ELSE CQI <=(OTHERS=>'0');END IF;END IF;END IF;
IF CQI=“1001” THEN COUT<='1';ELSE COUT<='0';END IF;END PROCESS;DOUT <= CQI;END behav;
5.4 測頻控制電路
LIBRARY IEEE;--測頻控制電路 USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY FTCTRL IS PORT(CLKK : IN STD_LOGIC;--1Hz CNT_EN : OUT STD_LOGIC;--計數器時鐘使能 RST_CNT : OUT STD_LOGIC;--計數器清零 Load : OUT STD_LOGIC);--輸出鎖存信號 END FTCTRL;ARCHITECTURE behav OF FTCTRL IS SIGNAL Div2CLK : STD_LOGIC;BEGIN PROCESS(CLKK)BEGIN IF CLKK'EVENT AND CLKK = '1' THEN--1Hz時鐘2分頻 Div2CLK <= NOT Div2CLK;END IF;END PROCESS;PROCESS(CLKK, Div2CLK)BEGIN IF CLKK='0' AND Div2CLK='0' THEN RST_CNT<='1';--產生計數器清零信號 ELSE RST_CNT <= '0';END IF;END PROCESS;Load <= NOT Div2CLK;CNT_EN <= Div2CLK;END behav;
5.5 32位鎖存器及其控制器
LIBRARY IEEE;--32位鎖存器及控制器 USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY REG32B IS PORT(LK : IN STD_LOGIC;DIN : IN STD_LOGIC_VECTOR(31 DOWNTO 0);DOUT : OUT STD_LOGIC_VECTOR(15 DOWNTO 0);LEDOUT : OUT STD_LOGIC_VECTOR(1 DOWNTO 0));END REG32B;ARCHITECTURE behav OF REG32B IS SIGNAL DD : STD_LOGIC_VECTOR(31 DOWNTO 0);BEGIN
PROCESS(LK, DIN)BEGIN IF LK'EVENT AND LK = '1' THEN DD<=DIN;END IF;if DD(31 DOWNTO 28)=“0000” then IF DD(27 DOWNTO 16)=“000000000000” THEN DOUT<=DD(15 DOWNTO 0);LEDOUT<=“01”;ELSIF DD(27 DOWNTO 16)/=“000000000000” THEN DOUT<=DD(27 DOWNTO 12);LEDOUT<=“11”;end if;else DOUT(15 DOWNTO 0)<=“***0”;LEDOUT<=“00”;END IF;END PROCESS;END behav;
6.引腳鎖定
7.綜合結果
7.1 RTL電路
7.2 測頻控制電路
7.3 8位十進制計數器
7.3 32位鎖存器
8.實驗結果
當計數頻率為4Hz(范圍在0-9999Hz)的時候,此時LED燈有一個亮,計數為:0004;當計數頻率為500KHz(范圍在10K-9999KHz)的時候,此時設定兩個LED燈都亮,計數為0500;當計數頻率大于9999KHz的時候,設定此時兩個LED燈都處于熄滅狀態,而計數則輸出一個‘E’值,表示范圍超出計數范圍。
7.實驗總結
經系統測試表明,本圖頻率計的各項功能正常,能實現對頻率的0~9999kHz頻率范圍的測量,并通過LED指示和數碼管顯示,操作簡單,是理想頻率計解決方案。
經過一個多星期的努力,本設計系統終于完成了。通過該課程設計,掌握了編譯程序工作的基本過程及其各階段的基本任務,熟悉了VHDL程序開發的總流程框圖,了解了編譯程序的生成過程及其相關的技術,對課本上的知識也有了更深的理解。老師常說,課本上的知識是機械的,要學會去運用,要舉一反三。現在終于深刻的了解了這句話。經過這次的課程設計,發現書本上很深奧的知識變的更為簡單,同樣,對實驗原理也了有更深的理解。知道和理解了該理論在計算機中是怎樣執行的,對該理論在實踐中的應用有深刻的理解。通過該課程設計,把死板的課本知識變得生動有趣,激發了學習的積極性。能夠把課堂上學的知識通過自己設計的程序表示出來,加深了對理論知識的理解。
課程設計中的電路和程序比較復雜,因此調試的過程更是考驗我們耐性和細心。除了課堂外,課程設計是最能學到東西的,最考驗人的。在做課程設計的這段時間,時刻都感到自己學的知識有多么的貧瘠。經過這次課程設計,讓我對VHDL語言和FPGA有了更深的認識,操作能力有了一定的提高。明白了,要想是寫出的代碼能運行,需要耐心細心,毅力以及充沛的體力。只有經過多次編輯,多次編譯,再多次運行,才能編寫出更好的程序,有時候需要多次的更正才能達到所要的運行結果。
參考文獻
[1] 潘松、黃繼業,EDA技術應用教程 VHDL篇[J].北京:高等教育出版社.2010
[2] 徐成劉彥李仁發,一種全同步數字頻率測量方法的研究[J].北京:高等教育出版社.2004 [3] 李云鵬王思明,基于FPGA 的等精度頻率計設計[J].北京:高等教育出版社.2007
第五篇:VHDL語言EDA四人搶答器
一.EDA技術簡介
在計算機技術的推動下,20世紀末,電子技術獲得了飛速的發展,現代電子產品幾乎滲透了社會的各個領域,有力地推動了社會生產力的發展和社會信息化程度的提高,同時也使現代電子產品性能進一步提高,產品更新換代的節奏也越來越快。
20世紀90年代,國際上電子和計算機技術較先進的國家,一直在積極探索新的電子電路設計方法,并在設計方法、工具等方面進行了徹底的變革,取得了巨大成功。在電子技術設計領域,可編程邏輯器件(如CPLD、FPGA)的應用,已得到廣泛的普及,這些器件為數字系統的設計帶來了極大的靈活性。這些器件可以通過軟件編程而對其硬件結構和工作方式進行重構,從而使得硬件的設計可以如同軟件設計那樣方便快捷。這一切極大地改變了傳統的數字系統設計方法、設計過程和設計觀念,促進了EDA技術的迅速發展。
EDA技術就是以計算機為工具,設計者在EDA軟件平臺上,用硬件描述語言HDL完成設計文件,然后由計算機自動地完成邏輯編譯、化簡、分割、綜合、優化、布局、布線和仿真,直至對于特定目標芯片的適配編譯、邏輯映射和編程下載等工作。EDA技術的出現,極大地提高了電路設計的效率和可操作性,減輕了設計者的勞動強度。
利用EDA工具,電子設計師可以從概念、算法、協議等開始設計電子系統,大量工作可以通過計算機完成,并可以將電子產品從電路設計、性能分析到設計出IC版圖或PCB版圖的整個過程的計算機上自動處理完成。
現在對EDA的概念或范疇用得很寬。包括在機械、電子、通信、航空航天、化工、礦產、生物、醫學、軍事等各個領域,都有EDA的應用。目前EDA技術已在各大公司、企事業單位和科研教學部門廣泛使用。例如在飛機制造過程中,從設計、性能測試及特性分析直到飛行模擬,都可能涉及到EDA技術。
二.設計要求
l、設計用于競賽的四人搶答器,功能如下:
(1)有多路搶答器,臺數為四,能顯示搶答臺號;
(2)具有搶答開始后20秒倒計時,20秒倒計時后無人搶答顯示超時,并報警;
(3)能顯示超前搶答臺號并顯示犯規警報;
2、系統復位后進入搶答狀態,當有一路搶答鍵按下時,該路搶答信號將其余各路搶答封鎖,同時鈴聲響,直至該路按鍵松開,顯示牌顯示該路搶答臺號。
3、用VHDL語言設計符合上述功能要求的四人搶答器,并用層次設計方法設計該電路。
三.電路工作原理
簡易邏輯數字搶答器由主體電路與擴展電路組成。優先編碼電路、鎖存器、譯碼電路將參賽隊的輸入信號在顯示器上輸出;用控制電路和主持人開關啟動報警電路,以上兩部分組成主體電路。通過定時電路和譯碼電路將秒脈沖產生的信號在顯示器上輸出實現計時功能,構成擴展電路。電路主要由脈沖產生電路、鎖存電路、編碼及譯碼顯示電路、倒計時電路和音響產生電路組成。當有選手搶答時,首先鎖存,阻止其他選手搶答,然后編碼,再經譯碼器將數字顯示在顯示器上同時產生音響。主持人宣布開始搶答時,倒計時電路啟動由20計到0,如有選手搶答,倒計時停止,如20秒后無人搶答,則會顯示報警。
四.設計思路
使用VHDL語言編寫的四人搶答器設計,根據現有知識及翻閱資料,經過反復推敲,基本設計思路可分為以下兩點:
(一)搶答鑒別鎖存及顯示模塊
根據設計要求,首先要有清零開關clr,主持人開關en,四人搶答按鈕a、b、c、d,并由一個LED數碼顯示管顯示選手組別,為了實現當有選手搶答后鎖存電路使其他選手無法搶答的功能,設置兩個鎖存信號tmp1、tmp2。
按下清零開關(clr=1),tmp1、tmp2=0,若主持人開關未開啟(en=0),此時有人搶答,則tmp2=1,關閉搶答電路,并由數碼顯示管輸出搶答組別,同時speaker報警;若主持人按下開關后(en=1),此時有人搶答,則tmp1=1,關閉搶答電路,并由數碼顯示管輸出搶答組別。
(二)數碼管倒計時,暫停及報警模塊
設計由兩個數碼管顯示20秒搶答倒計時,在程序中,由8位二進制矢量數count控制,高四位表示十位,低四位表示個位,由給定的時鐘信號clk高電平觸發。按下清零開關(clr=1),數碼管顯示20(count=“00100000”),主持人按下開關后(en=1),開始20秒倒計時,當低四位為“0000”時,則賦值為9(“1001”),同時高四位表示的十位數自減1,當低四位不為0時則自減1,由此實現了20秒倒計時。
為實現有人搶答則暫停計時以及20秒時間到停止計時并報警的功能,設置暫停鎖存信號tmp3,按下清零開關(clr=1),tmp3=0,主持人按下開關后(en=1),開始20秒倒計時,當有人搶答,則tmp3=1,暫停倒計時,若一直無人搶答,當20秒倒計時結束(count=“00000000”)時,則tmp3=1,停止倒計時并由speaker報警。
speaker報警可由脈沖信號clk0與(tmp3 or a or b or c or d)信號相與輸出,從而實現選擇性輸出報警信號。
五.仿真波形
(一)有人搶答的仿真波形
由上圖可知,clr=1,系統進入初始狀態,即count=“00100000”,dps=“0000”;en=0時,若有人搶答(b=1),則speaker報警,且數碼管顯示組別(dps=“0010”);en=1時,count開始20秒倒計時,在15秒時(count=“00010101”)有人搶答(a=1),倒計時暫停,數碼管顯示組別(dps=“0001”),且speaker報警。
(二)無人搶答的仿真波形
由上圖可知,en=1,20秒時間到而無人搶答(count=“00000000”),則speaker報警,按下清零開關(clr=1),重新開始20秒倒計時。
六.源程序 library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity qdq is port(clr,clk,clk0,en,a,b,c,d:in std_logic;dps:out std_logic_vector(3 downto 0);count:out std_logic_vector(7 downto 0);speaker:out std_logic);end;architecture one of qdq is signal dps1:std_logic_vector(3 downto 0);signal count1:std_logic_vector(7 downto 0);signal tmp1,tmp2,tmp3:std_logic;begin p1:process(clr,en,tmp1,tmp2)begin if clr='1' then tmp1<='0';tmp2<='0';dps1<=“0000”;elsif en='1' then if tmp1='0' then if a='1' then tmp1<='1';dps1<=“0001”;end if;if b='1' then tmp1<='1';dps1<=“0010”;end if;if c='1' then tmp1<='1';dps1<=“0011”;end if;if d='1' then tmp1<='1';dps1<=“0100”;end if;end if;elsif en='0' then if tmp2='0' then if a='1' then tmp2<='1';dps1<=“0001”;end if;if b='1' then tmp2<='1';dps1<=“0010”;end if;if c='1' then tmp2<='1';dps1<=“0011”;end if;if d='1' then tmp2<='1';dps1<=“0100”;end if;end if;end if;end process;p2:process(clr,clk,tmp1,tmp3)begin if clk'event and clk='1' then if clr='1' then count1<=“00100000”;tmp3<='0';elsif en='1' and tmp1='0' and tmp3='0' then if count1=“00000000” then tmp3<='1';elsif count1(3 downto 0)=“0000” then count1(3 downto 0)<=“1001”;count1(7 downto 4)<=count1(7 downto 4)-'1';else count1(3 downto 0)<=count1(3 downto 0)-'1';end if;end if;end if;end process;count<=count1;dps<=dps1;speaker<=((tmp3 or a or b or c or d)and clk0);end;
七.設計心得體會
在課程設計的這段時間里,我的收獲還是很多的,不但進一步掌握了數字電子技術的基礎知識及一門專業仿真軟件的基本操作,還提高了自己的設計能力和動手能力,同時對于智能搶答器的設計來了個系統的總結。更多的是讓我清楚的認識到,凡事都需要足夠的耐心,實踐是檢驗學習成效的唯一標準。理論知識的不足在這次課程設計中表現的極為明顯,這將有助于我今后更努力的學習,端正自己的學習態度,從而也提高了我的綜合能力,使我在各方面都得到了鍛煉。非常感謝我們的指導老師XX老師給予的悉心指導,使我們這次的課程設計任務圓滿完成。
通過這次對搶答器的設計與實踐,讓我了解了關于搶答器設計的基本原理與設計理念,進一步加深了對EDA程序設計的了解,讓我對它有了更加濃厚的興趣。特別是當每一個模塊編譯調試成功時,興奮之情溢于言表。通過這次課程設計我懂得了理論與實踐相結合的重要性,從理論中反復琢磨得出的真知才能真正為社會服務,從而提高自己的實際動手能力和獨立思考能力。在設計過程中可謂困難重重,同時在此間發現了自己的許多不足之處,對以前所學過的知識理解的不夠深刻,掌握的不夠牢固。
總的來說,這次設計的智能四人搶答器還是比較成功的,在設計中遇到的困難在老師的悉心指導下也都迎刃而解。終于覺得平時所學的知識有了實用價值,達到了理論與實踐相結合的目的,不僅學到了不少知識,而且鍛煉了自己的能力,使我對以后的道路有了更加清楚的認識,同時,對未來也有了更多信心。