Verilog HDL硬件描述語言_第1頁
Verilog HDL硬件描述語言_第2頁
Verilog HDL硬件描述語言_第3頁
Verilog HDL硬件描述語言_第4頁
Verilog HDL硬件描述語言_第5頁
已閱讀5頁,還剩120頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

三、

VerilogHDL硬件描述語言大規(guī)??删幊唐骷夹g(shù)課程安排一、可編程邏輯器件基礎(chǔ)二、數(shù)字系統(tǒng)設(shè)計方法三、VerilogHDL硬件描述語言四、開發(fā)軟件介紹五、應(yīng)用實驗六、考核方式三、VerilogHDL硬件描述語言1.VerilogHDL概述2.VerilogHDL建模概述3.VerilogHDL基本語法4.VerilogHDL的順序執(zhí)行與并發(fā)執(zhí)行5.條件語句使用要點6.設(shè)計的可綜合性7.基本電路的verilog描述-組合電路1.VerilogHDL概述1.1什么是VerilogHDL?Verilog

HDL(VerilogHardwareDiscriptionLanguage)一種硬件描述語言,用于從算法級、門級到開關(guān)級的多種抽象設(shè)計層次的數(shù)字系統(tǒng)建模。可以對硬件的并發(fā)執(zhí)行過程進行建模1.VerilogHDL概述1.2Verilog的歷史1983年由GatewayDesignAutomation公司(后被Cadence收購)首創(chuàng)1990年,Cadence公司成立OVI(Open

VerilogInternational)組織來推廣VerilogHDL1995年,IEEE制定了VerilogHDL標準,即IEEEStd1364–1995(Verilog-1995)2001年,IEEE1364-2001(Verilog-2001)獲得通過1.VerilogHDL概述1.3Verilog與VHDL均為硬件描述語言,應(yīng)用都很普遍VHDL由美國國防部高級研究計劃署開發(fā)兩者的區(qū)別:VHDL側(cè)重于系統(tǒng)級描述,從而更多的為系統(tǒng)級設(shè)計人員所采用Verilog側(cè)重于電路級描述,從而更多的為電路級設(shè)計人員所采用1.VerilogHDL概述1.4VerilogHDL與C語言C語言:計算機程序設(shè)計語言,順序執(zhí)行VerilogHDL:語法與C語言接近,硬件描述語言,對硬件的并發(fā)執(zhí)行過程進行建模利用VerilogHDL編程時,要時刻記得VerilogHDL是硬件語言,要將VerilogHDL與硬件電路對應(yīng)起來1.VerilogHDL概述1.5四種抽象層次行為或算法級:Verilog所支持的最高抽象層次。設(shè)計者只注重其實現(xiàn)的算法,不用關(guān)心其具體的硬件實現(xiàn)細節(jié)。與C語言編程類似。數(shù)據(jù)流級:通過描述數(shù)據(jù)流在寄存器間如何傳輸以及如何處理這些數(shù)據(jù)來對設(shè)計進行建模。門級:從組成電路的邏輯門及其相互之間的互連關(guān)系的角度來設(shè)計模塊。類似于使用門級邏輯簡圖來完成設(shè)計。開關(guān)級:Verilog所支持的最低抽象層。通過使用開關(guān)、存儲節(jié)點及其互連關(guān)系來設(shè)計模塊。術(shù)語RTL級(寄存器傳輸級):通常指能夠被邏輯綜合工具接受的行為級和數(shù)據(jù)流級的混合描述在一個模塊中可以混合使用多個抽象層次2.VerilogHDL建模概述數(shù)字電路=線+器件線:器件管教之間的物理連接器件:組合邏輯(如與或非門等)和時序邏輯器件(如寄存器、鎖存器、RAM等)VerilogHDL建模:使用HDL語言對數(shù)字電路的兩種基本要素的特性及相互之間的關(guān)系進行描述。2.1建模2.VerilogHDL建模概述是Verilog的基本描述單元,用于描述某個設(shè)計的功能或結(jié)構(gòu)及其與其他模塊通信的外部端口概念上可等同一個器件,如通用器件(與門、三態(tài)門等)或通用宏單元(計數(shù)器、ALU、CPU)等。模塊可被另一個模塊調(diào)用一個電路設(shè)計可由多個模塊組合而成。2.2模塊(module)2.VerilogHDL建模概述例1.加法器2.2模塊(module)簡單實例module

adder

(a,

b,

cin,

cout,

sum);

input

[2:0]

a;

input

[2:0]

b;

input

cin;

output

cout;

output

[2:0]

sum;

assign

{cout,sum}

=

a

+b

+

cin;endmodule2.VerilogHDL建模概述例2.比較器2.2模塊(module)簡單實例module

compare

(equal,a,b);

input

[1:0]

a,b;

//declaretheinputsignal;

output

equal

;

//declaretheoutputsignal;

assign

equal

=

(a

==

b)

?

1:0

;

/*ifa=b,output1,otherwise0;*/endmodule2.VerilogHDL建模概述例3.三態(tài)門驅(qū)動器2.2模塊(module)簡單實例module

mytri

(din,

d_en,

d_out);

input

din;

input

d_en;

output

d_out;

//--Enteryourstatementshere--//

assign

d_out

=

d_en

?

din

:'bz;endmodulemodule

trist

(din,

d_en,

d_out);

input

din;

input

d_en;

output

d_out;

//--statementshere--//

mytri

u_mytri(din,d_en,d_out);endmodule2.VerilogHDL建模概述模塊內(nèi)容位于module和endmodule兩個語句之間模塊包括接口描述部分和邏輯功能描述部分??膳c實際器件相類比每個模塊要進行端口定義,并說明輸入、輸出口,然后對模塊的功能進行邏輯描述(測試模塊例外)書寫格式自由,一行可以寫幾個語句,一個語句可以分幾行寫。除endmodule與局外,每個語句后面需要有分號表示該語句結(jié)束2.3模塊的結(jié)構(gòu)2.VerilogHDL建模概述2.4模塊語法module

module_name

(port1,port2,

......)

;//Declarations:input,

output,

inout,reg,

wire,

parameter,function,

task,

.

.

.//Statements:Initial

statementAlways

statementModule

instantiationGate

instantiationContinuous

assignmentendmodule2.VerilogHDL建模概述一個模塊用一個文件模塊名與文件名要同名一行一句語句信號方向按輸入、輸出、雙向順序描述盡量采用參數(shù)化,提高設(shè)計的重用2.5書寫語法建議2.VerilogHDL建模概述信號在電路中傳輸會有傳播延時,如線延時、器件延時等時延就是對延時特性的HDL描述所有時延都必須根據(jù)時間單位進行定義,定義方式為在文件頭添加如下語句:是VerilogHDL提供的預(yù)編譯處理命令,1ns表示時間單位是1ns,100ps表示時間精度是100ps。2.6時延2.VerilogHDL建模概述表示B信號在2個時間單位后得到A信號的值。2.6時延時延舉例assign

#2

B

=

A;2.VerilogHDL建模概述結(jié)構(gòu)化描述方式數(shù)據(jù)流描述方式行為描述方式2.7三種建模方式2.VerilogHDL建模概述通過對電路結(jié)構(gòu)的描述來建模,即通過對器件的調(diào)用(HDL概念稱為“例化”),并使用線來連接各器件的描述方式器件包括:Verilog的內(nèi)置門(如與門and,異或門xor等),也可以是用戶的一個設(shè)計反映了一個設(shè)計的層次結(jié)構(gòu)2.7三種建模方式結(jié)構(gòu)化描述方式2.VerilogHDL建模概述2.7三種建模方式結(jié)構(gòu)化描述方式例1:一位全加器module

FA_struct

(A,B,Cin,Sum,Cout);

input

A;

input

B;

input

Cin;

output

Sum;

output

Cout;

wire

S1,

T1,

T2;

//--statements--//

xor

X1

(S1,

A,

B);

xor

X2

(Sum,

S1,

Cin);

and

A1

(T1,

S1,

Cin);

and

A2

(T2,A,

B);

or

O1

(Cout,

T1,

T2);endmodule2.VerilogHDL建模概述1.兩個異或門、兩個與門、一個或門2.S1、T1、T2是門與門之間的連線3.純結(jié)構(gòu)的建模方式4.Xor、and、or為Verilog內(nèi)置的門器件xor表明調(diào)用一個內(nèi)置的異或門,器件名稱xor,代碼實例化名X1;括號內(nèi)的S1,A,B表明該器件管腳的實際連接線的名稱,其中A、B是輸入,S1是輸出。其他相同一位全加器代碼2.VerilogHDL建模概述結(jié)構(gòu)化描述方式例2:兩位全加器兩位全加器結(jié)構(gòu)示意框圖module

Four_bit_FA

(FA,

FB,

FCin,

FSum,

FCout

)

;

parameter

SIZE

=

2;

input

[SIZE:1]

FA;

input

[SIZE:1]

FB;

input

FCin;

output

[SIZE:1]

FSum;

output

FCout;

wire

FTemp;

FA_struct

FA1(

.A

(FA[1]),

.B

(FB[1]),

.Cin

(FCin)

,

.Sum

(FSum[1]),

.Cout

(Ftemp)

);

2.VerilogHDL建模概述兩位全加器代碼注意:.A(FA[1])的含義

FA_struct

FA2(

.A

(FA[2]),

.B

(FB[2]),

.Cin

(FTemp)

,

.Sum

(FSum[2]),

.Cout

(FCout

)

);

endmodule通過對數(shù)據(jù)流在設(shè)計中的具體行為的描述來建模使用連續(xù)賦值語句。借助于Verilog提供的一些運算符,如按位邏輯運算,邏輯與(&),邏輯或(|)等assign

#delay

net_name

=

expression;如:assign

#2

A

=

B;2.VerilogHDL建模概述2.7三種建模方式數(shù)據(jù)流描述方式2.VerilogHDL建模概述2.7三種建模方式數(shù)據(jù)流描述方式例1:一位全加器`timescale

1ns/100ps

module

FA_flow(A,B,Cin,Sum,Cout)

input

A,B,Cin;

output

Sum,

Cout;

wire

S1,T1,T2;

assign

#

2

S1

=

A

^

B;

assign

#

2

Sum

=

S1

^

Cin;

assign

#

2

T1

=

S1

&

Cin;

assign

#

2

T2

=

A

&

B

;

assign

#

2

Cout

=

T1

|

T2;

endmodule2.VerilogHDL建模概述一位全加器代碼注意:各assign語句之間是并行執(zhí)行的,即各語句的執(zhí)行與語句之間的順序無關(guān)。如上,當A有變化時,S1、T2將同時變化,S1的變化又會造成Sum和T1的同時變化。2.VerilogHDL建模概述采用對信號行為級的描述(不是結(jié)構(gòu)級的描述)的方法來建模一般采用initial塊語句或always塊語句通常采用行為級的運算符如加法(+),減法(-)運算符等2.7三種建模方式行為描述方式module

FA_behav1(A,

B,

Cin,

Sum,

Cout

);

input

A,B,Cin;

output

Sum,Cout;

reg

Sum,

Cout;

reg

T1,T2;

always@

(

A

or

B

or

Cin

)

begin

Sum

=

(A

^

B)

^

Cin

;

T1

=

(A

^

B)

&

Cin;

T2

=

A

&

B

;

Cout

=

T1|

T2;

end

endmodule2.VerilogHDL建模概述行為描述方式例1:一位全加器行為建模注意:只有寄存器類型的信號才可以在always和initial語句中進行賦值,類型定義通過reg語句實現(xiàn)always語句一直重復(fù)執(zhí)行,由敏感表中的變量觸發(fā)在begin和end之間的語句順序執(zhí)行,屬于串行語句module

FA_behav2(A,

B,

Cin,

Sum,

Cout

);

input

A,B,Cin;

output

Sum,Cout;

reg

Sum,

Cout;

always@

(

A

or

B

or

Cin

)

begin

{Cout

,Sum}

=

A

+

B

+

Cin

;

end

endmodule2.VerilogHDL建模概述行為描述方式例2:一位全加器行為建模采用更高級(更趨于行為級)的描述方式,即直接采用“+”來描述加法{Cout,Sun}表述將兩個信號拼接成一個寬度更長的信號。2.VerilogHDL建模概述實際設(shè)計中往往是多種設(shè)計模式的混合。一般,對頂層設(shè)計采用結(jié)構(gòu)描述方式;對底層模塊,可采用數(shù)據(jù)流、行為級或兩者的結(jié)合如上面的兩位全加器,對頂層模塊(Four_bit_FA)采用結(jié)構(gòu)描述方式進行“例化”,對底層模塊(FA)可采用結(jié)構(gòu)描述、數(shù)據(jù)流描述或行為描述。2.7三種建模方式混合設(shè)計描述3.VerilogHDL基本語法標識符注釋格式數(shù)字值集合數(shù)據(jù)類型運算符和表達式條件語句Case語句VerilogHDL基本語法標識符注釋格式數(shù)字值集合數(shù)據(jù)類型運算符和表達式條件語句Case語句標識符定義:標識符(identifier)用于定義模塊名、端口名、信號等??梢允且唤M字母、數(shù)字、$符號和_(下劃線)符號的組合,但標識符的第一個字符必須是字母或者下劃線。另外,標識符區(qū)分大小寫。例:CountCOUNT//與Count不同

R56_68FIVE$關(guān)鍵字,Verilog中的保留字。注意:只有小寫的關(guān)鍵字才是保留字書寫規(guī)范建議用有意義的有效的名字,如Sum、CPU_addr等用下劃線區(qū)分詞采用一些前綴或后綴,

時鐘采用Clk前綴:Clk_50,Clk_CPU

低電平采用_n后綴:Enable_n統(tǒng)一一定的縮寫,如全局復(fù)位信號Rst同一信號在不同層次保持一致性,如同一時鐘信號必須在各模塊中保持一致自定義的標識符不能與保留字同名參數(shù)采用大寫,如SIZEVerilogHDL基本語法標識符注釋格式數(shù)字值集合數(shù)據(jù)類型運算符和表達式條件語句Case語句Verilog中有兩種注釋的方式,一種是一“/*”符號開始,以“*/”符號結(jié)束,在兩個符號之間的語句都是注釋語句,因此可以擴展到多行。如:以上n各語句都是注釋語句另一種是以“//”開頭的語句,它表示以//開始到本行的結(jié)束都屬于注釋語句注釋/*statement1,statement2,...

statementn*/VerilogHDL基本語法標識符注釋格式數(shù)字值集合數(shù)據(jù)類型運算符和表達式條件語句Case語句格式VerilogHDL是區(qū)分大小寫的,即大小寫不同的標識符是不同的Verilog書寫格式自由,一條語句可多行書寫;一行可寫多個語句空白(新行、制表符、空格)沒有特殊意義如與是一樣的input

A;

input

Binput

A;input

B;書寫規(guī)范建議一個語句一行采用空四格的TAB鍵進行縮進VerilogHDL基本語法標識符注釋格式數(shù)字值集合數(shù)據(jù)類型運算符和表達式條件語句Case語句數(shù)字值集合值的集合常量(整型、實型、字符型)變量值集合四種基本的值類型0:邏輯0或“假”1:邏輯1或“真”X:未知值Z:高阻四種值得解釋內(nèi)置于語言中與門的輸入或表達式中的“z”的值通常解釋為“x”X值與z值不區(qū)分大小寫,及0x1z和0X1Z相同常量整型、實型、字符串型下劃線符號“_”可隨意用在整數(shù)或?qū)崝?shù)中,用來提高易讀性。注:下劃線不能作為首字符。整型書寫格式:簡單的十進制數(shù)格式;基數(shù)格式字符串型:雙引號內(nèi)的字符系列。整型-簡單的十進制格式帶有一個可選的“+”或“-”操作符的數(shù)字序列例如:32十進制數(shù)32-15十進制數(shù)-15整型-基數(shù)表示法(一)格式:[size]’basevalueSize定義以位計的常量的位長;base為o或O(表示八進制),b或B(表示二進制),d或D(表示十進制),h或H(表示十六進制)之一;value是基于base的值的數(shù)字序列。值x和z以及十六進制中的a到f不區(qū)分大小寫整型-基數(shù)表示法(二)合法例子:非法例子:5‘o37

//5位常量,值為八進制數(shù)37(和5'b11111等效)4

'd2

//4位常量,值十進制數(shù)2(和4'b0010等效)4

'b1x_01

//4位常量,各位的狀態(tài)依次為1x_017

'hx

//7位常量,每位的狀態(tài)均為未知(和7'bxxxxxxx等效)4

'hz

//4位常量,每位的狀態(tài)均為高阻(和4'bzzzz等效)8

'h

2A

//位長和單引號之間以及基數(shù)和數(shù)字之間允許出現(xiàn)空格3'

b

001

//非法:'和基數(shù)b之間不允許出現(xiàn)空格(2+3)

'b10

//非法:位長不能為表達式4

'd-4

//非法:數(shù)值不能為負,符號應(yīng)放在最左邊注意:x(或z)在十六進制中代表4位x(或z),在八進制中代表3位x(或z),在二進制中代表1位x(或z)。整型數(shù)的長度定義是可選的,如沒有定義長度,數(shù)的長度為相應(yīng)值中定義的位數(shù),如:如果定義的長度比常量制定的長度長,通常在左邊填0補位。但是如果數(shù)最左邊一位為“x”或“z”,就相應(yīng)地用x或z在左邊補位。如:如果長度定義的要小,最左邊的位相應(yīng)地被截斷。如:'o

721

//9位八進制數(shù)'h

AF

//8位十六進制數(shù)整型-基數(shù)表示法(三)10'b10

//左邊填0占位,等價于10'b000000001010'bx0x1

//左邊填X占位,等價于10'bxxxxxxx0x13'b1001_0011

//與3'b011等價5'H0FF

//與5'H1F等價字符串型雙引號內(nèi)的字符序列。字符串不能分成多行書寫。例:整數(shù)型常量是可以綜合的,而實數(shù)型和字符串型常量都是不可綜合的"INTERNALERROR""thisisanexampleforVerilogHDL"VerilogHDL基本語法標識符注釋格式數(shù)字值集合數(shù)據(jù)類型運算符和表達式條件語句Case語句數(shù)據(jù)類型線網(wǎng)類型(nettype)寄存器類型(regtype)數(shù)據(jù)類型-線網(wǎng)類型(nettype)常用wire定義用于對結(jié)構(gòu)化器件之間的物理連線建模代表物理連接線,不存儲邏輯值,必須由器件驅(qū)動,通常由assign進行賦值,如:當一個wire類型的信號沒有被驅(qū)動時,缺省值為z(高阻)信號非有定義數(shù)據(jù)類型時,缺省為wire類型語法:assign

A

=

B

^

C;wire

[msb:lsb]

wire1,

wire2,

...

,

wireN;數(shù)據(jù)類型-寄存器類型(regtype)reg是最常用的寄存器類型,用于對存儲單元的描述,如D觸發(fā)器,ROM。在某種觸發(fā)機制下分配一個值,在分配下一個值之前保留原值reg類型的變量,不一定是存儲單元,如在always語句中進行描述的必須用reg類型的變量。語法:例:reg

[msb:lsb]

reg1,

reg2,

...

,

regN;reg

[3:0]

Sat;

//Sat為4位寄存器類型信號reg

Cnt;

//1位寄存器類型reg[1:32]

Kisp,

pisp,

lisp;

//3個32位寄存器類型信號數(shù)據(jù)類型-寄存器類型(regtype)建模舉例:用寄存器類型構(gòu)建兩位的D觸發(fā)器:用寄存器數(shù)組類型來建立存儲器的模型,如對2個8位的RAM建模如下:存儲單元必須一個一個地賦值reg

[1:0]

Dout;...always@(posedge

clk)

Dout

<=

Din;...reg[7:0]

Mem[0:1];Mem[0]

=

'h55;Mem[1]

=

'haa;VerilogHDL基本語法標識符注釋格式數(shù)字值集合數(shù)據(jù)類型運算符條件語句Case語句運算符關(guān)系運算符算術(shù)運算符邏輯運算符按位邏輯運算符條件運算符連接運算符移位運算符運算符-算術(shù)運算符常用算術(shù)運算符:加法(二元運算符):“+”減法(二元運算符):“-”乘法(二元運算符):“*”除法(二元運算符):“/”求余(二元運算符):“%”運算符-關(guān)系運算符(一)包括:> 大于< 小于>= 不小于<= 不大于== 等于=== 全等!= 不等!== 不全等結(jié)果為True(1)或False(0)。如果操作數(shù)中有一位為x或z,那么結(jié)果為x運算符-關(guān)系運算符(二)例:如果操作數(shù)長度不同,長度較短的操作數(shù)在左方填0補齊。例:邏輯相等與不等的比較中,只要一個操作數(shù)含有x或z,比較結(jié)果為未知(x)。如:23>45

//結(jié)果為False(0);52<8'hxFF

//結(jié)果為x'b1000>='b01110;

//等價于'b01000>='b01110;結(jié)果為假(0)Data

=

'b11x0;Addr

=

'b11x0;Data

==

Addr

//比較結(jié)果不定,也就是說值為x運算符-邏輯運算符(一)包括:&& 邏輯與|| 邏輯或! 邏輯非語法:(表達式1)邏輯運算符(表達式2)運算結(jié)果為0或1,例:Crd='b0;

//0為假Dgs='b1;

//1為真Crd&&Dgs

//結(jié)果為0(假)Crd||Dgs

//結(jié)果為1(真)!Dgs

//結(jié)果為0(假)運算符-邏輯運算符(二)邏輯與(&&)的真值表:邏輯或(||)的真值表:運算符-按位邏輯運算符(一)包括:~ 一元非,相當于非門運算& 二元與,相當于與門運算| 二元或,相當于或門運算^ 二元異或,相當于異或門運算~^,^~ 二元異或非,即同或,相當于同或門運算

在輸入操作數(shù)的對應(yīng)位上按位操作,產(chǎn)生向量結(jié)果。運算符-按位邏輯運算符(二)按位邏輯運算符真值表:運算符-按位邏輯運算符(三)例:如果操作數(shù)長度不相等,長度較小的操作數(shù)在最左端填0補位。例如:A

=

'b0110;B

=

'b0100;A|B

//結(jié)果為'b0110A&B

//結(jié)果為'b0100'b0110^'b10000//與下式的操作相同'b00110^'b10000//結(jié)果為:'b10110運算符-條件運算符根據(jù)條件表達式的值選擇表達式語法:cond_expr?expr1:expr2;如果cond_expr為真(1),選項expr1,如果cond_expr為假(0),選擇expr2.如果cond_expr為x或z,結(jié)果是按以下邏輯expr1和expr2按位操作的值:0與0得1,1與1得1,其余情況為x例:wire

[2:0]

Student

=

Marks>18

?

Grade_A

:

Grade_C;//計算表達式Marks>18,如果為真,Grade_Aa賦值給Stuent;//如果為假,Grade_c賦值給Student運算符-連接運算符將小表達式合并形成大表達式語法:{expr1,expr2,…,exprN}例:wire

[7:0]

Dbus;assign

Dbus[7:4]

=

{Dbus[0],

Dbus[1],

Dbus[2],

Dbus[3]};//以反轉(zhuǎn)的順序?qū)⒌投?位賦給高端4位assign

Dbus

=

{Dbus[3:0},

Dbus[7:4]};//高4位與低4位交換運算符:移位運算符<<左移位運算符>>右移位運算符語法:a>>n或a<<na代表要進行移位的操作數(shù),n代表要移幾位。邏輯移位,移出的位用0填補例1:若A=5’b11001,則:

A>>2的值為5’b00110A<<2的值為5’b00100VerilogHDL基本語法標識符注釋格式數(shù)字值集合數(shù)據(jù)類型運算符If_else語句Case語句If_else語句用來判定所給定的條件是否滿足,根據(jù)判定的結(jié)果(真或假)決定執(zhí)行給出的兩種操作之一。三種形式:If_else語句的三種形式(1):if(condition)

procedural_statement;

(2):if(condition)

procedural_statement_1;

//語句1else

procedural_statement_2;

//語句2

(3):if(condition_1)

procedural_statement_1;

//語句1else

if(condition_2)

procedural_statement_2;

//語句2

.

.

.else

if(condition_m)

procedural_statement_m;

//語句melse

procedural_statement_n;

//語句n說明:1.if語句后面都有表達式,一般為邏輯表達式或關(guān)系表達式。0、x、z按“假”處理,1按“真”處理。2.注意分號的使用,if、else合起來是一條語句,else不能單獨使用3.if、else后面如果有多個操作語句,必須用begin和end關(guān)鍵字包含起來組成為一個復(fù)合語句,例if(a>b)

begin

out1<=int1;

out2<=int2;

endelse

begin

out1<=int2;

out2<=int1;

end說明:4.允許一定形式的表達式簡寫,例如:5.if語句的嵌套注意if和else的配對關(guān)系,else總是與它上面最近的if配對。if(expression)

等同于if(expression

==

1)if(!expression)

等同于if(expression

!=

1)if(condition_1)

if(condition_2)

procedural_statement_1;

else

procedural_statement_2;else

if(condition_3)

procedural_statement_3;

else

procedural_statement_4;例2:if(condition_1)

begin

if(condition_2)

procedural_statement_1;

endelse

procedural_statement_2;可以用begin、end塊語句來確定配對關(guān)系。例1:if(condition_1)

begin

if(condition_2)

procedural_statement_1;

else

procedural_statement_2;

end例:模為60的8421BCD碼加法計數(shù)器BCD碼——4位,0-9有進位輸入,結(jié)果加1輸出,計數(shù)滿60之后產(chǎn)生一個進位輸出VerilogHDL基本語法標識符注釋格式數(shù)字值集合數(shù)據(jù)類型運算符If_else語句Case語句case語句多分支選擇語句三種形式:1.case(表達式)<case分支項>endcase2.casez(表達式)<case分支項>endcase3.casex(表達式)<case分支項>endcase語法:case(case_expr)

case_item_expr_1

:

procedural_statement_1;

case_item_expr_2

:

procedural_statement_2;

.

.

.

case_item_expr_m

:

procedural_statement_m;

default:procedural_statement_n;endcase說明:1.case括號中的表達式稱為控制表達式,分支項中的表達式稱為分支表達式。2.當控制表達式的值與分支表達式的值項相等時,就執(zhí)行分支表達式后面的語句;如果所有的分支表達式的值都沒有與控制表達式的值相匹配,就執(zhí)行default后面的語句3.default項可有可無,一個case語句只能有一個default項4.每個分支表達式的值必須互不相同,否則會出現(xiàn)矛盾。5.所有表達式值的位寬必須相等。6.case、casez、casex的區(qū)別,case為全等比較,casez對表達式中出現(xiàn)z的相應(yīng)位不予比較,casex對表達式中出現(xiàn)x、z的相應(yīng)位均不予比較,見真值表例:BCD碼七段數(shù)碼顯示譯碼器三種建模方式詳解結(jié)構(gòu)建模數(shù)據(jù)流建模行為建模三種建模方式詳解結(jié)構(gòu)建模數(shù)據(jù)流建模行為建模結(jié)構(gòu)建模(一)描述語句主要是實例化語句實例化的對象主要是PLD廠家提供的宏單元和設(shè)計者已有的設(shè)計結(jié)構(gòu)建模(二)——實例化語句語法:module_name

instance_name(port_associations);端口關(guān)聯(lián)可通過位置或名稱關(guān)聯(lián),但兩者不能混用通過位置關(guān)聯(lián)(port_expr1,port_expr2,…,port_exprn);通過名稱關(guān)聯(lián)(.PortName(portexpr1),.PortName(port_expr2),….PortName(port_exprn));結(jié)構(gòu)建模(二)——實例化語句例:module

and_ins(DO,D1,D2);

input

D1,D2;

output

DO;

wire

T1,T2;

//采用位置關(guān)聯(lián),T1對應(yīng)輸出端口,D1、D2對應(yīng)兩個輸入端口

and

A1(T1,D1,D2);

//采用名稱關(guān)聯(lián),C是test模塊的端口,與信號T2相連

test

O1(

.C(T2),

.A(D1),

.B(D2));

assign

DO=T1^T2;

endmodule結(jié)構(gòu)建模(二)——實例化語句說明:port_expr可以是一下任何類型標識符,reg或wire。如,上例中的T3為wire型位選項則。如,.c(D[0]),c端口接到D信號的第0位部分選擇。如,.Bus(Din[5:4])上述類型的合并。如,.Addr({A1,A2[1:0]})表達式(只適用于輸入端口),如,.A(wire

Zire=0)建議:盡量采用名稱關(guān)聯(lián)結(jié)構(gòu)建模(二)——實例化語句端口懸空的處理:實例化時,可能有些管教沒有用到,可在映射中采用空白處理。對輸入管教懸空,則該管教輸入為高阻Z,輸入管教被懸空,該輸出管教廢棄不用。DFF

d1

(

.Q(QS),

.Qbar

(

),

.Data

(D)

,

.Preset

(

),

//該管腳懸空

.Clock

(CK));

//名稱對應(yīng)方式。三種建模方式詳解結(jié)構(gòu)建模數(shù)據(jù)流建模行為建模數(shù)據(jù)流建模(一)主要描述方式為持續(xù)性賦值語句數(shù)據(jù)流建模(二)——持續(xù)性賦值語句也稱連續(xù)賦值語句(continuousassignment)對線網(wǎng)類型變量賦值語法:主要用于組合邏輯的建模執(zhí)行過程:只要右邊表達式任一個變量有變化,表達式立即被計算,計算的結(jié)果立即賦給左邊信號為并行執(zhí)行語句,與書寫順序無關(guān)assign

net_type

=

expression;數(shù)據(jù)流建模(二)——持續(xù)性賦值語句舉例:wire

[3:0]

Z,

Preset,

Clear;

//線網(wǎng)說明assign

Z

=

Preset

&

Clear;

//連續(xù)賦值語句wire

Cout,

C

i

n

;wire

[3:0]

Sum,

A,

B;.

.

.assign

{Cout,

Sum}

=

A

+

B

+

Cin;assign

Mux

=

(S

=

=

3)?

D

:

'bz;三種建模方式詳解結(jié)構(gòu)建模數(shù)據(jù)流建模行為建模行為建模通過對設(shè)計的行為的描述來實現(xiàn)對設(shè)計建模一般采用過程語句(initial語句和always語句)行為建模——initial語句語法1:initial

語句1;語法2:只執(zhí)行一次常用于產(chǎn)生激勵信號或寄存器變量的初始化常用于仿真中的初始化initial

begin

statement1;

statement2;

.

.

.

statementn;

end行為建?!猧nitial語句例:用initial語句產(chǎn)生激勵信號`timescale

1ns/1nsmodule

test;

reg

A,B,C;

wire

D;

initial

begin

A=0;B=1;c=0;

#50

A=1;B=0;

#50

A=0;C=1;

#50

B=1;

#50

B=0;C=0;

end

and3

t1(D,A,B,C);

endmodule行為建?!猘lways語句語法1:always

時序控制語句1;語法2:always語句不斷重復(fù)執(zhí)行,即一直檢測時序控制條件,一旦滿足,其后的語句被執(zhí)行一次always

時序控制

begin

statement1;

statement2;

...

statementn;

end行為建模——always語句例:時序控制通常為敏感信號表達式,當表達式中變量的值改變時,其后的語句被執(zhí)行一次,多個表達式之間用“or”連接,此時的語法為:敏感信號一般為兩種類型:邊沿敏感型和電平敏感型,兩者一般不要在一個always語句中同時使用

always

#5

areg

=

~areg;

always

@(敏感信號表達式)

begin

n條語句;

end行為建?!猘lways語句邊沿觸發(fā)的always常常描述時序行為,綜合后生成的電路為寄存器加門級組合邏輯電平觸發(fā)的always常常描述組合邏輯行為,綜合后生成的電路為門級組合邏輯或帶鎖存器的組合邏輯例:always

@(posedge

clk

or

posedge

clr)

//兩個敏感信號都是邊沿型always

@(A

or

B)

//兩個敏感信號都是電平敏感型always

@(posedge

clk

or

clr)

//不建議使用,兩種敏感類型不要同時使用行為建模—posedge和negedge關(guān)鍵字對時序電路的建模(時序電路由時鐘邊沿觸發(fā))posedge表示上升沿;negedge表示下降沿注意同步、異步控制信號的描述方法行為建模—posedge和negedge關(guān)鍵字例1:同步置位、同步清零的計數(shù)器module

cout(out,data,load,reset,clk);

input[7:0]

data;

input

load,clk,reset;

output[7:0]

out;

reg[7:0]

out;

always

@(posedge

clk)

//clk上升沿觸發(fā)

begin

if(!reset)

out

<=

8'h00;

//同步清零,低電平有效

else

if(load)

out

<=

data;

//同步置位,高電平有效

else

out

<=

out+1;

//上升沿計數(shù)

endendmodule行為建?!猵osedge和negedge關(guān)鍵字上例中,敏感信號表達式中沒有列出輸入信號,load和reset,因為它們?yōu)橥娇刂菩盘?,在時鐘的上升沿才檢測這些信號行為建?!猵osedge和negedge關(guān)鍵字例2:異步控制信號的描述方式always

@(posedge

clk

or

posedge

clear)

begin

if(clear)

語句1;

//clear信號上升沿到來時,clear為高電平,

else

//執(zhí)行語句1,即高電平清零有效語句2;

//否則,在時鐘的上升沿執(zhí)行語句2;

end

always

@(posedge

clk

or

negedge

clear)

begin

if(!clear)

語句1;

//低電平有效清零

else

語句2;

end行為建?!猵osedge和negedge關(guān)鍵字注意塊內(nèi)的邏輯描述要與敏感信號表達式信號中的有效電平一致,如下錯誤的描述:always@(posedge

clk

or

negedge

clear)

begin

if(clear)

//矛盾,應(yīng)改為:if(!clear)

out

<=

0;

else

out

<=

in;

end其他語法賦值語句持續(xù)性賦值與過程賦值阻塞賦值與非阻塞賦值參數(shù)定義:parameter編譯預(yù)處理宏定義`define文件包含處理`include時間尺度`timescale其他語法賦值語句持續(xù)性賦值與過程賦值阻塞賦值與非阻塞賦值參數(shù)定義:parameter編譯預(yù)處理宏定義`define文件包含處理`include時間尺度`timescale賦值語句持續(xù)性賦值語句(continuousassignment),主要用于對wire型變量賦值,用于數(shù)據(jù)流建模過程賦值語句(proceduralassignment),多用于對reg型變量賦值,用于行為建模。包括阻塞賦值(blockingassignment)和非阻塞賦值(non-blockingassignment)兩種。賦值語句——持續(xù)型賦值語句例:2選1多路選擇器module

MUX2_1(out,a,b,sel);

input

a,b,sel;

output

out;

assign

out

=

(sel==0)?a:b;

//持續(xù)型賦值,如果sel為0,則out=a,否則,out=bendmodule賦值語句——過程賦值語句非阻塞(non-blocking)賦值方式賦值符號為“<=”,如:b<=a;非阻塞賦值在整個過程塊結(jié)束時才完成賦值操作,即b的值并不是立即就改變的阻塞(blocking)賦值方式賦值符號為“=”,如:b=a;語句結(jié)束時立即完成賦值操作,即b的值在該條件語句結(jié)束后立即改變同一個塊語句中,如果有多個阻塞賦值語句,那么前面的賦值操作沒完成之前,后面的語句就不能被執(zhí)行

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論