![第七講verilog語法_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/15/1eb938e9-053f-42e1-8cff-3416f8cdbcd0/1eb938e9-053f-42e1-8cff-3416f8cdbcd01.gif)
![第七講verilog語法_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/15/1eb938e9-053f-42e1-8cff-3416f8cdbcd0/1eb938e9-053f-42e1-8cff-3416f8cdbcd02.gif)
![第七講verilog語法_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/15/1eb938e9-053f-42e1-8cff-3416f8cdbcd0/1eb938e9-053f-42e1-8cff-3416f8cdbcd03.gif)
![第七講verilog語法_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/15/1eb938e9-053f-42e1-8cff-3416f8cdbcd0/1eb938e9-053f-42e1-8cff-3416f8cdbcd04.gif)
![第七講verilog語法_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/15/1eb938e9-053f-42e1-8cff-3416f8cdbcd0/1eb938e9-053f-42e1-8cff-3416f8cdbcd05.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、模塊模塊的的測試測試如何把被測模塊的輸出變化記錄到數(shù)據(jù)庫文件中?如何把被測模塊的輸出變化記錄到數(shù)據(jù)庫文件中?(文件格式為VCD,大多數(shù)的波形顯示工具都能讀取該格式)可用以下七個(gè)系統(tǒng)任務(wù):可用以下七個(gè)系統(tǒng)任務(wù):$dumpfile(“file.dump”); /打開記錄數(shù)據(jù)變化的數(shù)據(jù)文件$dumpvars(); /選擇需要記錄的變量$dumpflush; /把記錄在數(shù)據(jù)文件中的資料轉(zhuǎn)送到硬盤保存$dumpoff; /停止記錄數(shù)據(jù)變化$dumpon; /重新開始記錄數(shù)據(jù)變化$dumplimit(); /規(guī)定數(shù)據(jù)文件的大小(字節(jié))1)$dumpall; /記錄所有指定信號(hào)的變化值到數(shù)據(jù)文件中模塊模塊的
2、的測試測試如何把被測模塊的響應(yīng)變化記錄到數(shù)據(jù)庫文件中?如何把被測模塊的響應(yīng)變化記錄到數(shù)據(jù)庫文件中?舉例說明:舉例說明:$ $dumpvars; dumpvars; /記錄各層次模塊中所有信號(hào)的變化$ $dumpvars(1,top); dumpvars(1,top); /只記錄模塊top中所有信號(hào)的變化$ $dumpvars(2,top.u1); dumpvars(2,top.u1); /記錄top模塊中實(shí)例u1和它以下一層子模塊所有信號(hào)的變化$ $dumpvars(0,top.u2,top.u1.u13.q); dumpvars(0,top.u2,top.u1.u13.q); /記錄top模
3、塊中實(shí)例u2和它本層所有信號(hào)的變化,還有top.u1.u13.q信號(hào)的變化。$ $dumpvars(3,top.u2,top.u1); dumpvars(3,top.u2,top.u1); /記錄top模塊中u2和u1所有信號(hào)的變化(包括其兩層以下子模塊的信號(hào)變化)。模塊模塊的的測試測試如何把被測模塊的響應(yīng)變化記錄到數(shù)據(jù)庫文件中?如何把被測模塊的響應(yīng)變化記錄到數(shù)據(jù)庫文件中?舉例說明:舉例說明:下面的 Verilog 代碼段可以代替測試文件中的系統(tǒng)任務(wù)$monitor initialinitial begin begin $ $dumpfile(“vlog.dump”dumpfile(“vlog
4、.dump”);); $ $dumpvars(0,top); dumpvars(0,top); end end語法詳細(xì)講解編譯引導(dǎo)語句編譯引導(dǎo)語句使用使用 uselib 的語法:的語法: uselib 器件庫1的地點(diǎn) 器件庫2的地點(diǎn) 。上面的器件庫地點(diǎn)可用以下兩種方法表示:1) file = 庫文件名的路徑2) dir = 庫目錄名的路徑 libext = .文件擴(kuò)展例如例如:uselib dir =/lib/FAST_lib/uselib dir =/lib/TTL_lib/ libext=.v file = /libs/TTL_U/udp.lib語法詳細(xì)講解強(qiáng)制激勵(lì)強(qiáng)制激勵(lì)在一個(gè)過程塊中,
5、可以用兩種不同的方式對信號(hào)變量或表達(dá)式進(jìn)行連續(xù)賦值。 過程連續(xù)賦值往往是不可以綜合的,通常用在測試模塊中。 兩種方式都有各自配套的命令來停止賦值過程。 兩種不同方式均不允許賦值語句間的時(shí)間控制。 assign和deassign 適用于對寄存器類型的信號(hào)(例如:RTL級(jí)上 的節(jié)點(diǎn)或測試模塊中在多個(gè)地方被賦值的信號(hào))進(jìn)行賦值。 initial begin #10 assign top.dut.fsml.state_reg = init_state; #20 deassign top.dut.fsml.state_reg; end4force 和 release 用于寄存器類型和網(wǎng)絡(luò)連接類型(例如:
6、門級(jí)掃描寄存器的輸出)的強(qiáng)制賦值,強(qiáng)制改寫其它地方的賦值。 initial begin # 10 force top.dut.counter.scan_reg.q=0; # 20 release top.dut.counter.scan_reg.q; end 在以上兩個(gè)例子中,在10到20 這個(gè)時(shí)間段內(nèi),網(wǎng)絡(luò)或寄存器類型的信號(hào)被強(qiáng)制賦值,而別處對該變量的賦值均無效。 force的賦值優(yōu)先級(jí)高于assign。如果先使用assign,再使用force對同一信號(hào)賦值,則信號(hào)的值為force所賦 的值, 語法詳細(xì)講解強(qiáng)制激勵(lì)語法詳細(xì)講解字符串字符串 語法詳細(xì)講解強(qiáng)制激勵(lì)強(qiáng)制激勵(lì) 語法詳細(xì)講解強(qiáng)制激勵(lì)
7、當(dāng)執(zhí)行release后,則信號(hào)的值為assign所賦 的值。 如果用force對同一個(gè)信號(hào)賦了幾次值,再執(zhí)行release,則所有賦的值均不再存在。 可以對信號(hào)的某(確定)位、某些(確定)位或拼接的信號(hào),使用force和release賦值;但不能對信號(hào)的可變位使用force和release 來賦值。不能對寄存器類型的信號(hào)某位或某些位使用 assign 和deassign 來賦值。 語法詳細(xì)講解強(qiáng)制激勵(lì)強(qiáng)制激勵(lì) 語法詳細(xì)講解建立時(shí)鐘 雖然有時(shí)在設(shè)計(jì)中會(huì)包含時(shí)鐘,但時(shí)鐘通常用在測試模塊中。下面三個(gè)例子分別說明如何在門級(jí)和行為級(jí)建立不同波形的時(shí)鐘模型。 例例1 1 簡單的對稱方波時(shí)鐘簡單的對稱方波時(shí)
8、鐘:語法詳細(xì)講解建立時(shí)鐘建立時(shí)鐘 reg clk;always begin #period/2 clk=0; #period/2 clk=1;endreg go; wire clk;nand #(period/2) ul (clk,clk,go);initial begin go=0; #(period/2) go=1;end注:在有些仿真器中,如果設(shè)計(jì)所用的時(shí)鐘是由與其相同抽象級(jí)別的時(shí)鐘模型產(chǎn)生的,則仿真器的性能就能得到提高。 例例22簡單的帶延遲的對稱方波時(shí)鐘:簡單的帶延遲的對稱方波時(shí)鐘:語法詳細(xì)講解建立時(shí)鐘 reg clk;initial begin clk=0; #(period) f
9、orever # ( p e r i o d / 2 ) clk=!clk endreg go; wire clk;nand #(period/2) ul (clk,clk,go);initial begin go=0; #(period) go=1;end注:這兩個(gè)時(shí)鐘模型有些不同,行為描述的模型延遲期間一直是低電平,而門級(jí)描述的模型開始延遲有半個(gè)周期是不確定的。語法詳細(xì)講解建立時(shí)鐘 例例3. 3. 帶延遲、頭一個(gè)脈沖不規(guī)則的、占空比不為帶延遲、頭一個(gè)脈沖不規(guī)則的、占空比不為1 1的時(shí)鐘:的時(shí)鐘:語法詳細(xì)講解建立時(shí)鐘 reg clk;initial begin #(period+1) clk
10、=1; #(period/2-1) forever begin #(period/4) clk=0; #(3*period/4) clk=1; endendreg 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注:這兩個(gè)時(shí)鐘模型也有些不同,行為描述的模型一開始就有確定的電平,而門級(jí)描述的模型有延遲, 開始時(shí)電平是不確定的。語法詳細(xì)講解怎樣使用任務(wù)舉例說明如何使用任務(wù):舉例說明如何使用任務(wù):module bus_ct
11、rl_tb; reg 7:0 data; reg data_valid, data_rd; cpu ul(data_valid,data,data_rd); initial begin cpu_driver (8b0000_0000); cpu_driver (8b1010_1010); cpu_driver (8b0101_0101); end 語法詳細(xì)講解怎樣使用任務(wù)怎樣使用任務(wù) 語法詳細(xì)講解怎樣使用任務(wù)task cpu_data;input 7:0 data_in;output 7:0 data; begin #30 valid=1; wait(rd=1); #20 data=data_
12、in; wait(rd=0); #20 data=8hzz; #30 valid=0; end endtaskendmodule語法詳細(xì)講解怎樣使用任務(wù)怎樣使用任務(wù) 語法詳細(xì)講解怎樣使用任務(wù) 在測試模塊中使用任務(wù)可以提高程序代碼的效率,可以用任務(wù)把多次重復(fù)的操作包裝起來。語法詳細(xì)講解怎樣使用任務(wù)怎樣使用任務(wù) waitwaitwaitwaitdata1 data2data3 data4cpu_data clkvalidrdread_cpu_state語法詳細(xì)講解存儲(chǔ)建模目標(biāo)目標(biāo) 學(xué)會(huì)如何用Verilog對存儲(chǔ)器建模。學(xué)會(huì)如何用Verilog中對雙向(即輸入/輸出)端口, (inout)建模。語法
13、詳細(xì)講解第十五部分第十五部分 存儲(chǔ)器建模存儲(chǔ)器建模 存儲(chǔ)器建模必須注意以下兩個(gè)方面的問題:存儲(chǔ)器建模必須注意以下兩個(gè)方面的問題: 聲明存儲(chǔ)器容量的大小。 明確對存儲(chǔ)器訪問操作的權(quán)限。例如:指出可以對存儲(chǔ)器做以下哪幾種操作: 1)只讀 2)讀寫 3)同步讀寫 4)多次讀,同時(shí)進(jìn)行一次寫 5)多次同步讀寫,同時(shí)提供一些方法保證一致性語法詳細(xì)講解存儲(chǔ)器建模存儲(chǔ)器建模timescale 1ns/10ps module myrom(read_data,addr,read_en_); input read_en_; input 3:0 addr; output 3:0 read_data; reg 3:0
14、 read_data;reg 3:0 mem 0:15;initial $readmemb(“my_rom_data”,mem);always (addr or read_en_) if(!read_en_) read_data=memaddr;endmodule 語法詳細(xì)講解簡單簡單 ROM ROM 建模建模my_rom_datamy_rom_data 0000 0101 1100 0011 1101 0010 0011 1111 1000 1001 1000 0001 1101 1010 0001 1101 ROM ROM的數(shù)據(jù)存儲(chǔ)的數(shù)據(jù)存儲(chǔ)在另外的一個(gè)獨(dú)在另外的一個(gè)獨(dú)立的文件中立的文件中
15、語法詳細(xì)講解簡單簡單ROMROM建模建模上頁所示的上頁所示的ROMROM模型說明:模型說明: 如何在Verilog中用二維的寄存器組來定義存儲(chǔ)器。 ROM中的數(shù)據(jù)保存在一個(gè)獨(dú)立的文件中,如上頁的右邊的虛線方框所示。 這是一種保存ROM數(shù)據(jù)的通用的方法,它可以使數(shù)據(jù)和ROM模型分開。語法詳細(xì)講解簡單簡單RAMRAM建模建模timescale 1ns/1nsmodule mymem(data,addr,read,write); inout 3:0 data; inout 3:0 addr; input read, write; reg 3:0 memory 0:15; /4 bits, 16 wo
16、rds/從存儲(chǔ)器讀出到總線上 assign data=read? memoryaddr:4bz;/從總線寫入存儲(chǔ)器 always (posedge write) memoryaddr=data;endmodule語法詳細(xì)講解簡單簡單RAMRAM建模建模RAMRAM模型比模型比ROMROM模型稍微復(fù)雜:模型稍微復(fù)雜:它必須具有讀寫能力;進(jìn)行讀寫時(shí)通常使用相同的數(shù)據(jù)總線;需要新技術(shù)來處理雙向總線;當(dāng)讀信號(hào)無效時(shí),RAM模型與總線脫離,如果此時(shí)寫 信號(hào)也無效,總線無驅(qū)動(dòng)源,則總線進(jìn)入高阻狀態(tài), 這就避免了RAM中的讀寫競爭。上頁的 RAM 模塊是可綜合的,但綜合出來是一大堆寄存器,占比較大的面積,經(jīng)
17、濟(jì)上不太合算。例:例:module scalable_ROM (mem_word, address); parameter addr_bits=8; /size of address bus parameter wordsize=8; /width of a word parameter words=(1addr_bits); /size of mem output wordsize:1 mem_word; /word of memory input addr_bits:1 address; /address bus reg wordsize:1 mem 0 : words-1; /mem d
18、eclaration/output one word of memory wire wordsize:1 mem_word=memaddress;endmodule語法詳細(xì)講解存儲(chǔ)量可變的只讀存儲(chǔ)器建模存儲(chǔ)量可變的只讀存儲(chǔ)器建模語法詳細(xì)講解存儲(chǔ)量可變的只讀存儲(chǔ)器建模存儲(chǔ)量可變的只讀存儲(chǔ)器建模 上述的例子演示了怎樣通過設(shè)置字長和地址位數(shù)來編 寫 只讀存儲(chǔ)器的行為模塊。 注意 ! 在上例中,存儲(chǔ)字的范圍從0開始的,而不是從1開始,這是因?yàn)榇鎯?chǔ)單元是直接通過地址線尋址定位的。 同樣地,也可以用下面的方法來定義存儲(chǔ)器和尋址: reg wordsize:1 mem 1:words; /存儲(chǔ)器地址 從1
19、開始 /地址一個(gè)一個(gè)地增加直到包含了每個(gè)地址對應(yīng)的存儲(chǔ)器 wire wordsize:1 mem_word = memaddress+1; 可以在初始化塊中用一個(gè)循環(huán)或系統(tǒng)任務(wù)把初始數(shù)據(jù)存入存儲(chǔ)器的每個(gè)單元。 使用循環(huán)把值賦給存儲(chǔ)器數(shù)組。 for(i=0;imemsize;i=i+i) / initialize memory memai=wordsize1b1; 調(diào)用$readmem系統(tǒng)任務(wù)。 /從文件 mem_file.txt 中, 把初始數(shù)據(jù)存入存儲(chǔ)器(mem)的每個(gè)單元 $readmemb(“mem_file.txt”,mem); 注意:注意:上面兩項(xiàng)必須寫 在initial 塊中,加載
20、這些初始化數(shù)據(jù)不需要時(shí)間。 語法詳細(xì)講解存儲(chǔ)器的加載存儲(chǔ)器的加載語法詳細(xì)講解怎樣使用雙向口怎樣使用雙向口使用使用inout關(guān)鍵字聲明端口為雙向口。關(guān)鍵字聲明端口為雙向口。 inout 7:0 databus;使用雙向口必需遵循下面的規(guī)則:使用雙向口必需遵循下面的規(guī)則: inout口只能聲明為網(wǎng)絡(luò)連接類型, 不允許把它聲明為寄存器類型。(所以仿真器能確定多個(gè)驅(qū)動(dòng)源的最終值。) 在設(shè)計(jì)中,每次只能從一個(gè)方向來驅(qū)動(dòng)inout口口。 例如:當(dāng)使用總線讀RAM中的數(shù)據(jù)時(shí),如果同時(shí)又向RAM模型的雙向數(shù)據(jù)總線寫數(shù)據(jù),就會(huì)產(chǎn)生邏輯競爭,導(dǎo)致總線數(shù)據(jù)無法確定。所以必須為inout口設(shè)計(jì)控制邏輯,只有這樣才能保
21、證正確的操作。語法詳細(xì)講解怎樣使用雙向口怎樣使用雙向口 注意注意 :聲明一個(gè)inout口,可以用來輸入或輸出數(shù)據(jù)。inout口默認(rèn)為網(wǎng)絡(luò)連接類型。不允許在過程塊(initial 或always塊)中對網(wǎng)絡(luò)連接類型的數(shù)據(jù)進(jìn)行過程賦值;但可以在過程塊外把一個(gè)寄存器數(shù)據(jù)類型通過連續(xù)賦值語句賦給它(inout口),或者把它與用戶定義的源語(UDP)相連。必須為inout口設(shè)計(jì)控制邏輯,用來保證正確的操作。當(dāng)把inout口作為輸入口時(shí),必須通過控制邏輯禁止輸出到inout口。使用使用Verilog中的基本元件(中的基本元件(bufif1)為雙向口建模:為雙向口建模:語法詳細(xì)講解雙向口建模雙向口建模b2b
22、2b1b1en_a_ben_a_ben_b_aen_b_abus_abus_abus_bbus_bmodule 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(bus_b,bus_a,en_a_b); bufifl b2(bus_a,bus_b,en_b_a);/結(jié)構(gòu)模塊邏輯endmodule 當(dāng)當(dāng)en_a_b=1en_a_b=1時(shí),元器時(shí),元器件件b1b1激活,激活,bus_abus_a的值傳的值傳到到bus_bbus_b上上 當(dāng)當(dāng)en_b_a=1en_b_a=1時(shí),元
23、器時(shí),元器件件b1b1激活,激活,bus_bbus_b的值傳的值傳到到bus_abus_a上上語法詳細(xì)講解雙向口建模雙向口建模 注意注意 : 在上頁的例子中,使用在上頁的例子中,使用en_a_ben_a_b和和en_b_a en_b_a 來控制元器件來控制元器件bufifl,bufifl,如果控制信號(hào)同時(shí)有效,則結(jié)果無法確定。如果控制信號(hào)同時(shí)有效,則結(jié)果無法確定。 所以必須把控制信號(hào)所以必須把控制信號(hào) en_a_b en_a_b 和和 en_b_a en_b_a 在時(shí)間上分在時(shí)間上分開。開。使用連續(xù)賦值使用連續(xù)賦值為雙向口建模:為雙向口建模:en_a_ben_a_ben_b_aen_b_abu
24、s_abus_abus_bbus_bmodule 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)當(dāng)en_a_b=1en_a_b=1時(shí),時(shí),bus_abus_a的的值傳到值傳到bus_bbus_b上上當(dāng)當(dāng)en_b_a=1en_b_a=1時(shí),時(shí),bus_bbus_b的的值傳到值傳到bus_abus_a上上語法詳細(xì)講解雙向口建模雙向口建模b2
25、b2b1b1 注意注意 : 在在assignassign語句中,通過語句中,通過en_a_ben_a_b和和en_b_aen_b_a控制控制bus_abus_a與與bus_bbus_b之間的數(shù)據(jù)交換。之間的數(shù)據(jù)交換。 如果控制信號(hào)同時(shí)有效,則結(jié)果不能確定如果控制信號(hào)同時(shí)有效,則結(jié)果不能確定。所以必須所以必須把控制信號(hào)把控制信號(hào) en_a_b en_a_b 和和 en_b_a en_b_a 在時(shí)間上分開。在時(shí)間上分開。語法詳細(xì)講解雙向口建模雙向口建模存儲(chǔ)器的端口建模:存儲(chǔ)器的端口建模:語法詳細(xì)講解雙向口建模雙向口建模module ram_cell(databus,rd.wr);inout dat
26、abus;input rd,wr;reg datareg; assign databus=rd? datareg:bz; always (negedge wr) datareg=databus;endmodule當(dāng)當(dāng)rdrd等于等于1 1時(shí)時(shí)dataregdatareg的的值被賦給值被賦給databusdatabus當(dāng)當(dāng)wrwr的下降沿到達(dá)時(shí),的下降沿到達(dá)時(shí),databusdatabus的值被寫入的值被寫入dataregdatareg測試模塊測試模塊RAMRAM單元單元數(shù)據(jù)總線數(shù)據(jù)總線數(shù)據(jù)數(shù)據(jù)寄存寄存器器rdrdwrwr 注意注意 : 上頁中存儲(chǔ)單元在上頁中存儲(chǔ)單元在wrwr的下降沿到達(dá)時(shí)存入
27、數(shù)據(jù)。的下降沿到達(dá)時(shí)存入數(shù)據(jù)。上頁模塊在上頁模塊在 wrwr處于高電平時(shí),通過數(shù)據(jù)總線寫入數(shù)處于高電平時(shí),通過數(shù)據(jù)總線寫入數(shù)據(jù),但必須保證據(jù),但必須保證wrwr的高電平維持時(shí)間長于數(shù)據(jù)的寫的高電平維持時(shí)間長于數(shù)據(jù)的寫入時(shí)間。入時(shí)間。 在在rdrd處于高電平時(shí),上述存儲(chǔ)單元通過數(shù)據(jù)總線處于高電平時(shí),上述存儲(chǔ)單元通過數(shù)據(jù)總線讀出數(shù)據(jù)。由于此模型為單口存儲(chǔ)模型,因此讀出數(shù)據(jù)。由于此模型為單口存儲(chǔ)模型,因此wrwr變變低電平時(shí),低電平時(shí),rdrd不能同時(shí)為高電平,否則就無法確定不能同時(shí)為高電平,否則就無法確定存儲(chǔ)器的讀出存儲(chǔ)器的讀出/ /寫入的結(jié)果。寫入的結(jié)果。語法詳細(xì)講解雙向口建模雙向口建模目標(biāo)目標(biāo)
28、: 學(xué)會(huì)怎樣定義或調(diào)用任務(wù)和函數(shù)。學(xué)會(huì)怎樣定義或調(diào)用任務(wù)和函數(shù)。 學(xué)會(huì)怎樣使用命名塊。學(xué)會(huì)怎樣使用命名塊。 學(xué)會(huì)怎樣禁止命名塊和任務(wù)。學(xué)會(huì)怎樣禁止命名塊和任務(wù)。 理解有限狀態(tài)機(jī)的作用,學(xué)會(huì)如何顯式理解有限狀態(tài)機(jī)的作用,學(xué)會(huì)如何顯式地為有限狀態(tài)機(jī)建模。地為有限狀態(tài)機(jī)建模。語法詳細(xì)講解第十六部分第十六部分 VerilogVerilog中的高級(jí)結(jié)構(gòu)中的高級(jí)結(jié)構(gòu) 通過把代碼分成小的模塊或者使用任務(wù)和函數(shù),可把一項(xiàng)任務(wù)分成許多較小的、易于管理的部分,從而提高代碼的可讀性、可維護(hù)性和可重用性。任務(wù) 一般用于編寫測試模塊,或者行為描述的模塊。 其中可以包含時(shí)間控制(如:# delays, , wait);
29、也可以包含input, output 、inout 端口定義和參數(shù); 也可以調(diào)用其他的任務(wù)或函數(shù)函數(shù) 一般用于計(jì)算,或者用來代替組合邏輯。 不能包含任何延遲;函數(shù)在零時(shí)間執(zhí)行。 函數(shù)只有input變量,雖然沒有output變量, 但可以通過函數(shù)名返回一個(gè)值。 可以調(diào)用其他的函數(shù),但不可以調(diào)用任務(wù)語法詳細(xì)講解VerilogVerilog中的高級(jí)結(jié)構(gòu)中的高級(jí)結(jié)構(gòu)注意: 只能調(diào)用本模塊內(nèi)的任務(wù)和函數(shù)。 在任務(wù)和函數(shù)中不能聲明網(wǎng)絡(luò)連接類型的變量。 所有的輸入和輸出變量實(shí)際上都是本地寄存器 。 只有當(dāng)任務(wù)或函數(shù)調(diào)用并執(zhí)行完后,才能有返回值。 舉例說明: 若任務(wù)或函數(shù)中包含一個(gè)forever循環(huán)時(shí),永遠(yuǎn)無
30、法執(zhí)行完,就不可能有返回值。語法詳細(xì)講解VerilogVerilog中的高級(jí)結(jié)構(gòu)中的高級(jí)結(jié)構(gòu)語法詳細(xì)講解Verilog Verilog 任務(wù)任務(wù) 下面模塊中的任務(wù)含有定時(shí)控制和一個(gè)輸入,并且引用了一個(gè)本模塊的變量,但是沒有輸出,也沒有雙向總線和內(nèi)部變量,不顯示任何內(nèi)容。 用于定時(shí)控制的信號(hào),例如 clk,絕對不能作為任務(wù)的輸入,這是因?yàn)檩斎胫抵幌蛉蝿?wù)內(nèi)部傳遞一次。 module top; reg clk, a, b; DUT u1(out, a, b, clk); always #5 clk=!clk; 語法詳細(xì)講解整數(shù)和實(shí)常數(shù)整數(shù)和實(shí)常數(shù) task neg_clocks; input 31:
31、0 number_of_edges; repeat(number_of_edges) (negedge clk); endtask initial begin clk=0; a=1; b=1; neg_clocks(3); /任務(wù)調(diào)用 a=0; neg_clocks(5); b=0; end endmodule語法詳細(xì)講解Verilog Verilog 任務(wù)任務(wù)要點(diǎn):要點(diǎn):任務(wù)調(diào)用是通過在Verilog模塊中寫入任務(wù)名來實(shí)現(xiàn)的。任務(wù)中可以包含inputinput, outputoutput和inoutinout端口變量的聲明。 傳遞給任務(wù)的變量與任務(wù)I/O端口變量的聲明次序相同。雖然傳遞給任務(wù)
32、的變量名可以和任務(wù)內(nèi)聲明的I/O端口變量名相同,但是為了使任務(wù)成為一個(gè)獨(dú)立的可共用的任務(wù)塊,建議不要使用與任務(wù)內(nèi)聲明的I/O端口變量名相同的變量名,最好給傳遞到任務(wù)的變量起新的不同的名字。在任務(wù)中可以使用時(shí)間控制。任務(wù)使Verilog有更廣闊的適用范圍。關(guān)鍵字disable可以用來禁止任務(wù)的執(zhí)行。語法詳細(xì)講解 Verilog Verilog 任務(wù)任務(wù) 注意注意 : 不要在程序的不同部分同時(shí)調(diào)用同一個(gè)任務(wù)。這是因?yàn)槿蝿?wù)只有一組本地變量,同一時(shí)刻調(diào)用兩次相同的任務(wù)將會(huì)導(dǎo)致錯(cuò)誤。這種情況常發(fā)生在使用定時(shí)控制的任務(wù)中。 在任務(wù)或函數(shù)中,引用父模塊中聲明的變量時(shí)要特別注意(即注意變量的層次命名規(guī)則)。若
33、想在其它模塊中調(diào)用任務(wù)或函數(shù),該任務(wù)和函數(shù)中所使用的變量必須全都包含在輸入/輸出口列表中。語法詳細(xì)講解 Verilog Verilog 任務(wù)任務(wù) 下面模塊中的任務(wù)只含有一個(gè)雙向總線(inout)端口和一個(gè)內(nèi)部變量,沒有其它輸入端口、輸出端口和定時(shí)控制,沒有引用模塊變量,不顯示任何內(nèi)容。 在任務(wù)調(diào)用時(shí),任務(wù)的輸入變量(端口)在任務(wù)內(nèi)部被當(dāng)作寄存器類型變量處理。 parameter MAX_BITS=8; reg MAX_BITS:1 D; task reverse_bits; inout 7:0 data; /雙向總線端口被當(dāng)作寄存器類型!雙向總線端口被當(dāng)作寄存器類型! integer K; f
34、or (k=0; kMAX_BITS; K=K+1) reverse_bits MAXBITS (K+1) = dataK; endtask always (posedge clk) reverse_bits (D); 語法詳細(xì)講解Verilog Verilog 任務(wù)任務(wù) 下面模塊中定義的任務(wù)含有輸入、輸出、時(shí)間控制和一個(gè)內(nèi)部變量,并且引用了一個(gè)本模塊的變量,但是沒有輸出,不顯示任何內(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; outp
35、ut 7:0 out; reg 15:0 out; always (posedge clk) multme(a, b, out); /任務(wù)調(diào)用語法詳細(xì)講解Verilog Verilog 任務(wù)任務(wù) task multme; /任務(wù)定義 input 3:0 xme, tome; output 7:0 result; wait (en_mult) result=xme*tome; endtask endmodule語法詳細(xì)講解Verilog Verilog 任務(wù)任務(wù)module orand (a, b, c, d, e, out); input 7:0 a, b, c, d, e; output 7
36、:0 out; reg 7:0 out; always (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); else f_or_and=0; endfunctionendmodule語法詳細(xì)講解Verilog Verilog 函數(shù)函數(shù) 雖然函數(shù)不能包含定時(shí)控制,但是可以在包含定時(shí)控制的過程塊中調(diào)用函數(shù)。 在模塊中,使用名為f_or_and的函數(shù)時(shí),
37、是把它作為名為f_or_and 的寄存器類型變量來處理的。要點(diǎn)要點(diǎn)函數(shù)定義不能包含任何定時(shí)控制語句。函數(shù)必須至少有一個(gè)輸入,但絕不能含有任何輸出和總線口;一個(gè)函數(shù)只能返回一個(gè)值,該值的變量名與函數(shù)同名,數(shù)據(jù)類型默認(rèn)為reg類型。傳遞給函數(shù)的變量順序與函數(shù)輸入口聲明的順序相同。函數(shù)定義必須包含在模塊定義之內(nèi)。函數(shù)不能調(diào)用任務(wù),但任務(wù)可以調(diào)用函數(shù)。函數(shù)使Verilog有更廣闊的適用范圍。語法詳細(xì)講解Verilog Verilog 函數(shù)函數(shù)雖然函數(shù)只能返回一個(gè)值,但是它的返回值可以直接賦給一個(gè)由多個(gè)子信號(hào)拼接構(gòu)成的信號(hào)變量, 使其實(shí)際等效于產(chǎn)生了多個(gè)輸出。 o1, o2, o3, o4=f_or_a
38、nd(a, b, c, d, e);語法詳細(xì)講解Verilog Verilog 函數(shù)函數(shù)在函數(shù)定義時(shí),如果在函數(shù)名前面定義了位寬,該函數(shù)就可以返回由多位構(gòu)成的矢量。如果定義函數(shù)的語句比較多時(shí),可以用 begin 和end 把它們組合起來。在函數(shù)內(nèi),無論以函數(shù)名命名的變量被賦了多少次值,函數(shù)只有一個(gè)返回值。下例中的函數(shù),聲明了一個(gè)內(nèi)部整型變量。舉例說明如下: module foo; input 7:0 loo; /也可以用連續(xù)賦值語句調(diào)用函數(shù) wire 7:0 goo = zero_count (loo); function 3:0 zero_count; input 7:0 in_bus; i
39、nteger I; begin zero_count = 0; for (I=0; I8; I= I+1) if (!in_busI) zero_count = zero_count +1; end endfunction endmodule 語法詳細(xì)講解Verilog Verilog 函數(shù)函數(shù) 若把函數(shù)定義為整型、實(shí)型或時(shí)間類型, 就可以返回相應(yīng)類型的數(shù)據(jù)。我們可以在任何類型的表達(dá)式中調(diào)用函數(shù)。 module checksub(neg,in_a,in_b); output neg; input a, b; reg neg; function integer subtr; input 7:0
40、in_a, in_b; subtr = in_a in_b; /運(yùn)算結(jié)果可以為負(fù)數(shù) endfunction always (a or b) begin if ( subtr (a,b) 0) neg = 1; else neg = 0; end endmodule 語法詳細(xì)講解Verilog Verilog 函數(shù)函數(shù) 函數(shù)類型、端口和行為定義時(shí)也可以使用參數(shù), 這樣就可以構(gòu)成參數(shù)化函數(shù)使其返回的數(shù)據(jù)類型、輸入端口的位寬等很容易做修改。所以參數(shù)化函數(shù)就有更廣泛的適用范圍。 . parameter MAX_BITS =8; reg MAX_BITS:1 D; function MAX_BIT:1
41、reverse_bits; input 7:0 data; for(K=0; K MAX_BITS; K=K+1) reverse_bits MAX_BITS (K+1) = data K; endfunction always (posedge clk) begin . D= reverse_bits(D); . end 語法詳細(xì)講解Verilog Verilog 函數(shù)函數(shù)語法詳細(xì)講解命名塊命名塊可以通過在關(guān)鍵字begin或fork后加上:塊名來給塊命名。 module named_blk; begin :seq_blk end fork : par_blk join endmodule可以
42、在命名塊中聲明本地變量??梢允褂胐isable禁止命名塊。注意:命名塊使Verilog有更廣闊的適用范圍。命名塊的使用縮短了仿真的時(shí)間。語法詳細(xì)講解命名塊命名塊語法詳細(xì)講解禁止命名塊和任務(wù)禁止命名塊和任務(wù)module do_arith(out, a, b, c, d, e, clk, en_mult);input clk, en_mult;input 7:0 a, b, c, d, e;output 15:0 out;reg 14:0 out; always (posedge clk) begin : arith_block /*命名名為arith_block的塊* reg 3:0 tmp1,
43、 tmp2; /*本地變量* tmp, tmp2=f_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 /停止計(jì)算 disable multme; /*禁止任務(wù)的執(zhí)行* diable arith_block; /*禁止命名塊的執(zhí)行* end /在此定義任務(wù)和函數(shù) .endmodle注意:注意:disabledisable語句用來終止命名塊或任務(wù)的執(zhí)行。這是指在尚未執(zhí)行該命名塊或任務(wù)任何一條語句前,就從該命名塊/任務(wù)執(zhí)行中返回。 語
44、法:語法: disable 塊名 或 disable 任務(wù)名禁止執(zhí)行命名塊或任務(wù)后,所有在事件隊(duì)列中由該命名塊/任務(wù)安排的事件都將被刪除。一般 情況下disable語句是不可綜合的。在上頁的例子中,只禁止命名塊也可以得到預(yù)期的結(jié)果:命名塊中所有的事件,包括任務(wù)和函數(shù)的執(zhí)行都將被取消。語法詳細(xì)講解禁止命名塊和任務(wù)禁止命名塊和任務(wù)語法詳細(xì)講解有限狀態(tài)機(jī)(有限狀態(tài)機(jī)(FSM)FSM)隱式隱式FSM:不需要狀態(tài)寄存器仿真更加有效只能很好地處理線性的狀態(tài)改變大部分綜合工具不支持隱式FSMstate 1state 1state 2state 2state 3state 3state 4state 4語法詳
45、細(xì)講解編譯引導(dǎo)語句編譯引導(dǎo)語句顯式顯式FSM:結(jié)構(gòu)比較復(fù)雜可以很方便的用來處理默認(rèn)狀態(tài)能夠處理復(fù)雜的狀態(tài)改變所有的綜合工具均支持顯式FSM 的綜合語法詳細(xì)講解有限狀態(tài)機(jī)(有限狀態(tài)機(jī)(FSM)FSM)state Astate Astate B1state B1state B2state B2state Cstate Cstate Dstate D注意:注意:在隱式狀態(tài)機(jī)中,只要發(fā)生在一個(gè)時(shí)鐘周期內(nèi)寫數(shù)據(jù),在另一個(gè)時(shí)鐘周期內(nèi)讀數(shù)據(jù)的情況,都會(huì)生成寄存器。任何狀態(tài)機(jī)都必須有復(fù)位控制信號(hào),狀態(tài)的改變必需只與某單一時(shí)鐘信號(hào)沿同步。一般情況下,如果狀態(tài)改變比較簡單,又定義得比較好,而且綜合工具支持隱式狀態(tài)
46、機(jī)的綜合,就可以使用隱式狀態(tài)機(jī)。如果狀態(tài)改變比較復(fù)雜,最好使用顯式狀態(tài)機(jī),這樣效果更好。隱式狀態(tài)機(jī)屬于行為級(jí),不屬于RTL級(jí)。代碼中主要包含循環(huán)語句、嵌入的定時(shí)控制,有時(shí)也含有命名事件、wait 和 disable 語句。一般情況下,常用的綜合工具不支持隱式狀態(tài)機(jī)的綜合。語法詳細(xì)講解有限狀態(tài)機(jī)(有限狀態(tài)機(jī)(FSMs)FSMs)語法詳細(xì)講解顯式有限狀態(tài)機(jī)顯式有限狀態(tài)機(jī)module exp(out, datain, clk, rst);input clk, rst, datain;output out; reg out;reg state;always (posedge clk or posedg
47、e rst) if(rst) state, out=2b00; else case(state) 1b0: begin out=1b0; if(!datain) state=1b0; else state=1b1; end 1b1 begin狀態(tài)變量狀態(tài)變量語法詳細(xì)講解顯式有限狀態(tài)機(jī)顯式有限狀態(tài)機(jī)casecase語句語句0 01 1datain = 0datain = 0datain = 1datain = 1 out=datain; state=1b0; end default: state, out=2b00; endcaseendmodule注:在過程塊中可以使用一個(gè)時(shí)鐘沿和 case
48、語句來描述一個(gè)顯式狀態(tài)機(jī)。必須指定一個(gè)狀態(tài)變量,來記錄狀態(tài)機(jī)的狀態(tài)。要改變當(dāng)前的狀態(tài),必須改變狀態(tài)變量的值, 其改變要與時(shí)鐘沿同步。寫得比較好的狀態(tài)機(jī)常為不應(yīng)產(chǎn)生的條件規(guī)定一個(gè)默認(rèn)動(dòng)作。語法詳細(xì)講解顯式有限狀態(tài)機(jī)顯式有限狀態(tài)機(jī)轉(zhuǎn)到下一個(gè)狀態(tài)轉(zhuǎn)到下一個(gè)狀態(tài)默認(rèn)狀態(tài)指針默認(rèn)狀態(tài)指針0 01 11 10 01 1識(shí)別1111序列clkclkrstrstoutout begin: seq_block out=1b0; if(!datain) /狀態(tài)一:輸出零 disable seq_block; (posedge clk) /狀態(tài)二:輸出第二位 out=datain; endendmodule語法詳細(xì)
49、講解隱式有限狀態(tài)機(jī)隱式有限狀態(tài)機(jī)0 01 11 10 01 1識(shí)別1111序列clkclkrstrstoutout注意:注意:在過程塊中可以使用多個(gè)時(shí)鐘沿(即每次狀態(tài)改變都用一個(gè)新的時(shí)鐘沿)、條件語句、循環(huán)語句、disable語句來描述隱式FSM。隱式FSM往往是不可綜合的。隱式FSM不必指定狀態(tài)變量。當(dāng)下一個(gè)激活時(shí)鐘沿到達(dá)時(shí),狀態(tài)就有可能發(fā)生改變。下一個(gè)狀態(tài)是否改變,將由條件語句決定;除非用強(qiáng)制性語句使?fàn)顟B(tài)重復(fù)(例如:用循環(huán)語句或用disable語句來強(qiáng)制改變狀態(tài)),在隱式狀態(tài)機(jī)中,很難規(guī)定一個(gè)默認(rèn)動(dòng)作。語法詳細(xì)講解隱式有限狀態(tài)機(jī)隱式有限狀態(tài)機(jī)目標(biāo)目標(biāo)學(xué)會(huì)怎樣使用用戶定義的原語來創(chuàng)建邏輯。學(xué)
50、會(huì)怎樣使用用戶定義的原語來創(chuàng)建邏輯。用戶定義的源語元件用戶定義的源語元件 (UDP) 其行為與其行為與 Verilog 語法中語法中本來就存在的本來就存在的primitive(源語元件)相似,它用一個(gè)表源語元件)相似,它用一個(gè)表格來定義它的邏輯功能。格來定義它的邏輯功能。語法詳細(xì)講解第十七部分第十七部分 用戶定義的原語用戶定義的原語在 Verilog 結(jié)構(gòu)建模時(shí),可以使用:二十多個(gè)門級(jí)源語元件(primitives)。用戶定義的源語元件(UDP)。UDP 可用于ASIC 庫中的基本元件(cell)設(shè)計(jì),以及小規(guī)模芯片和中規(guī)模芯片的設(shè)計(jì)。使用 UDP可以在現(xiàn)有的Verilog 語言支持的源語元件
51、的基礎(chǔ)上編寫新的源語元件。UDP 是一個(gè)獨(dú)立元件, 不能用實(shí)例調(diào)用的方法調(diào)用其他的模塊。UDP 既可以用來表示時(shí)序邏輯元件,也可以表示組合邏輯元件。UDP 的行為是使用真值表來描述的 。調(diào)用 UDP 的方式與調(diào)用Verilog語言提供的源語元件的方式相同。語法詳細(xì)講解什么是什么是UDPUDP?注意:UDP 是一種緊湊的表示簡單邏輯關(guān)系部件的方法。在Verilog語言提供的幾種基本源語元件中,若在輸入中包含不確定值x,則在輸出時(shí)可能出現(xiàn)不確定值 x;而在 UDP 中則不允許出現(xiàn)此種情況。由幾個(gè)原語元件組成的邏輯可以用一個(gè)UDP表示。在仿真時(shí)使用這樣的UDP來代替分散的原語元件可以節(jié)省計(jì)算資源,加
52、快仿真速度。一般的仿真器處理行為模型表示的邏輯所需時(shí)間比處理用門級(jí)語句表示的相同邏輯所需時(shí)間少;而硬件仿真器正好相反。 語法詳細(xì)講解什么是什么是UDPUDP?UDP 只能有一個(gè)輸出端,而且必須是端口說明列表的第一項(xiàng)。UDP 可以有多個(gè)輸入端,最多允許有 10 個(gè)。UDP 所有端口變量必須是標(biāo)量,不允許使用雙向端口。UDP 不支持Z(高阻)邏輯值。在仿真的開始時(shí)刻,可以使用 initial 語句把UDP 的輸出初始化為一個(gè)已知值。UDP 不支持綜合,即不能通過綜合把它轉(zhuǎn)變?yōu)殚T級(jí)結(jié)構(gòu)邏輯。語法詳細(xì)講解 UDPUDP的特點(diǎn)的特點(diǎn)注:UDP 只能有一個(gè)輸出。如果邏輯功能要求有多個(gè)輸出端時(shí),則需要把其它
53、的原語元件連接到 UDP的 輸出,或同時(shí)使用多個(gè) UDP,保證其最終輸出只有一個(gè)。UDP 輸入端最多可以有 10 個(gè),但是當(dāng)輸入端的個(gè)數(shù)多于 5 個(gè)時(shí),仿真時(shí)需要的內(nèi)存?zhèn)€數(shù)將呈現(xiàn)近似指數(shù)的增加。下表列出了當(dāng)輸入數(shù)目不同時(shí),在仿真過程中,對每個(gè)輸入信號(hào),計(jì)算機(jī)中所需要開銷的內(nèi)存數(shù)目。語法詳細(xì)講解 UDPUDP的特點(diǎn)的特點(diǎn)語法詳細(xì)講解 UDPUDP的特點(diǎn)的特點(diǎn) 輸入端口的個(gè)數(shù)輸入端口的個(gè)數(shù)所需內(nèi)存的字節(jié)數(shù)所需內(nèi)存的字節(jié)數(shù)1-5165717856918710623組合邏輯示例:組合邏輯示例:2-1 多路器多路器語法詳細(xì)講解舉例說明舉例說明primitive multiplexer(o, a, b,
54、s); output o; input s, a, b; table / a b s : o 0 ? 1 : 0; 1 ? 1 : 1; ? 0 0 : 0; ? 1 0 : 1; 0 0 x : 0; 1 1 x : 1; endtableendprimitive原語名原語名輸出端口必須為輸出端口必須為第一個(gè)端口第一個(gè)端口注:注:在模塊外定義 UDP 。如果在表中沒有規(guī)定輸入組合,將輸出不確定邏輯值 (x)。表的列中元素的順序應(yīng)與端口列表中的一致。表中的 ?的意義是:重復(fù)的輸入 0,1或 任意不確定邏輯值(x)。表中開始兩行表示:當(dāng) s等于 1 時(shí),不管 b 邏輯值如何變化,輸出 o 將與
55、輸入 a 保持一致。 表中的下兩行表示:當(dāng) s 等于 0 時(shí),不管 a邏輯值如何變化,輸出 o 將與輸入 b 保持一致。 表中 的最后兩行使此器件的描述更加的全面、準(zhǔn)確。它們表示:當(dāng)輸入 a 和 b 的邏輯值相同時(shí),如果 sel 邏輯值不確定,則輸出 o 的值 將與輸入 a 和 b 的值相同。這種行為不能使用 Verilog 語言提供的基本源語元件進(jìn)行建模。UDP 將 x 作為實(shí)際的未知值,而不是 Verilog 語言邏輯值來進(jìn)行處理,因此使其比Verilog語言提供的基本源語元件更加準(zhǔn)確。語法詳細(xì)講解舉例說明舉例說明可以只使用兩個(gè) UDP 來描述全加器的邏輯功能。/ 全加器進(jìn)位實(shí)現(xiàn)部分pri
56、mitive U_ADDR2_C (CO, A, B, CI); output CO; input A, B, CI, table / A B CI : CO 1 1 ? : 1; 1 ? 1 : 1; ? 1 1 : 1; 0 0 ? : 0; 0 ? 0 : 0; ? 0 0 : 0; endtalbeendprimitive語法詳細(xì)講解組合邏輯示例:全加器組合邏輯示例:全加器向上一級(jí)進(jìn)位下一級(jí)來的進(jìn)位/全加器求和實(shí)現(xiàn)部分primitive U_ADDR2_S(S, A, B,CI); output S; input A, B, CI; table / A B CI : S 0 0 0 :
57、 0; 0 0 1 : 1; 0 1 0 : 1; 0 1 1 : 0; 1 0 0 : 1; 1 0 1 : 0; 1 1 0 : 0; 1 1 1 : 1; endtableendprimitive語法詳細(xì)講解組合邏輯示例:全加器組合邏輯示例:全加器 若使用 UDP 設(shè)計(jì)全加器,僅需要兩個(gè) UDP; 而使用 Verilog 原語元件,則需要 5 個(gè)Verilog語言提供的基本原語元件。當(dāng)設(shè)計(jì)需要使用大量全加器時(shí),采用UDP來表示全加器,將大大減少內(nèi)存的需要。事件的數(shù)目將大大降低。?表示邏輯值可以為 0,1或 x。語法詳細(xì)講解組合邏輯示例:全加器組合邏輯示例:全加器primitive lat
58、ch(q, clock, data); output q; reg q; input clock, data; initial q=1b1; table / clock data current next / state state 0 1 : ? 1; 0 0 : ? 0; 1 ? : : -; endtableendprimitive語法詳細(xì)講解電平敏感的時(shí)序邏輯示例:鎖存器電平敏感的時(shí)序邏輯示例:鎖存器 注意此寄存器的用法,注意此寄存器的用法,此寄存器用來存儲(chǔ)。此寄存器用來存儲(chǔ)。輸出初始化為輸出初始化為 11b1.b1. ? ? 表示無須考慮輸入表示無須考慮輸入和當(dāng)前狀態(tài)的值和當(dāng)前狀態(tài)的
59、值注:鎖存器的動(dòng)作行為如下: 當(dāng)時(shí)鐘信號(hào)為 0時(shí),輸入數(shù)據(jù)的值直接傳給輸出。 當(dāng)時(shí)鐘信號(hào)為1時(shí),輸出保持當(dāng)前狀態(tài)不變。next state 欄中的 “-” 表示輸出保持不變。輸出必須定義為寄存器類型,用來保存前一個(gè)狀態(tài)。initial q=1b1; 是時(shí)序 UDP 的初始化語句。使用此語句可以在仿真的開始對輸出進(jìn)行賦值。 在實(shí)際的部件模型中,很少使用初始賦值。但在測試 UDP 的功能時(shí),初始賦值相當(dāng)有用。語法詳細(xì)講解電平敏感的時(shí)序邏輯示例:鎖存器電平敏感的時(shí)序邏輯示例:鎖存器注:鎖存器的動(dòng)作行為如下: 當(dāng)時(shí)鐘信號(hào)為 0時(shí),輸入數(shù)據(jù)的值直接傳給輸出。 當(dāng)時(shí)鐘信號(hào)為1時(shí),輸出保持當(dāng)前狀態(tài)不變。ne
60、xt state 欄中的 “-” 表示輸出保持不變。輸出必須定義為寄存器類型,用來保存前一個(gè)狀態(tài)。initial q=1b1; 是時(shí)序 UDP 的初始化語句。使用此語句可以在仿真的開始對輸出進(jìn)行賦值。 在實(shí)際的部件模型中,很少使用初始賦值。但在測試 UDP 的功能時(shí),初始賦值相當(dāng)有用。語法詳細(xì)講解電平觸發(fā)時(shí)序邏輯的示例:鎖存器電平觸發(fā)時(shí)序邏輯的示例:鎖存器primitive d_edge_ff (q, clk, data);output q;input clk, data;reg q;table / clk dat state next (01) 0 : ? : 0; (01) 1 : ? : 1; (0 x) 1
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年鉛壓延加工材合作協(xié)議書
- 2025年清理去石設(shè)備合作協(xié)議書
- 八年級(jí)英語下冊 Unit 9 單元綜合測試卷(人教陜西版 2025年春)
- 2024-2025學(xué)年四川省南充市高坪區(qū)四年級(jí)(上)期末數(shù)學(xué)試卷
- 2025年臨滄市三方合作出資協(xié)議范文(2篇)
- 2025年產(chǎn)品購銷買賣合同(2篇)
- 2025年產(chǎn)權(quán)交易所項(xiàng)目掛牌服務(wù)協(xié)議(6篇)
- 2025年個(gè)人門面出租合同標(biāo)準(zhǔn)樣本(2篇)
- 2025年五年級(jí)語文教學(xué)鑒定總結(jié)模版(三篇)
- 2025年代理委托處理房地產(chǎn)協(xié)議(2篇)
- 《中電聯(lián)團(tuán)體標(biāo)準(zhǔn)-220kV變電站并聯(lián)直流電源系統(tǒng)技術(shù)規(guī)范》
- 中國主要蜜源植物蜜源花期和分布知識(shí)
- 電化學(xué)免疫傳感器的應(yīng)用
- 數(shù)據(jù)中心基礎(chǔ)知識(shí)培訓(xùn)-2024鮮版
- 供電企業(yè)輿情的預(yù)防及處置
- 【高中語文】《氓》課件++統(tǒng)編版+高中語文選擇性必修下冊
- T-WAPIA 052.3-2023 無線局域網(wǎng)設(shè)備技術(shù)規(guī)范 第3部分:接入點(diǎn)和控制器
- 第4課+中古時(shí)期的亞洲(教學(xué)設(shè)計(jì))-【中職專用】《世界歷史》(高教版2023基礎(chǔ)模塊)
- 金點(diǎn)子活動(dòng)總結(jié)匯報(bào)
- 運(yùn)動(dòng)技能學(xué)習(xí)與控制完整
- 原料驗(yàn)收標(biāo)準(zhǔn)知識(shí)培訓(xùn)課件
評論
0/150
提交評論