国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

Verilog HDL語言中always敏感信號對比分析

2015-08-14 20:40:17張穩(wěn)穩(wěn)
現(xiàn)代電子技術(shù) 2015年15期

張穩(wěn)穩(wěn)

摘 要: 為了高效地利用Verilog HDL語言中always行為建模語句設(shè)計集成電路,采用比較和舉例論證的方法,總結(jié)出always語句中事件控制敏感信號對設(shè)計仿真的影響。always語句中敏感信號分為時鐘邊沿信號和電平信號,對于敏感信號為時鐘邊沿信號,仿真結(jié)果直觀簡單;但是對于敏感信號為電平信號,敏感信號必須是所有的輸入和判斷語句的信號,否則仿真結(jié)果不確定。

關(guān)鍵詞: Verilog HDL; always語句; 敏感信號; 時鐘邊沿信號; 時鐘電平信號

中圖分類號: TN911.6?34; TP312 文獻標(biāo)識碼: A 文章編號: 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語言相似,代碼簡單,有大量支持仿真的語句與可綜合語句,對于初學(xué)者設(shè)計簡單的數(shù)字系統(tǒng),更容易學(xué)習(xí)和掌握[1]。所以,Verilog HDL語言在大規(guī)模集成電路和現(xiàn)場可編程門陣列設(shè)計中得到了廣泛的應(yīng)用[2?4]。

在集成電路設(shè)計中,Verilog語言中的always語句經(jīng)常用來描述時序邏輯電路和組合電路。always語句是一種結(jié)構(gòu)化的過程語句,是行為級建模的基本語句,它的語句格式為:always@(敏感事件列表),敏感事件可以是時鐘邊沿信號也可以是電平信號,分別對應(yīng)時序邏輯電路和組合邏輯電路[5]。敏感事件列表中可以包含多個敏感事件,只要所列舉的任意一種情況發(fā)生,都將激活事件控制,各個敏感事件之間是“或”的關(guān)系;但不可以同時包括電平敏感事件和邊沿敏感事件,也不可以同時包括同一個信號的上升沿和下降沿,這兩個事件可以合并為一個電平敏感事件。而且,按照語法要求,在always塊中只能給寄存器變量賦值。

在實際應(yīng)用中,敏感信號為時鐘邊沿信號,仿真綜合結(jié)果一般正確。但是當(dāng)敏感信號為電平信號時,情況就會變得復(fù)雜,仿真綜合結(jié)果會變得不確定。文獻[6]對always敏感信號與仿真結(jié)果的這種不確定性問題也進行了肯定,但是并沒有進一步的分析。本文對always語句中的事件控制敏感信號出現(xiàn)的各種情況進行對比探討,發(fā)掘always語句中敏感信號分別為時鐘邊沿信號和電平信號的差異,并通過仿真圖形去驗證。

1 敏感信號為時鐘邊沿信號

Always語句中的敏感信號如果為時鐘邊沿敏感事件,一般用來表示時序邏輯電路,時序邏輯電路在邏輯功能上的特點是任意時刻的輸出不僅取決于當(dāng)時的輸入信號,而且還取決于電路原來的狀態(tài),或者說,還與之前的輸入有關(guān)。從電路行為上講,不管輸入如何變化,僅當(dāng)時鐘的沿(上升沿或下降沿)到達時,才有可能使輸出發(fā)生變化[7]。這里以經(jīng)常用到的D觸發(fā)器為例,其仿真圖如圖1所示。

module dff(q,a,b,clk );

output q;

input a,b,clk;

reg q;

always @(posedge clk) //時鐘的上升沿

begin

q<=a | b; //D觸發(fā)器的驅(qū)動方程是a|b

end

endmodule

圖1 D觸發(fā)器的仿真圖

上面所述的D觸發(fā)器,賦值語句為q<=a|b,等式右端為wire型變量。再舉個多敏感信號的時序邏輯電路的例子,比如帶有清零端的16分頻,其仿真圖如圖2所示。

module div16(clk,rst,clk_16);

output clk_16;

input clk,rst;

reg[3:0] cnt16;

always @(posedge clk or negedge rst)

//時鐘的上升沿和清零信號的下降沿

begin

if(!rst)

cnt16<=0;

else

cnt16<=cnt16+1; //計數(shù)器加1

end

assign clk_16=cnt16[3];

endmodule

圖2 帶清零端16分頻仿真圖

只要在always塊的敏感信號表中定義有效的時鐘沿,敏感詞的作用立竿見影,然后使用過程賦值語句對信號賦值,就可以實現(xiàn)時序邏輯電路。

2 敏感信號為電平信號

always語句中的敏感信號如果為電平敏感事件,一般用來表示組合邏輯電路,組合邏輯電路的特點是輸出信號只是當(dāng)前時刻輸入信號的函數(shù),與其他時刻的輸入狀態(tài)無關(guān),無存儲電路。從電路行為上看,其特征就是輸出信號的變化僅僅與輸入信號的電平有關(guān),不涉及對信號跳變沿的處理[8]。always電平敏感信號列表,必須將所有的輸入信號和條件判斷信號都列在信號列表中。有時不完整的信號列表會造成不同的仿真和綜合結(jié)果,因此需要保證敏感信號的完備性。在實際的PLD 器件開發(fā)中,EDA 工具都會默認(rèn)將所有的輸入信號和條件判斷語句作為觸發(fā)信號,增減敏感信號列表中的信號不會對最終的執(zhí)行結(jié)果產(chǎn)生影響,因此如果期望在設(shè)計中通過修改敏感信號來得到不同的邏輯,是不能實現(xiàn)的,這也是經(jīng)常犯錯的地方,這是因為仿真器在工作時不會自動補充敏感信號表。如果缺少信號,則無法觸發(fā)和該信號相關(guān)的仿真進程,也就得不到正確的仿真結(jié)果。這里以一個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譯碼器仿真圖

如果想用一個敏感信號來控制邏輯變化,比如當(dāng)enable信號的電平發(fā)生變化時,再去譯碼,程序如下,仿真圖如圖4所示。

圖4 敏感信號只有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)自動將所有的輸入作為了敏感信號。

因此,在應(yīng)用always塊語句表述組合邏輯電路時,一定要注意敏感信號的完整性,要求觸發(fā)為所有內(nèi)部用到的信號,可以用always@(*),此時,綜合工具和仿真工具會自動將所有的敏感信號自動加入敏感信號列表。

前面已經(jīng)提到過always敏感信號不可以同時包括同一個信號的上升沿和下降沿,這兩個事件可以合并為一個電平敏感事件。在設(shè)計中,一些初學(xué)的設(shè)計者經(jīng)常在時鐘的上升沿和下降沿都進行計數(shù)器加1,以為這樣能實現(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 直接計數(shù)倍頻仿真波形

從圖5中可以發(fā)現(xiàn)并沒有出現(xiàn)想要的結(jié)果,而是呈現(xiàn)出了高阻態(tài)。將直接加1運算改為直接的賦值語句,程序如下,仿真結(jié)果如圖6所示。

從圖6中可以看出,cnt8這個變量存儲的是最后一次賦值,這時當(dāng)always敏感信號為電平信號,系統(tǒng)默認(rèn)為組合邏輯電路,雖然將信號定義為reg 型,但只是為了滿足always 模塊中的信號必須定義為reg 型的語法要求,最終的實現(xiàn)結(jié)果中并沒有寄存器,在圖5中出現(xiàn)高阻態(tài),因為cnt8=cnt8+1是計數(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é) 論

本文對Verilog語言中always塊語句中的敏感信號進行了對比探討,得到如下結(jié)論:

(1) 如果敏感信號是時鐘邊沿觸發(fā)信號,表示的是時序邏輯電路,而且在描述時序電路的always塊中的reg型信號都會被綜合成寄存器,而且時序邏輯的敏感信號列表只需要加入所用的時鐘觸發(fā)沿即可。

(2) 如果敏感信號是電平觸發(fā)信號,表示的是組合邏輯電路,這里一定要注意敏感信號的完整性,即所有的輸入和判斷語句的信號都要加為敏感信號,否則,得不到想要的設(shè)計結(jié)果。

(3) 在組合邏輯電路描述中,將信號定義為reg型,只是為了滿足always模塊中的信號必須定義為reg 型的語法要求,最終實現(xiàn)結(jié)果中并沒有寄存器。

參考文獻

[1] PALNITTKAR S.Verilog HDL數(shù)字設(shè)計與綜合[M].夏宇聞,胡燕祥,刁嵐松,譯.2版.北京:電子工業(yè)出版社,2009.

[2] 孫繼榮,李志蜀,王莉,等.程序切片技術(shù)在軟件測試中的應(yīng)用[J].計算機應(yīng)用研究,2007,24(5):210?213.

[3] 寧佐林,邱智亮.PCI橋接IP Core的Verilog HDL實現(xiàn)[J].電子科技,2006,19(4):43?46.

[4] 趙東,耿衛(wèi)東,吳春亞,等.用FPGA實現(xiàn)OLED灰度級顯示[J].光電子[?]激光,2002,13(6):554?558.

[5] 羅杰.Verilog HDL與數(shù)字ASIC設(shè)計基礎(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è)計教程[M].北京:北京航空航天大學(xué)出版社,2003.

汨罗市| 洱源县| 胶州市| 承德市| 台南市| 岳普湖县| 和硕县| 冀州市| 饶平县| 峨眉山市| 潜山县| 眉山市| 裕民县| 七台河市| 凤凰县| 长葛市| 九江县| 松原市| 北宁市| 星座| 渭源县| 墨竹工卡县| 华池县| 柳州市| 涡阳县| 台江县| 梅河口市| 萨迦县| 丰县| 聂荣县| 淮安市| 三江| 绥化市| 酒泉市| 鄯善县| 龙泉市| 江安县| 大化| 双桥区| 永州市| 佛山市|