Verilog HDL語(yǔ)言在FPGA/CPLD開(kāi)發(fā)中的應用
1 引言
本文引用地址:http://dyxdggzs.com/article/189865.htm近30年來(lái),由于微電子學(xué)和計算機科學(xué)的迅速發(fā)展,給EDA(電子設計自動(dòng)化)行業(yè)帶來(lái)了巨大的變化。特別是進(jìn)入20世紀90年代后,電子系統已經(jīng)從電路板級系統集成發(fā)展成為包括ASIC、FPGA和嵌入系統的多種模式??梢哉f(shuō)EDA產(chǎn)業(yè)已經(jīng)成為電子信息類(lèi)產(chǎn)品的支柱產(chǎn)業(yè)。EDA之所以能蓬勃發(fā)展的關(guān)鍵因素之一就是采用了硬件描述語(yǔ)言(HDL)描述電路系統。就FPGA和CPLD開(kāi)發(fā)而言,比較流行的HDL主要有Verilog HDL、VHDL、ABEL-HDL和 AHDL 等,其中VHDL和Verilog HDL因適合標準化的發(fā)展方向而最終成為IEEE標準。但與VHDL相比,Verilog HDL有個(gè)最大的優(yōu)點(diǎn):它是一種非常容易掌握的硬件描述語(yǔ)言,只要有C語(yǔ)言的編程基礎,一般經(jīng)過(guò)2~3個(gè)月的認真學(xué)習和實(shí)際操作就能掌握這種設計技術(shù)。并且完成同一功能Verilog HDL的程序條數一般僅為VHDL的1/3。而VHDL設計技術(shù)則不很直觀(guān),需要有EDA編程基礎,通常需要有多余半年的專(zhuān)業(yè)培訓才能掌握這們技術(shù)??梢?jiàn),用Verilog HDL語(yǔ)言有更高的優(yōu)越性。
2 設計實(shí)例
通常設計數字電路大都采用自頂向下將系統按功能逐層分割的層次化設計方法,這比傳統自下向上的EDA設計方法有更明顯的優(yōu)勢(當時(shí)的主要設計文件是電路圖)。因為由自頂向下的設計過(guò)程可以看出,從總體行為設計開(kāi)始到最終邏輯綜合,形成網(wǎng)絡(luò )表為止。每一步都要進(jìn)行仿真檢查,這樣有利于盡早發(fā)現系統設計中存在的問(wèn)題,從而可以大大縮短系統硬件的設計周期。這也是HDL語(yǔ)言設計系統硬件的最突出的優(yōu)點(diǎn)之一。并且在頂層設計中,要對內部各功能塊的連接關(guān)系和對外的接口關(guān)系進(jìn)行描述。而功能塊實(shí)際的邏輯功能和具體的實(shí)現形式則由下一層模塊來(lái)描述。在系統的底層設計中,由于其對系統很強的行為描述能力,可以不必使系統層層細化,從而避開(kāi)具體的器件結構,從邏輯行為上直接對模塊進(jìn)行描述和設計,隨后EDA設計軟件或相應的第三方工具軟件中的綜合器將程序自動(dòng)綜合成為具體FPGA/CPLD等目標芯片的網(wǎng)表文件,這種避開(kāi)具體器件結構的方式也是它的重要優(yōu)勢之一。
下面以序列檢測器的設計為例具體說(shuō)明。
序列檢測器是時(shí)序數字電路中非常常見(jiàn)的設計之一。它的主要功能是:將一個(gè)指定的序列從數字碼流中識別出來(lái)。接下來(lái)就以設計“01101”這個(gè)序列的檢測器為例,說(shuō)明Verilog HDL語(yǔ)言的具體應用。設X為數字碼流輸入,Z為檢出標記輸出,高電平表示“發(fā)現指定序列”,低電平表示“沒(méi)有發(fā)現指定的序列”。設輸入的碼流為“001101101111011111...”,則其序列檢測器的邏輯功能如表1所示。
在時(shí)鐘2~6中,碼流X里出現指定序列“01101”,對應輸出Z在第6個(gè)時(shí)鐘變?yōu)楦唠娖?ldquo;1”,表示發(fā)現指定序列“01101”,Z輸出“1”。同理在第9個(gè)時(shí)鐘對應輸出Z也為“1”。根據這個(gè)邏輯功能描述,我們可以分析得出狀態(tài)轉換圖(見(jiàn)圖1)。

其中狀態(tài)A~E表示5位序列“01101”按順序正確地出現在碼流中。因為輸入碼流X是隨機的,因此可能會(huì )有很多重疊的情況發(fā)生。這樣在轉換圖中相應的還要有狀態(tài)F和G。設初始狀態(tài)為IDLE,則有相應的Verilog HDL語(yǔ)言程序如下。
module seqdet(x,z,clk,rst);
input x,clk,rst;
output z;
reg[2:0] state;
wire z;
parameter IDLE=3'd0,
A=3'd1,
B=3'd2,
C=3'd3,
D=3'd4,
E=3'd5,
F=3'd6,
G=3'd7;
assign z=(state==D x==1)?1:0;
always@(posedge clk or negedge rst)
if(!rst)
begin
state=IDLE;
end
else
casex(state)
IDLE:if(x==0)
state=A;
else state=IDLE;
A:if(x==1)
state=B;
else state=A;
B:if(x==1)
state=C;
else state=F;
C:if(x==0)
state=D;
else state=G;
D:if(x==1)
state=E;
else state=A;
E:if(x==1)
state=C;
else state=A;
F:if(x==0)
state=A;
else state=B;
G:if(x==0)
state=F;
else state=G;
default: state=IDLE;
endcase
endmodule
評論