之前一段時間接觸過Verilog但是一直沒有具體記錄,現在在這里記錄一下,比較淺薄。
從C/C++語言上手Verilog一些需要注意的東西:
1.if,else等語句的書寫要求,這里與C/C++語言不同,if的內容是以begin和end開始和結尾的。在Verilog很少有用大括號來表示范圍的。
2.對output類型的變量賦值需要使用assign
3.Verilog中雖然有並行執行的語句,但是不是什么都並行執行的,一些書籍上面認為這是與其他語言很大的不同,誇大了並行執行,個人認為是不合適的,而且書中並沒有說明,整個文件被編譯之后的執行順序是什么。很容易給人以誤導。(具體的執行順序到現在還不是很清楚)
4.注意阻塞性賦值(=)與非阻塞性賦值(<=)的區別。這里簡單說就是阻塞性賦值是一個一個執行的,而非阻塞性賦值這是並行執行的。舉個例子:
a <= 1‘b1;
b <= 1'b1;//非阻塞性賦值,這里a,b同時被修改為1.
c = 1'b1;
d = 1'b1;//阻塞性賦值,c先被修改為1,之后d被修改為1
大致看了一下這篇文章里面結合硬件來說明應該是更加形象一點:
http://blog.163.com/xiaoting_hu/blog/static/50464772201361162838112/
5.再給非數字變量賦值時,要注意位數,比如直接給一個reg型的變量a賦值為1,即a = 1;這里a不是一個單獨的1,會按照一定的要求(和操作系統有關)經行數位的補齊。例如將1補成32’b1;
還有一點就是要注意相應位數所能表示數的最大范圍。例如一個8位的向量,最大可以為2的8次方,即255,如果發生溢出會導致從零重新開始,即0,1,2,3....254,255,0,1,2...這里不注意的話很可能會發生我們想不到的事情
6.關於always語句,本人使用的時候,里面放置的敏感信息都是時鍾信號,通常是上升沿觸發或者是下降沿觸發,之后再進行一個計數,已完成相應的延時或者其他功能。例如:
always(posedge clk)
begin
count = count + 1;
if(count < 100)
a = 1;
else if(count > 100 && count < 200)
a = 0;
else if(count == 200)
count = 0
end
//這樣a為1(高電平)就被保留了100個時鍾周期,假設clk是0.01秒,而a是一個給LED等供電的io口,那么我們//就能看到每隔1s中燈閃亮一次。
//注:只是舉個例子,具體事例還要具體的分析
7.之后還有一些function之類的語法還有IP核,由於沒有使用過了,這里就不多加議論了
以上是2015-03-29寫的
2016.3.15更新
FPGA與Verilog有一段時間沒有記錄了,看了一下自己過去寫的,感覺認識好膚淺.....
再次記錄一下自己對FPGA與Verilog的新的領悟。首先要想學習FPGA與Verilog就要與硬件相關聯,很多程序軟件上仿真是正確的,但到了板子上就沒有那種效果,這個大多數是因為在程序中使用了一下編譯器無法與硬件相對應的語句,例如always(*)這種可能編譯器沒有判定為錯誤的語句。此外Verilog是一種硬件描述語言,關鍵詞是描述,因為硬件FPGA的結構已經是確定的了,所以只能是描述,而不能像C/C++語言一樣,可以去設計程序。