此文是寫給0基礎學習者,也是對自己知識點總結水平的考驗。
對於有C基礎的人來說,學習verilog應該是輕而易舉 —— 類比法學習。
第一步:格式。
對於C來說我們前面會寫
‘include“stdio.h”
int main {.....};
直接轉化到verilog中是
module module_name (....);
........
endmodule
對於C 的意思就是告訴編輯器,我要在有這個庫的前提下,建立這么一個函數,它實現的功能是......。而對於Verilog來說就是告訴編輯器,我要建立一個數字模塊,這個模塊實現..... 功能。OK 我們再討論省略部分的內容。
第二步:運算符
大家知道HDL 是數字電路的描述性語言,所以需要一點點數字電路的基礎就行了,數字電路中三個最小最基本的邏輯是 與,或,非。在verilog中的運算符就是 &,|,! 。OK ,知道這么多就可以開始我們的verilog程序設計了。
現在我們要實現一個下圖所示的電路功能,這是一個a和b輸入,c輸出,內部實現與功能的電路圖
設計開始和C一樣先寫格式,取一個工程的名字叫project_a .
module project_a ();
endmodule
好了,我們要想想看,我們拿到一個芯片做top view的時候我們看到的是什么? 是pin腳。所以我們要把pin腳的信息告訴編輯器,那么代碼就變成了
module project_a ( input a, input b, output c );
endmodule
格式很靈活,還可以是
1 module project_a ( 2 a, 3 b, 4 c 5 ); 6 input a ; 7 input b; 8 output c ; 9 10 11 12 endmodule
或者是將6,7 兩行合並成 input a ,b ;
個人比較推薦第二種,原因以后再說。格式問題,不用糾結。只是要注意一下哪里是 “;” 哪里是 “,” 就可以了。
現在整個top view 已經做完了,現在要說說具體實現了。在C語言中賦值是直接給的,在Verilog中賦值要借助兩個關鍵字 always 和assign才可以把值賦過去。先說assign 的格式
assign c = a&b ;
意思就是左邊變量c 這根線上的信號結果等於右邊信號運算的結果。那么最終的程序就是
1 module digtal_HDL_test ( 2 a , 3 b , 4 c 5 ); 6 input a; 7 input b ; 8 output c ; 9 10 assign c = a&b ; 11 12 endmodule
再看always ,因為語法要求always里面所有賦值等式左邊的變量都必須是reg,所以得把c的類型改一下,就是在always的前面加上一條語句 : reg c ;那么最終的程序就是
1 module digtal_HDL_test ( 2 a , 3 b , 4 c 5 ); 6 input a; 7 input b ; 8 output c ; 9 10 reg c ; 11 12 always @ (a or b) 13 c = a&b ; 14 15 endmodule
第12行的意思是 “經常(always)在(@) a或者b (a or b)發生變化的時候去執行下面的語句”
好了,現在我們程序設計就完畢了。現在讓我們來回顧一下我們的程序包含了哪些東西
1,模塊的結構和端口。端口還有inout 雙向口(這個高級一點,http://www.cnblogs.com/sepeng/p/5126424.html 里面有介紹,可以先不追究)
2,運算符。verilog的運算符分為單目運算和雙目運算符,以及三目運算符。部分和C的是一樣的。
3,常量及變量。分為,數字,參數,變量(wire,reg ,memory)
4,連續賦值語句assign 以及過程賦值語句always。
具體說明就是念書了,請參照 夏宇聞老師的《Verilog數字系統設計教程》
練習流水燈實驗,熟悉設計流程以及工具的使用,下板看到效果才行。
(流水燈實驗中要貫穿,三目運算符,拼接移位操作,數字,常量,變量)
作業:硬件抽獎小模型。
一共有16個號碼,其中有兩個號碼是中獎號碼(具體號碼是機密,程序內部定義),輸入一個數字,按下使能鍵。如果不正確兩個燈一直是亮的,如果正確,對應的那個燈就會滅。
附加功能:1,如果必須先中第一個才能中第二個該如何設計
2,如果先中了第一個,后中了第二個。第三盞燈亮。如果是先中第二個,后中第一個第四盞燈亮。
(提示行為建模,號碼輸入使用key,使能使用button。)