張穩(wěn)穩(wěn)
摘 要: 為了高效地利用Verilog HDL語言中always行為建模語句設(shè)計(jì)集成電路,采用比較和舉例論證的方法,總結(jié)出always語句中事件控制敏感信號(hào)對(duì)設(shè)計(jì)仿真的影響。always語句中敏感信號(hào)分為時(shí)鐘邊沿信號(hào)和電平信號(hào),對(duì)于敏感信號(hào)為時(shí)鐘邊沿信號(hào),仿真結(jié)果直觀簡(jiǎn)單;但是對(duì)于敏感信號(hào)為電平信號(hào),敏感信號(hào)必須是所有的輸入和判斷語句的信號(hào),否則仿真結(jié)果不確定。
關(guān)鍵詞: Verilog HDL; always語句; 敏感信號(hào); 時(shí)鐘邊沿信號(hào); 時(shí)鐘電平信號(hào)
中圖分類號(hào): TN911.6?34; TP312 文獻(xiàn)標(biāo)識(shí)碼: A 文章編號(hào): 1004?373X(2015)15?0032?03
Contrastive analysis of always sensitive signals in Verilog HDL language
ZHANG Wenwen
(School of Electronic Engineering, Xian University of Posts and Telecommunications, Xian 710121, China)
Abstract: To use always behavioral modeling statements in Verilog HDL language to design integrated circuits efficiently, the influence of event control sensitive signals in always statement on design simulation are summarized by using comparison and illustrating arguments. The sensitive signals in always statements are divided into clock edge signal and level signal. When sensitive signal is the former, the simulation results are intuitive and simply. When sensitive signal is the latter, the sensitive signal must be the signal of all input and judgment statements, otherwise the simulation results are uncertain.
Keywords: Verilog HDL; always statement; sensitive signal; clock edge signal; clock level signal
0 引 言
硬件描述語言(Hardware Description Language, HDL)是一種用形式化方法來描述數(shù)字電路和系統(tǒng)的語言。Verilog HDL和VHDL是目前世界上最流行的兩種硬件描述語言,都是在20世紀(jì)80年代中期開發(fā)出來的,兩種HDL均為IEEE標(biāo)準(zhǔn)。但是Veriolg 語言的很多規(guī)定與C語言相似,代碼簡(jiǎn)單,有大量支持仿真的語句與可綜合語句,對(duì)于初學(xué)者設(shè)計(jì)簡(jiǎn)單的數(shù)字系統(tǒng),更容易學(xué)習(xí)和掌握[1]。所以,Verilog HDL語言在大規(guī)模集成電路和現(xiàn)場(chǎng)可編程門陣列設(shè)計(jì)中得到了廣泛的應(yīng)用[2?4]。
在集成電路設(shè)計(jì)中,Verilog語言中的always語句經(jīng)常用來描述時(shí)序邏輯電路和組合電路。always語句是一種結(jié)構(gòu)化的過程語句,是行為級(jí)建模的基本語句,它的語句格式為:always@(敏感事件列表),敏感事件可以是時(shí)鐘邊沿信號(hào)也可以是電平信號(hào),分別對(duì)應(yīng)時(shí)序邏輯電路和組合邏輯電路[5]。敏感事件列表中可以包含多個(gè)敏感事件,只要所列舉的任意一種情況發(fā)生,都將激活事件控制,各個(gè)敏感事件之間是“或”的關(guān)系;但不可以同時(shí)包括電平敏感事件和邊沿敏感事件,也不可以同時(shí)包括同一個(gè)信號(hào)的上升沿和下降沿,這兩個(gè)事件可以合并為一個(gè)電平敏感事件。而且,按照語法要求,在always塊中只能給寄存器變量賦值。
在實(shí)際應(yīng)用中,敏感信號(hào)為時(shí)鐘邊沿信號(hào),仿真綜合結(jié)果一般正確。但是當(dāng)敏感信號(hào)為電平信號(hào)時(shí),情況就會(huì)變得復(fù)雜,仿真綜合結(jié)果會(huì)變得不確定。文獻(xiàn)[6]對(duì)always敏感信號(hào)與仿真結(jié)果的這種不確定性問題也進(jìn)行了肯定,但是并沒有進(jìn)一步的分析。本文對(duì)always語句中的事件控制敏感信號(hào)出現(xiàn)的各種情況進(jìn)行對(duì)比探討,發(fā)掘always語句中敏感信號(hào)分別為時(shí)鐘邊沿信號(hào)和電平信號(hào)的差異,并通過仿真圖形去驗(yàn)證。
1 敏感信號(hào)為時(shí)鐘邊沿信號(hào)
Always語句中的敏感信號(hào)如果為時(shí)鐘邊沿敏感事件,一般用來表示時(shí)序邏輯電路,時(shí)序邏輯電路在邏輯功能上的特點(diǎn)是任意時(shí)刻的輸出不僅取決于當(dāng)時(shí)的輸入信號(hào),而且還取決于電路原來的狀態(tài),或者說,還與之前的輸入有關(guān)。從電路行為上講,不管輸入如何變化,僅當(dāng)時(shí)鐘的沿(上升沿或下降沿)到達(dá)時(shí),才有可能使輸出發(fā)生變化[7]。這里以經(jīng)常用到的D觸發(fā)器為例,其仿真圖如圖1所示。
module dff(q,a,b,clk );
output q;
input a,b,clk;
reg q;
always @(posedge clk) //時(shí)鐘的上升沿
begin
q<=a | b; //D觸發(fā)器的驅(qū)動(dòng)方程是a|b
end
endmodule
圖1 D觸發(fā)器的仿真圖
上面所述的D觸發(fā)器,賦值語句為q<=a|b,等式右端為wire型變量。再舉個(gè)多敏感信號(hào)的時(shí)序邏輯電路的例子,比如帶有清零端的16分頻,其仿真圖如圖2所示。
module div16(clk,rst,clk_16);
output clk_16;
input clk,rst;
reg[3:0] cnt16;
always @(posedge clk or negedge rst)
//時(shí)鐘的上升沿和清零信號(hào)的下降沿
begin
if(!rst)
cnt16<=0;
else
cnt16<=cnt16+1; //計(jì)數(shù)器加1
end
assign clk_16=cnt16[3];
endmodule
圖2 帶清零端16分頻仿真圖
只要在always塊的敏感信號(hào)表中定義有效的時(shí)鐘沿,敏感詞的作用立竿見影,然后使用過程賦值語句對(duì)信號(hào)賦值,就可以實(shí)現(xiàn)時(shí)序邏輯電路。
2 敏感信號(hào)為電平信號(hào)
always語句中的敏感信號(hào)如果為電平敏感事件,一般用來表示組合邏輯電路,組合邏輯電路的特點(diǎn)是輸出信號(hào)只是當(dāng)前時(shí)刻輸入信號(hào)的函數(shù),與其他時(shí)刻的輸入狀態(tài)無關(guān),無存儲(chǔ)電路。從電路行為上看,其特征就是輸出信號(hào)的變化僅僅與輸入信號(hào)的電平有關(guān),不涉及對(duì)信號(hào)跳變沿的處理[8]。always電平敏感信號(hào)列表,必須將所有的輸入信號(hào)和條件判斷信號(hào)都列在信號(hào)列表中。有時(shí)不完整的信號(hào)列表會(huì)造成不同的仿真和綜合結(jié)果,因此需要保證敏感信號(hào)的完備性。在實(shí)際的PLD 器件開發(fā)中,EDA 工具都會(huì)默認(rèn)將所有的輸入信號(hào)和條件判斷語句作為觸發(fā)信號(hào),增減敏感信號(hào)列表中的信號(hào)不會(huì)對(duì)最終的執(zhí)行結(jié)果產(chǎn)生影響,因此如果期望在設(shè)計(jì)中通過修改敏感信號(hào)來得到不同的邏輯,是不能實(shí)現(xiàn)的,這也是經(jīng)常犯錯(cuò)的地方,這是因?yàn)榉抡嫫髟诠ぷ鲿r(shí)不會(huì)自動(dòng)補(bǔ)充敏感信號(hào)表。如果缺少信號(hào),則無法觸發(fā)和該信號(hào)相關(guān)的仿真進(jìn)程,也就得不到正確的仿真結(jié)果。這里以一個(gè)2?4譯碼器為例,其仿真圖如圖3所示。
module trans24(data_out,data_in,enable);
input [1:0] data_in;
input enable;
output [3:0] data_out;
reg [3:0] data_out;
always @(data_in or enable)
begin
if (enable==1)
if(data_in==3′b00) data_out=~8′b1110;
else if(data_in==3′b01)data_out=~8′b1101;
else if(data_in==3′b10)data_out=~8′b1011;
else if(data_in==3′b11)data_out=~8′b0111;
else data_out=8′bxxxx;
else
data_out = ~8′b1111;
end
endmodule
圖3 2?4譯碼器仿真圖
如果想用一個(gè)敏感信號(hào)來控制邏輯變化,比如當(dāng)enable信號(hào)的電平發(fā)生變化時(shí),再去譯碼,程序如下,仿真圖如圖4所示。
圖4 敏感信號(hào)只有enable的2?4譯碼器的仿真圖
module tans24(data_out,data_in,enable);
input [1:0] data_in;
input enable;
output [3:0] data_out;
reg [3:0] data_out;
always @(enable)
begin
if(data_in==3′b00) data_out=~8′b1110;
else if(data_in==3′b01)data_out=~8′b1101;
else if(data_in==3′b10)data_out=~8′b1011;
else if(data_in==3′b11)data_out=~8′b0111;
else data_out=8′bxxxxxxxx;
end
endmodule
由圖4可以看出,這并不是所需的結(jié)果,這就是前面所說的,系統(tǒng)自動(dòng)將所有的輸入作為了敏感信號(hào)。
因此,在應(yīng)用always塊語句表述組合邏輯電路時(shí),一定要注意敏感信號(hào)的完整性,要求觸發(fā)為所有內(nèi)部用到的信號(hào),可以用always@(*),此時(shí),綜合工具和仿真工具會(huì)自動(dòng)將所有的敏感信號(hào)自動(dòng)加入敏感信號(hào)列表。
前面已經(jīng)提到過always敏感信號(hào)不可以同時(shí)包括同一個(gè)信號(hào)的上升沿和下降沿,這兩個(gè)事件可以合并為一個(gè)電平敏感事件。在設(shè)計(jì)中,一些初學(xué)的設(shè)計(jì)者經(jīng)常在時(shí)鐘的上升沿和下降沿都進(jìn)行計(jì)數(shù)器加1,以為這樣能實(shí)現(xiàn)倍頻,仿真結(jié)果如圖5所示。
module beipin(clk,clknot,cnt8,clk_2,clk_4,clk_8);
input clk;
output clknot,clk_2,clk_4,clk_8;
output[3:0] cnt8;
reg [2:0]cnt8;
reg[2:0]state;
reg clknot;
always @ (clk)
clknot=~clk;
always @ (clk)
cnt8=cnt8+1;
assign clk_2=cnt8[0];
assign clk_4=cnt8[1];
assign clk_8=cnt8[2];
endmodule
圖5 直接計(jì)數(shù)倍頻仿真波形
從圖5中可以發(fā)現(xiàn)并沒有出現(xiàn)想要的結(jié)果,而是呈現(xiàn)出了高阻態(tài)。將直接加1運(yùn)算改為直接的賦值語句,程序如下,仿真結(jié)果如圖6所示。
從圖6中可以看出,cnt8這個(gè)變量存儲(chǔ)的是最后一次賦值,這時(shí)當(dāng)always敏感信號(hào)為電平信號(hào),系統(tǒng)默認(rèn)為組合邏輯電路,雖然將信號(hào)定義為reg 型,但只是為了滿足always 模塊中的信號(hào)必須定義為reg 型的語法要求,最終的實(shí)現(xiàn)結(jié)果中并沒有寄存器,在圖5中出現(xiàn)高阻態(tài),因?yàn)閏nt8=cnt8+1是計(jì)數(shù)器,是時(shí)序邏輯電路。
圖6 直接賦值的倍頻仿真波形
module beipin1(clk,clknot,cnt8,clk_2,clk_4,clk_8);
input clk;
output clknot,clk_2,clk_4,clk_8;
output[3:0] cnt8;
reg [2:0]cnt8;
reg[2:0]state;
reg clknot;
always @ (clk)
clknot=~clk;
always @ (clk)
case(state)
0:begin cnt8<=3′b000;state=1;end
1:begin cnt8<=3′b001;state=2;end
2:begin cnt8<=3′b010;state=3;end
3:begin cnt8<=3′b011;state=4;end
4:begin cnt8<=3′b100;state=5;end
5:begin cnt8<=3′b101;state=6;end
6:begin cnt8<=3′b110;state=7;end
7:begin cnt8<=3′b111;state=0;end
endcase
assign clk_2=cnt8[0];
assign clk_4=cnt8[1];
assign clk_8=cnt8[2];
endmodule
3 結(jié) 論
本文對(duì)Verilog語言中always塊語句中的敏感信號(hào)進(jìn)行了對(duì)比探討,得到如下結(jié)論:
(1) 如果敏感信號(hào)是時(shí)鐘邊沿觸發(fā)信號(hào),表示的是時(shí)序邏輯電路,而且在描述時(shí)序電路的always塊中的reg型信號(hào)都會(huì)被綜合成寄存器,而且時(shí)序邏輯的敏感信號(hào)列表只需要加入所用的時(shí)鐘觸發(fā)沿即可。
(2) 如果敏感信號(hào)是電平觸發(fā)信號(hào),表示的是組合邏輯電路,這里一定要注意敏感信號(hào)的完整性,即所有的輸入和判斷語句的信號(hào)都要加為敏感信號(hào),否則,得不到想要的設(shè)計(jì)結(jié)果。
(3) 在組合邏輯電路描述中,將信號(hào)定義為reg型,只是為了滿足always模塊中的信號(hào)必須定義為reg 型的語法要求,最終實(shí)現(xiàn)結(jié)果中并沒有寄存器。
參考文獻(xiàn)
[1] PALNITTKAR S.Verilog HDL數(shù)字設(shè)計(jì)與綜合[M].夏宇聞,胡燕祥,刁嵐松,譯.2版.北京:電子工業(yè)出版社,2009.
[2] 孫繼榮,李志蜀,王莉,等.程序切片技術(shù)在軟件測(cè)試中的應(yīng)用[J].計(jì)算機(jī)應(yīng)用研究,2007,24(5):210?213.
[3] 寧佐林,邱智亮.PCI橋接IP Core的Verilog HDL實(shí)現(xiàn)[J].電子科技,2006,19(4):43?46.
[4] 趙東,耿衛(wèi)東,吳春亞,等.用FPGA實(shí)現(xiàn)OLED灰度級(jí)顯示[J].光電子[?]激光,2002,13(6):554?558.
[5] 羅杰.Verilog HDL與數(shù)字ASIC設(shè)計(jì)基礎(chǔ)[M].武漢:華中科技大學(xué)出版社,2008.
[6] PADMANABHAN T R, SUNDARI B B T. Design through Verilog HDL [M]. New York: John Wiley & Sons, 2013.
[7] CILETTI M D. Advanced digital design with the Verilog HDL [M]. 2nd ed. Beijing: Electronic Industry Press, 2010.
[8] 夏宇聞.Verilog數(shù)字系統(tǒng)設(shè)計(jì)教程[M].北京:北京航空航天大學(xué)出版社,2003.