![計算機語言 語法詳細講解_第1頁](http://file4.renrendoc.com/view11/M01/35/13/wKhkGWWypSmAboVOAAHDZECwRsg150.jpg)
![計算機語言 語法詳細講解_第2頁](http://file4.renrendoc.com/view11/M01/35/13/wKhkGWWypSmAboVOAAHDZECwRsg1502.jpg)
![計算機語言 語法詳細講解_第3頁](http://file4.renrendoc.com/view11/M01/35/13/wKhkGWWypSmAboVOAAHDZECwRsg1503.jpg)
![計算機語言 語法詳細講解_第4頁](http://file4.renrendoc.com/view11/M01/35/13/wKhkGWWypSmAboVOAAHDZECwRsg1504.jpg)
![計算機語言 語法詳細講解_第5頁](http://file4.renrendoc.com/view11/M01/35/13/wKhkGWWypSmAboVOAAHDZECwRsg1505.jpg)
版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 教育心理視角下的學(xué)生情緒管理方法
- 虛擬研究環(huán)境中防止學(xué)風(fēng)不正的策略與方法
- 茶文化在小學(xué)音樂教育中的體現(xiàn)
- 教育促進健康的綜合實踐與思考
- 科技助力下的出行安全與行為優(yōu)化策略
- 2025年度用戶授權(quán)協(xié)議及在線教育資源共享合同
- 2025年度簡易解聘合同書-金融行業(yè)員工離職協(xié)議
- 2025年度個人宿舍租賃合同與住宿條件保障協(xié)議
- 2025年度鐘點工家庭園藝養(yǎng)護服務(wù)合同
- 二零二五年度員工薪酬保密與公司信息安全保護合同
- 成品移動公廁施工方案
- 2025-2030年中國干混砂漿行業(yè)運行狀況及發(fā)展趨勢預(yù)測報告
- 供電公司一把手講安全
- 人教版五年級上冊數(shù)學(xué)簡便計算大全600題及答案
- 2016-2023年湖南高速鐵路職業(yè)技術(shù)學(xué)院高職單招(英語/數(shù)學(xué)/語文)筆試歷年考點試題甄選合集含答案解析
- 政治單招考試重點知識點
- 專題01 中華傳統(tǒng)文化-中考英語時文閱讀專項訓(xùn)練
- 北京四合院介紹課件
- 土法吊裝施工方案
- BLM戰(zhàn)略規(guī)劃培訓(xùn)與實戰(zhàn)
- GB/T 16475-2023變形鋁及鋁合金產(chǎn)品狀態(tài)代號
評論
0/150
提交評論