Verilog中的高級(jí)結(jié)構(gòu)_第1頁
Verilog中的高級(jí)結(jié)構(gòu)_第2頁
Verilog中的高級(jí)結(jié)構(gòu)_第3頁
Verilog中的高級(jí)結(jié)構(gòu)_第4頁
Verilog中的高級(jí)結(jié)構(gòu)_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、verilog中的高級(jí)結(jié)構(gòu)學(xué)習(xí)內(nèi)容:學(xué)習(xí)內(nèi)容: 任務(wù)和函數(shù)的定義和調(diào)用任務(wù)和函數(shù)的定義和調(diào)用 怎樣使用命名塊怎樣使用命名塊 怎樣禁止命名塊和任務(wù)怎樣禁止命名塊和任務(wù) 有限狀態(tài)機(jī)(有限狀態(tài)機(jī)(fsm)及建模)及建模verilog的任務(wù)及函數(shù)的任務(wù)及函數(shù) 結(jié)構(gòu)化設(shè)計(jì)是將任務(wù)分解為較小的,更易管理的單元,并將可重用代結(jié)構(gòu)化設(shè)計(jì)是將任務(wù)分解為較小的,更易管理的單元,并將可重用代碼進(jìn)行封裝。這通過將設(shè)計(jì)分成模塊,或任務(wù)和函數(shù)實(shí)現(xiàn)。碼進(jìn)行封裝。這通過將設(shè)計(jì)分成模塊,或任務(wù)和函數(shù)實(shí)現(xiàn)。任務(wù)(任務(wù)(task) 通常用于調(diào)試,或?qū)τ布M(jìn)行行為描述通常用于調(diào)試,或?qū)τ布M(jìn)行行為描述 可以包含時(shí)序控制(可以包含時(shí)序

2、控制(#延遲,延遲,, wait) 可以有可以有 input,output,和,和inout參數(shù)參數(shù) 可以調(diào)用其他任務(wù)或函數(shù)可以調(diào)用其他任務(wù)或函數(shù)函數(shù)函數(shù)(function) 通常用于計(jì)算,或描述組合邏輯通常用于計(jì)算,或描述組合邏輯 不能包含任何延遲;函數(shù)仿真時(shí)間為不能包含任何延遲;函數(shù)仿真時(shí)間為0 只含有只含有input參數(shù)并由函數(shù)名返回一個(gè)結(jié)果參數(shù)并由函數(shù)名返回一個(gè)結(jié)果 可以調(diào)用其他函數(shù),但不能調(diào)用任務(wù)可以調(diào)用其他函數(shù),但不能調(diào)用任務(wù)verilog的任務(wù)及函數(shù)的任務(wù)及函數(shù)任務(wù)和函數(shù)必須在任務(wù)和函數(shù)必須在module內(nèi)調(diào)用內(nèi)調(diào)用在任務(wù)和函數(shù)中不能聲明在任務(wù)和函數(shù)中不能聲明wire所有輸入所有

3、輸入/輸出都是輸出都是局部局部寄存器寄存器任務(wù)任務(wù)/函數(shù)執(zhí)行完成后才返回結(jié)果。函數(shù)執(zhí)行完成后才返回結(jié)果。 例如,若任務(wù)例如,若任務(wù)/函數(shù)中有函數(shù)中有forever語句,則永遠(yuǎn)不會(huì)返回結(jié)果語句,則永遠(yuǎn)不會(huì)返回結(jié)果任務(wù)任務(wù) 下面的任務(wù)中含有時(shí)序控制和一個(gè)輸入,并引用了一個(gè)下面的任務(wù)中含有時(shí)序控制和一個(gè)輸入,并引用了一個(gè)module變量,變量,但沒有輸出、輸入輸出和內(nèi)部變量,也不顯示任何結(jié)果。但沒有輸出、輸入輸出和內(nèi)部變量,也不顯示任何結(jié)果。 時(shí)序控制中使用的信號(hào)(例如時(shí)序控制中使用的信號(hào)(例如ck)一定不能作為任務(wù)的輸入,因?yàn)椋┮欢ú荒茏鳛槿蝿?wù)的輸入,因?yàn)檩斎胫抵幌蛟撊蝿?wù)傳送一次。輸入值只向該任務(wù)

4、傳送一次。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( number_of_edges) ( negedge clk); endtask initial begin clk = 0; a = 1; b = 1; neg_clocks(3); / 任務(wù)調(diào)用任務(wù)調(diào)用 a = 0; neg_clocks (5); b = 0; endendmodule任務(wù)任務(wù)任務(wù)可以有任務(wù)可以有input,ou

5、tput 和和 inout參數(shù)。參數(shù)。傳送到任務(wù)的參數(shù)和與任務(wù)傳送到任務(wù)的參數(shù)和與任務(wù)i/o說明順序相同。盡管傳送到任務(wù)的參數(shù)名說明順序相同。盡管傳送到任務(wù)的參數(shù)名稱與任務(wù)內(nèi)部稱與任務(wù)內(nèi)部i/o說明的名字可以相同,但在實(shí)際中這通常不是一個(gè)好的說明的名字可以相同,但在實(shí)際中這通常不是一個(gè)好的方法。參數(shù)名的唯一性可以使任務(wù)具有好的模塊性。方法。參數(shù)名的唯一性可以使任務(wù)具有好的模塊性??梢栽谌蝿?wù)內(nèi)使用時(shí)序控制??梢栽谌蝿?wù)內(nèi)使用時(shí)序控制。在在verilog中任務(wù)定義一個(gè)新范圍(中任務(wù)定義一個(gè)新范圍(scope)要禁止任務(wù),使用關(guān)鍵字要禁止任務(wù),使用關(guān)鍵字disable 。 主要特點(diǎn):主要特點(diǎn): 從代碼

6、中多處調(diào)用任務(wù)時(shí)要小心。從代碼中多處調(diào)用任務(wù)時(shí)要小心。因?yàn)槿蝿?wù)的局部變量的只有一個(gè)拷貝,并因?yàn)槿蝿?wù)的局部變量的只有一個(gè)拷貝,并行調(diào)用任務(wù)可能導(dǎo)致錯(cuò)誤的結(jié)果。在任務(wù)中使用時(shí)序控制時(shí)這種情況時(shí)常發(fā)生。行調(diào)用任務(wù)可能導(dǎo)致錯(cuò)誤的結(jié)果。在任務(wù)中使用時(shí)序控制時(shí)這種情況時(shí)常發(fā)生。 在任務(wù)或函數(shù)中引用調(diào)用模塊的變量時(shí)要小心。在任務(wù)或函數(shù)中引用調(diào)用模塊的變量時(shí)要小心。如果想使任務(wù)或函數(shù)能從另如果想使任務(wù)或函數(shù)能從另一個(gè)模塊調(diào)用,則所有在任務(wù)或函數(shù)內(nèi)部用到的變量都必須列在端口列表中。一個(gè)模塊調(diào)用,則所有在任務(wù)或函數(shù)內(nèi)部用到的變量都必須列在端口列表中。任務(wù)任務(wù) 下面的任務(wù)中有輸入,輸出,時(shí)序控制和一個(gè)內(nèi)部變量,并且

7、引用了下面的任務(wù)中有輸入,輸出,時(shí)序控制和一個(gè)內(nèi)部變量,并且引用了一個(gè)一個(gè)module變量。但沒有雙向端口,也沒有顯示。變量。但沒有雙向端口,也沒有顯示。 任務(wù)調(diào)用時(shí)的參數(shù)按任務(wù)定義的順序列出。任務(wù)調(diào)用時(shí)的參數(shù)按任務(wù)定義的順序列出。 module mult (clk, a, b, out, en_mult); input clk, en_mult; input 3: 0 a, b; output 7: 0 out; reg 7: 0 out; always ( posedge clk) multme (a, b, out); / 任務(wù)調(diào)用任務(wù)調(diào)用 task multme; / 任務(wù)定義任務(wù)定義

8、 input 3: 0 xme, tome; output 7: 0 result; wait (en_mult) result = xme * tome; endtaskendmodule函數(shù)(函數(shù)(function)函數(shù)中不能有時(shí)序控制,但調(diào)用它的過程可以有時(shí)序控制。函數(shù)中不能有時(shí)序控制,但調(diào)用它的過程可以有時(shí)序控制。函數(shù)名函數(shù)名f_or_and在函數(shù)中作為在函數(shù)中作為register使用使用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 (

9、 a or b or c or d or e) out = f_or_and (a, b, c, d, e); / 函數(shù)調(diào)用函數(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函數(shù)函數(shù)主要特性:主要特性:函數(shù)定義中不能包含任何時(shí)序控制語句。函數(shù)定義中不能包含任何時(shí)序控制語句。函數(shù)至少有一個(gè)輸入,不能包含任何輸出或雙向端口。函數(shù)至少有一個(gè)輸入,不能包含任何輸出或雙向端口。函

10、數(shù)只返回一個(gè)數(shù)據(jù),其缺省為函數(shù)只返回一個(gè)數(shù)據(jù),其缺省為reg類型。類型。傳送到函數(shù)的參數(shù)順序和函數(shù)輸入?yún)?shù)的說明順序相同。傳送到函數(shù)的參數(shù)順序和函數(shù)輸入?yún)?shù)的說明順序相同。函數(shù)在模塊(函數(shù)在模塊(module)內(nèi)部定義。內(nèi)部定義。函數(shù)不能調(diào)用任務(wù),但任務(wù)可以調(diào)用函數(shù)。函數(shù)不能調(diào)用任務(wù),但任務(wù)可以調(diào)用函數(shù)。函數(shù)在函數(shù)在verilog中定義了一個(gè)新的范圍(中定義了一個(gè)新的范圍(scope)。雖然函數(shù)只返回單個(gè)值,但返回的值可以直接給信號(hào)連接賦值。雖然函數(shù)只返回單個(gè)值,但返回的值可以直接給信號(hào)連接賦值。這在需要有多個(gè)輸出時(shí)非常有效。這在需要有多個(gè)輸出時(shí)非常有效。 o1, o2, o3, o4 = f

11、_ or_ and (a, b, c, d, e);函數(shù)函數(shù) 要返回一個(gè)向量值(多于一位),在函數(shù)定義時(shí)在函數(shù)名前說明范要返回一個(gè)向量值(多于一位),在函數(shù)定義時(shí)在函數(shù)名前說明范圍。函數(shù)中需要多條語句時(shí)用圍。函數(shù)中需要多條語句時(shí)用begin和和end。 不管在函數(shù)內(nèi)對(duì)函數(shù)名進(jìn)行多少次賦值,值只返回一次。下例中,不管在函數(shù)內(nèi)對(duì)函數(shù)名進(jìn)行多少次賦值,值只返回一次。下例中,函數(shù)還在內(nèi)部聲明了一個(gè)整數(shù)。函數(shù)還在內(nèi)部聲明了一個(gè)整數(shù)。 module foo; input 7: 0 loo; output 7: 0 goo;/ 可以持續(xù)賦值中調(diào)用函數(shù)可以持續(xù)賦值中調(diào)用函數(shù) wire 7: 0 goo = z

12、ero_count ( loo ); function 3: 0 zero_count; input 7: 0 in_ bus; integer i; begin zero_count = 0; for (i = 0; i 8; i = i + 1) if (! in_bus i ) zero_count = zero_count + 1; end endfunctionendmodule函數(shù)函數(shù)函數(shù)返回值可以聲明為其它函數(shù)返回值可以聲明為其它register類型:類型:integer, real, 或或time。在任何表達(dá)式中都可調(diào)用函數(shù)在任何表達(dá)式中都可調(diào)用函數(shù)module checksu

13、b (neg, a, b); output neg; reg neg; input a, b; function integer subtr; input 7: 0 in_a, in_b; subtr = in_a - in_b; / 結(jié)果結(jié)果可能為負(fù)可能為負(fù) endfunction always (a or b) if (subtr( a, b) 0) neg = 1; else neg = 0;endmodule函數(shù)函數(shù)函數(shù)中可以對(duì)返回值的個(gè)別位進(jìn)行賦值。函數(shù)中可以對(duì)返回值的個(gè)別位進(jìn)行賦值。函數(shù)值的位數(shù)、函數(shù)端口甚至函數(shù)功能都可以參數(shù)化。函數(shù)值的位數(shù)、函數(shù)端口甚至函數(shù)功能都可以參數(shù)化。.

14、. .parameter max_bits = 8;reg max_bits: 1 d;function max_bits: 1 reverse_bits; input max_bits-1: 0 data; integer k; for (k = 0; k max_bits; k = k + 1) reverse_ bits max_bits - (k+ 1) = data k;endfunctionalways (posedge clk) d = reverse_bits (d) ;. . .命名塊命名塊(named block) 在關(guān)鍵詞在關(guān)鍵詞begin或或fork后加上后加上 : 對(duì)

15、塊進(jìn)行命名對(duì)塊進(jìn)行命名module named_ blk; . . . begin : seq_blk. . . end. . . fork : par_blk. . . join. . .endmodule 在命名塊中可以聲明局部變量在命名塊中可以聲明局部變量 可以使用關(guān)鍵詞可以使用關(guān)鍵詞disable禁止一個(gè)命名塊禁止一個(gè)命名塊 命名塊定義了一個(gè)新的范圍命名塊定義了一個(gè)新的范圍 命名塊會(huì)降低仿真速度命名塊會(huì)降低仿真速度禁止命名塊和任務(wù)禁止命名塊和任務(wù)module do_arith (out, a, b, c, d, e, clk, en_mult); input clk, en_mult;

16、 input 7: 0 a, b, c, d, e; output 15: 0 out; reg 15: 0 out; always ( posedge clk) begin : arith_block / * 命名塊命名塊 * reg 3: 0 tmp1, tmp2; / * 局部變局部變量量 * tmp1, tmp2 = f_or_and (a, b, c, d, e); / 函數(shù)調(diào)用函數(shù)調(diào)用 if (en_mult) multme (tmp1, tmp2, out); / 任務(wù)調(diào)用任務(wù)調(diào)用 end always ( negedge en_mult) begin / 中止運(yùn)算中止運(yùn)算 di

17、sable multme ; / * 禁止任務(wù)禁止任務(wù) * disable arith_block; / * 禁止命名塊禁止命名塊 * end/ 下面下面定義任務(wù)和函數(shù)定義任務(wù)和函數(shù) endmodule禁止命名塊和任務(wù)禁止命名塊和任務(wù)disable語句終結(jié)一個(gè)命名塊或任務(wù)的所有活動(dòng)。也就是說,在一個(gè)語句終結(jié)一個(gè)命名塊或任務(wù)的所有活動(dòng)。也就是說,在一個(gè)命名塊或任務(wù)中的所有語句執(zhí)行完之前就返回。命名塊或任務(wù)中的所有語句執(zhí)行完之前就返回。 語法:語法: disable 或或 disable 當(dāng)命名塊或任務(wù)被禁止時(shí),所有因他們調(diào)度的事件將從事件隊(duì)列中當(dāng)命名塊或任務(wù)被禁止時(shí),所有因他們調(diào)度的事件將從事件

18、隊(duì)列中清除清除disable是典型的不可綜合語句。是典型的不可綜合語句。在前面的例子中,只禁止命名塊也可以達(dá)到同樣的目的:所有由命在前面的例子中,只禁止命名塊也可以達(dá)到同樣的目的:所有由命名塊、任務(wù)及其中的函數(shù)調(diào)度的事件都被取消。名塊、任務(wù)及其中的函數(shù)調(diào)度的事件都被取消。有限狀態(tài)機(jī)有限狀態(tài)機(jī)隱式狀態(tài)機(jī)隱式狀態(tài)機(jī)fsm 不需要聲明狀態(tài)寄存器不需要聲明狀態(tài)寄存器 仿真效率高仿真效率高 只適合于線性的狀態(tài)改變只適合于線性的狀態(tài)改變 大多數(shù)綜合工具不能處理大多數(shù)綜合工具不能處理顯式顯式fsm: 利于結(jié)構(gòu)化利于結(jié)構(gòu)化 易于處理缺省條件易于處理缺省條件 能處理復(fù)雜的狀態(tài)改變能處理復(fù)雜的狀態(tài)改變 所有綜合工

19、具都支持所有綜合工具都支持 有限狀態(tài)機(jī)有限狀態(tài)機(jī)在隱式在隱式fsm中,只要數(shù)據(jù)在一個(gè)時(shí)鐘沿寫入并在另一個(gè)周期讀出,中,只要數(shù)據(jù)在一個(gè)時(shí)鐘沿寫入并在另一個(gè)周期讀出,則會(huì)生成寄存器。則會(huì)生成寄存器。所有所有fsm必須有復(fù)位,且狀態(tài)改變必須在單一時(shí)鐘信號(hào)的同一邊必須有復(fù)位,且狀態(tài)改變必須在單一時(shí)鐘信號(hào)的同一邊沿。沿。通常,如果狀態(tài)改變簡(jiǎn)單明確,且綜合工具接受隱式狀態(tài)機(jī),就通常,如果狀態(tài)改變簡(jiǎn)單明確,且綜合工具接受隱式狀態(tài)機(jī),就可以使用隱式類型。如果狀態(tài)改變很復(fù)雜,則顯式類型更加有效??梢允褂秒[式類型。如果狀態(tài)改變很復(fù)雜,則顯式類型更加有效。隱式狀態(tài)機(jī)是一個(gè)行為級(jí)而非隱式狀態(tài)機(jī)是一個(gè)行為級(jí)而非rtl代

20、碼的典型例子。這種代碼依代碼的典型例子。這種代碼依賴循環(huán)和內(nèi)嵌時(shí)序控制,有時(shí)也有命名事件、賴循環(huán)和內(nèi)嵌時(shí)序控制,有時(shí)也有命名事件、wait和和disable語句。語句。因此,隱式狀態(tài)機(jī)在綜合時(shí)通常不被支持。因此,隱式狀態(tài)機(jī)在綜合時(shí)通常不被支持。 線性線性fsm是指從一個(gè)狀態(tài)到下一個(gè)狀態(tài)的轉(zhuǎn)換不需要任何條件。是指從一個(gè)狀態(tài)到下一個(gè)狀態(tài)的轉(zhuǎn)換不需要任何條件。顯式有限狀態(tài)機(jī)module exp (out, datain, clk, rst); input clk, rst, datain; output out; reg out; reg state; always ( posedge clk or

21、 posedge rst) if (rst) state, out = 2b00; else case (state) 1b0: begin out = 1b0; if (! datain) state = 1b0; else state = 1b1; end 1b1: begin out = datain; state = 1b0; end default: state, out = 2b00; endcaseendmodule顯式有限狀態(tài)機(jī)可以在過程塊中用單一時(shí)鐘邊沿和可以在過程塊中用單一時(shí)鐘邊沿和case語句顯式地描述語句顯式地描述fsm。必須聲明定義狀態(tài)機(jī)的狀態(tài)狀態(tài)變量。必須聲明定義狀

22、態(tài)機(jī)的狀態(tài)狀態(tài)變量。要改變當(dāng)前狀態(tài),必須在時(shí)鐘邊沿改變狀態(tài)變量的值。要改變當(dāng)前狀態(tài),必須在時(shí)鐘邊沿改變狀態(tài)變量的值。給通常不會(huì)發(fā)生的條件指定缺省動(dòng)作是一個(gè)很好的描述方式。給通常不會(huì)發(fā)生的條件指定缺省動(dòng)作是一個(gè)很好的描述方式。 隱式有限狀態(tài)機(jī)module imp (out, datain, clk, rst); output out; reg out; input clk, datain, rst; always ( rst) / synergy reset method if (rst) assign out = 1b0; else begin deassign out; disable seq_block; /返回初始狀態(tài)返回初始狀態(tài) end always ( posedge clk) begin: seq_block out = 1b0; if (!d

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論