初學習verilog_經(jīng)驗
先記下來:
1、不使用初始化語句;
2、不使用延時語句;
3、不使用循環(huán)次數(shù)不確定的語句,如:forever,while 等;
4、盡量采用同步方式設計電路;
5、盡量采用行為語句完成設計;
6、always過程塊描述組合邏輯,應在敏感信號表中列出所有的輸入信號;
7、所有的內部寄存器都應該可以被復位;
8、用戶自定義原件(UDP元件)是不能被綜合的。
1它是 cadence的模擬器verilog-XL的基礎,cadence的廣泛流行使得 verilog 在90年代深入人心;
2它在硅谷獲得廣泛使用;
B) verilog 與VHDL相比的優(yōu)點二者的關系仿佛 C與FORTRAN,具體而言:
1 verilog 的代碼效率更高:
比較明顯的對比:
VHDL在描述一個實體時采用 entity/architecture 模式,
verilog 在描述一個實體時只需用一個"module/edumodule"語句塊.
此外verilog 的高效性還在很多地方體現(xiàn)出來;
2 verilog 支持二進制的加減運算:
VHDL在進行二進制的加減運算時使用conv_***函數(shù)或者進行其他的定義,總之必須通知編譯器;verilog
直接用形如"c=a+b"的表示二進制的加減運算;
3綜合時可控制性好:
VHDL對信號不加區(qū)分地定義為"signal",
而verilog 區(qū)分為register類型的和 wire類型的;
但是也有人支持 VHDL,認為verilog 和VHDL的關系仿佛 C和C++.C)典型的verilog 模塊
討論以下典型電路的 verilog描述:
*與非門;
*加法器; //即全加器
* D觸發(fā)器;
*計數(shù)器; //**分頻的counter
* latch;
*時序機;
*RAM; //用synopsys的
*模塊引用;
*預編譯;
*與非門的 verilog描述如下:
//verilog 使用和C語言相同的注釋方法
module nd02(a1,a2,zn);//一個 verilog模塊總是以module 開始,以endmodule 結束,nd02是模塊
名,a1,a2,zn 是模塊的3個輸入輸出信號
input a1,a2; //告訴編譯器a1,a2 對此模塊而言是輸入,并且數(shù)據(jù)類型是"bit"
output zn; //告訴編譯器zn 對此模塊而言是輸出,數(shù)據(jù)類型也是"bit"
nand (zn,a1,a2); //我理解nand 是運算符,我們不必深究 verilog中的正式術語是什
么了吧,總之這種形式表示 zn=~(a1 && a2);你一定已經(jīng)想到類似的運算符還有
"not","and","or","nor","xor"了吧;除了"not",括號里的信號數(shù)可以任意,例如or (z,f,g,h)表示z=f
|| g || h,并且延時是3個單位時間,#x表示延時x個單位時間;
endmodule
*加法器的 verilog描述如下:
module ad03d1(A,B,CI,S,CO) ;
input [2:0] A,B; //表示A,B 是輸入信號,并且是3位矢量,上界是2,下界是 0
input CI;
output [2:0] S;
output CO;
assign {CO,S}=A+B+CI;//一對"{"和"}"表示鏈接,即將 CO和S合并成4位矢量
endmodule
*帶異步清零端的 D觸發(fā)器的verilog 描述如下:
module dfctnb (d,cp,cdn,q,qn);
input d,cp,cdn;
output q,qn;
reg q,qn; //關鍵字"reg"表示 q和qn是"register"類型的信號;verilog中有兩種類型的信
號:"register"類型和"wire"類型.你可以簡單地把register類型的信號想象為某個D觸發(fā)器的輸出,而
wire類型的的信號是組合邏輯的輸出.二者的最大區(qū)別在于:你可以對register 類型的信號進行定時賦
值(用wait 語句在特定時刻的賦值,詳見下面always語句),而對于wire類型的信號則不可.
always wait (cdn==0) //表示每當 cdn=0時,將要對D 觸發(fā)器清零,"always"和"wait"嵌套,"wait"和
"@"是verilog 的兩個關鍵字,表示一旦有某事發(fā)生;則執(zhí)行下面的語句塊,"always"有點象C語言中的
"if ... then...","wait"和"@"的區(qū)別:請參考本模塊.wait表示本語句塊的進程停止,直到"cdn=0"的
條件出現(xiàn)才繼續(xù);我理解在verilog中,每個最外層語句塊都是一個***的進程;"@"(請看下個always語
句)也表示本語句塊的進程停止,直到后面定義"posedge cp"(即出現(xiàn)cp的上升沿)的事件出現(xiàn)才繼續(xù);也
許wait和@可以合二為一吧,但至少到目前verilog中wait表示"條件",@表示"事件";具體運用中,wait
總是用于類似"wait(xxx=1)"之類的場合,@總是用于類似"@(xxx)"或"@(posedge/negedge xxx)"之類的
場合整句話的意思是"每當cdn 等于0時,則作以下事情"
begin //begin...end結構的用法類似于 pascal語言
q=0;
qn=1;
wait (cdn==1);
end
always @ (posedge cp)//"@(posedge cp)"中有兩個關鍵字:"@ (x)"表示"每當事件 x發(fā)
生","posedge x"表示"x的上升沿,"negedge x"表示"x的下降沿",整句話的意思是"每當cp的上升沿,
則作以下事情"
if (cdn) //如果cdn=1(意味著清零端無效)
begin
q=d;
qn=~q;//"~"表示反相
end
endmodule
完整的pdf格式文檔51黑下載地址(共39頁):
verilog_經(jīng)驗(適合初學者).pdf
(946.04 KB, 下載次數(shù): 33)
2018-4-21 19:49 上傳
點擊文件名下載附件
|