VHDL用戶自定義元件U.ppt_第1頁
VHDL用戶自定義元件U.ppt_第2頁
VHDL用戶自定義元件U.ppt_第3頁
VHDL用戶自定義元件U.ppt_第4頁
VHDL用戶自定義元件U.ppt_第5頁
已閱讀5頁,還剩56頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第4章用戶自定義元件(UDP),4.1 UDP 4.2 組合邏輯電路UDP 4.3 時序邏輯電路UDP,4.1什么是UDP?,在 Verilog 結構模型中,可以使用: 二十多個門級原器件。 用戶定義的原語。 UDP 可用于ASIC 庫單元設計和小規(guī)模芯片和中規(guī)模芯片設計。 可以使用 UDP 擴大預定義原器件的范圍。 UDP 是自包含的, 不能調用其他的模塊。 UDP 既可以用來代替時序邏輯元件,也可以代替組合邏輯元件。 使用真值表來描述 UDP 的行為。 調用 UDP 的方式與調用嵌入的原器件的方式相同。,UDP的定義 UDP的定義是由一個獨立的定義模塊構成的,該模塊由關鍵詞“primiti

2、ve”和“endprimitive”界定。 UDP定義模塊的語法格式:,primitive (, , , ); 輸出端口類型說明(output); 輸入端口類型說明(input); 輸出端寄存器變量說明(reg); 元件初始狀態(tài)說明( initial ); table ; ; ; endtable endprimitive,對上述的語法格式,需要說明如下幾點: (1) UDP定義模塊不能出現(xiàn)在其它模塊定義之內,UDP定義模塊和其它模塊具有相同的語法結構地位,它的定義必須獨立于其它模塊結構成分。所以UDP定義模塊必須出現(xiàn)在其它模塊定義之外,同時它也可以出現(xiàn)在獨立的文件中。,【例4-1】UDP定義

3、模塊的正確位置。 module MODULE1;/模塊MODULE1定義的開始 /模塊MODULE1描述體 endmodule/模塊MODULE1定義的結束 primitive MY_GATE(out,a,b); /UDP元件MY_GATE定義模塊的開始 /UDP元件MY_GATE定義的描述體 endprimitive/UDP元件MY_GATE定義模塊的結束 module MODULE2;/模塊MODULE2定義的開始 /模塊MODULE2 描述體 endmodule/模塊MODULE2定義的結束 在例4-1中,UDP元件MY_GATE的定義模塊與其它兩個模塊MODULE1和MODULE2并列

4、出現(xiàn),相互獨立;,【例4-2】UDP定義模塊的錯誤位置。 module MODULE1;/模塊MODULE1定義的開始 /模塊MODULE1描述體 primitive MY_GATE(out,a,b); /UDP元件MY_GATE定義模塊的開始 /UDP元件MY_GATE定義的描述體 endprimitive /UDP元件MY_GATE定義模塊的結束 endmodule/模塊MODULE1定義的結束 而在例4-2中,UDP定義模塊卻包含在另一個模塊MODULE1結構之中,這種情況是不允許的。,(2) 在UDP定義模塊的第一行,關鍵詞“primitive”標志著定義模塊的開始;其后出現(xiàn)的“元件名

5、”是為被定義UDP元件所取的一個名字;后面出現(xiàn)的端口列表指明了UDP元件的輸入輸出端口,該端口列表由若干個端口組成,其中只能有一個輸出端口并且該輸出端口必須是端口說明表中的第一項,而UDP的輸入端口數(shù)目可以是一個或多個,一般對時序電路的UDP最多允許有9個輸入端,對組合電路的UDP最多允許有10個輸入端。 必須注意在定義UDP元件時所有輸入端口和輸出端口都只能是1位的(標量)。,(3) 輸出端口類型說明是對UDP元件的輸出端口進行說明,這和普通模塊定義中的輸出端口說明一樣是通過關鍵詞“output”來進行的,比如: output out; 就說明了端口out 是一個輸出端口。 (4) 輸入端口

6、類型說明是對UDP元件的輸入端口進行說明,這和普通模塊定義中的輸入端口說明一樣是通過關鍵詞“input”來進行的,比如: input a,b; 就說明了端口a和端口b 是兩個輸入端口。,(5) 輸出端寄存器變量說明是在對時序邏輯UDP元件進行定義時,為了對輸出端口寄存器變量類型進行說明而引入的。寄存器變量用于描述時序電路UDP中的內部狀態(tài)。要注意只有在被定義的元件是時序邏輯元件時才能將輸出端口定義成寄存器類變量。寄存器變量說明用關鍵詞“reg”實現(xiàn),比如: reg out; 就將UDP輸出端口 out定義為一個寄存器變量。,(6) 元件初始狀態(tài)說明也是為進行時序電路UDP的定義而引入的,它的作

7、用是對時序電路上電時刻(即0時刻)的初始狀態(tài)進行定義,只允許有0、1、x三種狀態(tài)。缺省為x態(tài)。元件初始狀態(tài)說明用“initial”過程塊來實現(xiàn),比如: initial out=x; 就將時序邏輯UDP元件的初始狀態(tài)定義為“x”。,(7) 由關鍵詞“table”和“endtable”界定的多個table表項構成了UDP元件定義模塊內的一個輸入輸出真值表。在table表項中只允許出現(xiàn)0、1、x三種邏輯值,不允許出現(xiàn)高阻態(tài)“z”。組合電路UDP定義模塊和時序電路UDP定義模塊內的table表項格式是不同的。table表項構成了UDP元件輸入、輸出以及內部狀態(tài)(時序邏輯電路情況)間的一張“邏輯真值表”

8、。對不同邏輯功能的UDP元件進行定義時的差別將體現(xiàn)在不同的table表項描述上。,(8) 關鍵詞“endprimitive”出現(xiàn)在定義模塊的末尾,它標志著UDP定義模塊的結束。 下面給出對四選一MUX進行UDP定義描述的一個例子。,【例4-3】將四選一MUX定義成UDP元件。 primitive mux4_l(out,in1,in2,in3,in4,ctrl1,ctrl2); output out; input in1,in2,in3,in4,ctrl1,ctrl2; table / in1 in2 in3 in4 ctrl1 ctrl2 out 注釋行,用于保證表項中各項的正確排列順序 0

9、? ? ? 0 0 : 0 1 ? ? ? 0 0 : 1 ? 0 ? ? 0 1 : 0 ? 1 ? ? 0 1 : 1 ? ? 0 ? 1 0 : 0 ? ? 1 ? 1 0 : 1 ? ? ? 0 1 1 : 0 ? ? ? 1 1 1 : 1 endtable endprimitive,注意:不能將控制端口定義成一個二位的輸入端口,即不能采用如下定義方式:,【例4-4】錯例。 primitive mux4_l(out,in1,in2,in3,in4,ctrl);/錯例 output out; input in1,in2,in3,in4 ; input 21 ctrl; /錯,在UDP定

10、義中的端口只能是一位寬度的標量類型 table /in1 in2 in3 in4 ctrl out 0 ? ? ? 00 : 0 1 ? ? ? 00 : 1 ? 0 ? ? 01 : 0 ? 1 ? ? 01 : 1 ? ? 0 ? 10 : 0 ? ? 1 ? 10 : 1 ? ? ? 0 11 : 0 ? ? ? 1 11 : 1 endtable endprimitive,UDP 只能有一個輸出端,而且必須是端口的說明列表的第一項。 UDP 可以有多個輸入端,最多允許有 10 個。 UDP 所有端口變量必須是標量,不允許使用雙向端口。 UDP 不支持 Z 邏輯值。 在仿真的開始,UDP

11、 的輸出可以使用 initial 語句初始化為一個已知值。 UDP 不能被綜合。,UDP特征,UDP 只能有一個輸出。如果設計時的輸出多于一個,則需要把其它的原器件連接到 UDP 輸出,或同時使用多個 UDP。 UDP 輸入端最多可以有 10 個,但是當輸入的個數(shù)多于 5 個時,內存的需要將大大的增加。下頁表列出了輸入數(shù)目不同時,每個輸入所需要的內存。,UDP特征,4.2 組合邏輯電路UDP 對組合邏輯電路UDP元件的描述相當于直接把電路的邏輯真值表搬到UDP描述的table表中。組合邏輯電路UDP定義時的table表項的格式為: : ,對于上述table表項格式,必須注意: (1) 各個輸入

12、輸出邏輯值只能是 0,1,x 和 ? 中的一個,不能取高阻態(tài)“z”。 (2) 輸出端口在primitive定義語句的端口表項中列第一的位置,而輸出端邏輯值在table表項內則是位于最后一項。 (3) 在表項中要用空格分隔開不同的輸入端邏輯值, 各個輸入端口在table表項中的排列順序必須與它們在“primitive”定義語句中端口表項內的排列順序保持嚴格一致。,(4) table表項中的輸入部分與輸出部分之間要用一個冒號隔開。 (5) 為了明確觀察輸入輸出相互關系和各項排列順序是否正確,通常在table表項的第一欄中插人一條注釋語句,比如例43中的注釋行: / in1 in2 in3 in4

13、ctrl1 ctrl2 out,UDP元件的邏輯功能是由UDP定義模塊內關鍵詞“table”和“endtable”之間的table表的內容所決定的,table表相當于構成了UDP元件輸入輸出的一個真值表。在進行模擬時,當模擬器發(fā)現(xiàn)UDP的某個輸入發(fā)生改變時,將會自動進入table表查找相匹配的table表項,再把查到的輸出邏輯值賦給輸出端口。如果在UDP定義模塊的table表中找不到與當前輸入相匹配的table表項,則輸出端將取不定態(tài)“x”。所以,在進行UDP元件描述時,應當將盡可能多的輸入狀態(tài)設置到table表項中。,以設計一個一位的全加器為例,表4.1是它的本位和與進位的邏輯真值表,由于一

14、個UDP元件只允許有一個一位的輸出,所以要分別定義兩個UDP元件來實現(xiàn)全加器的本位和與進位。把它們的真值表分別移植到兩個UDP描述的table表中,就得到了例4-5所示的全加器的UDP描述。,【例4-5】全加器的UDP描述。 /進位的UDP定義 primitive carry(cout,cin,a,b ); output cout; input a ,b ,cin; table /cout 對應的table表項 /cinab: cout 000: 0; 001: 0; 010: 0; 011: 1: 100: 0: 101: 1; 11 0: 1; 111: 1; endtable endpr

15、imitive,/本位和的UDP定義 primitive summ(sum,cin,a,b ); output sum; input a ,b ,cin; table /sum對應的table表項 /cin a b : sum 0 0 0 : 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; endtable endprimitive,在例4-5的table表沒有考慮到輸入為x時的情況,因此在某個輸入為x時,模擬器找不到對應的table表項,輸出將為cout = x,sum = x。而

16、實際上對于進位cout而言,只要三個輸入項(cin,a和b)中有二個值為1,則不管第三個的值是什么(0,1或x),cout一定為1;反之,如果輸入中有二個為0,則cout也一定為0。為了表示出進位的這一特征,可以在cout對應的UDP定義table表內用?來替代第三個值對應表項,得到例4-6的定義描述。,【例4-6】考慮了輸入狀態(tài)“x”后的全加器進位cout的UDP描述。 /進位的UDP定義 primitive carry(cout,cin,a,b ); output cout; input a ,b ,cin; table /cout 對應的table表項,較例45的情況有所精簡 /cin

17、a b : cout 0 0 ? : 0; 0 ? 0 : 0; ? 0 0 : 0: 1 1 ? : 1; 1 ? 1 : 1; ? 1 1 : 1: endtable endprimitive,例:將如圖4.1(下頁)所示的組合邏輯電路描述為一個UDP元件時,首先得到該電路的真值表如表4.2所示。,圖4.1 一個組合邏輯電路的例子,【例4-7】圖4.1所示電路的UDP描述。 primitive and_or(out,a,b,c ); output out; input a ,b ,c; table /a b c : out 0 0 0 : 0; 0 0 1 : 1; 0 1 0 : 0;

18、0 1 1 : 1: 1 0 0 : 0: 1 0 1 : 1; 1 1 0 : 1; 1 1 1 : 1; endtable endprimitive,若再考慮到輸入取x態(tài)的情況,由圖4.1可知,當a b c0 x0,x00時輸出為0;當a b c0 x1,11x,1x1,x01,x11,xx1時輸出為1;將這些狀態(tài)補充到table表中就得到例4-8的情況。,【例4-8】圖4.1所示電路的UDP描述。 primitive and_or(out,a,b,c ); output out; input a ,b ,c; table /a b c : out 0 0 0 : 0; 0 0 1 : 1

19、; 0 1 0 : 0; 0 1 1 : 1: 1 0 0 : 0: 1 0 1 : 1; 1 1 0 : 1; 1 1 1 : 1;,/補充的包含有x輸入態(tài)的表項 0 x 0 : 0; x 0 0 : 0; 0 x 1 : 1; 1 1 x : 1; 1 x 1 : 1; x 0 1 : 1; x 1 1 : 1; x x 0 : 1; endtable endprimitive,由上面給出的邏輯圖4.1和例4-8中的table表可以看出, 當輸入c取值為1時,無論a,b取值如何,輸出out取值都是1; 當輸入a b取值為11時,無論c取值如何輸出,out取值都是1; 當輸入b c取值為00

20、時,無論a取值如何,輸出out取值都是0; 當輸入a c取值為00時,無論b取值如何,輸出out取值都是0。 這樣可以對table表進行簡化得到例4-9所示的UDP描述。,【例4-9】圖4.1所示電路的UDP描述。 primitive and_or(out,a,b,c ); output out; input a ,b ,c; table /a b c : out ? ? 1 : 1; 1 1 ? : 1; ? 0 0 : 0; 0 ? 0 : 0: endtable endprimitive,4.3 時序邏輯電路UDP 與組合邏輯電路相比,時序邏輯電路元件的輸出除了與當前的輸入狀態(tài)有關,還與

21、時序元件本身的內部狀態(tài)有關。 對時序邏輯電路UDP進行定義時的table表項格式為: : : ,與組合邏輯電路UDP的定義一樣,時序邏輯電路UDP定義模塊中各個輸入端口在table表項中的排列順序必須與它們在“primitive”語句中端口表項內的排列順序保持嚴格一致;在表項中要用空格分隔開不同的輸入邏輯值。,時序邏輯電路UDP定義時的 table表項格式與組合邏輯電路UDP的表項格式的不同之處在于: (1) 表項中多了關于元件內部狀態(tài)的描述。 (2) 要用兩個冒號分別將輸入邏輯值部分與元件內部狀態(tài),元件內部狀態(tài)與輸出邏輯值部分分隔開。 (3) 在構建table表項時要把元件內部狀態(tài)對輸出的影

22、響考慮進去。,時序邏輯電路元件可根據(jù)觸發(fā)方式分為 電平觸發(fā) 邊沿觸發(fā) 它們對應的table表項格式雖然都是上面給出的格式,但是table表項中輸入輸出信號可取的狀態(tài)在兩種電路類別下是不同的。,4.3.1 初始化狀態(tài)寄存器 因為時序邏輯電路元件有自己的內部狀態(tài),所以必須有一個寄存器變量來保持其內部狀態(tài)。在時序邏輯電路UDP的定義模塊中必須將輸出端口定義為寄存器類型,時序邏輯電路UDP的定義模塊中必須增加“輸出端寄存器變量說明”這一項來將輸出端口說明成寄存器變量類型。,在有些情況下必須對上電時刻(即0時刻)元件的初始狀態(tài)值加以指定。所以在時序邏輯電路UDP的定義模塊中還可以增加“元件初始狀態(tài)說明”

23、這一項通過initial過程塊來指定元件上電時刻的初始狀態(tài)(0、1或x)。如果該說明項(initial語句)缺省,則元件的初始狀態(tài)被默認為不定態(tài)“x”。,4.3.2 電平觸發(fā)時序電路UDP 電平觸發(fā)時序電路UDP的特點是其內部狀態(tài)改變是由某一輸入信號電平觸發(fā)的。 比如一個電平觸發(fā)的鎖存器,其真值表示于表4.3中。,當它的時鐘輸入信號clk為邏輯0時,鎖存器的狀態(tài)及輸出時刻保持與輸入信號d_in相同;當時鐘輸入信號為邏輯1時,鎖存器進入鎖存狀態(tài),其內部狀態(tài)及輸出保持不變。,下面給出了電平觸發(fā)鎖存器的UDP描述。,【例4-10】電平觸發(fā)鎖存器的UDP描述。 primitive latch (q,c

24、lk,d_in); output q; reg q; input clk, d_in ; initial q = 1b0; / 內部狀態(tài)和輸出被初始化為0狀態(tài) table /clk d_in : current_state : next_state 0 1 : ? : 1; 0 0 : ? : 0; 1 ? : ? : ; /“”表示輸出狀態(tài)不變 endtable endprimitive,需要注意到:定義中增加了對說明輸出q為寄存器類變量的reg語句;又增加了指定UDP初始狀態(tài)為邏輯0值的initial語句。,最后一個table項內引入了一個新的標記“”,它的含義就是UDP的內部狀態(tài)(也就是

25、輸出端狀態(tài))將保持原有狀態(tài)不變(No-change)。表項中的“?”仍代表“任意態(tài)”。,4.3.3 邊沿觸發(fā)時序電路UDP 邊沿觸發(fā)時序電路UDP的特點是其內部狀態(tài)的改變是由輸入時鐘的有效邊沿(上升沿或下降沿)觸發(fā)的,而與時鐘信號穩(wěn)定時的輸入狀況無關。所以對邊沿觸發(fā)時序邏輯元件的描述中就需要對輸入信號的變化和變化方式加以考慮。,模擬器只有在檢測到輸入信號發(fā)生跳變時才會搜索table表得到新的內部狀態(tài)值和輸出邏輯值。這樣table表項中的輸入邏輯值部分需要列出輸入邏輯值的變化情況即跳變情況。 在Verilog中用一對括號括起來的二個數(shù)字“(vw)”的形式來表示從一個狀態(tài)到另一個狀態(tài)的轉化,其中v

26、、w可以是0、1、x、?之一,因而(01)代表的就是由0往1的上升沿正跳變,(10)則代表了下降沿負跳變,(1x)代表了由1往不定態(tài)的跳變,(?)代表在0,1,x三狀態(tài)間的任意跳變。,必須注意Verilog規(guī)定在每一條table表項中最多只允許一個輸入信號處于跳變狀態(tài),例如: /clkdatastatenext_state (01)(10) 00 ; 表示的這一條table表項就是不允許的,因為其中有兩個輸入信號clk和data同時發(fā)生了跳變。 以設計一個上升沿T觸發(fā)器為例,其真值表示于表4.4中。,真值表的第14行說明了在時鐘信號clk發(fā)生上跳變時,若輸入t_in為0則觸發(fā)器狀態(tài)保持不變,而

27、若clk上跳變時t_in為1則觸發(fā)器狀態(tài)翻轉;,真值表的第58行說明了在時鐘信號clk發(fā)生下跳變時,不管輸入t_in為何值,觸發(fā)器狀態(tài)保持不變;,真值表的第9、10行說明在時鐘信號clk處于穩(wěn)定值但t_in發(fā)生跳變時,觸發(fā)器狀態(tài)保持不變;,將真值表中的各種情況加以簡化并移植到UDP描述的table表中可以得到例4-11所示的上升沿T觸發(fā)器的UDP描述。,【例4-11】上升沿T觸發(fā)器的UDP描述。 primitive t_trigger(q,clk,t_in); output q; reg q: input t_in,clk; table / clk t_in : state : q (01)

28、0 : ? : - ; (01) 1 : 0 : 1 ; (01) 1 : 1 : 0 ; (10) ? : ? : - ; (0 x) 0 : ? : - ; (1x) 0 : ? : - ; ? (?) : ? : - ; endtable endprimitive,table表中的第5、6項內容的目的是為了把盡可能的定態(tài)輸出情況考慮進去。它們在本例中的意思是,當時鐘從0狀態(tài)變化到不定態(tài)x時或從1狀態(tài)變化到不定態(tài)x時,如果輸入t_in為0,則UDP元件狀態(tài)及輸出邏輯值保持原來的取值不變;,table表中的最后一項與真值表的第9、10兩行對應,注意這項是描述一個T觸發(fā)器所必需的,因為只要在t

29、able表中出現(xiàn)了一個含有輸入邏輯值跳變的表項,模擬器就會對任何一個輸入信號的跳變作出反應,進入table表查找相應的表項,如果上例中沒有這條表項來對數(shù)據(jù)輸入端t_in發(fā)生跳變時元件輸出端對應的邏輯取值進行說明,模擬器將會因為找不到對應的說明項而輸出一個不定態(tài)x。,為了簡化UDP元件定義模塊中table表項的描述,以及為了加強table表的可讀性,Verilog在對UDP進行定義時引入了一些縮記符號來描述table表項,這些符號列于表4.5之中,利用這些縮記符號,例4-11可以被改寫成例4-12的形式。,【例4-12】使用縮記符號后的上升沿T觸發(fā)器的UDP元件定義模塊。 primitive t

30、_trigger(q,clk,t_in); output q; reg q: input t_in,clk; table / clk t_in : state: q r 0 : ?: - ; r 1 : 0: 1 ; r 1 : 1: 0 ; f ? : ?: - ; (?) 0 : ?: - ; ? (?) : ?: - ; endtable endprimitive,4.3.4 電平觸發(fā)和邊沿觸發(fā)混合的時序電路UDP 有些時序邏輯電路中的狀態(tài)改變要既受電平觸發(fā)、又受邊沿觸發(fā)。這種電路稱為電平觸發(fā)和邊沿觸發(fā)混合的時序電路。 例如一個帶有異步清零輸入和異步置位輸入的觸發(fā)器,清零和置位操作時要求電平觸發(fā),而觸發(fā)器本身卻是邊沿觸發(fā)的。,在這種混合觸發(fā)形式時序電路類型的UDP定義模塊中,穩(wěn)定的輸入狀態(tài)和輸入信號的跳變狀況都將對元件的輸出和元件內部狀態(tài)的改變產生影響。所以在進行UDP定義描述時需要同時對輸入的穩(wěn)定取值和變化狀

溫馨提示

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

評論

0/150

提交評論