版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、語法詳細(xì)講解強(qiáng)制激勵,在一個過程塊中,可以用兩種不同的方式對信號變量或表達(dá)式進(jìn)行連續(xù)賦值。 過程連續(xù)賦值往往是不可以綜合的,通常用在測試模塊中。 兩種方式都有各自配套的命令來停止賦值過程。 兩種不同方式均不允許賦值語句間的時間控制。 assign和deassign 適用于對寄存器類型的信號(例如:RTL級上 的節(jié)點(diǎn)或測試模塊中在多個地方被賦值的信號)進(jìn)行賦值。 initial begin
2、 #10 assign top.dut.fsml.state_reg = `init_state;,#20 deassign top.dut.fsml.state_reg; endforce 和 release 用于寄存器類型和網(wǎng)絡(luò)連接類型(例如:門級掃描寄存器的輸出)的強(qiáng)制賦值,強(qiáng)制改寫其它地方的賦值。 initial begin # 10 force top.dut.co
3、unter.scan_reg.q=0; # 20 release top.dut.counter.scan_reg.q; end 在以上兩個例子中,在10到20 這個時間段內(nèi),網(wǎng)絡(luò)或寄存器類型的信號被強(qiáng)制賦值,而別處對該變量的賦值均無效。force的賦值優(yōu)先級高于assign。如果先使用assign,再使用force對同一信號賦值,則信號的值為force所賦 的值,,語法詳細(xì)講解強(qiáng)制激勵,
4、語法詳細(xì)講解字符串,語法詳細(xì)講解強(qiáng)制激勵,語法詳細(xì)講解強(qiáng)制激勵,當(dāng)執(zhí)行release后,則信號的值為assign所賦 的值。如果用force對同一個信號賦了幾次值,再執(zhí)行release,則所有賦的值均不再存在。可以對信號的某(確定)位、某些(確定)位或拼接的信號,使用force和release賦值;但不能對信號的可變位使用force和release 來賦值。不能對寄存器類型的信號某位或某些位使用 assign 和deassi
5、gn 來賦值。,語法詳細(xì)講解強(qiáng)制激勵,語法詳細(xì)講解建立時鐘,雖然有時在設(shè)計中會包含時鐘,但時鐘通常用在測試模塊中。下面三個例子分別說明如何在門級和行為級建立不同波形的時鐘模型。[例1] 簡單的對稱方波時鐘:,語法詳細(xì)講解建立時鐘,reg clk;always begin #period/2 clk=0; #period/2 clk=1;end,reg go; wire clk;nand #(per
6、iod/2) ul (clk,clk,go);initial begin go=0; #(period/2) go=1;end,注:在有些仿真器中,如果設(shè)計所用的時鐘是由與其相同抽象級別的時鐘模型產(chǎn)生的,則仿真器的性能就能得到提高。,[例2]簡單的帶延遲的對稱方波時鐘:,語法詳細(xì)講解建立時鐘,reg clk;initial begin clk=0; #(
7、period) forever #(period/2) clk=!clk end,reg go; wire clk;nand #(period/2) ul (clk,clk,go);initial begin go=0; #(period) go=1;end,注:這兩個時鐘模型有些不同,行為描述的模型延遲期間一直是低電平,而
8、門級描述的模型開始延遲有半個周期是不確定的。,語法詳細(xì)講解建立時鐘,[例3]. 帶延遲、頭一個脈沖不規(guī)則的、占空比不為1的時鐘:,語法詳細(xì)講解建立時鐘,reg clk;initial begin #(period+1) clk=1; #(period/2-1) forever begin #(period/4) clk=0; #(3*period/4) clk=1;
9、endend,reg go; wire clk;nand #(3*period/4,period/4) ul(clk,clk,go);initial begin #(period/4+1) go=0; #(5*period/4-1) go=1;end,注:這兩個時鐘模型也有些不同,行為描述的模型一開始就有確定的電平,而門級描述的模型有延遲開始時電平是不確定的。,語法詳細(xì)講解怎樣使用任務(wù),mocule bus
10、_ctrl_tb reg [7:0] data; reg data_valid, data_rd; cpu ul(data_valid,data,data_rd); initial begin cpu_driver(8’b0000_0000); cpu_driver(8’b1010_1010); cpu_driver(8’b0101_0101);
11、 end task cpu_driver;,語法詳細(xì)講解怎樣使用任務(wù),語法詳細(xì)講解怎樣使用任務(wù),input [7:0] data_in; begin #30 data_valid=1; wait(data_rd==1); #20 data=data_in; wait(data_rd==0);
12、 #20 data=8’hzz; #30 data_valid=0; end endtask,語法詳細(xì)講解怎樣使用任務(wù),語法詳細(xì)講解怎樣使用任務(wù),endmodule 在測試模塊中使用任務(wù)可以提高程序代碼的效率,可以進(jìn)行多次重復(fù)操作。,語法詳細(xì)講解怎樣使用任務(wù),,,,,,,,,,,,,,,,,,,,,,,,wait,wait,wait,wait,data1
13、,data2,data3,data4,cpu_data,clk,data_valid,data_read,read_cpu_state,語法詳細(xì)講解存儲建模,目標(biāo)學(xué)會使用Verilog進(jìn)行存儲建模。學(xué)會在Verilog中進(jìn)行雙向口建模。,語法詳細(xì)講解存儲建模,存儲設(shè)備建模必須注意以下兩個方面的問題:聲明存儲容量的大小。提供對內(nèi)容的訪問權(quán)限,例如: 只讀 讀寫 同步讀寫
14、多次讀,同時進(jìn)行一次寫 多次同步讀寫,同時提供一些方法保證一致性,,,,,,語法詳細(xì)講解存儲設(shè)備建模,myrom.v `timescale 1ns/10ps module myrom(read_data,addr,read_en_); input read_en_;
15、 input [3:0] addr; output [3:0] read_data; reg [3:0] read_data;reg [3:0] mem [0:15];initial $readmemb(“my_rom_data”,mem);always @ (addr or r
16、ead_en_) if(!read_en_) read_data=mem[addr];endmodule,語法詳細(xì)講解簡單ROM建模,my_rom_data 0000 0101 1100 0011 1101 0010 0011 1111 1000 1001 1000 0001 1101 1010 0001 1101,ROM
17、的數(shù)據(jù)存儲在另外的一個獨(dú)立的文件中,,,語法詳細(xì)講解簡單ROM建模,上面所示的ROM模型中使用二維的存儲寄存器來定義存儲容量。ROM中的數(shù)據(jù)保存在一個獨(dú)立的文件中,如上面的右邊所示。這是一種保存ROM數(shù)據(jù)的通用的方法,它可以使數(shù)據(jù)和ROM模型分開。,語法詳細(xì)講解簡單RAM建模,`timescale 1ns/1nsmodule mymem(data,addr,read,write); inout [3:0] data;
18、inout [3:0] addr; input read, write; reg [3:0] memory [0:15]; //4 bits, 16 words//read assign data=read? memory[addr]:4’bz;//write always @ (posedge write) memory[addr]=data;endmodule,RAM模型比ROM模型稍微復(fù)雜,
19、因為它必須具有讀寫能力,而進(jìn)行讀寫時通常使用相同的數(shù)據(jù)總線,這就需要新技術(shù)來處理雙向總線。當(dāng)讀出口沒有被激活時,RAM模型不再激勵總線,如果此時的總線寫入變量也沒有被激活,則總線進(jìn)入高阻狀態(tài),這就避免了RAM中的讀寫競爭。,上述模型是可綜合的,但是許多工具只產(chǎn)生一系列的寄存器,這一般就需要更大的空間,從而比實際的存儲器的價格更昂貴。,語法詳細(xì)講解簡單RAM建模,例:module scalable_ROM(mem_word,addre
20、ss); parameter addr_bits=8; //size of address bus parameter wordsize=8; //width of a word parameter words=(1<<addr_bits); //size of mem output [wordsize:1] mem_wo
21、rd; //word of memory input [addr_bits:1] address; //address bus reg [wordsize:1] mem [0:words-1]; //mem declaration//output one word of memory wire [wordsize:1] mem_word=mem[address];
22、endmodule,語法詳細(xì)講解容量可變的存儲器建模,語法詳細(xì)講解容量可變的存儲器建模,上述的例子演示了怎樣通過設(shè)置字長和地址位數(shù)來定義一個只讀存儲設(shè)備。 在上例中,存儲字的范圍從0開始的,而不是從1開始,這是因為內(nèi)存是直接通過地址線定位的,同樣地,也可以用下面的方法來定義內(nèi)存和定位: reg [wordsize:1] mem [1:words]; //memory starts at word
23、1//address must be incremented to address all words in memory wire [wordsize:1] mem_word=mem[address+1];,可以通過使用一個循環(huán)或系統(tǒng)任務(wù)來載入存有數(shù)據(jù)的整個存儲器。
24、 使用循環(huán)把值賦給存儲數(shù)組。 for(i=0;i<memsize;i=i+i) // initialize memory mema[i]={wordsize{1’b1}};調(diào)用$readmem系統(tǒng)任務(wù)。 //load memory data form a file $readmemb(“m
25、em_file.txt”,mem);,語法詳細(xì)講解載入存儲設(shè)備,語法詳細(xì)講解怎樣使用雙向口,使用inout關(guān)鍵字聲明雙向口。 inout [7:0] databus;使用雙向口需要遵循下面的規(guī)則:一個inout口只能聲明為網(wǎng)絡(luò)類型,而不能是寄存器類型的。 因此仿真器能確定多個激勵源的最終值。在設(shè)計中,每次只能激活inout的一個方向。 例如:當(dāng)使用總線讀R
26、AM中的數(shù)據(jù)時,同時又向RAM模 型的雙向數(shù)據(jù)總線寫數(shù)據(jù),就會產(chǎn)生邏輯競爭,導(dǎo)致總 線脫離。 必須為inout口設(shè)計控制邏輯,用來保證正確的操作。,,,語法詳細(xì)講解怎樣使用雙向口,注:可以聲明一個inout口,用來輸入或輸出數(shù)據(jù)。inout口默認(rèn)為網(wǎng)絡(luò)類型,不可以對網(wǎng)絡(luò)類型的數(shù)據(jù)進(jìn)行過程賦值,但可以在過程塊外對寄存器數(shù)據(jù)類型進(jìn)
27、行連續(xù)賦值,或者把它與元器件相連。必須為inout口設(shè)計控制邏輯,用來保證正確的操作。當(dāng)把inout口做為輸入口時,必須使輸出邏輯失效。,使用元器件,語法詳細(xì)講解雙向口建模,en_a_b,en_b_a,bus_a,bus_b,module bus_xcvr (bus_a,bus_b,en_a_b,en_b_a);inout bus_a,bus_b;input en_a_b,en_b_a; bufifl b1(bu
28、s_b,bus_a,en_a_b); bufifl b2(bus_a,bus_b,en_b_a);//結(jié)構(gòu)模塊邏輯endmodule,當(dāng)en_a_b=1時,元器件b1激活,bus_a的值傳到bus_b上,當(dāng)en_b_a=1時,元器件b1激活,bus_b的值傳到bus_a上,語法詳細(xì)講解雙向口建模,注:在上頁的例子中,使用了en_a_b和en_b_a 來控制元器件bufifl,如果進(jìn)行同時控制,則得不到預(yù)期的結(jié)果。,,使用連續(xù)賦
29、值,en_a_b,en_b_a,bus_a,bus_b,module bus_xcvr (bus_a,bus_b,en_a_b,en_b_a);inout bus_a,bus_b;input en_a_b,en_b_a; assign bus_b=en_a_b? bus_a:’bz; assign bus_a=en_b_a? bus_b:’bz;//結(jié)構(gòu)模塊邏輯endmodule,當(dāng)en_a_b=1時,bus
30、_a的值傳到bus_b上,當(dāng)en_b_a=1時,bus_b的值傳到bus_a上,語法詳細(xì)講解雙向口建模,注:在assign語句中,通過en_a_b和en_b_a控制bus_a與bus_b之間的數(shù)據(jù)交換。 如果進(jìn)行同時控制,則得不到預(yù)期的結(jié)果。,語法詳細(xì)講解雙向口建模,存儲口建模,語法詳細(xì)講解雙向口建模,測試模塊,RAM單元,數(shù)據(jù)總線,數(shù)據(jù)寄存器,rd,wr,module ram_cell(databus,rd.w
31、r);inout databus;input rd,wr;reg datareg; assign databus=rd? datareg:’bz; always @(negedge sr) datareg<=databus;endmodule,當(dāng)rd等于1時datareg的值被賦給databus,當(dāng)wr的下降沿到達(dá)時,databus的值被寫入datareg,,,,注:上頁存儲單元在wr的下降沿到達(dá)時存入數(shù)據(jù)
32、。上頁模塊在 wr處于高電平時,通過數(shù)據(jù)總線寫入數(shù)據(jù),但必須保證wr的高電平維持時間長于數(shù)據(jù)的寫入時間。 在rd處于高電平時,上述存儲單元通過數(shù)據(jù)總線讀出數(shù)據(jù)。由于此模型為單口存儲模型,因此wr和rd不能同時為高電平,否則就得不到預(yù)期的結(jié)果。,語法詳細(xì)講解雙向口建模,目標(biāo)學(xué)會怎樣定義或調(diào)用任務(wù)和函數(shù)。學(xué)會怎樣使用命名塊。學(xué)會怎樣使命名塊和任務(wù)失效。熟悉有限狀態(tài)機(jī)及怎樣進(jìn)行有限狀態(tài)機(jī)顯式建模。,語法詳細(xì)講解第十七
33、部分 Verilog中的高級結(jié)構(gòu),可以通過把代碼分成小的模塊或者使用任務(wù)和函數(shù),來把一項任務(wù)分成許多較小的、易于管理的部分,從而提高代碼的重用性。任務(wù) 一般用于執(zhí)行調(diào)試操作,或者行為的描述硬件 可以包含時間控制(# delays, @, wait) 可以包含input, output 和 inout參數(shù) 可以調(diào)用其他的任
34、務(wù)或函數(shù)函數(shù) 一般用于計算,或者用來代替組合邏輯 不能包含任何延遲;函數(shù)在零時間執(zhí)行 只能使用input參數(shù),但可以通過函數(shù)名來返回一個值。 可以調(diào)用其他的函數(shù),但不可以調(diào)用任務(wù),語法詳細(xì)講解第十七部分 Verilog中的高級結(jié)構(gòu),注:必須在模塊內(nèi)調(diào)用任務(wù)和函數(shù)。在任務(wù)和函數(shù)中不能聲明連線類型的變量。所有的輸入和輸
35、出都是真正的本地寄存器類型的數(shù)據(jù)。只有當(dāng)任務(wù)或函數(shù)調(diào)用并執(zhí)行完后,才能有返回值。例如:當(dāng)任務(wù)或函數(shù)中包含一個forever循環(huán)時,就不可能有返回值。,語法詳細(xì)講解第十七部分 Verilog中的高級結(jié)構(gòu),語法詳細(xì)講解Verilog 任務(wù),下面的任務(wù)含有時間控制和一個輸入,并且指向一個模塊變量,但是不包含輸出、總線和內(nèi)部變量,不顯示任何內(nèi)容。 時間控制中使用的信號(例如 clk)不必是任務(wù)的輸入,這是因為輸入值只向任務(wù)內(nèi)部
36、傳遞一次。 module top; reg clk, a, b; DUT u1(out, a, b, clk); always #5 clk=!clk; task neg_clocks; input [31:0] number_of_edges; repeat(
37、number_of_edges),語法詳細(xì)講解整數(shù)和實常數(shù),@(negedge clk); endtask initial begin clk=0; a=1; b=1; neg_clocks(3); //任務(wù)調(diào)用 a=0; neg_clocks(5);
38、 b=0; end endmodule主要特征:任務(wù)調(diào)用是通過在Verilog模塊中寫入任務(wù)名來實現(xiàn)的。任務(wù)中可以包含input, output和inout參數(shù)。,語法詳細(xì)講解Verilog 任務(wù),傳遞給任務(wù)的參數(shù)與任務(wù)I/O聲明參數(shù)的順序相同。雖然傳遞給任務(wù)的參數(shù)名可以和任務(wù)內(nèi)部I/O聲明的參數(shù)名相同,但是為了提高任務(wù)的模塊化程度,傳遞給任務(wù)的參數(shù)名通常是唯一的,而
39、不使用與任務(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ù)中所使用的變量必須包含在輸入/輸
40、出口列表中。,語法詳細(xì)講解Verilog 任務(wù),下面模塊中的任務(wù)含有一個雙口總線和一個內(nèi)部變量,但是沒有輸入、輸出和定時控制,沒有引用本模塊的變量,不顯示任何內(nèi)容。 在任務(wù)調(diào)用時,任務(wù)參數(shù)(口)類型被視為內(nèi)部寄存器類型。 parameter MAX_BITS=8; reg [MAX_BITS:1] D; task reverse_bits; inout [7:0
41、] data; //雙口總線被視為寄存器類型! integer K; for (k=0; k<MAX_BITS; K=K+1) reverse_bits [MAXBITS – (K+1)=data[K]; endtask always @ (posedge clk) reverse_bits (D);
42、 ……,語法詳細(xì)講解Verilog 任務(wù),下面模塊中的任務(wù)含有輸入、輸出、時間控制和一個內(nèi)部變量,并且引用了一個本模塊的變量,但是沒有輸出,不顯示任何內(nèi)容。 任務(wù)調(diào)用時的參數(shù)順序應(yīng)與任務(wù)定義中聲明的順序相同。 module mult(clk, a, b, out, en_mult); input clk, en_mult; input [3:0] a, b; output
43、[7:0] out; reg [15:0] out; always @ (posedge clk) multme(a, b, out); //任務(wù)調(diào)用,語法詳細(xì)講解Verilog 任務(wù),task muotme; //任務(wù)定義 input [3:0] xme, tome; output [7:0] result;
44、 wait (en_mult) result=xme*tome; endtask endmodule,語法詳細(xì)講解Verilog 任務(wù),module orand(a, b, c, d, e, out); input [7:0] a, b, c, d, e; output [7:0] out; reg [7:0] out; always @ (
45、a or b or c or d or e) out=f_or_and(a, b, c, d, e); //函數(shù)調(diào)用 function [7:0] f_or_and; input [7:0] a, b, c, d, e; if(e==1) f_or_and=(a|b)&(c|d); el
46、se f_or_and=0; endfunctionendmodule,語法詳細(xì)講解Verilog 函數(shù),雖然函數(shù)不能包含定時控制,但是可以在包含定時控制的過程塊中調(diào)用函數(shù)。 在上述函數(shù)中使用了函數(shù)名f_or_and作為寄存器類型的變量。要點(diǎn)函數(shù)定義不能包含定時控制語句。函數(shù)必須含有輸出,但不能含有輸出和總線口;一個函數(shù)只能返回一個值,該值的變量名與函數(shù)同名,數(shù)據(jù)
47、類型默認(rèn)為reg類型。傳遞給函數(shù)參數(shù)的順序與函數(shù)輸入?yún)?shù)聲明的順序相同。函數(shù)定義必須包含在模塊定義之內(nèi)。函數(shù)不能調(diào)用任務(wù),但任務(wù)可以調(diào)用函數(shù)。函數(shù)使Verilog有更廣闊的適用范圍。,語法詳細(xì)講解Verilog 函數(shù),雖然函數(shù)只能返回一個值,但是它們的返回值可以直接的賦給一個信號拼接,從而使它們有多個輸出。 {o1, o2, o3, o4}=f_or_and(a, b, c, d, e);,語法詳細(xì)講
48、解Verilog 函數(shù),語法詳細(xì)講解命名塊,可以通過在關(guān)鍵字begin或fork后加上:〈塊名〉來給塊命名。 module named_blk; …… begin :seq_blk …… end …… fork : par_blk …… join
49、 …… endmodule可以在命名塊中聲明本地變量。可以使用disable禁止命名塊。,注意:命名塊使Verilog有更廣闊的適用范圍。命名塊的使用縮短了仿真的時間。,語法詳細(xì)講解命名塊,語法詳細(xì)講解禁止命名塊和任務(wù),module do_arith(out, a, b, c, d, e, clk, en_mult);input clk, en_mult;input [7:0] a, b,
50、 c, d, e;output [15:0] out;reg [14:0] out; always @(posedge clk) begin : arith_block //***命名塊*** reg [3:0] tmp1, tmp2; //***本地變量*** {tmp, tmp2}=f
51、_or_and(a, b, c, d, e); // 函數(shù)調(diào)用 if(en_mult) multme(tmp1, tmp2, out); //任務(wù)調(diào)用 end always @(negedge en_mult) begin //停止計算 disable multme; //***禁止任務(wù)的執(zhí)行***
52、 diable arith_block; //***禁止命名塊的執(zhí)行*** end //在此定義任務(wù)和函數(shù)endmodle,注意:disable語句用來終止命名塊或任務(wù)的執(zhí)行,因此可以在執(zhí)行所有的語句前,就能從命名塊或任務(wù)的執(zhí)行中返回。 語法: disable 〈塊名〉 或 disable 〈任務(wù)名〉禁止執(zhí)行命名塊或任務(wù)后,
53、所有在事件隊列中安排的事件都將被刪除。在綜合中一般不支持disable語句。在上頁的例子中,只禁止命名塊也可以得到預(yù)期的結(jié)果:命名塊中所有的事件、任務(wù)和函數(shù)的執(zhí)行都將被取消。,語法詳細(xì)講解禁止命名塊和任務(wù),語法詳細(xì)講解有限狀態(tài)機(jī)(FSM),隱式FSM:不需要狀態(tài)寄存器仿真更加有效只能很好的處理線形狀態(tài)改變大部分綜合工具不支持隱式FSM,state 1,state 2,state 3,state 4,,,,,,,語法詳細(xì)
54、講解編譯引導(dǎo)語句,顯式FSM:結(jié)構(gòu)更加復(fù)雜可以很方便的用來處理默認(rèn)狀態(tài)能夠處理復(fù)雜的狀態(tài)改變所有的綜合工具均支持顯式FSM,語法詳細(xì)講解有限狀態(tài)機(jī)(FSM),state A,state A,state A,state A,state A,,,,,,,,注意:在隱式 FSMs 中,無論什么時候在一個時鐘周期內(nèi)寫數(shù)據(jù)和在在另一個時鐘周期內(nèi)讀數(shù)據(jù),都會創(chuàng)建寄存器。所有的 FSMs 都必須能復(fù)位,狀態(tài)改變必須與一個單一的時鐘信
55、號同步。一般的,如果狀態(tài)改變比較簡單,又定義的比較好,而且綜合工具支持隱式狀態(tài)機(jī),就可以使用隱式類型。如果狀態(tài)改變比較復(fù)雜,最好使用顯式類型,這樣會更加有效。隱式狀態(tài)機(jī)應(yīng)屬于行為級,而不應(yīng)屬于RTL級,代碼中主要包含循環(huán)、嵌入的定時控制,有時也含有命名事件、wait 和 disable 語句。因此,綜合中一般不支持隱式機(jī)。,語法詳細(xì)講解有限狀態(tài)機(jī)(FSMs),語法詳細(xì)講解Verilog 函數(shù),要返回一個矢量值(超過一個位寬),可
56、以在函數(shù)名前聲明變量的位寬。在函數(shù)中,將語句放在 begin 和 end 塊中。 在函數(shù)中無論多少次對函數(shù)名進(jìn)行賦值,值只返回一次。下面的函數(shù)中聲明了一個內(nèi)部整型變量。 module foo; input [7:0] loo; output [7:0] goo; //可以從連續(xù)賦值中調(diào)用函數(shù) wire [7:0] goo=zero_count(loo); fu
57、nction [3:0] zero_count; input [7:0] in_bus;,語法詳細(xì)講解Verilog 函數(shù),integer I; begin zero_count=0; for(I=0; I<8; I=I+1) if(!in_bus[I]
58、) zero_count=zero_count+1; end endfunction endmodule,可以聲明函數(shù)的返回值的類型為 integer、real 或 time, 可以在任何表達(dá)式中調(diào)用函數(shù)。 module checksub(neg, in_a, in_b); output neg;
59、 reg neg; function integer_subtr; input [7:0] in_a, in_b; subtr=in_a-in_b; //結(jié)果可能是負(fù)數(shù) endfunction always @(a or b) if(subtr(a, b)<0)
60、 neg=1; else neg=0; endmodule,語法詳細(xì)講解Verilog 函數(shù),可以給返回變量的每一位賦值,還可以參數(shù)化函數(shù)的大小、函數(shù)口、甚至函數(shù)的行為。 ... parameter MAX_BITS=8; reg [MAX_BITS:1] D; function [MAX_BITS:1]
61、 reverse_bits; input [7:0] data; integer K; for(K=0; K<MAX_BITS; K=K+1) reverse_bits [MAX_BITS-(K+1)]=data[K]; endfunction always @(posedge
62、 clk) D=reverse_bits(D); ...,語法詳細(xì)講解Verilog 函數(shù),語法詳細(xì)講解顯式有限狀態(tài)機(jī),module exp(out, datain, clk, rst);input clk, rst, datain;output out; reg out;ret state;always @(pasedge clk or posedge rst) if(rst)
63、 {state, out}=2’b00; else case(state) 1’b0: begin out=1’b0; if(!datain) state=1’b0; else state=1’b1; end 1’b1 begin,狀態(tài)變量,,語法詳細(xì)
64、講解顯式有限狀態(tài)機(jī),case語句,,out=datain; state=1’b0; end default: {state, out}=2’b00; endcaseendmodule注:可以在過程塊中使用一個單一的時鐘沿和一個 case 語句來描述一個顯式狀態(tài)機(jī)。必須規(guī)定一個狀態(tài)變量,用來定義狀態(tài)機(jī)的狀態(tài)。要改變當(dāng)前的狀態(tài),必須改
65、變狀態(tài)變量的值,狀態(tài)變量的值的改變要與時鐘沿同步。最好為通常不會發(fā)生的狀態(tài)規(guī)定默認(rèn)動作。,語法詳細(xì)講解顯式有限狀態(tài)機(jī),轉(zhuǎn)到下一個狀態(tài),,默認(rèn)狀態(tài)指針,,module imp(out, datain, clk, rst);output out; reg out;input clk, datain, rst;always @(rst) //協(xié)同復(fù)位方法 if (rst) assing out=1’b0;
66、 else begin deassign out; disable seq_block; //返回到初始狀態(tài) endalways @(posedge clk),語法詳細(xì)講解隱式有限狀態(tài)機(jī),begin: seq_block out=1’b0; if(!datain) //狀態(tài)一:輸出零
67、 disable seq_block; @(posedge clk) //狀態(tài)二:輸出第二位 out=datain; endendmodule,語法詳細(xì)講解隱式有限狀態(tài)機(jī),注意:可以在過程塊使用多個時鐘沿(一個狀態(tài)一個)、條件語句、循環(huán)語句、disable語句來描述隱式FSM。不
68、必定義一個狀態(tài)變量。若沒有強(qiáng)制狀態(tài)重復(fù)(例如:在循環(huán)語句或disable語句中強(qiáng)制狀態(tài)重復(fù)),當(dāng)下一個激活時鐘沿到達(dá)時,狀態(tài)改變。下一個裝態(tài)將由條件語句決定。在隱式狀態(tài)機(jī)中,很難規(guī)定一個默認(rèn)動作。,語法詳細(xì)講解隱式有限狀態(tài)機(jī),目標(biāo)學(xué)會怎樣創(chuàng)建邏輯使用的用戶定義的原語。用戶定義的原語 (UDP) 的行為與嵌入的 Verilog 原器件相似,可以用一個表格來定義它的功能。,語法詳細(xì)講解第十八部分 用戶定義的原語,在 Veril
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論