先說背景。

我在幫忙做一個項目(本科畢業設計之類的),是個關於電子的項目。然後要求是用4個MY9231晶元控制4個LED燈,每個LED燈里包含紅藍綠三種顏色。然後教授要我用VHDL寫個程序,來控制4個燈怎麼亮。我本科學的是物理,c語言,groovy,Matlab,LabVIEW我幾乎都摻過一腳。所以看VHDL語法的時候並不覺得難。但是我現在也還是沒理解這個程序到底是怎麼運行的。我感覺一開始我對VHDL這個語言的理解就有所偏差。我之前理解的程序,就像命令行一樣,我寫的每一句,機器照做就行了。所以在我看懂了晶元的時序圖後,我以為我只要控制那塊底板(原諒我並不知道該叫什麼,版上刻著「HPEmini」),給晶元的針腳發送信號就可以了。但是我看的VHDL的例子越多,越覺得這程序更像是個說明書,它解釋了晶元如果運作,卻沒提到怎麼控制。所以我現在完全一頭霧水不知道該怎麼辦。

我自己覺得我應該是缺少了某一塊基礎知識,但是我不知道是哪塊。我也不知道該從什麼地方開始補。

有沒有大神能指點一下~跪謝!


vhdl是描述電路的,每一段是一個電路,一上電,滿足要求的就同時運行
忘記高級語言的順序執行的思想。多從時序和並行的角度來理解。
作為一個新手來回答一下這個問題,說的不對勿噴。很多人學FPGA老是放不下以前所學的知識,喜歡把verilog hdl和VHDL這兩門硬體描述語言與c語言對比,然後一路對比一路想不通,越學就越迷糊。卻不想,verilog和VHDL是硬體描述語言,都說了是硬體描述語言,那就明顯是在描述電路,既然是電路,那電路運行的特點不就是並行的嗎?見過現實中電路上電後電路中互連的部分會沒電嗎?個人理解,能把思維轉換成電路電流在電路運行的思維,學習FPGA或許會更好。看代碼最好先看RTL視圖,然後再看各個模塊的整體功能;接著看,如果是verilog,那就看各個always塊的聯繫,如果是VHDL那就看各個進程之間的聯繫;而不是斤斤計較每一行代碼起什麼作用。然後題主提問,是通過什麼控制LED燈,我想,裡面有一個狀態機(類似c語言裡面的switch語句;VHDL裡面是when select或者其他帶有when的, verilog裡面帶有case, 一般是狀態機)在不停的控制LED燈。如果沒有,那一般會有個輸入信號(外界分配的引腳或其他模塊輸出的信號)進入這個用硬體描述語言描述出來的電路模塊來改變電路輸出的電平,從而達到控制LED燈。

對了,FPGA寫代碼,不管是verilog hdl還是VHDL,一般沒有固定的結果輸出,除非在模塊裡面已經固定好了,例如例化一個d觸發器,就沒有一個固定的值輸出,還不是跟隨外部變化而變化,不是嗎?


題主首先要排除過去學的計算機語言的影響,VHDL也好Verilog也好,都是HDL,硬體描述語言,本質是對一種實現某種功能的電路的描述,就好像你是在畫一張供水管網圖紙,當你設計好管道走向閥門控制條件等等之後,上電(開閘供水)水就會按照你設計好的圖紙依據一定的時序約束最終到達終端。儘管HDL中也存在一些諸如循環判斷的結構,但是本質上還是並行的,就像同時幾根水管都在充水一樣。
VHDL可以理解成是用代碼的形式去搭建邏輯電路,就像題主要用四個晶元,那麼VHDL程序里可能就要定義signal,而這個signal可以看做是電路中的導線來連接這幾個晶元。不要把VHDL程序想成指令,而是想成真實電路的零件,這樣應該會清楚一點。要寫好VHDL,首先要搞清楚這個電路的邏輯關係,boolean function寫出來很有用的啊,剛開始學的話變數一多容易搞混,但是寫出來了就會清楚很多。寫完之後記得要返回去對照邏輯電路檢查,不然寫錯或者電路畫錯後面寫程序還蠻麻煩的。確認電路無誤之後,如果可以的話把functional diagram畫出來很有助於理清各個部件和輸入輸出信號之間的關係。假如需要finite state machine的話,也可以將state diagram畫出來。在把圖畫出來之後,其實就是按著圖把需要的東西轉成程序一行行寫出來。題主的感覺其實也蠻對的,VHDL就像自己寫份說明書對設計好的電路進行解釋。一般來說,除了將library/entity這類框架要按順序寫下來之外,VHDL並沒有太多的順序限制,因為VHDL並不像C語言這樣順序執行。寫完程序之後就是debug,運行一下程序,有error的話就去找error修改。如果顯示有什麼warning但是程序運行成功了的話,一般好像不用理它,經常是定義了pin但是沒用到就會出現warning的。不過有時候明明看上去沒有error了但是程序還是不對,這樣的話剛剛畫的functional diagram和state diagram就又發揮作用了。我用的軟體是Quartus II,在程序運行成功之後可以點開RTL Viewer和State Machine Viewer,這兩個viewer會自動生成所寫程序的電路,可以和之前自己畫的圖進行比較找出錯誤。大概就是這樣了吧。我也在學習VHDL中,如果說錯了請糾正。。。

大概查了一下這個晶元,再根據你的描述,應該是板子上有別的晶元(CPLD/FPGA?)控制這個晶元驅動LED吧。

其實你不是不懂VHDL,而是不了解一般的晶元使用方法,考慮到你沒有背景,快速攻略是:

1. 先查晶元的data sheet。我嚴重懷疑你看的所謂的解釋晶元運行原理和時序的就是data sheet…看data sheet的目的就是搞懂晶元的原理以及使用方法,原理可以看不懂,但是使用方法一定要看懂,也就是對輸入輸出的時序要求和介面引腳的配置。所以,再仔細看看晶元手冊吧。

2. 看懂了使用方法,接下來就很簡單了,寫代碼:按照手冊給出的時序配置晶元,然後根據自己的需求寫功能模塊。也就是別人回答的那些,硬體並行的思維+VHDL的基本語法,參考常式,照貓畫虎寫吧。更基本的內功是數字電路和邏輯設計,如果學過的話,應該問題不大。

只能幫到這裡了,祝你順利 ^_^
很簡單,fpga東西不多,lut,這個用查表代替組合邏輯。每個裡面裝的值是ide幫你算好的。然後就是觸發器,一個時鐘改變一次狀態。就這兩個東西比較重要,明白什麼語句出什麼硬體就好了。
vhdl是rtl層次的電路描述語言哦,跟c語言這種馮諾依曼體系的程序語言完全不是一個概念。我也不大寫vhdl,verilog寫的多點,想要深入理解的話,建議去好好看看數字電路得相關知識,比如寄存器是啥,時序電路是啥,時鐘有什麼用,組合邏輯是怎樣的,standcell是什麼,setup hold等timing代表了什麼,數字晶元設計流程是怎樣的,然後再來看verilog的語法就好理解了。
硬體描述語言描述的是電路的行為,不是軟體設計語言那種過程描述。

VHDL語言比較偏向行為級描述。設計思路也是偏自頂向下,也就是系統整體到模塊功能再到RTL級電路。

看題主的問題,大概是不知道具體控制實現方向怎麼寫。建議多去看一下結構體部分。一般VHDL開始基本寫的時候,程序包開頭直接調用Ieee庫就行,實體是相當於將你這個程序封裝成一個電路晶元,外部給他定義引腳,幾個In 幾個Out。 具體模塊的控制功能是由結構體具體實現,結構體內部又分了並行語句,也就是同時執行的,還有順序模塊process這種,個人覺得process模塊裡面實現簡單功能和C的風格略像。多看看這方面的實例應該比較好。


只想說兩點,

1,你的問題問的有點含糊2.硬體語言寫出來的每一句話都是電路的一部分,並且電路是並行運行的,因此你寫代碼的時候要注意,數據處理會有並行。PS如果你用組合邏輯寫代碼,那你就先學習下時序電路設計吧。
先學一下數字電路設計,vhdl只是用來描述電路的一種方式,跟畫圖紙一樣,需要想清楚電路,再用vhdl描述出來。
只要知道怎麼控制單個燈的亮/滅以及顏色顯示,剩下的控制策略基本就是時序邏輯和組合邏輯的實現。

C語言的程序是一段由處理器執行的指令,處理器是硬體電路,C程序是軟體。

VHDL是硬體描述語言,VHDL代碼在經過綜合,映射,布線等步驟之後,產生的是一個對目標晶元(比如FPGA)的配置文件(bitstream)。目標晶元經過配置之後,將按照VHDL代碼所描述的行為運行。

題目中說到了「VHDL程序」,我認為是題主把VHDL代碼類比成了C程序。VHDL代碼不是通常意義上的順序執行的「程序」,它描述的是硬體行為。

題目中還說沒有理解VHDL程序是怎麼運行的,這也是在和C語言程序做類比。實際上運行的不是VHDL程序,而是被配置後的電路。題主可以了解一下FPGA的工作原理,應該會有幫助。


推薦閱讀:
相关文章