久久99精品久久久久久琪琪,久久人人爽人人爽人人片亞洲,熟妇人妻无码中文字幕,亚洲精品无码久久久久久久

VHDL 編程的一些心得體會(共五則)

時間:2019-05-12 15:29:55下載本文作者:會員上傳
簡介:寫寫幫文庫小編為你整理了多篇相關的《VHDL 編程的一些心得體會》,但愿對你工作學習有幫助,當然你在寫寫幫文庫還可以找到更多《VHDL 編程的一些心得體會》。

第一篇:VHDL 編程的一些心得體會

VHDL 編程的一些心得體會(轉)http://www.dzjs.net/html/EDAjishu/2007/0131/1504.html

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)--Ctl_a即為該輸入信號 ② begin

③ if Ctl_a’event and Ctl_a=’1’ then ④ ? ?;--執行相應操作 ⑤ end if;⑥ end process;

由于出現第③行這類語句,綜合工具自動默認 Ctl_a 為時鐘,某些 FPGA 更會強行將該輸入約束到時鐘引腳上。而設計者的初衷只是想將其作為下位機的狀態輸入以進行判斷。上面的程序容易造成多時鐘現象,增加設計的難度。解決的辦法可以如下,將 Ctl_a 增加一級狀態 Ctl_areg 寄存,通過對 Ctl_a 和Ctl_areg 狀態判斷上跳與否,改正程序如下: ① process(clk)② begin

③ if clk’event and clk=’1’ then ④ Ctl_areg<=Ctl_a;--產生相鄰狀態

⑤ if Ctl_areg=’0’ and Ctl_a=’1’ then--上跳判斷 ⑥ ? ?;--執行相應操作 ⑦ end if;⑧ end if;

⑨ end process;

程序中第④行用以產生兩個相鄰狀態,第⑤行對前后狀態進行判斷是否有上跳現象發生。其中,需注意的是 clk 的時鐘頻率應明顯快于 Ctl_a信號的變化頻率,以保證正確采樣。

2.輸出多驅動

誤用 Process經常會引起輸出多驅動源的發生,即在兩個以上的進程內對同一信號賦值操作。

以下程序就出現了這類情況: ⑴ Proc_a: process(clk)⑵ begin

⑶ if clk’event and clk=’1’ then ⑷ Dout<=Din_A;⑸ end if

⑹ end process;;⑺

⑻ Proc_b:process(sel_en)⑼ begin

⑽ if sel_en=’1’ then ⑾ Dout<=Din_B;⑿ end if;

⒀ end process;

進程 Proc_a 和 Proc_b 中都出現了對 Dout 的賦值語句,設計者原本的想法是,只要合理控制好 clk 和 sel_en 輸入,使其不發生沖突,即 clk上升沿時 sel_en 不為’1’;sel_en 為’1’時,不出現 clk 的上升沿,這樣 Proc_a,Proc_b 兩個進程就不會發生沖突。但綜合時,綜合工具會將所有可能情況全部羅列進去,包括第⑶行和第⑽行同時成立的情況,此時對于 Dout就有 Din_A和 Din_B 兩個輸入驅動,Dout 不知接收哪一個,因此該程序無法綜合,改正的方法是只要將兩個進程合并成一個即可。

由于進程在 VHDL 中的重要性,對此專門做了一個總結如下:(1)一個進程中不允許出現兩個時鐘沿觸發,(Xilinx 公司 CoolRunner 系列 CPLD 支持單個時雙鐘的雙觸發沿除外)(2)對同一信號賦值的語句應出現在單個進程內,不要在時鐘沿之后加上 else 語句,如 if clk’event and clk=’1’ then-else ? 的結構,現有綜合工具支持不了這種特殊的觸發器結構

(3)當出現多層 IF語句嵌套時,最好采用 CASE 語句替代,一是減少多層嵌套帶來的延時,二來可以增強程序的可讀性

(4)順序語句如 IF語句、CASE 語句、LOOP 語句、變量賦值語句等必須出現在進程、函數或子程序內部,而不能單獨出現在進程之外

(5)進程內部是順序執行的,進程之間是并行運行的;VHDL 中的所有并行語句都可以理解為特殊的進程,只是不以 Process結構出現,其輸入信號和判斷信號就是隱含的敏感表

五.關于 VHDL 學習中的幾點說明

與軟件語言相比,VHDL 最重要的特點就在于它的并行運行特性,當設計好的電路上電后,器件內部所有信號將同時并發工作,而不會以軟件方式按照程序順序執行,即使在進程內部也是趨向并行工作的。例如以下程序: ① process(clk)② begin

③ if clk’event and clk=’1’ then ④ <=;⑤ <=;

⑥ end if;;

⑦ end process;

綜合的結果兩個獨立的 D 型觸發器,雖然進程內部應按順序執行,但是硬件實現后,只要采樣到時鐘上升沿,和 狀態會同時翻轉,而不會先執行 的變化,然后才會去執行 的轉變。因此,VHDL 學習過程中,應加強硬件概念的理解,沒有硬件概念或是硬件概念不強,在設計時,往往會將 VHDL 設計以軟件編程的方式來處理,而得出一些不可思議的結果。

作為一門硬件描述語言,VHDL 幾乎可以用來描述現有的大型系統數字電路、算法以及其它設計。但是,限于目前綜合工具的水平,VHDL 中的許多語法還不能支持,例如:

dout<=din after 5 ns;綜合時就無法達到如此精度,因此這條語句主要用來編寫測試激勵,而很少出現在設計實體中。類似的情況還有很多,目前 VHDL 設計使用的也只是整個標準中的一部分,這也正是VHDL 的“可綜合子集”性質,它一定程度上限制了 VHDL 的廣泛應用,但是隨著綜合技術的發展,這種情況會逐漸得以改善,VHDL 也將在各個領域中發揮出愈來愈重要的作用

第二篇: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)--Ctl_a即為該輸入信號

② begin

③ if Ctl_a’event and Ctl_a=’1’ then

④??;--執行相應操作

⑤ end if;

⑥ end process;

由于出現第③行這類語句,綜合工具自動默認 Ctl_a 為時鐘,某些 FPGA 更會強行將該輸入約束到時鐘引腳上。而設計者的初衷只是想將其作為下位機的狀態輸入以進行判斷。上面的程序容易造成多時鐘現象,增加設計的難度。解決的辦法可以如下,將 Ctl_a 增加一級狀態

Ctl_areg 寄存,通過對 Ctl_a 和Ctl_areg 狀態判斷上跳與否,改正程序如下:① process(clk)

② begin

③ if clk’event and clk=’1’ then

④ Ctl_areg<=Ctl_a;--產生相鄰狀態

⑤ if Ctl_areg=’0’ and Ctl_a=’1’ then--上跳判斷

⑥??;--執行相應操作

⑦ end if;

⑧ end if;

⑨ end process;

程序中第④行用以產生兩個相鄰狀態,第⑤行對前后狀態進行判斷是否有上跳現

象發生。其中,需注意的是 clk 的時鐘頻率應明顯快于 Ctl_a信號的變化頻率,以保證正確采樣。

2.輸出多驅動

誤用 Process經常會引起輸出多驅動源的發生,即在兩個以上的進程內對同一信號賦值操作。

以下程序就出現了這類情況:

⑴ Proc_a: process(clk)

⑵ begin

⑶ if clk’event and clk=’1’ then

⑷ Dout<=Din_A;

⑸ end if

⑹ end process;;

⑻ Proc_b:process(sel_en)

⑼ begin

⑽ if sel_en=’1’ then

⑾ Dout<=Din_B;

⑿ end if;

⒀ end process;

進程 Proc_a 和 Proc_b 中都出現了對 Dout 的賦值語句,設計者原本的想法是,只要合理控制好 clk 和 sel_en 輸入,使其不發生沖突,即 clk上升沿時 sel_en 不為’1’;sel_en 為’1’時,不出現 clk 的上升沿,這樣 Proc_a,Proc_b 兩個進程就不會發生沖突。但綜合時,綜合工具會將所有可能情況全部羅列進去,包括第⑶行和第⑽行同時成立的情況,此時對于 Dout就有 Din_A和 Din_B 兩個輸入驅動,Dout 不知接收哪一個,因此該程序無法綜合,改正的方法是只要將兩個進程合并成一個即可。

由于進程在 VHDL 中的重要性,對此專門做了一個總結如下:

(1)一個進程中不允許出現兩個時鐘沿觸發,(Xilinx 公司 CoolRunner 系列 CPLD 支持單個時雙鐘的雙觸發沿除外)

(2)對同一信號賦值的語句應出現在單個進程內,不要在時鐘沿之后加上 else 語句,如 if clk’event and clk=’1’ then-else?的結構,現有綜合工具支持不了這種特殊的觸發器結構

(3)當出現多層 IF語句嵌套時,最好采用 CASE 語句替代,一是減少多層嵌套帶來的延時,二來可以增強程序的可讀性

(4)順序語句如 IF語句、CASE 語句、LOOP 語句、變量賦值語句等必須出現在進程、函數或子程序內部,而不能單獨出現在進程之外

(5)進程內部是順序執行的,進程之間是并行運行的;VHDL 中的所有并行語句都可以理解為特殊的進程,只是不以 Process結構出現,其輸入信號和判斷信號就是隱含的敏感表

五.關于 VHDL 學習中的幾點說明

與軟件語言相比,VHDL 最重要的特點就在于它的并行運行特性,當設計好的電路上電后,器件內部所有信號將同時并發工作,而不會以軟件方式按照

程序順序執行,即使在進程內部也是趨向并行工作的。例如以下程序:① process(clk)

② begin

③ if clk’event and clk=’1’ then

④ <=;

⑤ <=;

⑥ end if;;

⑦ end process;

綜合的結果兩個獨立的 D 型觸發器,雖然進程內部應按順序執行,但是硬件實現后,只要采樣到時鐘上升沿,和 狀態會同時翻轉,而不會先執行的變化,然后才會去執行的轉變。因此,VHDL 學習過程中,應加強硬件概念的理解,沒有硬件概念或是硬件概念不強,在設計時,往往會將 VHDL 設計以軟件編程的方式來處理,而得出一些不可思議的結果。

作為一門硬件描述語言,VHDL 幾乎可以用來描述現有的大型系統數字電路、算法以及其它設計。但是,限于目前綜合工具的水平,VHDL 中的許多語法還不能支持,例如:

dout<=din after 5 ns;

綜合時就無法達到如此精度,因此這條語句主要用來編寫測試激勵,而很少出現在設計實體中。類似的情況還有很多,目前 VHDL 設計使用的也只是整個標準中的一部分,這也正是VHDL 的“可綜合子集”性質,它一定程度上限制了 VHDL 的廣泛應用,但是隨著綜合技術的發展,這種情況會逐漸得以改善,VHDL 也將在各個領域中發揮出愈來愈重要的作用

第三篇:基于VHDL編程FPGA的地鐵自動售票機

地鐵自動售票機

一、設計要求

1、功能描述

用于模仿地鐵售票自動售票,完成地鐵售票的核心控制功能。

2、功能要求

售票機有兩個進幣孔,一個是輸入硬幣,識別的范圍是一元硬幣;一個是紙幣,識別的范圍是一元、兩元、五元、十元、二十元。乘客可以連續多次投入錢幣。乘客 一次只能選擇一個出站口,購買車票時,乘客先選出站口,有六個出站口可供選擇,再選擇所需的票數,然后投幣,投入的錢幣達到或者超過所需金額時,售票機自 動出票,并找零。本次交易結束后,等待下一次交易。在選擇出站口、所需票數以及在投幣期間,乘客可以按取消鍵取消操作,錢幣自動退出。

二、實驗分析

1、買票時,乘客按下開始鍵,售票機進入站臺選擇程序,乘客選擇出站口后,可以按取消鍵重新選擇,否則售票機自動進入票數選擇程序,同樣這時可以按下取消鍵重新開始選擇出站口以及票數。

2、當選擇好出站口以及所需票數時,乘客可以投硬幣或者用紙幣,當所投的錢幣總額大于或者等于票價時,售票機自動出票以及找零。期間,可以按下取消鍵重新開始選擇,并退出所有的錢幣。

3、乘客若還沒選擇出站口或者票數,就投幣或者使用紙幣,售票機會自動退出所有的錢幣。

4、有六個站臺可供乘客選擇,每個乘客最多可以買3張票,六個站臺編號為1到6,票價從2元依次遞增到7。

三、系統流程圖

四、程序源代碼 LIBRARY IEEE;USE IEEE.std_logic_1164.ALL;USE IEEE.std_logic_arith.ALL;USE IEEE.std_logic_unsigned.ALL;ENTITY metrosell IS PORT(clk:in std_logic;startselect:in std_logic;sure:in std_logic;save your forward step(s)coin1y:in std_logic;pmoney1y:in std_logic;pmoney2y:in std_logic;pmoney5y:in std_logic;pmoney10y:in std_logic;money pmoney20y:in std_logic;money cancel:in std_logic;number:in std_logic_vector(3 downto 0);the tickets platform:in std_logic_vector(3 downto 0);want to reach moneystorage:out std_logic;acceptmo:out std_logic;stamp:out std_logic;--set the clock signal--start to select the platform--this button is to--1 yuan coin

--1 yuan paper money--2 yuan paper money--5 yuan paper money--10 yuan paper--20 yuan paper--cancel the forward step(s)--choose the number of--choose the platform you--to store the money--accept the money--stamp outgate charge:out std_logic_vector(3 downto 0);--the mount of charge,up to 15 yuan chargegate:out std_logic--charge outgate);END metrosell;ARCHITECTURE sell OF metrosell IS type state_type is(initial_type,selectp_type,selectnum_type,insert_type,stamp_type,charge_type);--define six types signal state:state_type;--define a shared state BEGIN main:process(clk,state,startselect,platform,number,coin1y,pmoney1y,pmoney2y,pmoney5y,pmoney10y,pmoney20y,cancel,sure)variable univalence :integer range 0 to 7;--the univalence of the ticket variable total_money :integer range 0 to 21;--the price of the ticket(s)variable selectp_alr:std_logic;--the flag of select platform type variable selectnum_alr:std_logic;--the flag of select number type variable stamp_alr:std_logic;--the flag of the stamp gate variable charge_alr:std_logic;--the flag of the charge gate variable money_reg:integer range 0 to 21;--the mount of money put in variable coin1y_f:std_logic;--the flag of one yuan coin variable pmoney1y_f:std_logic;--the flag of one yuan paper money variable pmoney2y_f:std_logic;--the flag of two yuan paper money variable pmoney10y_f:std_logic;--the flag of ten yuan paper money variable pmoney20y_f:std_logic;--the flag of twelve yuan paper money variable pmoney5y_f:std_logic;--the flag of five yuan paper money variable charge_reg:integer range 0 to 15;

begin if(rising_edge(clk))then case state is when initial_type => variables univalence:=0;selectp_alr:='0';selectnum_alr:='0';stamp_alr:='0';charge_alr:='0';money_reg:=0;total_money:=0;coin1y_f:='0';pmoney1y_f:='0';pmoney2y_f:='0';pmoney5y_f:='0';

--the register of charge--initialize some pmoney10y_f:='0';pmoney20y_f:='0';moneystorage<='0';stamp<='0';charge_reg:=0;charge<=“0000”;acceptmo<='0';chargegate<='0';if(startselect='1')then state<=selectp_type;end if;when selectp_type => if(selectp_alr='0'and cancel='0')then--choose the platform if(platform=“0001”)then univalence:=2;selectp_alr:='1';elsif(platform=“0010”)then univalence:=3;selectp_alr:='1';elsif(platform=“0011”)then univalence:=4;selectp_alr:='1';elsif(platform=“0100”)then univalence:=5;selectp_alr:='1';elsif(platform=“0101”)then univalence:=6;selectp_alr:='1';elsif(platform=“0110”)then univalence:=7;selectp_alr:='1';elsif(platform=“0000”)then univalence:=0;selectp_alr:='0';else null;end if;elsif(selectp_alr='1'and cancel='1')then state<=initial_type;elsif(selectp_alr='1'and sure='1')then state<=selectnum_type;end if;when selectnum_type =>--you can buy at most 3 tickets if(selectnum_alr='0'and cancel='0')then--choose the number of tickets if(number=“0001”)then if(univalence=2)then total_money:=2;selectnum_alr:='1';elsif(univalence=3)then total_money:=3;selectnum_alr:='1';elsif(univalence=4)then total_money:=4;selectnum_alr:='1';elsif(univalence=5)then total_money:=5;selectnum_alr:='1';elsif(univalence=6)then total_money:=6;selectnum_alr:='1';elsif(univalence=7)then total_money:=7;selectnum_alr:='1';elsif(univalence=0)then total_money:=0;selectnum_alr:='0';else null;end if;end if;

if(number=“0010”)then if(univalence=2)then total_money:=4;selectnum_alr:='1';elsif(univalence=3)then total_money:=6;selectnum_alr:='1';elsif(univalence=4)then total_money:=8;selectnum_alr:='1';elsif(univalence=5)then total_money:=10;selectnum_alr:='1';elsif(univalence=6)then total_money:=12;selectnum_alr:='1';elsif(univalence=7)then total_money:=14;selectnum_alr:='1';elsif(univalence=0)then total_money:=0;selectnum_alr:='0';else null;end if;end if;if(number=“0011”)then if(univalence=2)then total_money:=6;selectnum_alr:='1';elsif(univalence=3)then total_money:=9;selectnum_alr:='1';elsif(univalence=4)then total_money:=12;selectnum_alr:='1';elsif(univalence=5)then total_money:=15;selectnum_alr:='1';elsif(univalence=6)then total_money:=18;selectnum_alr:='1';elsif(univalence=7)then total_money:=21;selectnum_alr:='1';elsif(univalence=0)then total_money:=0;selectnum_alr:='0';else null;end if;end if;elsif(selectnum_alr='1'and cancel='1')then state<=initial_type;elsif(selectnum_alr='1'and sure='1')then state<=insert_type;end if;when insert_type => moneystorage<='1';if(money_reg=total_money)then state<=stamp_type;end if;when stamp_type =>--put out the stamp if(stamp_alr='0')then acceptmo<='1';stamp<='1';stamp_alr:='1';else state<=charge_type;end if;when charge_type =>--put out the charge charge_reg:=money_reg-total_money;case charge_reg is when 0 => charge<=“0000”;when 1 => charge<=“0001”;

when 2 => charge<=“0010”;when 3 => charge<=“0011”;when 4 => charge<=“0100”;when 5 => charge<=“0101”;when 6 => charge<=“0110”;when 7 => charge<=“0111”;when 8 => charge<=“1000”;

end case;end if;

when 9 => charge<=“1001”;when 10 => charge<=“1010”;when 11 => charge<=“1011”;when 12 => charge<=“1100”;when 13 => charge<=“1101”;when 14 => charge<=“1110”;when 15 => charge<=“1111”;when others => charge<=“0000”;end case;if(charge_reg>0 and charge_alr='0')then chargegate<='1';charge_alr:='1';elsif(charge_reg=0 and charge_alr='0')then chargegate<='0';charge_alr:='1';else state<=initial_type;end if;end process main;END sell;

五、波形仿真

1、乘客按下開始按鈕,進入選站臺模式,選擇二號站臺,按下確定鍵,再選擇票數為2張,按下確定鍵,售票機錢箱關閉,投入一張兩元和五元紙幣(對順序沒有要求),此時錢幣總額大于票價,出兩張票并找零一元。之后系統進入初始化狀態。具體仿真如圖 1 仿真1

圖 1 仿真1

2、測試cancel鍵,當乘客按正確的操作完成選站臺時,按下取消鍵,再重新選擇,如圖 2 cancel仿真,仿真波形如下。

圖 2 cancel仿真

3、還是測試cancel鍵,當乘客選擇好票數時,按下cancel鍵,然后重新選擇兩張單價為七塊錢的六號站臺票,投入一張20元和5元,找零六元。仿真波形如圖 3 cancel仿真2

圖 3 cancel仿真2

4、乘客選擇五號站臺,兩張票,然后先后投入一元紙幣,兩元紙幣,一元紙幣,五元紙幣,然后按下取消鍵,售票機自動放出所有的錢幣。仿真如圖 4 cancel仿真3。

圖 4 cancel仿真3

六、心得體會

在我的設計中,有一個moneystorage信號量用于控制儲存錢幣箱的開與關,這個設計主要考慮到當乘客要求退幣時,最好不是從售票機中取出投入的錢數,然后退還,設置了這個開關,就可以在按下取消鍵時,直接從儲存錢幣箱中退出錢幣。

還有,乘客選擇的站臺以及票數,在售票機內部會自動將這兩個信號傳給出票系統,從而自動出票,以上寫的程序只是讓系統知道怎樣收錢以及找零。

這次實驗總體上來說比六人搶答器簡單,但是因為這個售票機完全是自己寫的,所以也不是想象中的那么簡單。這也讓我看出,要完全自己去做一件東西不是簡單的,特別是要考慮很全面,還是要發一些時間的。

第四篇: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 編程的一些心得體會(共五則)word格式文檔
下載VHDL 編程的一些心得體會(共五則).doc
將本文檔下載到自己電腦,方便修改和收藏,請勿使用迅雷等下載。
點此處下載文檔

文檔為doc格式


聲明:本文內容由互聯網用戶自發貢獻自行上傳,本網站不擁有所有權,未作人工編輯處理,也不承擔相關法律責任。如果您發現有涉嫌版權的內容,歡迎發送郵件至:645879355@qq.com 進行舉報,并提供相關證據,工作人員會在5個工作日內聯系你,一經查實,本站將立刻刪除涉嫌侵權內容。

相關范文推薦

    JAVA編程心得體會

    JAVA編程心得計算機3班 竇金霞 20104773 最近幾周一直在弄程序,說實話真的很累,但累中也有成功的快樂。我覺得學到了很多東西,這是只看課本知識所不能學到的。說實話,以前我一直......

    VHDL簡答題總結

    1 數據BIT與STD_LOGIC的區別? Bit只是一個邏輯型變量,只能存在“0”和“1”,不存在不定狀態和高阻態 STD_LOGIC存在U初始值,X不定,0,1,Z高阻 W弱信號不定,L弱信號1,H弱信號0,-不可能......

    編程實習心得體會(五篇)

    編程實習心得體會1此次只實訓了短短的三周。雖說時間很短,但其中的每一天都使我收獲很大、受益匪淺,它不但極大地加深了我對一些理論知識的理解,不僅使我在理論上對Java有了全......

    數控編程實習心得體會

    數控編程實習心得體會 數控編程是數控加工準備階段的主要內容之一,下面是數控編程實習心得體會,希望可以幫到大家。篇一:數控編程實習心得體會"天下英雄皆我輩,一入江湖立馬催。......

    socket編程實驗心得體會

    實驗心得體會 在本次實驗中,我通過對網絡課上所學知識的應用,學到了很多實踐中的知識。并且加深了我對課本知識的理解和認識,在實驗過程中,更容易記憶和深入理解各種協議的工作......

    編程心得體會(共五則)

    篇一:java編程心得體會 java編程心得計算機3班 竇金霞 20104773 最近幾周一直在弄程序,說實話真的很累,但累中也有成功的快樂。我覺得學到了很多東西,這是只看課本知識所不能......

    java編程實習心得體會

    Java編程實習心得體會 “紙上得來終覺淺,絕知此事要躬行。”在短暫的實習過程中,我深深的感覺到自己所學知識的膚淺和在實際運用中的專業知識的匱乏。剛開始的一段時間里,對一......

    VHDL課程設計報告 頻率計

    目錄 1. 前言........................................................................................................................... 2 2. 設計要求.................

主站蜘蛛池模板: 成人亚洲精品777777| 国产对白叫床清晰在线播放| 欧美熟妇乱子伦xx视频| 午夜成人理论无码电影在线播放| 久久精品国产免费观看三人同眠| 十八禁视频在线观看免费无码无遮挡骂过| 日本免费人成视频在线观看| 动漫成人无码免费视频在线播| 婷婷开心深爱五月天播播| 免费AV观看| 久久精品久久电影免费| 国产日韩一区二区三免费高清| 亚洲精品尤物av在线观看任我爽| 亚洲无av码一区二区三区| 成人午夜福利免费体验区| 亚洲欧美在线一区中文字幕| 国产美女亚洲精品久久久| 中文人妻av久久人妻水密桃| av狠狠色超碰丁香婷婷综合久久| 人妻体体内射精一区二区| 国产精品久久久久久久久软件| 性一交一乱一伦在线播放| 天天做日日做天天添天天欢公交车| 国产玉足榨精视频在线观看| 色综合色狠狠天天综合色| 亚洲日韩乱码中文无码蜜桃臀网站| 亲胸揉屁股膜下刺激视频免费网站| 国产又爽又黄又无遮挡的激情视频| 放荡的闷骚娇妻h| 亚洲美腿丝袜 欧美另类| 国产在线精品成人一区二区| 欧洲人与动牲交α欧美精品| 内射夜晚在线观看| 一本一道人人妻人人妻αv| 欧美午夜精品久久久久久浪潮| 久久久久久亚洲精品无码| 麻豆画精品传媒2021一二三区| 色偷偷偷久久伊人大杳蕉| 精品三级av无码一区| 人人妻人人妻人人片av| 精品无码成人网站久久久久久|