VerilogHDL硬件描述(第二節(jié))_第1頁
VerilogHDL硬件描述(第二節(jié))_第2頁
VerilogHDL硬件描述(第二節(jié))_第3頁
VerilogHDL硬件描述(第二節(jié))_第4頁
VerilogHDL硬件描述(第二節(jié))_第5頁
已閱讀5頁,還剩80頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、2022年7月4日1福州大學微電子系福州大學微電子系2022年7月4日2標識符標識符l所謂所謂標識別符標識別符就是用戶為程序描述中的就是用戶為程序描述中的VerilogVerilog對象所起對象所起的名字。的名字。l標識符可以是任意一組標識符可以是任意一組字母、數(shù)字、字母、數(shù)字、$ $符號和符號和_(_(下劃線下劃線) )符號組合,但符號組合,但標識符第一個字符必須是字母或者下劃線標識符第一個字符必須是字母或者下劃線。l標識符最長可以達到標識符最長可以達到10231023個字符。個字符。l模塊名、端口名和實例名都是標識符。模塊名、端口名和實例名都是標識符。lVerilogVerilog語言是大

2、小寫敏感的,因此語言是大小寫敏感的,因此selsel和和SELSEL是兩個不同是兩個不同的標識符。的標識符。2022年7月4日3合法和非法標識符合法和非法標識符 l合法的:合法的:lshift_reg_ashift_reg_a lbusa_indexbusa_index l_bu$s2_bu$s2lbus263 bus263 非法的:非法的:34net /34net /不能用數(shù)字開頭不能用數(shù)字開頭a a* *b_netb_net / /不能含有非字母符號不能含有非字母符號* *n n 263 /263 /不能含有非字母符號不能含有非字母符號 2022年7月4日4代碼書寫規(guī)范代碼書寫規(guī)范l分節(jié)書

3、寫格式分節(jié)書寫格式 各節(jié)之間加各節(jié)之間加1 1到多行空格。如每個到多行空格。如每個alwaysalways、initialinitial語句都是一節(jié),每節(jié)基本上完成一個特定的功能。在每語句都是一節(jié),每節(jié)基本上完成一個特定的功能。在每節(jié)之前有幾行注釋對該節(jié)代碼加以描述,至少列出本節(jié)節(jié)之前有幾行注釋對該節(jié)代碼加以描述,至少列出本節(jié)所描述信號的含義。所描述信號的含義。 行首不要用空格來對齊,而就用行首不要用空格來對齊,而就用TabTab鍵。鍵。l注釋規(guī)范注釋規(guī)范 分號結(jié)束以分號結(jié)束以/進行行注釋;使用進行行注釋;使用/ /* *和和* */ /各占一行,并各占一行,并且頂頭。且頂頭。l在注釋說明要注

4、意細節(jié):在注釋說明要注意細節(jié): 應在注釋中詳細說明模塊的設(shè)計思路,特別需要注明應在注釋中詳細說明模塊的設(shè)計思路,特別需要注明的一些想法。的一些想法。 在注釋函數(shù)時要注明函數(shù)適用方法,對輸入?yún)?shù)要求在注釋函數(shù)時要注明函數(shù)適用方法,對輸入?yún)?shù)要求以及輸出格式等。以及輸出格式等。 對日期注釋要求記錄從開始編寫模塊到模塊測試結(jié)束之間的日期對日期注釋要求記錄從開始編寫模塊到模塊測試結(jié)束之間的日期2022年7月4日5代碼書寫規(guī)范代碼書寫規(guī)范l空格使用空格使用 不同變量,以及變量與符號、變量與括號之間都應不同變量,以及變量與符號、變量與括號之間都應保留一個空格。關(guān)鍵字與其它任何字符串之間都應保保留一個空格。

5、關(guān)鍵字與其它任何字符串之間都應保留一個空格。例如:留一個空格。例如:always always ( ( ) ) 使用大括號和小括號時,前括號的后邊與后括號的使用大括號和小括號時,前括號的后邊與后括號的前邊應當保留一個空格。前邊應當保留一個空格。 邏輯運算符、算術(shù)運算符、比較運算符等的兩側(cè)各邏輯運算符、算術(shù)運算符、比較運算符等的兩側(cè)各留一個空格,與變量分隔開來。單操作數(shù)運算符例外,留一個空格,與變量分隔開來。單操作數(shù)運算符例外,直接位于操作數(shù)前,不使用空格。直接位于操作數(shù)前,不使用空格。 如果使用如果使用/進行注釋,在進行注釋,在/后應當有一個空格;注后應當有一個空格;注釋行的末尾不要有多余的空

6、格。釋行的末尾不要有多余的空格。例例:assign Div 3:0 = Div 3:0 + 4b0001; 2022年7月4日6代碼書寫規(guī)范代碼書寫規(guī)范lBeginBeginendend的書寫規(guī)范的書寫規(guī)范 同一個層次的所有語句左端對齊;同一個層次的所有語句左端對齊;initailinitail、always always 等語句塊的等語句塊的beginbegin關(guān)鍵詞與相應的關(guān)鍵詞與相應的endend關(guān)關(guān)鍵詞對齊,并且在鍵詞對齊,并且在endend后面添加注釋標明結(jié)束。后面添加注釋標明結(jié)束。 不同層次之間的語句使用不同層次之間的語句使用TABTAB進行縮進,每加進行縮進,每加深一層縮進一個深

7、一層縮進一個TABTAB; 在在endmoduleendmodule、endtaskendtask、endcaseendcase等標記一個等標記一個代碼塊結(jié)束的關(guān)鍵詞后面要加上一行注釋說明代碼塊結(jié)束的關(guān)鍵詞后面要加上一行注釋說明這個代碼塊的名稱這個代碼塊的名稱2022年7月4日7整數(shù)整數(shù) 在在VerilogVerilog中,整型常量有以下四種進中,整型常量有以下四種進制表示形式:制表示形式:l二進制整數(shù)二進制整數(shù)(b(b或或B) B) l十進制整數(shù)十進制整數(shù)(d(d或或D) D) l十六進制整數(shù)十六進制整數(shù)(h(h或或H) H) l八進制整數(shù)八進制整數(shù)(o(o或或O) O) VerilogVe

8、rilog中的標識符是區(qū)分大小寫的,中的標識符是區(qū)分大小寫的,但在但在表示進制和數(shù)值表示進制和數(shù)值a-fa-f時使用大寫或小寫都可以時使用大寫或小寫都可以,不加以區(qū)分。不加以區(qū)分。2022年7月4日8整數(shù)表達方式有以下三種:整數(shù)表達方式有以下三種:1) ,這是一種完整的描述方式。下面的,這是一種完整的描述方式。下面的描述方式都是正確的:描述方式都是正確的: 8b101000108b10100010/表示位寬為表示位寬為8 8的二進制數(shù)。的二進制數(shù)。11b100_1010_111011b100_1010_1110/表示位寬為表示位寬為1111的二進制數(shù)的二進制數(shù) “_” “_”出現(xiàn)在數(shù)字之間是合

9、法的,可提高可讀性。出現(xiàn)在數(shù)字之間是合法的,可提高可讀性。 但需要注意的是但需要注意的是“_”“_”不能出現(xiàn)在最高位數(shù)字之前,不能出現(xiàn)在最高位數(shù)字之前, 例如例如11b_100_1010_111011b_100_1010_1110就是錯誤的。就是錯誤的。10d3210d32/表示位寬為表示位寬為1010的十進制數(shù)的十進制數(shù)323216D12816D128/表示位寬為表示位寬為1616的十進制數(shù)的十進制數(shù)12812832haa_bb_11_9732haa_bb_11_97/表示位寬為表示位寬為3232的十六進制數(shù)的十六進制數(shù)aabb1197aabb11978o2348o234/表示位寬為表示位寬

10、為8 8的八進制數(shù)的八進制數(shù)2342342022年7月4日9整數(shù)表達方式有以下三種整數(shù)表達方式有以下三種2 2) ,在這種描述方式中位寬采用缺省位寬,在這種描述方式中位寬采用缺省位寬( (具具體數(shù)值由機器系統(tǒng)決定體數(shù)值由機器系統(tǒng)決定, ,但通常為但通常為3232位位) )。b1101=32b1101b1101=32b1101 /表示位寬為表示位寬為3232的二進制數(shù)的二進制數(shù)11011101B11_0001_1110 /B11_0001_1110 /表示位寬為表示位寬為3232的二進制數(shù)的二進制數(shù)11000111101100011110d9872 /d9872 /表示位寬為表示位寬為3232的

11、十進制數(shù)的十進制數(shù)98729872Hafcd_1785Hafcd_1785 / /表示位寬為表示位寬為3232的十六進制數(shù)的十六進制數(shù)afcd1785afcd17853 3) ,在這種描述方式中,在這種描述方式中, ,采用缺省采用缺省3232位位寬和十進制位位寬和十進制6464/表示位寬為表示位寬為3232的十進制數(shù)的十進制數(shù)6464129129/表示位寬為表示位寬為3232的十進制數(shù)的十進制數(shù)1291292022年7月4日10整數(shù)整數(shù)例:例:4b1111 / This is a 4-bit binary number4b1111 / This is a 4-bit binary number

12、12habc / This is a 12-bit hexadecimal number12habc / This is a 12-bit hexadecimal number16d255 / This is a 16-bit decimal number.16d255 / This is a 16-bit decimal number.(2+3)b10 /(2+3)b10 /非法非法: :位長不能夠為表達式位長不能夠為表達式hc3 / This is a 32-bit hexadecimal numberhc3 / This is a 32-bit hexadecimal numbero21

13、 / This is a 32-bit octal numbero21 / This is a 32-bit octal number276 / This is a 32-bit decimal number by default276 / This is a 32-bit decimal number by default2022年7月4日11整數(shù)整數(shù)x x和和z z值值: :x x代表不定值,代表不定值,z z代表高阻值。代表高阻值。x x(或(或z z)在十六進制值中代表)在十六進制值中代表4 4位位x x(或(或z z),在八進制中),在八進制中代表代表3 3位位x x(或(或z z)

14、,在二進制中代表),在二進制中代表1 1位位x x(或(或z z)。)。z z還可以寫作還可以寫作“?”?”。在使用。在使用casecase表達式時建議使用這種表達式時建議使用這種寫法寫法, ,以提高程序的可讀性。以提高程序的可讀性。 在其它計算機程序語言中不存在這兩種數(shù)值,但在描述在其它計算機程序語言中不存在這兩種數(shù)值,但在描述數(shù)字邏輯電路時這兩個數(shù)值卻有著明確的物理意義。在數(shù)字邏輯電路時這兩個數(shù)值卻有著明確的物理意義。在數(shù)字電路中的三態(tài)門正常工作時就存在一個高阻態(tài),數(shù)字電路中的三態(tài)門正常工作時就存在一個高阻態(tài),z z就就可以描述這種狀態(tài)??梢悦枋鲞@種狀態(tài)。x x表示不能明確具體的邏輯值是表

15、示不能明確具體的邏輯值是1 1、0 0還是還是z z。 值值x x和和z z以及十六進制中的以及十六進制中的a a到到f f不區(qū)分大小寫不區(qū)分大小寫。2022年7月4日12整數(shù)整數(shù)x x和和z z值值: : 例例: :4b10 x04b10 x0/位寬為位寬為4 4的二進制數(shù),從低位數(shù)的二進制數(shù),從低位數(shù)起第二位為不定值起第二位為不定值4b101z4b101z /位寬為位寬為4 4的二進制數(shù)從低位數(shù)起第一位的二進制數(shù)從低位數(shù)起第一位為高阻值為高阻值12dz12dz/位寬為位寬為1212的十進制數(shù)其值為高阻值的十進制數(shù)其值為高阻值( (第第一種表達方式一種表達方式) )12d?12d?/位寬為位

16、寬為1212的十進制數(shù)其值為高阻值的十進制數(shù)其值為高阻值( (第第二種表達方式二種表達方式) )8h4x8h4x/位寬為位寬為8 8的十六進制數(shù)其低四位值為不的十六進制數(shù)其低四位值為不定值定值2022年7月4日13整數(shù)整數(shù)負數(shù)負數(shù): :l一個數(shù)字可以被定義為負數(shù)一個數(shù)字可以被定義為負數(shù), ,只需在位寬表達式前只需在位寬表達式前加一個減號。加一個減號。l注意:注意: 減號必須寫在數(shù)字定義表達式的最前面,不可減號必須寫在數(shù)字定義表達式的最前面,不可以放在位寬和進制之間,也不可以放在進制和具以放在位寬和進制之間,也不可以放在進制和具體的數(shù)之間。體的數(shù)之間。例例: :-8d5-8d5/這個表達式代表這

17、個表達式代表5 5的補數(shù)(用八位二進的補數(shù)(用八位二進制數(shù)表示制數(shù)表示) )8d-58d-5/非法格式非法格式2022年7月4日14整數(shù)整數(shù)下劃線下劃線(underscore_):(underscore_):l可以用下劃線將數(shù)分隔開,以提高程序可讀性??梢杂孟聞澗€將數(shù)分隔開,以提高程序可讀性。l下劃線不可以用在位寬和進制處下劃線不可以用在位寬和進制處, ,只能用在具只能用在具體的數(shù)字之間。體的數(shù)字之間。例例: :1616b1010_1011_1111_1010b1010_1011_1111_1010 / /合法格式合法格式8 8b_0011_1010b_0011_1010 /非法格式非法格式2

18、022年7月4日15實數(shù)實數(shù)兩種形式定義兩種形式定義l十進制計數(shù)法:十進制計數(shù)法:例:例:2.0 16.56722.0 16.5672l科學計數(shù)法:科學計數(shù)法:其中其中e e和和E E相同相同例:例:23.5E2 5.2e-423.5E2 5.2e-4 根據(jù)根據(jù)VerilogVerilog HDL HDL語言定義,實數(shù)通過四舍語言定義,實數(shù)通過四舍五入隱式地轉(zhuǎn)換成最相近的整數(shù)五入隱式地轉(zhuǎn)換成最相近的整數(shù)2022年7月4日16 數(shù)據(jù)類型用來表示數(shù)字電路硬件中的數(shù)據(jù)存數(shù)據(jù)類型用來表示數(shù)字電路硬件中的數(shù)據(jù)存儲和傳送的元素。儲和傳送的元素。VerilogVerilog HDL HDL共有共有19種數(shù)據(jù)

19、類型,分種數(shù)據(jù)類型,分2 2大類數(shù)據(jù):大類數(shù)據(jù): 線網(wǎng)類型線網(wǎng)類型 表示器件之間的物理連接。表示器件之間的物理連接。 其數(shù)值由驅(qū)動元件決定,如果沒有驅(qū)動元件連接到其數(shù)值由驅(qū)動元件決定,如果沒有驅(qū)動元件連接到線網(wǎng)上,線網(wǎng)上,則其默認值為高阻則其默認值為高阻Z Z。 寄存器類型寄存器類型 表示數(shù)據(jù)的儲存單元。表示數(shù)據(jù)的儲存單元。 其默認值為不定其默認值為不定X X。 兩者最大的區(qū)別:兩者最大的區(qū)別: 寄存器類型保持最后一次的賦值,而線網(wǎng)類型則需寄存器類型保持最后一次的賦值,而線網(wǎng)類型則需要持續(xù)的驅(qū)動。要持續(xù)的驅(qū)動。數(shù)據(jù)類型數(shù)據(jù)類型2022年7月4日17wirewire(網(wǎng)絡(luò)連線)(網(wǎng)絡(luò)連線): 由

20、模塊或門驅(qū)動的連線。由模塊或門驅(qū)動的連線。 驅(qū)動端信號的改變會立刻驅(qū)動端信號的改變會立刻傳遞到輸出的連線上。傳遞到輸出的連線上。 例如:右圖上,例如:右圖上,selbselb的改的改變,會自動地立刻影響或變,會自動地立刻影響或門的輸出。門的輸出。 netsabslselbselanslout線網(wǎng)類型線網(wǎng)類型2022年7月4日18線網(wǎng)類型線網(wǎng)類型l線網(wǎng)型數(shù)據(jù)常用來表示以線網(wǎng)型數(shù)據(jù)常用來表示以assignassign關(guān)鍵字指定的組合關(guān)鍵字指定的組合邏輯信號。邏輯信號。lVerilogVerilog程序模塊中輸入輸出信號類型缺省時自動程序模塊中輸入輸出信號類型缺省時自動定義為定義為wirewire型

21、。型。lwirewire型信號可以用作任何方程式的輸入,也可以用型信號可以用作任何方程式的輸入,也可以用作作“assign”assign”語句或?qū)嵗妮敵?。語句或?qū)嵗妮敵?。l定義格式:定義格式: wire wire 位寬位寬 數(shù)據(jù)名數(shù)據(jù)名1, 1, 數(shù)據(jù)名數(shù)據(jù)名2,2, 數(shù)據(jù)名數(shù)據(jù)名n;n; wire a; / wire a; /定義了一個一位的定義了一個一位的wirewire型數(shù)據(jù)型數(shù)據(jù) wire 7:0 b;/wire 7:0 b;/定義了一個八位的定義了一個八位的wirewire型數(shù)據(jù)型數(shù)據(jù) wire 4:1 c,dwire 4:1 c,d; /; /定義了二個四位的定義了二個

22、四位的wirewire型數(shù)據(jù)型數(shù)據(jù)2022年7月4日19線網(wǎng)類型變量的種類線網(wǎng)類型變量的種類:類型 功能 wire, triwire, tri 對應于標準的互連線(缺?。跇藴实幕ミB線(缺?。﹕upply1, supply2 supply1, supply2 對應于電源線或接地線對應于電源線或接地線wor, triorwor, trior 對應于有多個驅(qū)動源的線或邏輯連接對應于有多個驅(qū)動源的線或邏輯連接wand, triandwand, triand 對應于有多個驅(qū)動源的線與邏輯連接對應于有多個驅(qū)動源的線與邏輯連接triregtrireg 對應于有電容存在能暫時存儲電平連接對應于有電容存在

23、能暫時存儲電平連接tri1, tri0 tri1, tri0 對應于需要上拉或下拉的連接對應于需要上拉或下拉的連接 如果不明確地說明連接是何種類型,默認為如果不明確地說明連接是何種類型,默認為wirewire類型。類型。 其中只有其中只有wire, tri , supply1, supply2wire, tri , supply1, supply2是可是可綜合的,其余只能用于仿真語句綜合的,其余只能用于仿真語句2022年7月4日20線網(wǎng)類型線網(wǎng)類型lVerilogVerilog語法規(guī)定可以對語法規(guī)定可以對wirewire型變量有多個驅(qū)動,型變量有多個驅(qū)動,但只有用于仿真,在實際電路中,對任何信

24、號但只有用于仿真,在實際電路中,對任何信號有多個驅(qū)動源都會產(chǎn)生不確定的后果,因此綜有多個驅(qū)動源都會產(chǎn)生不確定的后果,因此綜合是過不去的合是過不去的 wire a,b,c; assign c =a; assign c =b;l在在VerilogVerilog定義中,定義中,wirewire、tritri功能是完全一致功能是完全一致的,提供這兩種不同名稱的目的是為了與模型的,提供這兩種不同名稱的目的是為了與模型中所使用的變量實際情況相一致。中所使用的變量實際情況相一致。 WireWire通常是通常是用來表示單個門驅(qū)動或連續(xù)賦值驅(qū)動。用來表示單個門驅(qū)動或連續(xù)賦值驅(qū)動。TriTri則常則常用于來表示多

25、驅(qū)動器驅(qū)動用于來表示多驅(qū)動器驅(qū)動2022年7月4日21wire a b;ababcNAND2wire a,b,c; assign c =a & b ;線網(wǎng)類型線網(wǎng)類型2022年7月4日22寄存器類型寄存器類型 寄存器型變量具有存儲性,即在接受下一個寄存器型變量具有存儲性,即在接受下一個賦值前,將保持原值,默認的初始狀態(tài)為賦值前,將保持原值,默認的初始狀態(tài)為“X”X”。 寄存器數(shù)據(jù)類型包含下列寄存器數(shù)據(jù)類型包含下列5 5類數(shù)據(jù)類型:類數(shù)據(jù)類型:lregreg: : 最常用的,用于行為描述中對寄存器類的說明最常用的,用于行為描述中對寄存器類的說明lintegerinteger:3232位帶

26、符號整形變量位帶符號整形變量ltimetime:6464位無符號時間變量位無符號時間變量lrealreal:6464位浮點、雙精度、帶符號實形變量位浮點、雙精度、帶符號實形變量lrealtimerealtime:其特征與:其特征與realreal型變量一致型變量一致2022年7月4日23寄存器類型寄存器類型(reg(reg) )l定義寄存器數(shù)據(jù)類型的關(guān)鍵字是定義寄存器數(shù)據(jù)類型的關(guān)鍵字是regreg,可以通過賦值語句,可以通過賦值語句改變寄存器存儲的值。改變寄存器存儲的值。lregreg類型數(shù)據(jù)的缺省初始值為不定值類型數(shù)據(jù)的缺省初始值為不定值x x,這在電路仿真時這在電路仿真時需要十分注意,需要

27、十分注意,建議仿真前建議仿真前都都要明確要明確給給每一個寄存器確每一個寄存器確定初始值定初始值。l在在“always”always”塊內(nèi)被賦值每一個信號都必須定義成塊內(nèi)被賦值每一個信號都必須定義成regreg類類型型。l定義方式:定義方式:regreg 位寬位寬 數(shù)據(jù)名數(shù)據(jù)名1,1,數(shù)據(jù)名數(shù)據(jù)名2,2, 數(shù)據(jù)名數(shù)據(jù)名i;i;reg regareg rega; /; /定義了一個定義了一個1 1位位regreg型數(shù)據(jù)型數(shù)據(jù)reg 3:0 regbreg 3:0 regb; /; /定義一個定義一個4 4位的位的regreg型數(shù)據(jù)型數(shù)據(jù)reg 4:0 regc, regdreg 4:0 regc,

28、 regd; /; /定義兩個定義兩個5 5位的位的regreg型數(shù)據(jù)型數(shù)據(jù)2022年7月4日24 regreg型變量能保持其值,直到它被賦于新值。型變量能保持其值,直到它被賦于新值。 regreg型變量常用于行為建模,產(chǎn)生測試的激勵型變量常用于行為建模,產(chǎn)生測試的激勵信號。信號。 常用行為語句結(jié)構(gòu)來給常用行為語句結(jié)構(gòu)來給regreg類型的變量賦值。類型的變量賦值。abslselbselansloutreg_areg_selreg_b 寄存器(寄存器(registerregister)類型變量)類型變量2022年7月4日25wireclk,d;reg q;always ( posedge cl

29、k ) q = d; regreg型數(shù)據(jù)常用來表示型數(shù)據(jù)常用來表示“always”always”模塊內(nèi)的指定模塊內(nèi)的指定信號,代表觸發(fā)器。信號,代表觸發(fā)器。寄存器類型寄存器類型(reg(reg) )2022年7月4日26d dout2out2AND2i1AND2i1clkclkout1out1D D Q QDFFDFFmodule rw2( clk, d, out1, out2 ) ; input clk, d;output out1, out2; reg out1; wire out2;assign out2 = d & (out1 ); always (posedge clk) b

30、egin out1 = d ; endendmodule 用寄存器用寄存器(reg(reg) )類型變量生成觸發(fā)器例子類型變量生成觸發(fā)器例子2022年7月4日27寄存器類型寄存器類型(reg(reg) )注意:注意: regreg型只表示被定義的信號將用在型只表示被定義的信號將用在“always”always”塊內(nèi),塊內(nèi),理解這一點很重要。并不是說理解這一點很重要。并不是說regreg型信號一定是寄存型信號一定是寄存器或觸發(fā)器的輸出。雖然器或觸發(fā)器的輸出。雖然regreg型信號常常是寄存器或型信號常常是寄存器或觸發(fā)器的輸出,但并不一定總是這樣。觸發(fā)器的輸出,但并不一定總是這樣。 aout2BU

31、FFbINVout1module rw1( a, b, out1, out2 ) ;input a, b;output out1, out2;reg out1;wire out2; assign out2 = a ; always (b) out1 = b;endmodule 2022年7月4日28regreg和和wirewire類型變量的區(qū)別類型變量的區(qū)別lregreg類型的變量可以被直接賦予數(shù)值,向類型的變量可以被直接賦予數(shù)值,向外輸出信號外輸出信號l而而wirewire類型的變量值是由驅(qū)動它的電路決類型的變量值是由驅(qū)動它的電路決定的定的2022年7月4日29位選擇和部分選擇位選擇和部分選

32、擇 l位選擇從向量中抽取特定的位。形式如下:位選擇從向量中抽取特定的位。形式如下: wirewire或者或者regreg向量名向量名bit_select_exprbit_select_expr l regreg 5:0 State; 5:0 State;l wire 3:0 Prtwire 3:0 Prt;lState1 & State4 /State1 & State4 /寄存器位選擇。寄存器位選擇。lPrt0 | BbqPrt0 | Bbq / /線網(wǎng)位選擇。線網(wǎng)位選擇。2022年7月4日30位選擇和部分選擇位選擇和部分選擇l在部分選擇中,向量的連續(xù)序列被選擇。形式在部分選

33、擇中,向量的連續(xù)序列被選擇。形式如下:如下:l wirewire或者或者regreg向量名向量名 常數(shù)表達式常數(shù)表達式1:1:常數(shù)表達式常數(shù)表達式22l regreg 5:0 State; 5:0 State; wire 3:0 Prtwire 3:0 Prt; State4:1 /State4:1 /寄存器部分選擇。寄存器部分選擇。 Prt3:2 /Prt3:2 /線網(wǎng)部分選擇。線網(wǎng)部分選擇。2022年7月4日31存儲器存儲器l通過對通過對regreg型變量建立數(shù)組來對存儲器型變量建立數(shù)組來對存儲器進行進行建模建模。regreg n-1:0 n-1:0 存儲器名存儲器名m-1:0m-1:0;

34、lregn-1:0regn-1:0定義了存儲器中每一個存儲單元的大小,定義了存儲器中每一個存儲單元的大小,即該存儲單元是一個即該存儲單元是一個n n位的寄存器。位的寄存器。l存儲器名后的存儲器名后的m-1:0 m-1:0 則定義了該存儲器中有多少個則定義了該存儲器中有多少個這樣的寄存器這樣的寄存器( (即地址),最后用分號結(jié)束定義語句。即地址),最后用分號結(jié)束定義語句。regreg 7:0 mema255 7:0 mema255:0; /256x80; /256x8位的存儲器。位的存儲器。2022年7月4日32存儲器存儲器l一個由一個由n n個個1 1位寄存器構(gòu)成的存儲器組不同于一個位寄存器構(gòu)

35、成的存儲器組不同于一個n n位的寄存位的寄存器。器。 reg n-1:0 regareg n-1:0 rega; /; /一個一個n n位的寄存器位的寄存器 regreg meman-1:0; / meman-1:0; /一個由一個由n n個個1 1位寄存器構(gòu)成存儲器組位寄存器構(gòu)成存儲器組l一個一個n n位的寄存器可以在一條賦值語句里進行賦值,而一個位的寄存器可以在一條賦值語句里進行賦值,而一個完整的存儲器則不行。完整的存儲器則不行。 regarega =0; / =0; /合法賦值語句合法賦值語句 memamema =0; / =0; /非法賦值語句非法賦值語句 mema3=0;/mema3

36、=0;/正確正確. .給給memorymemory中的第中的第3 3個存儲單元賦值個存儲單元賦值0.0.2022年7月4日33 輸入口(輸入口(inputinput)可以由寄存器或網(wǎng)絡(luò)連接驅(qū)動,)可以由寄存器或網(wǎng)絡(luò)連接驅(qū)動,但它本身只能驅(qū)動網(wǎng)絡(luò)連接。但它本身只能驅(qū)動網(wǎng)絡(luò)連接。 輸出口輸出口 (output)(output)可以由寄存器或網(wǎng)絡(luò)連接驅(qū)動,可以由寄存器或網(wǎng)絡(luò)連接驅(qū)動,但它本身只能驅(qū)動網(wǎng)絡(luò)連接。但它本身只能驅(qū)動網(wǎng)絡(luò)連接。 輸入輸入/ /輸出口輸出口(inout(inout) )只可以由網(wǎng)絡(luò)連接驅(qū)動,但只可以由網(wǎng)絡(luò)連接驅(qū)動,但它本身只能驅(qū)動網(wǎng)絡(luò)連接。它本身只能驅(qū)動網(wǎng)絡(luò)連接。 如果信號變量

37、是在過程塊如果信號變量是在過程塊 (initial(initial塊塊 或或 alwaysalways塊塊) )中被賦值的,必須把它聲明為寄存器類型變量中被賦值的,必須把它聲明為寄存器類型變量 如何選擇數(shù)據(jù)類型如何選擇數(shù)據(jù)類型2022年7月4日34如何選擇數(shù)據(jù)類型如何選擇數(shù)據(jù)類型舉例說明例化時數(shù)據(jù)類型舉例說明例化時數(shù)據(jù)類型的選擇的選擇module top;wire y; reg a, b; DUT u1(y,a,b); initial begin a = 0; b = 0; #10 a =1; . endendmodule 模塊模塊DUT的邊界的邊界輸入口輸入口輸出口輸出口輸出輸出/入口入口n

38、etnetnet/registernetnet/registernetinoutmodule DUT(Y, A, B);output Y;input A,B: wire Y, A, B; and (Y, A, B);endmodule2022年7月4日35 選擇數(shù)據(jù)類型時常犯的錯誤選擇數(shù)據(jù)類型時常犯的錯誤 把模塊的輸入信號定義為寄存器類型了。把模塊的輸入信號定義為寄存器類型了。 把例化后的輸出連接出去時,把它定義為寄存把例化后的輸出連接出去時,把它定義為寄存器類型了。器類型了。 在過程塊中對變量賦值時,忘了把它定義為寄在過程塊中對變量賦值時,忘了把它定義為寄存器類型(存器類型(regreg)或

39、已把它定義為連接類型了)或已把它定義為連接類型了(wirewire)。)。這是經(jīng)常犯的三個錯誤!這是經(jīng)常犯的三個錯誤!如何選擇數(shù)據(jù)類型如何選擇數(shù)據(jù)類型2022年7月4日36參數(shù)(參數(shù)(parametersparameters)l在在VerilogVerilog 中用中用parameterparameter定義一個代表常量的標識符定義一個代表常量的標識符, ,稱稱為符號常量為符號常量, ,采用標識符代表一個常量可提高程序的可讀性采用標識符代表一個常量可提高程序的可讀性和可維護性,且在和可維護性,且在有限狀態(tài)機中經(jīng)常使用符號常量。有限狀態(tài)機中經(jīng)常使用符號常量。l參數(shù)型常數(shù)也經(jīng)常用于定義延遲時間和變

40、量寬度。參數(shù)型常數(shù)也經(jīng)常用于定義延遲時間和變量寬度。l parameter parameter 參數(shù)名參數(shù)名1 1表達式表達式1 1,, ,參數(shù)名參數(shù)名n n表達式表達式n n;parameter wordsizeparameter wordsize=16,=16, memsize memsize=256; /=256; /定義二個參數(shù);定義二個參數(shù);regreg wordsize-1:0 memmemsize-1:0; / wordsize-1:0 memmemsize-1:0; /存儲器聲明存儲器聲明l參數(shù)是本地的,其定義只在本模塊內(nèi)有效參數(shù)是本地的,其定義只在本模塊內(nèi)有效2022年7月4

41、日37參數(shù)值的改寫參數(shù)值的改寫: : 在模塊或?qū)嵗脮r可通過參數(shù)傳遞來改變被引用在模塊或?qū)嵗脮r可通過參數(shù)傳遞來改變被引用模塊或?qū)嵗幸讯x的參數(shù)。模塊或?qū)嵗幸讯x的參數(shù)。參數(shù)(參數(shù)(parametersparameters)module adder (a, b,sum); parameter wid = 8; Input wid-1:0 a,b; output wid:0 sum; endmodulemodule TOP(ina,inb,out); input 8:0 ina,inb; output 9:0 out; . adder u1(ina,inb,out,); defparam

42、 u1.wid=9; endmodule參數(shù)值的改寫參數(shù)值的改寫: : 方法一方法一2022年7月4日38參數(shù)(參數(shù)(parametersparameters)module adder (a, b,sum); parameter wid = 8; Input wid-1:0 a,b; output wid:0 sum; endmodulemodule TOP(ina,inb,out); input 8:0 ina,inb; output 9:0 out; . adder #(9) u1(ina,inb,out,);endmodule參數(shù)值的改寫參數(shù)值的改寫: : 方法二方法二2022年7月4日

43、39運算符和表達式運算符和表達式運算符所帶的操作數(shù)個數(shù)不同,分為:運算符所帶的操作數(shù)個數(shù)不同,分為:l單目運算符:單目運算符:帶帶1 1個操作數(shù),且放在運算符右邊個操作數(shù),且放在運算符右邊l雙目運行符:雙目運行符:帶帶2 2個操作數(shù),且放在運算符兩邊個操作數(shù),且放在運算符兩邊l三目運行符:三目運行符:帶帶3 3個操作數(shù),且被運算符間隔開個操作數(shù),且被運算符間隔開2022年7月4日40賦值運算符賦值運算符l分連續(xù)賦值和過程賦值兩種分連續(xù)賦值和過程賦值兩種l過程賦值主要用于兩種結(jié)構(gòu)模塊過程賦值主要用于兩種結(jié)構(gòu)模塊(initial(initial和和always)always),分為阻塞和非阻塞賦值

44、。,分為阻塞和非阻塞賦值。l連續(xù)賦值語句只能對線網(wǎng)型變量進行賦值,連續(xù)賦值語句只能對線網(wǎng)型變量進行賦值,而不能對寄存器變量進行賦值而不能對寄存器變量進行賦值l連續(xù)賦值語句的語法為連續(xù)賦值語句的語法為: : assign assign # #延時量延時量 線網(wǎng)型變量名線網(wǎng)型變量名= = 賦值表達式賦值表達式 只要右端表達式中任一個操作數(shù)值發(fā)生變化,只要右端表達式中任一個操作數(shù)值發(fā)生變化,就會立即觸發(fā)對被賦值變量的更新操作就會立即觸發(fā)對被賦值變量的更新操作2022年7月4日41連續(xù)賦值語句應用連續(xù)賦值語句應用l對標量線網(wǎng)賦值對標量線網(wǎng)賦值wire a,bwire a,b; ; assign a =

45、b; assign a =b;l對矢量線網(wǎng)賦值對矢量線網(wǎng)賦值wire 7:0 a,bwire 7:0 a,b; ; assign a =b; assign a =b;l對矢量線網(wǎng)某幾位賦值對矢量線網(wǎng)某幾位賦值wire 7:0 a,bwire 7:0 a,b; ; assign a3:0 =b4:1; assign a3:0 =b4:1;l對任意拼接線網(wǎng)賦值對任意拼接線網(wǎng)賦值wire a,bwire a,b; ;wire 1:0 c,dwire 1:0 c,d; ; assign c = a , b; assign a , b=d; assign c = a , b; assign a , b=

46、d;2022年7月4日42算術(shù)運算符算術(shù)運算符l完成加、減、乘、除等算術(shù)運算的符號完成加、減、乘、除等算術(shù)運算的符號算術(shù)運算符算術(shù)運算符運算符運算符完成的運算完成的運算+ +加法加法- -減法減法* *乘法乘法/ /除法除法% %求模求模 用算術(shù)運算符進行用算術(shù)運算符進行RTLRTL描述時,最終生成的電路性能與描述時,最終生成的電路性能與使用的綜合工具有關(guān)。有些工具不支持除法及求模電路。使用的綜合工具有關(guān)。有些工具不支持除法及求模電路。例:例:9%4 9%4 的值為的值為1 12022年7月4日43VerilogVerilog中的大小中的大小(size)(size)與符號與符號lVerilog

47、Verilog會根據(jù)表達式中變量長度對表達式值自動地進行調(diào)整。會根據(jù)表達式中變量長度對表達式值自動地進行調(diào)整。lVerilogVerilog自動截斷或擴展賦值語句中右邊的值以適應左邊變量自動截斷或擴展賦值語句中右邊的值以適應左邊變量的長度。的長度。module sign_size; reg 3:0 a, b; reg 15:0 c; initial begin a = -1; / a是無符號數(shù),因此其值為是無符號數(shù),因此其值為1111 b = 8; c= 8; / b = c = 1000 #10 b = b + a; / 結(jié)果結(jié)果10111截斷截斷, b = 0111 #10 c = c +

48、 a; / c = 10111 endendmodule 當一個當一個負數(shù)賦值給負數(shù)賦值給無符號變量無符號變量如如regreg時,時,VerilogVerilog自自動完成二進動完成二進制補碼計算制補碼計算2022年7月4日44按位運算符按位運算符名稱名稱記號記號定義定義說明或例子說明或例子按位取反按位取反A = 5b00110&按位與按位與A&B=5b10001|按位或按位或A | B=5b11101按位異或按位異或AB=5b01100,按位同或按位同或AB=5b10011A=5b11001A=5b11001B=5b10101B=5b101012022年7月4日45按位運算符

49、按位運算符module bitwise (); reg 3: 0 rega, regb, regc; reg 3: 0 num; initial begin rega = 4b1001; regb = 4b1010; regc = 4b11x0; end initial fork #10 num = rega & 0; / num = 0000 #20 num = rega & regb; / num = 1000 #30 num = rega | regb; / num = 1011 #40 num = regb & regc; / num = 10 x0 #50 n

50、um = regb | regc; / num = 1110 #60 $finish; joinendmodule 按位操作符對矢量中相對應位運算。按位操作符對矢量中相對應位運算。 regb = 4b1 0 1 0 regc = 4b1 x 1 0num = regb & regc = 1 0 1 0 ; 位值為位值為x時不一定產(chǎn)生時不一定產(chǎn)生x結(jié)果。如結(jié)果。如#50時的時的or計算。計算。 當兩個操作數(shù)位數(shù)不同時,當兩個操作數(shù)位數(shù)不同時,位數(shù)少的操作數(shù)零擴展到相位數(shù)少的操作數(shù)零擴展到相同位數(shù)。同位數(shù)。a = 4b1011;b = 8b01010011;c = a | b; / a零擴

51、展零擴展為為 8b000010112022年7月4日46邏輯運算符邏輯運算符&邏輯與邏輯與A和和B的與的與 為為 A&B;|邏輯或邏輯或A和和B的或的或 為為 A/B;!邏輯非邏輯非A的非的非 為為 !A;a=4b1001; b=4b0000a=4b1001; b=4b0000a=1; b=0a=1; b=0!a!a!b!ba a|b|ba&ba&b0 01 11 10 0!a!a!b!ba a|b|ba&ba&b0 01 11 10 0 這些操作符在邏輯值這些操作符在邏輯值0 0或或1 1上操作。邏輯操作的結(jié)果為上操作。邏輯操作的結(jié)果為0 0或

52、或1 1。對于向量操作對于向量操作, , 非非0 0向量當作向量當作“1”1”處理。處理。2022年7月4日47邏輯運算符邏輯運算符module logical (); parameter five = 5; reg ans; reg 3: 0 rega, regb, regc; initial begin rega = 4b0011; /邏輯值為邏輯值為“1” regb = 4b10 xz; /邏輯值為邏輯值為“1” regc = 4b0z0 x; /邏輯值為邏輯值為“x” end initial fork #10 ans = rega & 0; / ans = 0 #20 ans

53、= rega | 0; / ans = 1 #30 ans = rega & five; / ans = 1 #40 ans = regb & rega; / ans = 1 #50 ans = regc | 0; / ans = x #60 $finish; joinendmodule 邏輯操作符結(jié)果為一位邏輯操作符結(jié)果為一位1 1,0 0或或x x。邏輯操作符只對邏輯值運算。邏輯操作符只對邏輯值運算。如操作數(shù)為全如操作數(shù)為全0 0,則其邏輯值為,則其邏輯值為falsefalse如操作數(shù)如操作數(shù)有一位為有一位為1 1,則其邏輯,則其邏輯值為值為truetrue若操作數(shù)若操作數(shù)

54、只只包含包含0 0、x x、z z,則邏,則邏輯值為輯值為x x 邏輯反操作符將操作數(shù)的邏輯反操作符將操作數(shù)的邏輯值取反。例如,若操作邏輯值取反。例如,若操作數(shù)為全數(shù)為全0 0,則其邏輯值為,則其邏輯值為0 0,邏輯反操作值為邏輯反操作值為1 1。2022年7月4日48邏輯反與位反的對比邏輯反與位反的對比module negation(); reg 3: 0 rega, regb; reg 3: 0 bit; reg log; initial begin rega = 4b1011; regb = 4b0000; end initial fork #10 bit = rega; / num =

55、 0100 #20 bit = regb; / num = 1111 #30 log = !rega; / num = 0 #40 log = !regb; / num = 1 #50 $finish; joinendmodule! logical not 邏輯反邏輯反 bit-wise not 按位反按位反 邏輯反的結(jié)果為一位邏輯反的結(jié)果為一位1 1,0 0或或x x。按位反的結(jié)果與操作數(shù)按位反的結(jié)果與操作數(shù)的位數(shù)相同的位數(shù)相同 邏輯反操作符將操作數(shù)邏輯反操作符將操作數(shù)的邏輯值取反。例如,若的邏輯值取反。例如,若操作數(shù)為全操作數(shù)為全0 0,則其邏輯值,則其邏輯值為為0 0,邏輯反操作值為,邏

56、輯反操作值為1 1。2022年7月4日49關(guān)系運算符關(guān)系運算符l關(guān)系運算符共有以下四種:關(guān)系運算符共有以下四種:a b aa b aa b a大于大于b ba = b aa = b aa = b a大于或等于大于或等于b bl在進行關(guān)系運算時在進行關(guān)系運算時,如果聲明的關(guān)系是假的,如果聲明的關(guān)系是假的(flase(flase) ),則返回值是,則返回值是0 0;如果聲明的關(guān)系是真如果聲明的關(guān)系是真的的(true)(true),則返回值是,則返回值是1 1;如果某個操作數(shù)的值如果某個操作數(shù)的值不定,則關(guān)系是模糊的,返回值是不定值不定,則關(guān)系是模糊的,返回值是不定值“X”X”2022年7月4日50

57、關(guān)系運算符關(guān)系運算符module relationals (); reg 3: 0 rega, regb, regc; reg val; initial begin rega = 4b0011; regb = 4b1010; regc = 4b0 x10; end initial fork #10 val = regc rega ; / val = x #20 val = regb = rega ; / val = 1 #40 val = regb regc ; / val = 1 #50 $finish; joinendmodule無論無論x為何值,為何值,regbregcrega和和reg

58、c的關(guān)的關(guān)系取決于系取決于x 其結(jié)果是其結(jié)果是1b11b1、1b01b0或或1bx1bx。2022年7月4日51名稱名稱記號記號定義定義用途用途注釋注釋=等于等于電路功能描述電路功能描述等于等于!=不等于不等于電路功能描述電路功能描述不等于不等于=全等于全等于仿真仿真 X, Z也也作為比作為比較對象較對象!=不全等于不全等于仿真仿真=01XZ010XX101XXXXXXXZXXXX=01XZ0100010100X0010Z0001邏輯等邏輯等case等(等(綜合工具不支持綜合工具不支持!)等式運算符等式運算符2022年7月4日52等式運算符等式運算符l“=”“=”和和“!=”!=”又稱為邏輯等

59、式運算符。其結(jié)又稱為邏輯等式運算符。其結(jié)果由兩個操作數(shù)的值決定。由于操作數(shù)中某些果由兩個操作數(shù)的值決定。由于操作數(shù)中某些位可能是不定值位可能是不定值x x和高阻值和高阻值z,z,結(jié)果可能為不定結(jié)果可能為不定值值x x。l而而“=”=”和和“!=”!=”運算符則不同運算符則不同, ,它在對操它在對操作數(shù)進行比較時對某些位的不定值作數(shù)進行比較時對某些位的不定值x x和高阻值和高阻值z z也進行比較也進行比較, ,兩個操作數(shù)必需完全一致,兩個操作數(shù)必需完全一致,其結(jié)其結(jié)果才是果才是1 1,否則為,否則為0 0。lcasecase等只能用于仿真描述,不能用于等只能用于仿真描述,不能用于RTLRTL描述

60、描述。2022年7月4日53相等操作符相等操作符 賦值操作符,將等式右邊表達式的值拷貝到左邊賦值操作符,將等式右邊表達式的值拷貝到左邊。注意邏輯等與注意邏輯等與casecase等的差別等的差別= 邏輯等邏輯等= = = 01xz010 xx101xxxxxxxzxxxx case等等= = =01xz0100010100 x0010z00012b1x=2b0 x 值為值為0,因為不相等,因為不相等2b1x=2b1x 值為值為x,因為可能不,因為可能不相等,也可能相等相等,也可能相等2b1x=2b0 x 值為值為0,因為不相同,因為不相同2b1x=2b1x 值為值為1,因為相同,因為相同a = 2b1x;b = 2b1x;if (a = b) $display( a is equal to b);else $display( a is not equal b);a = 2

溫馨提示

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

評論

0/150

提交評論