計算機語言 語法詳細講解_第1頁
計算機語言 語法詳細講解_第2頁
計算機語言 語法詳細講解_第3頁
計算機語言 語法詳細講解_第4頁
計算機語言 語法詳細講解_第5頁
已閱讀5頁,還剩115頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

語法詳細講解

強制激勵

.?■在一個過程塊中,可以用兩種不同的方式對信號變量或表達式進

.?行連續(xù)賦值。

■過程連續(xù)賦值往往是不可以綜合的,通常用在測試模塊中。

-兩種方式都有各自配套的命令來停止賦值過程。

一?■兩種不同方式均不允許賦值語句間的時間控制。

■assign和deassign適用于對寄存器類型的信號(例如:RTL級上

:的節(jié)點或測試模塊中在多個地方被賦值的信號)進行賦值。

I.initialbegin

I.#10assigntop.dut.fsml.statereg='initstate;

語法詳細講解

強制激勵

#20deassigntop.dut.fsml.statereg;

?end

?■force和release用于寄存器類型和網(wǎng)絡(luò)連接類型(例如:門級掃

?描寄存器的輸出)的強制賦值,強制改寫其它地方的賦值。

.initialbegin

.#10forcetop.dut.counter.scanreg.q=0;

#20releasetop.dut.counter.scanreg.q;

?end

?在以上兩個例子中,在10到20這個時間段內(nèi),網(wǎng)絡(luò)或寄存器類型

?的信號被強制賦值,而別處對該變量的賦值均無效。

.fbrce的賦值優(yōu)先級高于assign。

如果先使用assign,再使用force對同一信號賦值,則信號的值

為force所賦的值,

語法詳細講解

強制激勵

當(dāng)執(zhí)行release后,則信號的值為assign所賦的值。

如果用force對同一個信號賦了幾次值,再執(zhí)行release,則

所有賦的值均不再存在。

可以對信號的某(確定)位、某些(確定)位或拼接的

信號,使用force和release賦值;但不能對信號的可變位使

用force和release來賦值。

不能對寄存器類型的信號某位或某些位使用assign和

deassign來賦值。

.語法詳細講解

?建立時鐘

?------------------

.雖然有時在設(shè)計中會包含時鐘,但時鐘通常用在測試模塊中。下面

?三個例子分別說明如何在門級和行為級建立不同波形的時鐘模型。

?[例1]簡單的對稱方波時鐘:

reggo;wireelk;

〃.regelk;

nand#(period/2)ul(elk,elk,go);

.alwaysbegin

initialbegin

,?#period/2clk=O;

go=0;

?#period/2clk=l;

#(period/2)go=l;

一?enjd

end

注:在有些仿真器中,如果設(shè)計所用的時鐘是由與其相同抽象級別的時鐘

模型產(chǎn)生的,則仿真器的性能就能得到提高。

語法詳細講解

建立時鐘

..[例2]簡單的帶延遲的對稱方波時鐘:

regelk;

reggo;wireelk;

initialbegin

nand#(period/2)ul(elk,elk,go);

*clk=0;

initialbegin

#(period)

go=0;

forever

#(period)go=l;

#(period/2)clk=!clk

end

end

?注:這兩個時鐘模型有些不同,行為描述的模型延遲期間一直是低電平,

而門級描述的模型開始延遲有半個周期是不確定的。

語法詳細講解

建立時鐘

.?[例3].帶延遲、頭一個脈沖不規(guī)則的、占空比不為1的時鐘:

?regelk;

initialbeginreggo;wireelk;

#(period+l)clk=l;nand#(3*period/4,period/4)

ul(clk,clk,go);

#(period/2-l)

initialbegin

foreverbegin

#(period/4+l)go=0;

#(period/4)clk=0;

#(5*period/4-l)go=l;

#(3*period/4)clk=l;

end

end

注:這兩個時鐘模型也有些不同,行為描述的模型一開始就有確定的

電平,而門級描述的模型有延遲開始時電平是不確定的。

語法詳細講解

怎樣使用任務(wù)

..moculebusctrltb

..reg[7:0]data;

?regdatavalid,datard;

?cpuul(data_valid,data,data_rd);

r?initialbegin

?cpu_driver(8'bOOOO_OOOO);

,cpu_driver(8'bl010」010);

*cpu_driver(87b01010101);

end一

taskcpudriver;

語法詳細講解

怎樣使用任務(wù)

input[7:0]datain;

begin

#30data_valid=l;

wait(data_rd==1);

#20data=datain;

wait(data口5?

#20data=8'hzz;

#30datavalid=O;

end

endtask

語法詳細講解

存儲建模

?目標(biāo)

:■學(xué)會使用Verilog進行存儲建模。

(?■學(xué)會在Verilog中進行雙向口建模。

語法詳細講解

,存儲設(shè)備建模

,存儲設(shè)備建模必須注意以下兩個方面的問題:

.,■聲明存儲容量的大小。

?提供對內(nèi)容的訪問權(quán)限,例如:

9——只讀

,——讀寫

D——同步讀寫

.——多次讀,同時進行一次寫

——多次同步讀寫,同時提供一些方法保證一致性

語法詳細講解

簡單ROM建模

rnyrom.vmy_rom_data

'timescaleIns/lOps

modulemyrom(read_data,addr,readen);

inputread_en_;。。口

input[3:0]addr;1101

output[3:0]readdata;0010

reg[3:0]readdata;0011

reg[3:0]mem[0:15];1111

initial1000

$readmemb("myromdata”,mem);1001

always@(addrorreadenj1000

0001

if(!read_en_)ROM的數(shù)據(jù)存儲在另外

1101

的——個獨立的文件中

read_data=mem[addr];1010

endmodule0001

1101

語法詳細講解

簡單ROM建模

上面所示的ROM模型中使用二維的存儲寄存器來定義存儲容量。

ROM中的數(shù)據(jù)保存在一個獨立的文件中,如上面的右邊所示。這是

一種保存ROM數(shù)據(jù)的通用的方法,它可以使數(shù)據(jù)和ROM模型分開。

語法詳細講解

簡單RAM建模

.'timescaleIns/lns

modulemymem(data,addr,read,write);

?inout[3:0]data;

.inout[3:0]addr;

inputread,write;

?reg[3:0]memory[0:15];//4bits,16words

.//read

assigndata=read?memory[addr]:4'bz;

―//write

?always@(posedgewrite)

.memory[addr]=data;

endmodule

?RAM模型比ROM模型稍微復(fù)雜,因為它必須具有讀寫能力,而進行讀寫時

?通常使用相同的數(shù)據(jù)總線,這就需要新技術(shù)來處理雙向總線。當(dāng)讀出口沒

>有被激活時,RAM模型不再激勵總線,如果此時的總線寫入變量也沒有被激

活,則總線進入高阻狀態(tài),這就避免了RAM中的讀寫競爭。

語法詳細講解

簡單RAM建模

上述模型是可綜合的,但是許多工具只產(chǎn)生一系列的寄存器,這一般

就需要更大的空間,從而比實際的存儲器的價格更昂貴。

語法詳細講解

容量可變的存儲器建模

L.例:

.modulescalable_ROM(mem_word,address);

.parameteraddr_bits=8;//sizeofaddressbus

parameterwordsize=8;//widthofaword

?parameterwords=(l?addr_bits);//sizeofmem

.output[wordsize:1]memword;//wordofmemory

.input[addr_bits:1]address;//addressbus

?reg[wordsize:1]mem[0:words-l];//memdeclaration

//outputonewordofmemory

wire[wordsize:1]mem_word=mem[address];

''endmodule

語法詳細講解

?容量可變的存儲器建模

■-------------------------

.?上述的例子演示了怎樣通過設(shè)置字長和地址位數(shù)來定義一個只讀

.存儲設(shè)備。

在上例中,存儲字的范圍從0開始的,而不是從1開始,這是因為

內(nèi)存是直接通過地址線定位的,同樣地,也可以用下面的方法來

定義內(nèi)存和定位:

reg[wordsize:1]mem[1:words];//memorystartsatword1

.//addressmustbeincrementedtoaddressallwordsinmemory

.wire[wordsize:1]mem_word=mem[address+1];

語法詳細講解

載入存儲設(shè)備

可以通過使用一個循環(huán)或系統(tǒng)任務(wù)來載入存有數(shù)據(jù)的整個存儲

器。

■使用循環(huán)把值賦給存儲數(shù)組。

for(i=0;i<memsize;i=i+i)//initializememory

mema[i]={wordsize{1'b1}};

■調(diào)用$readmem系統(tǒng)任務(wù)。

//loadmemorydataformafile

$readmembCtmem_file.txt,,,mem);

語法詳細講解

怎樣使用雙向口

.?使用inout關(guān)鍵字聲明雙向口。

.inout[7:0]databus;

,使用雙向口需要遵循下面的規(guī)則:

>-一個inout口只能聲明為網(wǎng)絡(luò)類型,而不能是寄存器類型的。

?因此仿真器能確定多個激勵源的最終值。

.■在設(shè)計中,每次只能激活inout的一個方向。

.——例如:當(dāng)使用總線讀RAM中的數(shù)據(jù)時,同時又向RAM模

?型的雙向數(shù)據(jù)總線寫數(shù)據(jù),就會產(chǎn)生邏輯競爭,導(dǎo)致總

?線脫離。

■——必須為inout口設(shè)計控制邏輯,用來保證正確的操作。

語法詳細講解

怎樣使用雙向口

注:

,?■可以聲明一個inout口,用來輸入或輸出數(shù)據(jù)。inout口默認為網(wǎng)絡(luò)

.類型,不可以對網(wǎng)絡(luò)類型的數(shù)據(jù)進行過程賦值,但可以在過程塊

,外對寄存器數(shù)據(jù)類型進行連續(xù)賦值,或者把它與元器件相連。

■必須為inout口設(shè)計控制邏輯,用來保證正確的操作。當(dāng)把inout口

?做為輸入口時,必須使輸出邏輯失效。

,?

語法詳細講解

雙向口建模

使用元器件

語法詳細講解

雙向口建模

.?注:在上頁的例子中,使用了en_a_b和en_b_a來控制元器件bufifl,如

.果進行同時控制,則得不到赫麗的結(jié)桌「

語法詳細講解

雙向口建模

使用連續(xù)賦值

ba

(busa,busb,ena_b,enba);

inoutbusa,busb;當(dāng)ena_b二1時,bus_a的

值傳到bus_b上

inputen_ab,enba;

assignbus_b=en_a_b?bus_a:'bz;

assignbus_a=en_b_a?bus_b:'bz;

當(dāng)enba=1時,busb的

〃結(jié)構(gòu)模塊邏輯

值傳到bus_a上

endmodule

語法詳細講解

雙向口建模

注:在assign語句中,通過en_a_b和en_b_a控制busa與busb之間

的數(shù)據(jù)交換。——————

如果進行同時控制,則得不到預(yù)期的結(jié)果。

語法詳細講解

雙向口建模

存儲口建模

測試模塊

數(shù)據(jù)

wr

moduleramcel1(databus,rd.wr);當(dāng)rd等于1時

inoutdatabus;datareg的值被賦

inputrd,wr;給databus

regdatareg;

assigndatabus=rd?datareg:?bz;

當(dāng)wr的下降沿到

always@(negedgesr)

達時,databus的值

datareg<=databus;---------

被寫入datareg

endmodule

語法詳細講解

雙向口建模

注:上頁存儲單元在wr的下降沿到達時存入數(shù)據(jù)。上頁模塊在wr

處于高電平時,通過數(shù)據(jù)總線寫入數(shù)據(jù),但必須保證wr的高電

平維持時間長于數(shù)據(jù)的寫入時間。

在rd處于高電平時,上述存儲單元通過數(shù)據(jù)總線讀出數(shù)據(jù)。由

于此模型為單口存儲模型,因此wr和rd不能同時為高電平,否

則就得不到預(yù)期的結(jié)果。

語法詳細講解

f第十七部分Verilog中的高級結(jié)構(gòu)

,目標(biāo)

,■學(xué)會怎樣定義或調(diào)用任務(wù)和函數(shù)。

■學(xué)會怎樣使用命名塊。

..■學(xué)會怎樣使命名塊和任務(wù)失效。

.■熟悉有限狀態(tài)機及怎樣進行有限狀態(tài)機顯式建模。

語法詳細講解

第十七部分Verilog中的高級結(jié)構(gòu)

可以通過把代碼分成小的模塊或者使用任務(wù)和函數(shù),來把一項任務(wù)

分成許多較小的、易于管理的部分,從而提高代碼的重用性。

■任務(wù)

一般用于執(zhí)行調(diào)試操作,或者行為的描述硬件

可以包含時間控制(#delays,@,wait)

可以包含input,output和inout參藪

可以調(diào)用其他的任務(wù)或函數(shù)

■函[

一般用于計算,或者用來代替組合邏輯

不能包含任何延遲;函數(shù)在零時間執(zhí)行

只能使用input參數(shù),但可以通過函數(shù)名來返回一個值。

可以調(diào)用其他的函數(shù),但不可以調(diào)用任務(wù)

語法詳細講解

f第十七部分Verilog中的高級結(jié)構(gòu)

,注:

.■必須在模塊內(nèi)調(diào)用任務(wù)和函數(shù)。

:■在任務(wù)和函數(shù)中不能聲明連線類型的變量。

4■所有的輸入和輸出都是真正的本地寄存器類型的數(shù)據(jù)

o

'?'只有當(dāng)任務(wù)或函數(shù)調(diào)用并執(zhí)行完后,才能有返回值。

?例如:當(dāng)任務(wù)或函數(shù)中包含一個forever循環(huán)時,就不

?可能有返回值。

語法詳細講解

Verilog任務(wù)

下面的任務(wù)含有時間控制和一個輸入,并且指向一個模塊變量

,但是不包含輸出、總線和內(nèi)部變量,不顯示任何內(nèi)容。

時間控制中使用的信號(例如elk)不必是任務(wù)的輸入,這是因

為輸入值只向任務(wù)內(nèi)部傳遞一次。

moduletop;

regelk,a,b;

DUTul(out,a,b,elk);

always#5clk=!clk;

tasknegclocks;

input[31:0]numberofledges;

repeat(numberof^edges)

語法詳細講解

Verilog任務(wù)

@(negedgeelk);

endtask

initialbegin

clk=0;a=l;b=l;

neg_clocks(3);〃任務(wù)調(diào)用

a=0;

negclocks(5);

b=0;

end

endmodule

.主要特征:

?■任務(wù)調(diào)用是通過在Verilog模塊中寫入任務(wù)名來實現(xiàn)的。

?■任務(wù)中可以包含input,output和inout參數(shù)。

?語法詳細講解

SVeriIog任務(wù)

--傳遞給任務(wù)的參數(shù)與任務(wù)i/。聲明參數(shù)的順序相同。雖然傳遞給

’任務(wù)的參數(shù)名可以和任務(wù)內(nèi)部I/O聲明的參數(shù)名相同,但是為了

?提高任務(wù)的模塊化程度,傳遞給任務(wù)的參數(shù)名通常是唯一的,

.而不使用與任務(wù)內(nèi)部I/O聲明的參數(shù)名相同的參數(shù)名。

_■在任務(wù)中可以使用時間控制。

,?■在Verilog中,任務(wù)定義了一個新的范圍。

.■使用關(guān)鍵字disable禁止任務(wù)。

注意:不要在程序的不同部分同時調(diào)用同一個任務(wù)。這是因為任

?務(wù)只有一組本地變量,同時調(diào)用兩次將會導(dǎo)致錯誤。這種情況

..通常發(fā)生在使用時間控制的任務(wù)中。

在任務(wù)或函數(shù)中,應(yīng)給在父模塊中聲明的變量加注釋。若在其

.它模塊中調(diào)用任務(wù)或函數(shù),任務(wù)和函數(shù)中所使用的變量必須包

含在輸入/輸出口列表中。

語法詳細講解

Verilog任務(wù)

F面模塊中的任務(wù)含有一個雙口總線和一個內(nèi)部變量,但是沒有輸入、

輸出和定時控制,沒有引用本模塊的變量,不顯示任何內(nèi)容。

在任務(wù)調(diào)用時,任務(wù)參數(shù)(口)類型被視為內(nèi)部寄存器類型。

parameterMAX_BITS=8;

reg[MAXBITS:1]D;

taskreverse_bits;

inout[7?0]data;〃雙口總線被視為寄存器類型!

integerK;

for(k=0;k<MAX_BITS;K=K+1)

reverse_bits[MAXBITS-(K+l)=data[K];

endtask

always@(posedgeelk)

reversebits(D);

語法詳細講解

Verilog任務(wù)

F面模塊中的任務(wù)含有輸入、輸出、時間控制和一個內(nèi)部變量,

并且引用了一個本模塊的變量,但是沒有輸出,不顯示任何內(nèi)容。

任務(wù)調(diào)用時的參數(shù)順序應(yīng)與任務(wù)定義中聲明的順序相同。

modulemult(clk,a,b,out,enmult);

inputelk,enmult;

input[3:0]a,b;

output[7:0]out;

reg[15:0]out;

always@(posedgeelk)

multme(a,b,out);〃任務(wù)調(diào)用

語法詳細講解

Verilog任務(wù)

taskmuotme;〃任務(wù)定義

input[3:0]xme,tome;

output[7:0]result;

wait(en_mult)

result=xme*tome;

endtask

endmodule

語法詳細講解

VeriIog函數(shù)

$moduleorand(a,b,c,d,e,out);

input[7:0]a,b,c,d,e;

?output[7:0]out;

.reg[7:0]out;

always@(aorborcordore)

*out=f^or_and(a,b,c,d,e);〃函數(shù)調(diào)用

function[7:0]f^orand;

input[7:0]a,b,c,d,e;

if(e==l)

f^or_and=(a|b)&(c|d);

else

f^or_and=0;

endfunction

endmodule

語法詳細講解

VeriIog函數(shù)

雖然函數(shù)不能包含定時控制,但是可以在包含定時控制的過程

塊中調(diào)用函數(shù)。

?在上述函數(shù)中使用了函數(shù)名Lojand作為寄存器類型的變量。

,

要點

■■八函數(shù)定義不能包含定時控制語句。

■?■函數(shù)必須含有輸出,但不能含有輸出和總線口;

?-一個函數(shù)只能返回一個值,該值的變量名與函數(shù)同名,數(shù)據(jù)類

.型默認為reg類型。

■傳遞給函數(shù)參數(shù)的順序與函數(shù)輸入?yún)?shù)聲明的順序相同。

?-函數(shù)定義必須包含在模塊定義之內(nèi)。

??函數(shù)不能調(diào)用任務(wù),但任務(wù)可以調(diào)用函數(shù)。

.■函數(shù)使Verilog有更廣闊的適用范圍。

語法詳細講解

VeriIog函數(shù)

-雖然函數(shù)只能返回一個值,但是它們的返回值可以直接的賦給

一個信號拼接,從而使它們有多個輸出。

{ol,o2,o3,o4}=f^or_and(a,b,c,d,e);

語法詳細講解

命名塊

■可以通過在關(guān)鍵字begin或fork后加上:〈塊名〉來給塊命名。

modulenamedblk;

begin:seq_blk

end

fork:parblk

join

endmodule

■可以在命名塊中聲明本地變量。

■可以使用disable禁止命名塊。

語法詳細講解

命名塊

汪思:

■命名塊使Verilog有更廣闊的適用范圍。

-命名塊的使用縮短了仿真的時間。

語法詳細講解

禁止命名塊和任務(wù)

moduledo_arith(out,a,b,c,d,e,elk,en_mult);

'.inputelk,enmult;

,input[7:0]a,b,c,d,e;

output[15:0]out;

reg[14:0]out;

.always@(posedgeelk)

begin:arithblock〃***命名塊***

?reg[3:0]tmpl,tmp2;//***本如變量***

.{tmp,tmp2}=^or_and(a,b,c,d,e);//函數(shù)調(diào)用

”if(en_mult)multme(tmp1,tmp2,out);〃任務(wù)調(diào)用

>?end

always@(negedgeenmult)begin〃停止計算

disablemultme;〃***禁止任務(wù)的執(zhí)行***

diablearithblock;//***禁it命名塊的執(zhí)行***

end

〃在此定義任務(wù)和函數(shù)

endmodle

語法詳細講解

禁止命名塊和任務(wù)

注意:

-disable語句用來終止命名塊或任務(wù)的執(zhí)行,因此可以在執(zhí)行所

有的語句前,就能從命名塊或任務(wù)的執(zhí)行中返回。

語法:

disable〈塊名〉

disable〈任務(wù)名〉

-禁止執(zhí)行命名塊或任務(wù)后,所有在事件隊列中安排的事件都將

被刪除。

■在綜合中一般不支持disable語句。

在上頁的例子中,只禁止命名塊也可以得到預(yù)期的結(jié)果:命名塊

中所有的事件、任務(wù)和函數(shù)的執(zhí)行都將被取消。

語法詳細講解

有限狀態(tài)機(FSM)

,

.隱式FSM:

■不需要狀態(tài)寄存器

?■仿真更加有效

?■只露很好的處理線形狀態(tài)改變

語法詳細講解

有限狀態(tài)機(FSM)

顯式FSM:

■結(jié)構(gòu)更加復(fù)雜

-可以很方便的用來處理默認狀態(tài)

■能夠處理復(fù)雜的狀態(tài)改變

-所有的綜合工具均支持顯式FSM

stateA

語法詳細講解

有限狀態(tài)機(FSMs)

注意:

在隱式FSMs中,無論什么時候在一個時鐘周期內(nèi)寫數(shù)據(jù)和在

在另一個時鐘周期內(nèi)讀數(shù)據(jù),都會創(chuàng)建寄存器。

所有的FSMs都必須能復(fù)位,狀態(tài)改變必須與一個單一的時鐘

信號同步。

■一般的,如果狀態(tài)改變比較簡單,又定義的比較好,而且綜合

工具支持隱式狀態(tài)機,就可以使用隱式類型。如果狀態(tài)改變比

較復(fù)雜,最好使用顯式類型,這樣會更加有效。

隱式狀態(tài)機應(yīng)屬于行為級,而不應(yīng)屬于RTL級,代碼中主要包

含循環(huán)、嵌入的定時控制,有時也含有命名事件、wait和

disable語句。因此,綜合中一般不支持隱式機。

語法詳細講解

VeriIog函數(shù)

要返回一個矢量值(超過一個位寬),可以在函數(shù)名前聲明變

量的位寬。在函數(shù)中,將語句放在begin和end塊中。

在函數(shù)中無論多少次對函數(shù)名進行賦值,值只返回一次。下面

的函數(shù)中聲明了一個內(nèi)部整型變量。

modulefoo;

input[7:0]loo;

output[7:0]goo;

〃可以從連續(xù)賦值中調(diào)用函數(shù)

wire[7:0]goo=zero_count(loo);

function[3:0]zerocount;

input[7:0]inbus;

語法詳細講解

VeriIog函數(shù)

integerI;

begin

zero_count=0;

fbr(I=O;I<8;1=1+1)

if(!in__bus[I])

zerocount=zerocount+1;

end

endfunction

endmodule

語法詳細講解

VeriIog函數(shù)

可以聲明函數(shù)的返回值的類型為integer、real或time,可以在

任何表達式中調(diào)用函數(shù)。

modulechecksub(neg,in_a,in_b);

outputneg;

regneg;

functioninteger_subtr;

input[7:0]in_a,in_b;

subtr=in_a-in_b;〃結(jié)果可能是負數(shù)

endfunction

always@(aorb)

if^subtr(a,b)<0)

neg=l;

elseneg=0;

endmodule

語法詳細講解

VeriIog函數(shù)

可以給返回變量的每一位賦值,還可以參數(shù)化函數(shù)的大小、函

數(shù)口、甚至函數(shù)的行為。

parameterMAX_BITS=8;

reg[MAXBITS:!!D;

function[MAXBITS:1]reverse_bits;

input[7:0]data;

integerK;

fdr(K=0;K<MAX_BITS;K=K+1)

reversebits[MAX_BITS-(K+1)]=data[K];

endfunction

always@(posedgeelk)

D=reverse_bits(D);

語法詳細講解

顯式有限狀態(tài)機

moduleexp(out,datain,elk,rst);

inputelk,rst,datain;

outputout;regout;

retstate;-------------狀態(tài)變量

always@(pasedgeelkorposedgerst)datain

if(rst){state,out}=2'b00;

else

case(state)--------case語句

rbO:begin

out=rbO;

if(!datain)state=rbO;

elsestate=rbl;

end

rblbegin

語法詳細講解

顯式有限狀態(tài)機

.out=datain;

statesTbO;<-----------轉(zhuǎn)到下一個狀態(tài)

,end

?default:{state,out)=2^00;----------默認狀態(tài)指針

1elkrst

..endcase

dendmodule口-

??識別ii序歹!—kout

注:

,?■可以在過程塊中使用一個單一的時鐘沿和一個case語句來描述

[.一個顯式狀態(tài)機。

’.-必須規(guī)定一個狀態(tài)變量,用來定義狀態(tài)機的狀態(tài)。

,?"要改變當(dāng)前的狀態(tài),必須改變狀態(tài)變量的值,狀態(tài)變量的值的

?改變要與時鐘沿同步。

,.-最好為通常不會發(fā)生的狀態(tài)規(guī)定默認動作。

語法詳細講解

隱式有限狀態(tài)機

-?moduleimp(out,datain,elk,rst);datain=0

,outputout;regout;

一.inputelk,datain,rst;

.always@(rst)〃協(xié)同復(fù)位方法

.if(rst)assingout=l'bO;datain

else

|.begin

deassignout;

disableseq_block;〃返回到初始狀態(tài)

end

always@(posedgeelk)

語法詳細講解

隱式有限狀態(tài)機

begin:seq_block

out=rbO;

if(!datain)〃狀態(tài)一:輸出零

disableseq_block;

@(posedgeelk)〃狀態(tài)二:輸出第二位

out=datain;

end

endmodule

kr

THUZHoM-識別ii序列°ut

語法詳細講解

Q隱式有限狀態(tài)機

,?注意:

?一可以在過程塊使用多個時鐘沿(一個狀態(tài)一個)、條件語句、循

一.環(huán)語句、disable語句來描述隱式FSM。

L."不必定義一個狀態(tài)變量。

"若沒有強制狀態(tài)重復(fù)(例如:在循環(huán)語句或disable語句中強制狀

|態(tài)重復(fù)),當(dāng)下一個激活時鐘沿到達時,狀態(tài)改變。下一個裝態(tài)

f將由條件語句決定。

?口在隱式狀態(tài)機中,很難規(guī)定一個默認動作。

語法詳細講解

第十八部分用戶定義的原語

目標(biāo)

-學(xué)會怎樣創(chuàng)建邏輯使用的用戶定義的原語。

■用戶定義的原語(UDP)的行為與嵌入的Verilog原器

件相似,可以用一個表格來定義它的功能。

語法詳細講解

什么是UDP?

在Verilog結(jié)構(gòu)模型中,可以使用:

-二十多個門級原器件。

■用戶定義的原語。

UDP可用于ASIC庫單元設(shè)計和小規(guī)模芯片和中規(guī)模芯片設(shè)計。

-可以使用UDP擴大預(yù)定義原器件的范圍。

-UDP是自包含的,不能調(diào)用其他的模塊。

■UDP既可以用來代替時序邏輯元件,也可以代替組合邏輯元件。

■使用真值表來描述UDP的行為。

?

調(diào)用UDP的方式與調(diào)用嵌入的原器件的方式相同。

語法詳細講解

什么是UDP?

-UDP是一種很好的代替邏輯方式。

■在嵌入原器件中,輸入中包含的x不能在輸出時自動

轉(zhuǎn)變成x,而在UDP中則不會出現(xiàn)此種情況。

-UDP可以代替許多原器件邏輯。另外,UDP的仿真時

間和內(nèi)存需要大大低于運行分立原器件。如果仿真工

具合適,相同邏輯的行為模型甚至可以更快。

?語法詳細講解

?特征

??UDP只能有一個輸出端,而且必須是端口的說明列表

■的第一項。

■"UDP可以有多個輸入端,最多允許有10個。

?-UDP所有端口變量必須是標(biāo)量,不允許使用雙向端口。

■-UDP不支持Z邏輯值。

?■在仿真的開始,UDP的輸出可以使用initial語句初始

?化為一個已知值。

,■UDP不能被綜合。

?語法詳細講解

?特征

?注:

??UDP只能有一個輸出。如果設(shè)計時的輸出多于一個,則需要把其

.它的原器件連接到UDP輸出,或同時使用多個UDP。

-UDP輸入端最多可以有10個,但是當(dāng)輸入的個數(shù)多于5個時,

?內(nèi)存的需要將大大的增加。下頁表列出了輸入數(shù)目不同時,每個

一輸入所需要的內(nèi)存。

語法詳細講解

特征

#輸入內(nèi)存

1-5<1

65

717

856

9187

10623

語法詳細講解

示例

■注:

.-在模塊外定義UDP。

.?如果在表中沒有規(guī)定輸入組合,將輸出X。

-表的列中元素的順序應(yīng)與端口列表中的一致。

??表中的?的意義是:重復(fù)的輸入0,1或x;邏輯值。

?-表中開始兩行表示:當(dāng)s等于1時,不管b如何取值,輸出。將與輸入a

保持一■致。

.表中的下兩行表示:當(dāng)s等于。時,不管a如何取值,輸出。將與輸入b

?保持一致。

?表中的最后兩行使此器件更加的全面、準確。它們表示:當(dāng)輸入a和b

■的邏輯值相同時,如果sei等于x,則輸出o的值將與輸入a和b的值相

.同。這種行為不能使用Verilog嵌入原器件進行建模。UDP將x作為實際

的未知值,而不是Verilog值來進行處理,使其比嵌入原器件更加準確。

語法詳細講解

組合示例:全加器

可以僅使用兩個UDP設(shè)計全加器。

.〃全加器進位實現(xiàn)部分

primitiveU_ADDR2_C(C0,A,B,CI);

outputCO;

inputA,B,CI,

B?c

L

table//八11C?I1

--?

1911夕

-i?

?-11xe

1-?

o?o夕

O、

O夕

o7or

?6Oo

endtalbe

?endprimitive

*

.

語法詳細講解

組合示例:全加器

〃全加器求和實現(xiàn)部分

.primitiveU_ADDR2_S(S,A,B,CI);

outputS;

inputA,B,CI;

'?table//B

noo

M

O

o11

11

1o1

11

11

11

1oo1

11

1o1

11

11oc

11(>)

111

1111

endtable

.endprimitive

語法詳細講解

組合邏輯示例:全加器

?若使用UDP設(shè)計全加器,僅需要兩個UDP;而使用Verilog嵌入

.原器件,則需要5個Verilog嵌入原器件。

.?大量使用全加器時,這將大大減少內(nèi)存的需要。

-事件的數(shù)目將大大降低。

■?代表0,1或X。

語法詳細講解

級觸發(fā)時序邏輯示例:鎖存器

primitivelatch(q,clock,data);

outputq;注意此寄存器的用法,

*regq;---------此寄存器用來存儲。

.inputclock,data;

initialq=l'bl;<輸出初始化為

table1'bl.

.//clockdatacurrentnext

.//statestate

?01:?1;

?00:?0;

.1?::

endtable

?endprimitive

?表示無須考慮輸入

和當(dāng)前狀態(tài)的值

語法詳細講解

級觸發(fā)時序邏輯示例:鎖存器

注:

.?-鎖存器的動作行為如下:

一?當(dāng)時鐘信號為0時,輸入數(shù)據(jù)的值直接傳給輸出。

當(dāng)時鐘信號為1時,輸出保持當(dāng)前狀態(tài)不變。

?nextstate欄中的表示輸出保持不變。

:.?輸出必須定義為寄存器類型,用來保存前一個狀態(tài)。

|-initialq=l,bl;是時序UDP的初始化語句。使用此語句可以在仿

真的開始對輸出進行賦值。

?在實際的部件模型中,很少使用初始賦值。但在測試UDP的功能

?時,初始賦值相當(dāng)有用。

語法詳細講解

邊沿敏感的時序邏輯示例:D觸發(fā)器

-?primitivededgeff(q,elk,data);

..outputq;

一.inputelk,data;

-regq;

.table//elkdatstatenext

(01)0:?:0;

H(Ox)1:1:1;

(Ox)0:0:0;

(xl)0:0:0;

(xl)1:1:1;

語法詳細講解

邊沿敏感的時序邏輯示例:D觸發(fā)器

.一//忽略時鐘的下降沿

.,(?0)

(1X)?:?:-;

,.//忽略時鐘穩(wěn)定時的數(shù)據(jù)改變

.endtable

.endprimitive

口在大多數(shù)情況下,可以在任何表入口語句中規(guī)定一個輸入過渡。

如果規(guī)定了任何輸入過渡,則必須規(guī)定所有輸入的所有過渡。

語法詳細講解

第十九部分Verilog綜合建模類型

?建模類型概述

在任何時候,如果輸出直接由當(dāng)前的輸入組合決定,則此邏輯為

組合邏輯。

如果邏輯中具有記憶功能,則此邏輯為時序邏輯。在任何給定的

時刻,如果輸出不能由輸入的狀態(tài)確定,則此邏輯具有記憶功能。

語法詳細講解

不受支持的Verilc結(jié)構(gòu)

綜合工具一般不支持下面的Verilog結(jié)構(gòu):

.initial

一?一些循環(huán)語句:

.repeat

|.forever

while

F*for的非結(jié)構(gòu)用法

:一些數(shù)據(jù)類型

event

real

time

語法詳細講解

不受支持的Verilc結(jié)構(gòu)

.?UDPs

■fork...join

.wait

過程連續(xù)賦值語句

.assign和deassign

force和release

,一一些操作符

語法詳細講解

過程塊

■兩個邊沿的任一個

過程塊到達所有輸入信號的任一個邊沿產(chǎn)生組合邏輯。此塊稱為

組合塊。

always@(aorb)〃實現(xiàn)與門

y=a&b;

■單個邊沿

過程塊到達控制信號的單個邊沿(下降沿或上升沿)產(chǎn)生同步邏

輯。此塊稱為同步塊。

always@(posedgeelk)〃實現(xiàn)D觸發(fā)器

q<=d;

語法詳細講解

Q過程塊

同步塊也可能對異步復(fù)位信號的改變敏感。

>always@(posedgeelkornegedgerst_)

if(!rst_)

q<=0;

.else

-qv=d;

--語法詳細講解

?過程塊中寄存器類型的信號變量

.?當(dāng)在同步塊中使用reg類型的信號變量時:

?如果此信號變量在一個時鐘周期中被附值,而在另一個時鐘周期

.中創(chuàng)建了其實例,則此信號變量僅作為硬件寄存器使用。

\如果此信號變量也是基本輸出,則其將顯示在綜合列表中,但不

一定是硬件寄存器。

?,否則,信號可以被優(yōu)化掉。

?當(dāng)在組合塊中使用reg類型的信號變量時:

??如果當(dāng)塊的任何輸入的值改變時,此信號變量的值也隨之改變,

?則此信號變量在綜合輸出中并不屬于硬件寄存器。

-如果當(dāng)塊的任何輸入的值改變時,此信號變量的值并一定改變,

一則此信號變量在綜合輸出中屬于鎖存器。

語法詳細講解

奇C±zi存T-肅□□

同步寄存器示例

..在下面的例子中,rega僅用作臨時存儲器,因此它被優(yōu)化掉。

moduleexlreg(d,elk,q);

inputd,elk;

.?outputq;

.regq,rega;

always@(posedgeelk)

begin

??rega=0;

|.if(d)rega=l;

q=rega;

?end

??endmodule

語法詳細講解

奇C±zi存T-肅□□

在下面的例子中,兩個時鐘沿包含兩個存儲兀素,因此rega未被

..優(yōu)化掉。

.moduleex2reg(d,elk,q);

.inputd,elk;

outputq;

Iregq,rega;

always@(posedgeelk)

begin

?rega=0;

if(d)rega=l;

??end

語法詳細講解

奇存肅

?always@(posedgeelk)

q=rega;

endmodule

注:在后面的例子中,塊執(zhí)行的順序是不確定的,因此q可以獲得

在前一個周期中賦給rega的值。

語法詳細講解

奇C±zi存T-肅□□

組合寄存器示例

>在下面的兩個例子中,rega是一個臨時變量且被優(yōu)化掉。

,?在下面的例子中,y和rega不斷被賦新值;因此,下例是一個純

.的組合邏輯。

.moduleex3reg(y,a,b,c);

.inputa,b,c;

outputy;

regy,rega

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論