⁩⁣⁩⁨ ⁩⁤⁢⁢⁢⁥⁩ ⁥⁣⁦⁡ ⁣⁤⁨ ⁡⁨⁠⁤⁠ ⁦⁧⁡⁤⁣⁡⁡⁨⁤ NrEnE8Gui⁤⁥⁧⁦⁦⁡⁧
⁢⁢⁦⁡⁩⁢⁡
⁣⁧⁡⁤ ⁦⁥⁣⁣ ⁦⁩⁣⁥⁥⁤⁢⁢⁨ ⁥⁤⁦⁢⁦⁦⁠⁠ ⁠⁣ ⁩⁡⁠⁢⁦⁢ J2JwAm⁤⁦⁨⁣⁢⁤⁦⁨ ⁢⁦⁤⁦⁤⁡⁩ ⁧⁨⁨ ⁡⁠⁥⁡⁥⁢⁣ XjPR4LJxih⁧⁨⁦⁠⁥⁧⁩⁠⁥ ⁦⁤⁠⁦⁧⁨⁤⁩
⁦⁢⁨⁤
⁢⁠⁤⁦⁨

⁩⁩⁡

⁤⁧⁩⁧⁩⁠ ⁧⁤⁢⁥⁦⁢⁡ ⁨⁦⁢⁨ FgLr6⁨⁩⁧⁢⁣⁤⁡ ⁤⁤⁩⁤⁤⁡⁧
⁡⁤⁨⁣⁡⁦
⁧⁡⁧⁦
65ggcjb⁥⁤⁧⁡⁤⁦⁧⁤⁣⁥ X9uGXfmv⁨⁦⁦⁤⁧⁨⁧⁧⁥ ⁤⁠⁩⁤
⁩⁨⁧⁩
⁡⁦⁣⁠⁥⁥ ⁩⁧⁡⁥⁨⁨⁡⁧⁧⁨⁠ ⁡⁥⁧⁥⁣⁠⁩⁤⁣ ⁠⁣⁡⁣⁠⁦⁢
WT6nRT1o23⁩⁧⁡⁢⁨⁡
Qdw9KKIo⁨⁧⁣⁧⁦⁥⁩⁨⁠⁡⁨
⁦⁦⁨
⁩⁡⁩⁧⁢⁩⁦⁦ ⁠⁢⁨⁥ ⁨⁩⁥⁥⁣⁩⁧⁤⁣⁦⁡ cl0BI⁩⁦⁩⁣ ⁡⁡⁨⁢⁤⁨⁧
v7yKzer⁣⁨⁠⁨ dcIfNPAm⁠⁣⁠⁨⁩ qlnwC⁤⁥⁦⁤⁠⁤⁤
JvpNiZxt5⁥⁣⁠⁤⁨⁤⁨⁤⁩⁠
ahPko25mQ⁣⁠⁩⁥ ⁠⁩⁤⁨⁩⁩
⁥⁥⁥
⁦⁦⁧⁣⁥⁦⁠⁡
⁧⁦⁧⁤⁩⁢⁡⁤⁢⁧ V5YFmR6G⁤⁩⁥ ⁡⁢⁥

⁧⁨⁡⁩⁣⁡⁥

⁨⁡⁡⁤ ⁨⁤⁧⁩⁥⁧⁤⁣⁤⁣ ⁢⁤⁡⁢⁣⁤ ⁣⁤⁣⁡⁠⁤⁧⁣ ⁧⁥⁧⁧⁥⁣⁢⁦⁡ ⁦⁡⁩ ⁡⁡⁢
⁩⁢⁧⁨⁤⁥⁥⁤
⁦⁥⁧⁣⁠⁩⁠
⁤⁦⁢⁥ ⁩⁦⁦⁦⁢⁧ ⁢⁡⁡⁥⁢⁧
zcJV4txK5⁩⁨⁤⁩⁨⁢
⁢⁣⁤⁦⁥⁤⁩
wpLRd⁨⁣⁨⁩⁧
nWhHw⁤⁦⁩⁣⁨⁨⁠⁩⁥
⁡⁢⁦⁩⁤⁢⁩⁩ ⁥⁡⁠⁠ ⁥⁨⁤⁩⁣⁨⁨ ⁨⁡⁠⁢⁧⁨ ⁠⁠⁧⁠⁩⁧⁢ ⁣⁦⁠ ⁠⁧⁡⁠⁣⁣⁩⁣⁨ ⁤⁤⁥⁨ ⁦⁩⁨⁨ ⁤⁤⁢⁡⁨⁣ ⁤⁡⁡
⁡⁤⁦
⁠⁦⁡ ⁩⁠⁡⁦⁥⁩⁢⁢ 2R9CiQsn2G⁩⁤⁤⁡⁩⁧⁩ ⁣⁩⁥⁩⁥⁩ ⁨⁢⁥ ⁤⁨⁧⁥⁤ ⁩⁥⁠⁥⁢⁡⁠⁩⁥⁠ ⁢⁣⁠⁩⁣⁡ ⁦⁥⁥⁢
⁤⁩⁡⁢⁢⁨⁥
OMxWXh⁡⁦⁥⁦⁢⁦⁥⁩ hiKc3D58Ir⁦⁧⁡⁢ ⁣⁤⁩⁦⁨⁡⁦ ⁤⁥⁨⁩⁥⁡ ⁩⁡⁤⁣⁦⁩ ⁣⁤⁨⁣⁤⁣⁠⁧⁥⁨ ⁤⁠⁩⁠⁩⁤⁡ ⁥⁥⁤⁢⁨⁡⁥⁣ ⁠⁨⁣⁡⁦⁩⁠⁣⁧⁤⁣⁤⁠
    ⁨⁣⁡⁩⁤⁧⁩
⁦⁦⁧⁠⁡⁧⁠
⁩⁩⁡⁩⁨ ⁦⁧⁢⁥⁤⁠⁣ LdJ2mJEioC⁨⁣⁦⁢⁣ ⁣⁣⁥⁢⁠⁧⁡⁧⁠ ⁤⁣⁡⁩⁢ ⁨⁣⁠⁦⁡⁡
⁢⁢⁣⁥⁩⁣⁥⁥⁣
⁡⁡⁨⁨ ⁩⁦⁧⁢⁠⁥⁤⁤⁩⁧ ⁡⁥⁦⁦⁦⁡⁧ ⁧⁥⁨ 0m5W9j⁦⁨⁡⁦⁦⁠⁠ ⁢⁩⁨⁢⁨⁦ ⁧⁠⁣⁩⁨⁥⁩⁠⁠⁩ ⁠⁠⁤⁩⁧⁦⁨⁢⁩⁧⁡⁢⁩
⁥⁥⁣⁢⁨⁡⁤
⁧⁡⁥⁡⁥⁩⁧⁤ ⁨⁡⁢⁠⁤⁦⁥⁠⁦ ⁥⁩⁢⁥⁥⁥⁨ ⁡⁢ ⁥⁦⁩⁧⁧

⁡⁦⁣⁥⁤⁧⁡

⁩⁧⁥⁧⁦⁣⁦⁨⁦⁣ ⁥⁢⁥⁤⁨⁧
⁡⁠⁥⁤⁠⁩
⁢⁧⁩⁧⁥
    ⁡⁡⁦⁠⁡⁢⁧
sTNINeCG⁢⁦⁥
⁢⁩
⁥⁨⁧
cgBAuISw⁦⁠⁩⁥⁠⁡ ⁦⁣⁢⁢⁢⁧ ⁥⁤⁦ RtObD⁢⁠⁧⁩⁨⁢⁢ ⁢⁡⁥⁧⁩ ⁢⁣⁦⁥
⁦⁦⁠⁧⁡⁧⁡⁥⁣

⁢⁢⁣⁣⁥

⁠⁨⁠⁩⁢⁤⁢⁤⁦⁣⁠
    ⁠⁣⁢
⁨⁥⁢⁥⁤ ⁤⁠⁤⁥⁦⁨⁥ ⁣⁧⁤⁥⁤⁩⁡⁩⁤ ⁥⁥⁣⁦⁢ RApFx9⁠⁢⁥⁨⁠⁤⁡⁠⁩ sfszXCv5⁧⁡⁠⁢⁦⁤⁠ 8lejA⁥⁧⁥ ⁠⁡⁠⁨⁦⁧⁠⁣ ⁦⁦⁥ ⁠⁥⁠⁩⁦⁩ ⁨⁩⁠⁡⁣⁦ ⁤⁡⁥⁨⁥⁡ ⁡⁩⁨⁤ ⁤⁩⁧⁦⁢⁠ ⁨⁤⁨⁢⁧⁠⁤⁢ ⁦⁣⁦⁥⁤ bM03⁠⁥⁤⁣⁣⁡⁩⁤ ⁨⁥⁥⁥⁡⁡ ⁧⁩⁩⁤⁠⁢ ⁧⁨⁥⁩ ⁠⁥⁤⁤ ⁤⁣⁢⁡⁡⁣⁣⁩⁧⁠⁦⁢ muoSY1i⁦⁥⁠⁧⁠ ⁩⁥⁦⁠⁦ ⁨⁦⁦⁢ vYTcooXzA⁤⁣⁧⁡⁡⁦⁤
⁨⁠⁧⁨⁤
AYQ3gnMR⁧⁠⁣⁥ ⁦⁢⁤⁧⁤⁩
⁠⁤⁤

xDsToeNDG7⁥⁠⁢

⁧⁨⁥⁨


官方(fāng)論壇
官方(fāng)淘寶(bǎo)
官方(fāng)博客
微信(xìn)公衆号(hào)
點(diǎn)擊聯系(xì)吴工 點(diǎn)擊聯系(xì)周老(lǎo)师(shī)

明(míng)德揚至(zhì)簡設計(jì)法原理與(yǔ)應(yìng)用(yòng)-1.3VERILOG

發(fà)布(bù)时(shí)間(jiān):2021-08-22   作者(zhě):admin 浏覽量(liàng):


第(dì)三(sān)章(zhāng)  VERILOG


4 Verilog HDL基本(běn)語(yǔ)句(jù)

4.1 順序块(kuài)語(yǔ)句(jù)

語(yǔ)句(jù)块(kuài)块(kuài)提(tí)供将两(liǎng)条(tiáo)或(huò)更(gèng)多(duō)条(tiáo)語(yǔ)句(jù)組合成(chéng)語(yǔ)法結構上(shàng)相當于(yú)一(yī)条(tiáo)語(yǔ)句(jù)的(de)機(jī)制。这(zhè)里(lǐ)主(zhǔ)要(yào)講Verilog HDL的(de)順序語(yǔ)句(jù)块(kuài)(begin . . . end):語(yǔ)句(jù)块(kuài)中(zhōng)的(de)語(yǔ)句(jù)按給(gěi)定(dìng)次(cì)序順序執行。順序語(yǔ)句(jù)块(kuài)中(zhōng)的(de)語(yǔ)句(jù)按順序方(fāng)式執行。每条(tiáo)語(yǔ)句(jù)中(zhōng)的(de)时(shí)延值與(yǔ)其前(qián)面(miàn)的(de)語(yǔ)句(jù)執行的(de)模拟时(shí)間(jiān)相關(guān)。一(yī)旦順序語(yǔ)句(jù)块(kuài)執行結束(shù),跟随順序語(yǔ)句(jù)块(kuài)过(guò)程的(de)下(xià)一(yī)条(tiáo)語(yǔ)句(jù)繼續執行。順序語(yǔ)句(jù)块(kuài)的(de)語(yǔ)法如(rú)下(xià):

begin [ :block_id{declarations} ]

procedural_statement ( s )

end

例如(rú):

/ / 産生(shēng)波(bō)形:

begin

#2 Stream = 1;

#5 Stream = 0;

#3 Stream = 1;

#4 Stream = 0;

#2 Stream = 1;

#5 Stream = 0;

End


假定(dìng)順序語(yǔ)句(jù)块(kuài)在(zài)第(dì)10个(gè)时(shí)間(jiān)單位開(kāi)始執行。两(liǎng)个(gè)时(shí)間(jiān)單位後(hòu)第(dì)1条(tiáo)語(yǔ)句(jù)執行,即第(dì)12个(gè)时(shí)間(jiān)單位。此(cǐ)執行完成(chéng)後(hòu),下(xià)1条(tiáo)語(yǔ)句(jù)在(zài)第(dì)17个(gè)时(shí)間(jiān)單位執行(延遲5个(gè)时(shí)間(jiān)單位)。然後(hòu)下(xià)1条(tiáo)語(yǔ)句(jù)在(zài)第(dì)20个(gè)时(shí)間(jiān)單位執行,以(yǐ)此(cǐ)類(lèi)推。該順序語(yǔ)句(jù)块(kuài)執行过(guò)程中(zhōng)産生(shēng)的(de)波(bō)形如(rú)图(tú):

图(tú) 33

4.2 連(lián)續賦值語(yǔ)句(jù)

數據(jù)流的(de)描述是(shì)采用(yòng)連(lián)續賦值語(yǔ)句(jù)(assign)語(yǔ)句(jù)来(lái)实現(xiàn)的(de)。語(yǔ)法如(rú)下(xià):

assign    net_type   = 表(biǎo)达(dá)式;

連(lián)續賦值語(yǔ)句(jù)用(yòng)于(yú)組合邏輯的(de)建模。等式左(zuǒ)邊(biān)是(shì)wire類(lèi)型的(de)變(biàn)量(liàng)。等式右(yòu)邊(biān)可(kě)以(yǐ)是(shì)常量(liàng)、由(yóu)運算符如(rú)邏輯運算符、算術(shù)運算符參與(yǔ)的(de)表(biǎo)达(dá)。如(rú)下(xià)幾(jǐ)个(gè)实例:

wire [3:0] Z, Preset, Clear; //線(xiàn)网(wǎng)说(shuō)明(míng)

assign   Z =  Preset & Clear; //連(lián)續賦值語(yǔ)句(jù)

wire  Cout, C i n ;

wire [3:0]  Sum, A, B;

. . .

assign {Cout, Sum} = A + B + Cin;

assign  Mux  =  (S = = 3)? D : 'bz;

注意(yì)如(rú)下(xià)幾(jǐ)个(gè)方(fāng)面(miàn):

1、連(lián)續賦值語(yǔ)句(jù)的(de)執行是(shì):只(zhī)要(yào)右(yòu)邊(biān)表(biǎo)达(dá)式任一(yī)个(gè)變(biàn)量(liàng)有(yǒu)變(biàn)化(huà),表(biǎo)达(dá)式立即被(bèi)計(jì)算,計(jì)算的(de)結果(guǒ)立即賦給(gěi)左(zuǒ)邊(biān)信(xìn)号(hào)。

2、連(lián)續賦值語(yǔ)句(jù)之間(jiān)是(shì)并行語(yǔ)句(jù),因(yīn)此(cǐ)與(yǔ)位置順序无關(guān)。


4.3 条(tiáo)件(jiàn)語(yǔ)句(jù)

4.3.1 条(tiáo)件(jiàn)語(yǔ)句(jù) if

語(yǔ)句(jù)的(de)語(yǔ)法如(rú)下(xià):

if(condition_1)

procedural_statement_1

{else if(condition_2)

procedural_statement_2}

{else

procedural_statement_3}

如(rú)果(guǒ)对(duì)condition_1 条(tiáo)件(jiàn)滿足,不(bù)管(guǎn)condition_2是(shì)否滿足,都執行procedural_statement_1,procedural_statement_2和(hé)procedural_statement_3都不(bù)執行。

如(rú)果(guǒ)condition_1不(bù)滿足而(ér)condition_2滿足,則執行procedural_statement_2procedural_statement_1和(hé)procedural_statement_3都不(bù)執行。

如(rú)果(guǒ)condition_1不(bù)滿足并且condition_2也(yě)不(bù)滿足时(shí),執行procedural_statement_3procedural_statement_1和(hé)procedural_statement_2都不(bù)執行。

以(yǐ)下(xià)是(shì)一(yī)个(gè)例子。

if(Sum < 60) begin

Grade = C;

Total_C = Total _c + 1;

end else if(Sum < 75) begin

Grade = B;

Total_B = Total_B + 1;

end else begin

Grade = A;

Total_A = Total_A + 1;

end

注意(yì)条(tiáo)件(jiàn)表(biǎo)达(dá)式必須總(zǒng)是(shì)被(bèi)括起来(lái),如(rú)果(guǒ)使用(yòng)if - if - else 格式,那(nà)麼(me)可(kě)能(néng)会(huì)有(yǒu)二(èr)義性(xìng),如(rú)下(xià)例所(suǒ)示:

if(C l k)

if(R e s e t)

Q = 0;

else

Q = D;

問(wèn)題(tí)是(shì)最(zuì)後(hòu)一(yī)个(gè)else 屬于(yú)哪一(yī)个(gè)if? 它(tā)是(shì)屬于(yú)第(dì)一(yī)个(gè)if 的(de)条(tiáo)件(jiàn)(Clk)還(huán)是(shì)屬于(yú)第(dì)二(èr)个(gè)if的(de)条(tiáo)件(jiàn) (Reset)? 这(zhè)在(zài)Verilog HDL 中(zhōng)已通(tòng)过(guò)将else 與(yǔ)最(zuì)近(jìn)的(de)沒(méi)有(yǒu)else 的(de)if 相關(guān)聯来(lái)解(jiě)決。在(zài)这(zhè)个(gè)例子中(zhōng), else 與(yǔ)內(nèi)层if 語(yǔ)句(jù)相關(guān)聯。

以(yǐ)下(xià)是(shì)另(lìng)一(yī)些if 語(yǔ)句(jù)的(de)例子。

if(Sum < 100)

Sum = Sum + 10;

if(Nickel_In)

Deposit = 5;

elseif (Dime_In)

Deposit = 10;

else if(Quarter_In)

Deposit = 25;

else

Deposit = ERROR;

書(shū)写建議:

1、条(tiáo)件(jiàn)表(biǎo)达(dá)式需用(yòng)括号(hào)括起来(lái)。

2、若为(wèi)if - if 語(yǔ)句(jù),請使用(yòng)块(kuài)語(yǔ)句(jù) begin --- end

if(C l k) begin

if(R e s e t)

Q = 0;

else

Q = D;

end

以(yǐ)上(shàng)两(liǎng)點(diǎn)建議是(shì)为(wèi)了(le)使代(dài)碼更(gèng)加清(qīng)晰,防止出(chū)錯。


4.3.2 条(tiáo)件(jiàn)語(yǔ)句(jù) case

case 語(yǔ)句(jù)是(shì)一(yī)个(gè)多(duō)路(lù)条(tiáo)件(jiàn)分(fēn)支形式,其語(yǔ)法如(rú)下(xià):

case(case_expr)

case_item_expr{ ,case_item_expr} :procedural_statement

. . . . . .

[default:procedural_statement]

endcase

case語(yǔ)句(jù)首先(xiān)对(duì)条(tiáo)件(jiàn)表(biǎo)达(dá)式case_expr 求值,然後(hòu)依次(cì)对(duì)各(gè)分(fēn)支項求值并進(jìn)行比較,第(dì)一(yī)个(gè)與(yǔ)条(tiáo)件(jiàn)表(biǎo)达(dá)式值相匹(pǐ)配的(de)分(fēn)支中(zhōng)的(de)語(yǔ)句(jù)被(bèi)執行。可(kě)以(yǐ)在(zài)1 个(gè)分(fēn)支中(zhōng)定(dìng)義多(duō)个(gè)分(fēn)支項;这(zhè)些值不(bù)需要(yào)互斥。缺省(shěng)分(fēn)支覆蓋所(suǒ)有(yǒu)沒(méi)有(yǒu)被(bèi)分(fēn)支表(biǎo)达(dá)式覆蓋的(de)其他(tā)分(fēn)支。

例:

case (HEX)

4'b0001 : LED = 7'b1111001; // 1

4'b0010 : LED = 7'b0100100; // 2

4'b0011 : LED = 7'b0110000; // 3

4'b0100 : LED = 7'b0011001; // 4

4'b0101 : LED = 7'b0010010; // 5

4'b0110 : LED = 7'b0000010; // 6

4'b0111 : LED = 7'b1111000; // 7

4'b1000 : LED = 7'b0000000; // 8

4'b1001 : LED = 7'b0010000; // 9

4'b1010 : LED = 7'b0001000; // A

4'b1011 : LED = 7'b0000011; // B

4'b1100 : LED = 7'b1000110; // C

4'b1101 : LED = 7'b0100001; // D

4'b1110 : LED = 7'b0000110; // E

4'b1111 : LED = 7'b0001110; // F

default :LED = 7'b1000000; // 0

endcase

書(shū)写建議: case 的(de)缺省(shěng)項必須写,防止産生(shēng)鎖存器。


4.4 过(guò)程語(yǔ)句(jù)

Verilog HDL中(zhōng)提(tí)供两(liǎng)種(zhǒng)过(guò)程賦值語(yǔ)句(jù)initial和(hé)always語(yǔ)句(jù),用(yòng)这(zhè)两(liǎng)種(zhǒng)語(yǔ)句(jù)来(lái)实現(xiàn)行为(wèi)的(de)建模。这(zhè)两(liǎng)種(zhǒng)語(yǔ)句(jù)之間(jiān)的(de)執行是(shì)并行的(de),即語(yǔ)句(jù)的(de)執行與(yǔ)位置順序无關(guān)。这(zhè)两(liǎng)種(zhǒng)語(yǔ)句(jù)通(tòng)常與(yǔ)語(yǔ)句(jù)块(kuài)(begin ....end)相結合,則語(yǔ)句(jù)块(kuài)中(zhōng)的(de)執行是(shì)按順序執行的(de)。


4.4.1 initial 語(yǔ)句(jù)

initial語(yǔ)句(jù)只(zhī)執行一(yī)次(cì),即在(zài)設計(jì)被(bèi)開(kāi)始模拟執行时(shí)開(kāi)始(0时(shí)刻)。通(tòng)常只(zhī)用(yòng)在(zài)对(duì)設計(jì)進(jìn)行仿真(zhēn)的(de)测試文(wén)件(jiàn)中(zhōng),用(yòng)于(yú)对(duì)一(yī)些信(xìn)号(hào)進(jìn)行初始化(huà)和(hé)産生(shēng)特(tè)定(dìng)的(de)信(xìn)号(hào)波(bō)形。語(yǔ)法如(rú)下(xià):(大家(jiā)只(zhī)要(yào)先(xiān)有(yǒu)个(gè)概念就(jiù)可(kě)以(yǐ))

initial [timing_control]

procedural_statement

procedural_statement 是(shì)下(xià)列語(yǔ)句(jù)之一(yī):

procedural_assignment (blocking or non-blocking ) //阻塞或(huò)非(fēi)阻塞性(xìng)过(guò)程賦值語(yǔ)句(jù)

procedural_continuous_assignment

conditional_statement

case_statement

loop_statement

wait_statement

disable_statement event_trigger task_enable (user or system)

事(shì)例如(rú)上(shàng)産生(shēng)一(yī)个(gè)信(xìn)号(hào)波(bō)形:

initial begin

#2 Stream = 1;

#5 Stream = 0;

#3 Stream = 1;

#4 Stream = 0;

#2 Stream = 1;

#5 Stream = 0;

end

再次(cì)強(qiáng)調,initial語(yǔ)句(jù)只(zhī)用(yòng)于(yú)仿真(zhēn)测試,一(yī)般不(bù)会(huì)用(yòng)到(dào)設計(jì)代(dài)碼中(zhōng)。


4.4.2 always 語(yǔ)句(jù)
需要(yào)看(kàn)对(duì)應(yìng)的(de)視頻,請點(diǎn)擊視頻編号(hào):001100000068

1、本(běn)节(jié)介紹时(shí)序邏輯代(dài)碼(即always語(yǔ)句(jù)),分(fēn)位同(tóng)步複位的(de)时(shí)序邏輯和(hé)异(yì)步複位的(de)时(shí)序邏輯,本(běn)教学統一(yī)采用(yòng)异(yì)步时(shí)鐘(zhōng)邏輯。
2、这(zhè)是(shì)ALTERA和(hé)VIVADO文(wén)檔

always語(yǔ)句(jù)與(yǔ)initial語(yǔ)句(jù)相反(fǎn),是(shì)被(bèi)重(zhòng)複執行,執行機(jī)制是(shì)通(tòng)过(guò)对(duì)一(yī)个(gè)稱为(wèi)敏感(gǎn)變(biàn)量(liàng)表(biǎo)的(de)事(shì)件(jiàn)驅動(dòng)来(lái)实現(xiàn)的(de),下(xià)面(miàn)会(huì)具體(tǐ)講到(dào)。

always 語(yǔ)句(jù)的(de)基本(běn)格式是(shì)

always @(敏感(gǎn)事(shì)件(jiàn))begin

程序語(yǔ)句(jù)

end

always是(shì)“一(yī)直(zhí)、總(zǒng)是(shì)”的(de)意(yì)思(sī),@後(hòu)面(miàn)跟着事(shì)件(jiàn)。整个(gè)always的(de)意(yì)思(sī)是(shì):當敏感(gǎn)事(shì)件(jiàn)的(de)条(tiáo)件(jiàn)滿足时(shí),就(jiù)執行一(yī)次(cì)“程序語(yǔ)句(jù)”。每敏感(gǎn)事(shì)件(jiàn)每滿足一(yī)次(cì),就(jiù)執行“程序語(yǔ)句(jù)”一(yī)次(cì)。

1

2

3

4

5

6

always  @(a or b or d)begin

if(sel==0)

c = a + b;

else

c = a + d;

end

这(zhè)段(duàn)程序的(de)意(yì)思(sī)是(shì),當信(xìn)号(hào)a或(huò)者(zhě)信(xìn)号(hào)b或(huò)者(zhě)信(xìn)号(hào)d發(fà)生(shēng)變(biàn)化(huà)时(shí),就(jiù)執行一(yī)次(cì)下(xià)面(miàn)語(yǔ)句(jù)。在(zài)執行該段(duàn)語(yǔ)句(jù)时(shí),首先(xiān)判斷信(xìn)号(hào)sel是(shì)否为(wèi)0,如(rú)果(guǒ)为(wèi)0,則執行第(dì)783行代(dài)碼;如(rú)果(guǒ)sel不(bù)为(wèi)0,則執行第(dì)785行代(dài)碼。需要(yào)強(qiáng)調的(de)是(shì),a、b、c任意(yì)一(yī)个(gè)發(fà)生(shēng)變(biàn)化(huà)一(yī)次(cì),782行至(zhì)785行也(yě)只(zhī)執行一(yī)次(cì),不(bù)会(huì)執行第(dì)二(èr)次(cì)的(de)。

注意(yì)到(dào)的(de)是(shì),sel这(zhè)个(gè)信(xìn)号(hào)變(biàn)化(huà)时(shí),是(shì)不(bù)会(huì)執行第(dì)782行到(dào)785行代(dài)碼的(de)。通(tòng)常这(zhè)不(bù)符合設計(jì)者(zhě)的(de)想(xiǎng)法。例如(rú),一(yī)般想(xiǎng)法是(shì)當sel为(wèi)0时(shí),c的(de)結果(guǒ)是(shì)a+b;當sel不(bù)为(wèi)0时(shí),c的(de)結果(guǒ)是(shì)a+d。但如(rú)果(guǒ)sel由(yóu)0變(biàn)1之後(hòu),c的(de)結果(guǒ)a+b。總(zǒng)之,这(zhè)不(bù)是(shì)一(yī)个(gè)規範的(de)設計(jì)思(sī)維。

一(yī)般設計(jì)者(zhě)的(de)想(xiǎng)法是(shì):當信(xìn)号(hào)a或(huò)者(zhě)信(xìn)号(hào)b或(huò)者(zhě)信(xìn)号(hào)d或(huò)者(zhě)信(xìn)号(hào)sel執行變(biàn)化(huà)时(shí),就(jiù)執行782行至(zhì)785行。这(zhè)樣(yàng)就(jiù)确保,當sel为(wèi)0时(shí),c的(de)結果(guǒ)一(yī)定(dìng)为(wèi)a+b;當sel不(bù)为(wèi)0时(shí),c的(de)結果(guǒ)一(yī)定(dìng)是(shì)a+d。所(suǒ)以(yǐ)要(yào)在(zài)敏感(gǎn)列表(biǎo)中(zhōng)加上(shàng)sel,如(rú)下(xià)面(miàn)代(dài)碼。

1

2

3

4

5

6

always  @(a or b or d or sel)begin

if(sel==0)

c = a + b;

else

c = a + d;

end

當敏感(gǎn)信(xìn)号(hào)非(fēi)常多(duō)时(shí),很容易就(jiù)会(huì)把敏感(gǎn)信(xìn)号(hào)遺漏,为(wèi)避免这(zhè)種(zhǒng)情(qíng)況,可(kě)以(yǐ)用(yòng)“*”来(lái)代(dài)替。这(zhè)个(gè)“*”是(shì)指“程序語(yǔ)句(jù)”中(zhōng)所(suǒ)有(yǒu)的(de)条(tiáo)件(jiàn)信(xìn)号(hào),也(yě)就(jiù)是(shì)a、b、d、sel(不(bù)包(bāo)括c)發(fà)生(shēng)變(biàn)化(huà)。明(míng)德揚也(yě)推薦这(zhè)種(zhǒng)写法。

1

2

3

4

5

6

always  @(*)begin

if(sel==0)

c = a + b;

else

c = a + d;

end

这(zhè)種(zhǒng)条(tiáo)件(jiàn)信(xìn)号(hào)變(biàn)化(huà),結果(guǒ)立即變(biàn)化(huà)的(de)always,我(wǒ)们(men)稱之为(wèi)“組合邏輯”。

1

2

3

4

5

6

always  @(posedge clk)begin

if(sel==0)

c <= a + b;

else

c <= a + d;

end

这(zhè)段(duàn)代(dài)碼敏感(gǎn)列表(biǎo)是(shì)“posedge clk”,其中(zhōng)posedge表(biǎo)示上(shàng)升(shēng)沿。也(yě)就(jiù)是(shì)说(shuō),當clk由(yóu)0變(biàn)成(chéng)1的(de)瞬間(jiān),執行一(yī)次(cì)程序代(dài)碼:第(dì)806至(zhì)809行。其他(tā)时(shí)候,c的(de)值保持(chí)不(bù)變(biàn)。要(yào)特(tè)别強(qiáng)調的(de)是(shì),如(rú)果(guǒ)clk沒(méi)有(yǒu)由(yóu)0變(biàn)成(chéng)1,那(nà)麼(me)即使a、b、d、sel發(fà)生(shēng)變(biàn)化(huà),c的(de)值也(yě)是(shì)不(bù)變(biàn)的(de)。

1

2

3

4

5

6

always  @(negedge clk)begin

if(sel==0)

c <= a + b;

else

c <= a + d;

end

这(zhè)段(duàn)代(dài)碼的(de)敏感(gǎn)列表(biǎo)是(shì)“negedge clk”,其中(zhōng)negedg表(biǎo)示下(xià)降沿。也(yě)就(jiù)是(shì)说(shuō),當clk由(yóu)1變(biàn)成(chéng)0的(de)瞬間(jiān),執行一(yī)次(cì)程序代(dài)碼:第(dì)806至(zhì)809行。其他(tā)时(shí)候,c的(de)值保持(chí)不(bù)變(biàn)。要(yào)特(tè)别強(qiáng)調的(de)是(shì),如(rú)果(guǒ)clk沒(méi)有(yǒu)由(yóu)1變(biàn)成(chéng)0,那(nà)麼(me)即使a、b、d、sel發(fà)生(shēng)變(biàn)化(huà),c的(de)值也(yě)是(shì)不(bù)變(biàn)的(de)。

1

2

3

4

5

6

7

8

9

always  @(posedge clk or negedge rst_n)begin

if(rst_n==1'b0)begin

c <= 0;

end

else if(sel==0)

c <= a + b;

else

c <= a + d;

end

这(zhè)段(duàn)代(dài)碼的(de)敏感(gǎn)列表(biǎo)是(shì)“posedge clk or negedge rst_n”,也(yě)就(jiù)是(shì)说(shuō),當clk由(yóu)0變(biàn)成(chéng)1的(de)瞬間(jiān),或(huò)者(zhě)rst_n由(yóu)1變(biàn)化(huà)0的(de)瞬間(jiān),執行一(yī)次(cì)程序代(dài)碼:第(dì)814至(zhì)820行。其他(tā)时(shí)候,c的(de)值保持(chí)不(bù)變(biàn)。

我(wǒ)们(men)把这(zhè)種(zhǒng)信(xìn)号(hào)邊(biān)沿觸發(fà),即信(xìn)号(hào)上(shàng)升(shēng)沿或(huò)者(zhě)下(xià)降沿才變(biàn)化(huà)的(de)always,稱之为(wèi)“时(shí)序邏輯”。而(ér)那(nà)个(gè)信(xìn)号(hào)clk是(shì)时(shí)鐘(zhōng)。注意(yì),識别是(shì)不(bù)是(shì)时(shí)鐘(zhōng),不(bù)是(shì)看(kàn)名稱,而(ér)是(shì)看(kàn)这(zhè)个(gè)信(xìn)号(hào)放(fàng)在(zài)哪里(lǐ)。如(rú)放(fàng)在(zài)敏感(gǎn)列表(biǎo)并且是(shì)邊(biān)沿觸發(fà)的(de),才是(shì)时(shí)鐘(zhōng)。而(ér)信(xìn)号(hào)rst_n是(shì)複位信(xìn)号(hào),也(yě)不(bù)是(shì)看(kàn)名字(zì),而(ér)是(shì)它(tā)放(fàng)在(zài)敏感(gǎn)列表(biǎo)里(lǐ),并且也(yě)是(shì)邊(biān)沿觸發(fà),更(gèng)關(guān)鍵的(de)是(shì)“程序語(yǔ)句(jù)”首先(xiān)判斷了(le)rst_n的(de)值,也(yě)就(jiù)是(shì)优先(xiān)級最(zuì)高(gāo),一(yī)般都是(shì)用(yòng)于(yú)複位使用(yòng)的(de)。

注意(yì)以(yǐ)下(xià)幾(jǐ)點(diǎn):

1、对(duì)組合邏輯的(de)always 語(yǔ)句(jù),敏感(gǎn)變(biàn)量(liàng)必須写全(quán),或(huò)者(zhě)用(yòng)“*”代(dài)替。

2、对(duì)組合邏輯器件(jiàn)的(de)賦值采用(yòng)阻塞賦值“=;时(shí)序邏輯器件(jiàn)的(de)賦值語(yǔ)句(jù)采用(yòng)非(fēi)阻塞賦值“<=”;具體(tǐ)原因(yīn)請看(kàn)“阻塞賦值和(hé)非(fēi)阻塞賦值”一(yī)节(jié)內(nèi)容。


4.5 阻塞賦值和(hé)非(fēi)阻塞賦值

需要(yào)看(kàn)对(duì)應(yìng)的(de)視頻,請點(diǎn)擊視頻編号(hào):001100000072

1、本(běn)节(jié)介紹在(zài)always語(yǔ)句(jù)块(kuài)中(zhōng),verilog語(yǔ)言支持(chí)的(de)两(liǎng)種(zhǒng)類(lèi)型的(de)賦值:阻塞賦值(=)和(hé)非(fēi)阻塞賦值(<=),前(qián)者(zhě)表(biǎo)示順序執行,後(hòu)者(zhě)表(biǎo)示并行執行。
2、这(zhè)是(shì)ALTERA和(hé)VIVADO文(wén)檔

在(zài)always語(yǔ)句(jù)块(kuài)中(zhōng),verilog語(yǔ)言支持(chí)两(liǎng)種(zhǒng)類(lèi)型的(de)賦值:阻塞賦值和(hé)非(fēi)阻塞賦值。阻塞賦值使用(yòng)“=”語(yǔ)句(jù);非(fēi)阻塞賦值使用(yòng)“<=”語(yǔ)句(jù)。

阻塞賦值:在(zài)一(yī)个(gè)begin end的(de)多(duō)行賦值語(yǔ)句(jù),是(shì)先(xiān)執行當前(qián)行的(de)賦值語(yǔ)句(jù),再執行下(xià)一(yī)行的(de)賦值語(yǔ)句(jù)。

非(fēi)阻塞賦值:在(zài)一(yī)个(gè)begin end的(de)多(duō)行賦值語(yǔ)句(jù),在(zài)同(tóng)一(yī)时(shí)間(jiān)同(tóng)时(shí)賦值。

1

2

3

4

5

6

7

8

9

begin

c = a;

d = c + a;

end

begin

c <= a;

d <= c + a;

end

例如(rú)上(shàng)面(miàn)两(liǎng)个(gè)例子中(zhōng),1到(dào)4行这(zhè)一(yī)段(duàn)是(shì)阻塞賦值,程序会(huì)先(xiān)執行825行,得到(dào)結果(guǒ)後(hòu)再執行826行。829至(zhì)832行这(zhè)一(yī)段(duàn)是(shì)非(fēi)阻塞賦值,830行和(hé)831行的(de)賦值語(yǔ)句(jù)是(shì)同(tóng)时(shí)執行的(de)。

假設當前(qián)c的(de)值为(wèi)0d的(de)值为(wèi)0a的(de)新值为(wèi)1

阻塞賦值的(de)執行过(guò)程和(hé)結果(guǒ):程序会(huì)先(xiān)執行第(dì)825行,此(cǐ)时(shí)c的(de)值将更(gèng)新为(wèi)1,然後(hòu)再執行826行,此(cǐ)时(shí)c+a也(yě)就(jiù)是(shì)相當于(yú)1+1=2,也(yě)就(jiù)是(shì)d的(de)值为(wèi)2

非(fēi)阻塞賦值的(de)執行过(guò)程和(hé)結果(guǒ):程序会(huì)同(tóng)时(shí)執行第(dì)830行和(hé)831行。特(tè)别注意(yì)是(shì),在(zài)執行831行的(de)时(shí)候,830行是(shì)還(huán)沒(méi)有(yǒu)執行的(de),也(yě)就(jiù)是(shì)意(yì)味着c的(de)值還(huán)沒(méi)變(biàn)化(huà),即此(cǐ)时(shí)c的(de)值为(wèi)0。同(tóng)时(shí)執行的(de)結果(guǒ)是(shì),c的(de)值为(wèi)1d的(de)值为(wèi)1

明(míng)德揚的(de)規範要(yào)求,組合邏輯使用(yòng)阻塞賦值=”,时(shí)序邏輯使用(yòng)非(fēi)阻塞賦值“<=”。读(dú)者(zhě)可(kě)以(yǐ)把这(zhè)个(gè)規則記(jì)下(xià)来(lái),絕对(duì)不(bù)会(huì)出(chū)錯。

制定(dìng)这(zhè)个(gè)規範的(de)原因(yīn),不(bù)是(shì)語(yǔ)法上(shàng)的(de)原因(yīn),而(ér)是(shì)为(wèi)了(le)正(zhèng)确描述硬(yìng)件(jiàn)的(de)原因(yīn)。


5  D觸發(fà)器

需要(yào)看(kàn)对(duì)應(yìng)的(de)視頻,請點(diǎn)擊視頻編号(hào):001100000069

1、本(běn)节(jié)主(zhǔ)要(yào)介紹了(le)在(zài)FPGA中(zhōng)使用(yòng)最(zuì)簡單的(de)觸發(fà)器——D觸發(fà)器,介紹了(le)它(tā)的(de)結構、波(bō)形,以(yǐ)及(jí)如(rú)何看(kàn)FPGA波(bō)形。
2、这(zhè)是(shì)ALTERA和(hé)VIVADO文(wén)檔

5.1 D觸發(fà)器

數字(zì)電(diàn)路(lù)介紹了(le)多(duō)種(zhǒng)觸發(fà)器:JK觸發(fà)器、D觸發(fà)器、RS觸發(fà)器、T觸發(fà)器等。在(zài)FPGA中(zhōng),我(wǒ)们(men)使用(yòng)的(de)是(shì)最(zuì)簡單的(de)觸發(fà)器---D觸發(fà)器。


5.1.1 D觸發(fà)器結構

图(tú) 34

图(tú) 34是(shì)D觸發(fà)器的(de)結構图(tú),读(dú)者(zhě)可(kě)以(yǐ)把它(tā)看(kàn)成(chéng)一(yī)个(gè)芯片(piàn)。該芯片(piàn)擁有(yǒu)4个(gè)管(guǎn)脚,其中(zhōng)3个(gè)是(shì)輸入(rù)管(guǎn)脚:时(shí)鐘(zhōng)clk、複位rst_n、信(xìn)号(hào)d1个(gè)是(shì)輸出(chū)管(guǎn)脚:q

該芯片(piàn)的(de)功能(néng)是(shì)这(zhè)樣(yàng)的(de):當給(gěi)管(guǎn)脚rst_n給(gěi)低電(diàn)平,也(yě)就(jiù)是(shì)賦值为(wèi)0时(shí),輸出(chū)管(guǎn)脚q就(jiù)处于(yú)低電(diàn)平狀态。如(rú)果(guǒ)管(guǎn)脚rst_n为(wèi)高(gāo)電(diàn)平,然後(hòu)再看(kàn)管(guǎn)脚clk,在(zài)clk由(yóu)0變(biàn)1即上(shàng)升(shēng)沿的(de)时(shí)候,将現(xiàn)在(zài)d的(de)值賦給(gěi)qd是(shì)低電(diàn)平,q也(yě)是(shì)低電(diàn)平,d是(shì)高(gāo)電(diàn)平,q也(yě)是(shì)高(gāo)電(diàn)平。


5.1.2 D觸發(fà)器波(bō)形

图(tú) 35

图(tú) 35是(shì)D觸發(fà)器的(de)功能(néng)波(bō)形图(tú)。該波(bō)形图(tú)反(fǎn)映了(le)D觸發(fà)器各(gè)个(gè)信(xìn)号(hào)的(de)變(biàn)化(huà)情(qíng)況,從左(zuǒ)到(dào)右(yòu)表(biǎo)示时(shí)間(jiān)的(de)走(zǒu)勢。时(shí)鐘(zhōng)信(xìn)号(hào)有(yǒu)規律地(dì)高(gāo)低變(biàn)化(huà)。

波(bō)形图(tú)從左(zuǒ)開(kāi)始往右(yòu)看(kàn)。

Ø 最(zuì)開(kāi)始时(shí),rst_n等于(yú)1d=0q等于(yú)1

Ø 然後(hòu)rst_n由(yóu)1變(biàn)0,此(cǐ)时(shí)輸出(chū)信(xìn)号(hào)q立即變(biàn)成(chéng)0。对(duì)應(yìng)的(de)功能(néng)是(shì):當給(gěi)管(guǎn)脚rst_n給(gěi)低電(diàn)平,也(yě)就(jiù)是(shì)賦值为(wèi)0时(shí),輸出(chū)管(guǎn)脚q就(jiù)处于(yú)低電(diàn)平狀态。

Ø 在(zài)rst_n为(wèi)0期(qī)間(jiān),即使有(yǒu)时(shí)鐘(zhōng),即使信(xìn)号(hào)d變(biàn)化(huà)了(le),q仍然保持(chí)为(wèi)低電(diàn)平。

Ø 在(zài)rst_n由(yóu)0變(biàn)成(chéng)1,撤消複位後(hòu),q沒(méi)有(yǒu)立刻變(biàn)化(huà)。

Ø 在(zài)第(dì)4个(gè)时(shí)鐘(zhōng)上(shàng)升(shēng)沿时(shí),此(cǐ)时(shí)rst_n等于(yú)1,而(ér)d等于(yú)1,所(suǒ)以(yǐ)q變(biàn)成(chéng)了(le)1

Ø 第(dì)5个(gè)时(shí)鐘(zhōng)上(shàng)升(shēng)沿,仍然是(shì)同(tóng)樣(yàng)情(qíng)況,rst_n=1d=1,所(suǒ)以(yǐ)之後(hòu)q=1

Ø 在(zài)第(dì)6个(gè)时(shí)鐘(zhōng)上(shàng)升(shēng)沿,rst_n=1d=0,所(suǒ)以(yǐ)之後(hòu)q=0

Ø 第(dì)7~10个(gè)时(shí)鐘(zhōng)沿也(yě)是(shì)按同(tóng)樣(yàng)方(fāng)式判斷。对(duì)應(yìng)的(de)功能(néng)是(shì):如(rú)果(guǒ)管(guǎn)脚rst_n为(wèi)高(gāo)電(diàn)平,然後(hòu)再看(kàn)管(guǎn)脚clk,在(zài)clk由(yóu)0變(biàn)1即上(shàng)升(shēng)沿的(de)时(shí)候,将現(xiàn)在(zài)d的(de)值賦給(gěi)qd是(shì)低電(diàn)平,q也(yě)是(shì)低電(diàn)平,d是(shì)高(gāo)電(diàn)平,q也(yě)是(shì)高(gāo)電(diàn)平。


5.1.3 D觸發(fà)器代(dài)碼

我(wǒ)们(men)看(kàn)下(xià)面(miàn)这(zhè)段(duàn)时(shí)序邏輯的(de)代(dài)碼。

1

2

3

4

5

6

7

8

always  @(posedge clk or negedge rst_n)begin

if(rst_n==1'b0)begin

q <= 0;

end

else begin

q <= d;

end

end

我(wǒ)们(men)從語(yǔ)法上(shàng),分(fēn)析該段(duàn)代(dài)碼的(de)功能(néng)。該段(duàn)代(dài)碼總(zǒng)是(shì)在(zài)“时(shí)鐘(zhōng)clk上(shàng)升(shēng)沿或(huò)者(zhě)複位rst_n下(xià)降沿”的(de)时(shí)候執行一(yī)次(cì)。怎樣(yàng)執行呢?

1. 如(rú)果(guǒ)複位rst_n=0,則q的(de)值为(wèi)0

2. 如(rú)果(guǒ)複位rst_n=1,則将d的(de)值賦給(gěi)q(注意(yì),前(qián)提(tí)条(tiáo)件(jiàn)是(shì)时(shí)鐘(zhōng)上(shàng)升(shēng)沿的(de)时(shí)候)。

上(shàng)面(miàn)的(de)功能(néng),與(yǔ)这(zhè)个(gè)功能(néng)是(shì)相同(tóng)的(de):當給(gěi)管(guǎn)脚rst_n給(gěi)低電(diàn)平,也(yě)就(jiù)是(shì)賦值为(wèi)0时(shí),輸出(chū)管(guǎn)脚q就(jiù)处于(yú)低電(diàn)平狀态。如(rú)果(guǒ)管(guǎn)脚rst_n为(wèi)高(gāo)電(diàn)平,然後(hòu)再看(kàn)管(guǎn)脚clk,在(zài)clk由(yóu)0變(biàn)1即上(shàng)升(shēng)沿的(de)时(shí)候,将現(xiàn)在(zài)d的(de)值賦給(gěi)q,d是(shì)低電(diàn)平,q也(yě)是(shì)低電(diàn)平,d是(shì)高(gāo)電(diàn)平,q也(yě)是(shì)高(gāo)電(diàn)平。

沒(méi)錯,上(shàng)面(miàn)代(dài)碼功能(néng),與(yǔ)D觸發(fà)器的(de)功能(néng)是(shì)一(yī)樣(yàng)的(de)。这(zhè)份代(dài)碼,其实就(jiù)是(shì)在(zài)描述一(yī)个(gè)D觸發(fà)器,这(zhè)就(jiù)是(shì)D觸發(fà)器的(de)代(dài)碼。

前(qián)面(miàn)已經(jīng)講过(guò),在(zài)FPGA設計(jì)中(zhōng),你可(kě)以(yǐ)用(yòng)原理图(tú)的(de)形式来(lái)設計(jì),也(yě)可(kě)以(yǐ)用(yòng)硬(yìng)件(jiàn)描述語(yǔ)言。當用(yòng)原理图(tú)来(lái)設計(jì)时(shí),幾(jǐ)个(gè)D觸發(fà)器還(huán)可(kě)以(yǐ)忍受,但如(rú)果(guǒ)是(shì)幾(jǐ)千(qiān)幾(jǐ)万(wàn)个(gè)D觸發(fà)器呢,那(nà)必定(dìng)是(shì)头(tóu)暈眼(yǎn)花了(le)。用(yòng)硬(yìng)件(jiàn)描述語(yǔ)言verilog,則沒(méi)有(yǒu)这(zhè)問(wèn)題(tí)。


5.1.4 怎麼(me)看(kàn)FPGA波(bō)形

我(wǒ)们(men)再来(lái)讨論一(yī)下(xià)波(bō)形。先(xiān)請读(dú)者(zhě)思(sī)考,在(zài)第(dì)4个(gè)时(shí)鐘(zhōng)上(shàng)升(shēng)沿的(de)时(shí)刻,在(zài)此(cǐ)时(shí)此(cǐ)刻看(kàn)到(dào)的(de)信(xìn)号(hào)q的(de)值是(shì)多(duō)少(shǎo)?是(shì)0還(huán)是(shì)1?還(huán)是(shì)说(shuō)看(kàn)到(dào)q的(de)上(shàng)升(shēng)沿?

图(tú) 36

我(wǒ)们(men)的(de)verilog代(dài)碼对(duì)應(yìng)的(de)是(shì)硬(yìng)件(jiàn),我(wǒ)们(men)應(yìng)該從硬(yìng)件(jiàn)来(lái)分(fēn)析这(zhè)个(gè)問(wèn)題(tí)。我(wǒ)们(men)想(xiǎng)一(yī)下(xià)代(dài)碼的(de)因(yīn)果(guǒ)關(guān)系(xì)。是(shì)先(xiān)有(yǒu)时(shí)鐘(zhōng)上(shàng)升(shēng)沿,这(zhè)个(gè)是(shì)因(yīn)。然後(hòu)将d的(de)值賦給(gěi)q,这(zhè)个(gè)是(shì)結果(guǒ)。这(zhè)个(gè)因(yīn)果(guǒ)是(shì)有(yǒu)先(xiān)後(hòu)關(guān)系(xì)的(de),对(duì)于(yú)硬(yìng)件(jiàn)来(lái)说(shuō),这(zhè)个(gè)“先(xiān)後(hòu)”无論是(shì)多(duō)麼(me)地(dì)快(kuài),也(yě)是(shì)占有(yǒu)一(yī)定(dìng)时(shí)間(jiān)的(de),所(suǒ)以(yǐ)q的(de)變(biàn)化(huà)会(huì)稍後(hòu)于(yú)clk的(de)上(shàng)升(shēng)沿。例如(rú)下(xià)图(tú)就(jiù)是(shì)硬(yìng)件(jiàn)的(de)实際變(biàn)化(huà)情(qíng)況。

图(tú) 37

图(tú)中(zhōng)就(jiù)很容易看(kàn)出(chū),第(dì)4个(gè)时(shí)鐘(zhōng)上(shàng)升(shēng)沿时(shí)刻,看(kàn)到(dào)的(de)q值为(wèi)0,也(yě)就(jiù)是(shì)變(biàn)化(huà)前(qián)的(de)值。上(shàng)面(miàn)的(de)波(bō)形虽然更(gèng)将近(jìn)于(yú)实際,但这(zhè)樣(yàng)画(huà)图(tú)实在(zài)是(shì)沒(méi)累了(le),而(ér)且也(yě)沒(méi)有(yǒu)完成(chéng)必要(yào)。我(wǒ)们(men)只(zhī)需掌握这(zhè)種(zhǒng)看(kàn)波(bō)形規則:时(shí)鐘(zhōng)上(shàng)升(shēng)沿看(kàn)信(xìn)号(hào),是(shì)看(kàn)到(dào)變(biàn)化(huà)之前(qián)的(de)值。

图(tú) 38

所(suǒ)以(yǐ)第(dì)4个(gè)时(shí)鐘(zhōng)上(shàng)升(shēng)沿时(shí),看(kàn)到(dào)q值为(wèi)0;在(zài)第(dì)6个(gè)时(shí)鐘(zhōng)上(shàng)升(shēng)沿时(shí),看(kàn)到(dào)q值为(wèi)1;在(zài)第(dì)7个(gè)时(shí)鐘(zhōng)上(shàng)升(shēng)沿时(shí),看(kàn)到(dào)q值为(wèi)0;在(zài)第(dì)8个(gè)时(shí)鐘(zhōng)上(shàng)升(shēng)沿时(shí),看(kàn)到(dào)q值为(wèi)1;在(zài)第(dì)10个(gè)时(shí)鐘(zhōng)上(shàng)升(shēng)沿时(shí),看(kàn)到(dào)q值为(wèi)0

注意(yì)一(yī)下(xià),複位信(xìn)号(hào)是(shì)在(zài)系(xì)統開(kāi)始时(shí)刻或(huò)者(zhě)出(chū)現(xiàn)异(yì)常时(shí)才使用(yòng),一(yī)般上(shàng)電(diàn)後(hòu)就(jiù)不(bù)会(huì)再次(cì)複位了(le),可(kě)以(yǐ)認为(wèi)複位是(shì)特(tè)殊的(de)情(qíng)況。

我(wǒ)们(men)考慮正(zhèng)常使用(yòng)的(de)情(qíng)況。我(wǒ)们(men)无論是(shì)從功能(néng)上(shàng),還(huán)是(shì)波(bō)形上(shàng),都可(kě)以(yǐ)看(kàn)到(dào)信(xìn)号(hào)q只(zhī)在(zài)时(shí)鐘(zhōng)上(shàng)升(shēng)沿才變(biàn)化(huà),它(tā)絕对(duì)不(bù)会(huì)在(zài)中(zhōng)間(jiān)變(biàn)化(huà)。在(zài)一(yī)般的(de)數字(zì)系(xì)統中(zhōng),大部(bù)分(fēn)信(xìn)号(hào)之間(jiān)的(de)傳遞,都是(shì)在(zài)同(tóng)一(yī)个(gè)时(shí)鐘(zhōng)傳遞的(de),即大部(bù)分(fēn)都是(shì)同(tóng)步電(diàn)路(lù)。跨时(shí)鐘(zhōng)的(de)電(diàn)路(lù)占比非(fēi)常小,屬于(yú)特(tè)殊的(de)异(yì)步電(diàn)路(lù)。在(zài)本(běn)教材中(zhōng),所(suǒ)有(yǒu)的(de)案(àn)例、練習,如(rú)果(guǒ)沒(méi)有(yǒu)提(tí)前(qián)说(shuō)明(míng),默認都是(shì)同(tóng)步電(diàn)路(lù)。

既然是(shì)同(tóng)步電(diàn)路(lù),那(nà)麼(me)輸入(rù)信(xìn)号(hào)d也(yě)是(shì)另(lìng)一(yī)个(gè)D觸發(fà)器産生(shēng)的(de),并且是(shì)同(tóng)一(yī)个(gè)时(shí)鐘(zhōng)clk産生(shēng)的(de),如(rú)下(xià)图(tú)。

这(zhè)就(jiù)意(yì)味着信(xìn)号(hào)d也(yě)只(zhī)会(huì)在(zài)时(shí)鐘(zhōng)上(shàng)升(shēng)沿變(biàn)化(huà),理想(xiǎng)波(bō)形中(zhōng),它(tā)不(bù)会(huì)在(zài)时(shí)鐘(zhōng)的(de)中(zhōng)間(jiān)變(biàn)化(huà)的(de),所(suǒ)以(yǐ)修正(zhèng)下(xià)波(bō)形图(tú),下(xià)图(tú)就(jiù)是(shì)理想(xiǎng)的(de)、正(zhèng)确的(de)波(bō)形图(tú)。

图(tú) 39

在(zài)rst_n由(yóu)1變(biàn)0时(shí),q立刻變(biàn)成(chéng)0

在(zài)第(dì)2个(gè)时(shí)鐘(zhōng)上(shàng)升(shēng)沿,看(kàn)到(dào)rst_n为(wèi)0。按代(dài)碼功能(néng),q仍然为(wèi)0

在(zài)第(dì)3个(gè)时(shí)鐘(zhōng)上(shàng)升(shēng)沿,看(kàn)到(dào)rst_n为(wèi)0。按代(dài)碼功能(néng),q仍然为(wèi)0

在(zài)第(dì)4个(gè)时(shí)鐘(zhōng)上(shàng)升(shēng)沿,看(kàn)到(dào)rst_n为(wèi)1d值为(wèi)1q值为(wèi)0。按代(dài)碼功能(néng),q變(biàn)成(chéng)1

在(zài)第(dì)5个(gè)时(shí)鐘(zhōng)上(shàng)升(shēng)沿,看(kàn)到(dào)rst_n为(wèi)1d值为(wèi)1q值为(wèi)1。按代(dài)碼功能(néng),q變(biàn)成(chéng)1

在(zài)第(dì)6个(gè)时(shí)鐘(zhōng)上(shàng)升(shēng)沿,看(kàn)到(dào)rst_n为(wèi)1d值为(wèi)0q值为(wèi)1。按代(dài)碼功能(néng),q變(biàn)成(chéng)0

在(zài)第(dì)7个(gè)时(shí)鐘(zhōng)上(shàng)升(shēng)沿,看(kàn)到(dào)rst_n为(wèi)1d值为(wèi)1q值为(wèi)0。按代(dài)碼功能(néng),q變(biàn)成(chéng)1

在(zài)第(dì)8个(gè)时(shí)鐘(zhōng)上(shàng)升(shēng)沿,看(kàn)到(dào)rst_n为(wèi)1d值为(wèi)0q值为(wèi)1。按代(dài)碼功能(néng),q變(biàn)成(chéng)0

在(zài)第(dì)9个(gè)时(shí)鐘(zhōng)上(shàng)升(shēng)沿,看(kàn)到(dào)rst_n为(wèi)1d值为(wèi)0q值为(wèi)0。按代(dài)碼功能(néng),q變(biàn)成(chéng)0

在(zài)第(dì)10个(gè)时(shí)鐘(zhōng)上(shàng)升(shēng)沿,看(kàn)到(dào)rst_n为(wèi)1d值为(wèi)1q值为(wèi)0。按代(dài)碼功能(néng),q變(biàn)成(chéng)1


5.2 时(shí)序邏輯实現(xiàn)的(de)加法器

我(wǒ)们(men)分(fēn)析下(xià)面(miàn)这(zhè)段(duàn)代(dài)碼

1

2

3

4

5

6

7

8

always  @(posedge clk or negedge rst_n)begin

if(rst_n==1'b0)begin

q <= 0;

end

else begin

q <= a + d;

end

end

我(wǒ)们(men)仍然從語(yǔ)法上(shàng),分(fēn)析該段(duàn)代(dài)碼的(de)功能(néng)。該段(duàn)代(dài)碼總(zǒng)是(shì)在(zài)“时(shí)鐘(zhōng)clk上(shàng)升(shēng)沿或(huò)者(zhě)複位rst_n下(xià)降沿”的(de)时(shí)候執行一(yī)次(cì)。怎樣(yàng)執行呢?

1. 如(rú)果(guǒ)複位rst_n=0,則q的(de)值为(wèi)0

2. 如(rú)果(guǒ)複位rst_n=1,則将(a+d)的(de)結果(guǒ)賦給(gěi)q(注意(yì),前(qián)提(tí)条(tiáo)件(jiàn)是(shì)时(shí)鐘(zhōng)上(shàng)升(shēng)沿的(de)时(shí)候)。

假設用(yòng)信(xìn)号(hào)c表(biǎo)示a+d的(de)結果(guǒ),則第(dì)2點(diǎn)可(kě)改为(wèi):如(rú)果(guǒ)複位rst_n=1,則将c的(de)值賦給(gěi)q(注意(yì),前(qián)提(tí)条(tiáo)件(jiàn)是(shì)时(shí)鐘(zhōng)上(shàng)升(shēng)沿的(de)时(shí)候)。这(zhè)很明(míng)顯就(jiù)是(shì)一(yī)个(gè)D觸發(fà)器,輸入(rù)信(xìn)号(hào)为(wèi)d,輸出(chū)为(wèi)q,时(shí)鐘(zhōng)为(wèi)clk,複位为(wèi)rst_n。

图(tú) 40

c是(shì)怎麼(me)来(lái)的(de)?c是(shì)a+d的(de)結果(guǒ),自(zì)然是(shì)一(yī)个(gè)加法器,所(suǒ)以(yǐ)可(kě)以(yǐ)画(huà)出(chū)上(shàng)面(miàn)代(dài)碼所(suǒ)对(duì)應(yìng)的(de)電(diàn)路(lù)結構图(tú),可(kě)以(yǐ)看(kàn)出(chū)在(zài)D觸發(fà)器的(de)基礎上(shàng)增加了(le)一(yī)个(gè)加法器。

图(tú) 41

很容易分(fēn)析出(chū)上(shàng)面(miàn)電(diàn)路(lù)的(de)功能(néng):信(xìn)号(hào)a和(hé)信(xìn)号(hào)b相加得到(dào)cc連(lián)到(dào)D觸發(fà)器的(de)輸入(rù)端。當clk出(chū)現(xiàn)上(shàng)升(shēng)沿时(shí),将c的(de)值傳給(gěi)q。这(zhè)與(yǔ)代(dài)碼功能(néng)是(shì)一(yī)致(zhì)的(de)。

下(xià)面(miàn)是(shì)代(dài)碼和(hé)硬(yìng)件(jiàn)所(suǒ)对(duì)應(yìng)的(de)波(bō)形图(tú)。

图(tú) 42

先(xiān)看(kàn)信(xìn)号(hào)c的(de)波(bō)形,c的(de)産生(shēng)只(zhī)有(yǒu)與(yǔ)a和(hé)b有(yǒu)關(guān),與(yǔ)rst_n和(hé)clk无關(guān)。c是(shì)a+d的(de)結果(guǒ),按照二(èr)進(jìn)制加法:0+0=0,0+1=1,1+1=0。就(jiù)可(kě)以(yǐ)画(huà)出(chū)c的(de)波(bō)形。

在(zài)第(dì)1个(gè)时(shí)鐘(zhōng)期(qī)間(jiān),a=0b=0,所(suǒ)以(yǐ)c=0+0=0

在(zài)第(dì)2个(gè)时(shí)鐘(zhōng)期(qī)間(jiān),a=1b=0,所(suǒ)以(yǐ)c=1+0=1

在(zài)第(dì)3个(gè)时(shí)鐘(zhōng)期(qī)間(jiān),a=1b=1,所(suǒ)以(yǐ)c=1+1=0

在(zài)第(dì)4个(gè)时(shí)鐘(zhōng)期(qī)間(jiān),a=0b=1,所(suǒ)以(yǐ)c=0+1=1

在(zài)第(dì)5到(dào)第(dì)6个(gè)时(shí)鐘(zhōng)期(qī)間(jiān),a=0b=0,所(suǒ)以(yǐ)c=0+0=0

在(zài)第(dì)7个(gè)时(shí)鐘(zhōng)期(qī)間(jiān),a=1b=1,所(suǒ)以(yǐ)c=1+1=0

在(zài)第(dì)8个(gè)时(shí)鐘(zhōng)期(qī)間(jiān),a=0b=1,所(suǒ)以(yǐ)c=0+1=1

在(zài)第(dì)9个(gè)时(shí)鐘(zhōng)期(qī)間(jiān),a=0b=0,所(suǒ)以(yǐ)c=0+0=0

在(zài)第(dì)10个(gè)时(shí)鐘(zhōng)期(qī)間(jiān),a=0b=1,所(suǒ)以(yǐ)c=0+1=1

再看(kàn)信(xìn)号(hào)q的(de)波(bō)形。q是(shì)D觸發(fà)器的(de)輸出(chū),它(tā)只(zhī)在(zài)rst_n的(de)下(xià)降沿或(huò)者(zhě)clk的(de)上(shàng)升(shēng)沿才變(biàn)化(huà),其他(tā)时(shí)候不(bù)變(biàn)化(huà),也(yě)就(jiù)是(shì)a、b、c有(yǒu)變(biàn)化(huà)时(shí),q都不(bù)会(huì)立刻變(biàn)。

图(tú) 43

在(zài)rst_n由(yóu)1變(biàn)0时(shí),q立刻變(biàn)成(chéng)0

在(zài)第(dì)2个(gè)时(shí)鐘(zhōng)上(shàng)升(shēng)沿,看(kàn)到(dào)rst_n为(wèi)0。按代(dài)碼功能(néng),q仍然为(wèi)0

在(zài)第(dì)3个(gè)时(shí)鐘(zhōng)上(shàng)升(shēng)沿,看(kàn)到(dào)rst_n为(wèi)0。按代(dài)碼功能(néng),q仍然为(wèi)0

在(zài)第(dì)4个(gè)时(shí)鐘(zhōng)上(shàng)升(shēng)沿,看(kàn)到(dào)rst_n为(wèi)1c值为(wèi)0q值为(wèi)0。按代(dài)碼功能(néng),q變(biàn)成(chéng)0

在(zài)第(dì)5个(gè)时(shí)鐘(zhōng)上(shàng)升(shēng)沿,看(kàn)到(dào)rst_n为(wèi)1c值为(wèi)1q值为(wèi)0。按代(dài)碼功能(néng),q變(biàn)成(chéng)1

在(zài)第(dì)6个(gè)时(shí)鐘(zhōng)上(shàng)升(shēng)沿,看(kàn)到(dào)rst_n为(wèi)1c值为(wèi)0q值为(wèi)1。按代(dài)碼功能(néng),q變(biàn)成(chéng)0

在(zài)第(dì)7个(gè)时(shí)鐘(zhōng)上(shàng)升(shēng)沿,看(kàn)到(dào)rst_n为(wèi)1c值为(wèi)0q值为(wèi)0。按代(dài)碼功能(néng),q變(biàn)成(chéng)0

在(zài)第(dì)8个(gè)时(shí)鐘(zhōng)上(shàng)升(shēng)沿,看(kàn)到(dào)rst_n为(wèi)1c值为(wèi)0q值为(wèi)0。按代(dài)碼功能(néng),q變(biàn)成(chéng)0

在(zài)第(dì)9个(gè)时(shí)鐘(zhōng)上(shàng)升(shēng)沿,看(kàn)到(dào)rst_n为(wèi)1c值为(wèi)1q值为(wèi)0。按代(dài)碼功能(néng),q變(biàn)成(chéng)1

在(zài)第(dì)10个(gè)时(shí)鐘(zhōng)上(shàng)升(shēng)沿,看(kàn)到(dào)rst_n为(wèi)1c值为(wèi)0q值为(wèi)1。按代(dài)碼功能(néng),q變(biàn)成(chéng)0

在(zài)第(dì)11个(gè)时(shí)鐘(zhōng)上(shàng)升(shēng)沿,看(kàn)到(dào)rst_n为(wèi)1c值为(wèi)1q值为(wèi)0。按代(dài)碼功能(néng),q變(biàn)成(chéng)1

读(dú)者(zhě)有(yǒu)沒(méi)有(yǒu)發(fà)現(xiàn),在(zài)讨論时(shí)序邏輯的(de)加法器时(shí),我(wǒ)们(men)是(shì)分(fēn)開(kāi)讨論加法器的(de)輸出(chū)c和(hé)D觸發(fà)器的(de)輸出(chū)q,这(zhè)就(jiù)像两(liǎng)块(kuài)独立的(de)電(diàn)路(lù)。那(nà)我(wǒ)们(men)Verilog代(dài)碼,是(shì)否也(yě)可(kě)以(yǐ)分(fēn)開(kāi)来(lái)写呢?當然是(shì)可(kě)以(yǐ)的(de)。

我(wǒ)们(men)可(kě)以(yǐ)先(xiān)将下(xià)面(miàn)的(de)硬(yìng)件(jiàn)電(diàn)路(lù)用(yòng)Verilog描述出(chū)来(lái)。

图(tú) 44

該電(diàn)路(lù)对(duì)應(yìng)的(de)電(diàn)路(lù),可(kě)以(yǐ)写成(chéng):

1

2

3

always  @(*)begin

c = a + d;

end

也(yě)可(kě)以(yǐ)写成(chéng)

1

assign c = a + d;

上(shàng)面(miàn)的(de)两(liǎng)段(duàn)代(dài)碼,都是(shì)描述同(tóng)一(yī)硬(yìng)件(jiàn)電(diàn)路(lù),并且是(shì)加法器。

其次(cì),我(wǒ)们(men)再用(yòng)Verilog描述一(yī)下(xià)觸發(fà)器。

图(tú) 45

其代(dài)碼的(de)写法如(rú)下(xià):

1

2

3

4

5

6

7

8

always  @(posedge clk or negedge rst_n)begin

if(rst_n==1'b0)begin

q <= 0;

end

else begin

q <= c;

end

end

最(zuì)後(hòu),我(wǒ)们(men)可(kě)以(yǐ)看(kàn)到(dào),两(liǎng)段(duàn)代(dài)碼都有(yǒu)信(xìn)号(hào)c,说(shuō)明(míng)这(zhè)两(liǎng)个(gè)是(shì)相連(lián)的(de),因(yīn)此(cǐ)硬(yìng)件(jiàn)連(lián)接起来(lái),變(biàn)成(chéng)下(xià)面(miàn)電(diàn)路(lù)。

图(tú) 46

由(yóu)此(cǐ)可(kě)見(jiàn),下(xià)面(miàn)两(liǎng)段(duàn)代(dài)碼所(suǒ)对(duì)應(yìng)的(de)硬(yìng)件(jiàn)電(diàn)路(lù)是(shì)一(yī)模一(yī)樣(yàng)的(de)。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

always  @(posedge clk or negedge rst_n)begin

if(rst_n==1'b0)begin

q <= 0;

end

else begin

q <= c;

end

end

always  @(*)begin

c = a + d;

end


1

2

3

4

5

6

7

8

always  @(posedge clk or negedge rst_n)begin

if(rst_n==1'b0)begin

q <= 0;

end

else begin

q <= a + d;

end

end

这(zhè)两(liǎng)種(zhǒng)代(dài)碼哪種(zhǒng)比較好(hǎo)?答(dá)案(àn)是(shì)一(yī)樣(yàng)好(hǎo)。因(yīn)为(wèi)它(tā)们(men)的(de)硬(yìng)件(jiàn)是(shì)相同(tóng)的(de),这(zhè)就(jiù)是(shì)評估verilog代(dài)碼好(hǎo)不(bù)好(hǎo)的(de)最(zuì)基本(běn)标(biāo)準,不(bù)是(shì)看(kàn)代(dài)碼行數,而(ér)是(shì)看(kàn)硬(yìng)件(jiàn)。


6 时(shí)鐘(zhōng)的(de)重(zhòng)要(yào)性(xìng)

需要(yào)看(kàn)对(duì)應(yìng)的(de)視頻,請點(diǎn)擊視頻編号(hào):001100000070

1、本(běn)节(jié)主(zhǔ)要(yào)介紹了(le)數字(zì)電(diàn)路(lù)中(zhōng)非(fēi)常重(zhòng)要(yào)的(de)概念——时(shí)鐘(zhōng),以(yǐ)及(jí)时(shí)鐘(zhōng)頻率和(hé)时(shí)鐘(zhōng)周期(qī)的(de)換算方(fāng)法。
2、这(zhè)是(shì)ALTERA和(hé)VIVADO視頻


  时(shí)鐘(zhōng)信(xìn)号(hào)是(shì)每隔固定(dìng)时(shí)間(jiān)上(shàng)下(xià)變(biàn)化(huà)的(de)信(xìn)号(hào)。本(běn)次(cì)上(shàng)升(shēng)沿和(hé)上(shàng)次(cì)上(shàng)升(shēng)沿占用(yòng)的(de)时(shí)間(jiān),就(jiù)是(shì)时(shí)鐘(zhōng)周期(qī),它(tā)的(de)倒數就(jiù)是(shì)时(shí)鐘(zhōng)頻率。高(gāo)電(diàn)平占整个(gè)时(shí)鐘(zhōng)周期(qī)的(de)时(shí)間(jiān),稱之为(wèi)占空比。

  FPGA中(zhōng)的(de)时(shí)鐘(zhōng),占空比一(yī)般是(shì)50%,即高(gāo)電(diàn)平时(shí)間(jiān)和(hé)低電(diàn)平时(shí)間(jiān)一(yī)樣(yàng)。其实占空比在(zài)FPGA內(nèi)部(bù)沒(méi)有(yǒu)太大的(de)意(yì)義,因(yīn)为(wèi)我(wǒ)们(men)使用(yòng)的(de)是(shì)时(shí)鐘(zhōng)上(shàng)升(shēng)沿来(lái)觸發(fà),更(gèng)加關(guān)心(xīn)的(de)是(shì)时(shí)鐘(zhōng)頻率。

如(rú)果(guǒ)时(shí)鐘(zhōng)的(de)上(shàng)升(shēng)沿每秒(miǎo)出(chū)現(xiàn)一(yī)次(cì),说(shuō)明(míng)时(shí)鐘(zhōng)的(de)时(shí)鐘(zhōng)周期(qī)为(wèi)1秒(miǎo),时(shí)鐘(zhōng)頻率为(wèi)1Hz。如(rú)果(guǒ)时(shí)鐘(zhōng)的(de)上(shàng)升(shēng)沿每1毫(háo)秒(miǎo)出(chū)現(xiàn)一(yī)次(cì),说(shuō)明(míng)时(shí)鐘(zhōng)的(de)时(shí)鐘(zhōng)周期(qī)为(wèi)1毫(háo)秒(miǎo),时(shí)鐘(zhōng)頻率为(wèi)1000Hz,或(huò)写成(chéng)1kHz

  現(xiàn)在(zài)普通(tòng)的(de)FPGA器件(jiàn),所(suǒ)支持(chí)的(de)时(shí)鐘(zhōng)頻率範圍一(yī)般不(bù)超过(guò)150M,高(gāo)端器件(jiàn)可(kě)能(néng)不(bù)超过(guò)700M(經(jīng)验(yàn)值,实際能(néng)跑多(duō)愉,取(qǔ)決于(yú)器件(jiàn)、設計(jì)的(de)電(diàn)路(lù)有(yǒu)相當大的(de)關(guān)系(xì))。反(fǎn)对(duì)應(yìng)的(de)时(shí)鐘(zhōng)周期(qī)在(zài)納秒(miǎo)級範圍。所(suǒ)以(yǐ)本(běn)教材里(lǐ),所(suǒ)有(yǒu)案(àn)例的(de)时(shí)鐘(zhōng)頻率一(yī)般都是(shì)幾(jǐ)十(shí)到(dào)一(yī)百(bǎi)多(duō)M

  下(xià)面(miàn)列出(chū)本(běn)教材常用(yòng)到(dào)的(de)时(shí)鐘(zhōng)頻率以(yǐ)及(jí)所(suǒ)对(duì)應(yìng)的(de)时(shí)鐘(zhōng)周期(qī),方(fāng)便读(dú)者(zhě)進(jìn)行換算。

时(shí)鐘(zhōng)頻率

时(shí)鐘(zhōng)周期(qī)

100KHz

10_000ns

1MHz

1_000ns

8MHz

125ns

50MHz

20ns

100MHz

10ns

125MHz

8ns

150MHz

6.667ns

200MHz

5ns

时(shí)鐘(zhōng)是(shì)FPGA最(zuì)重(zhòng)要(yào)的(de)信(xìn)号(hào),所(suǒ)有(yǒu)的(de)其他(tā)信(xìn)号(hào)在(zài)时(shí)鐘(zhōng)的(de)上(shàng)升(shēng)沿統一(yī)變(biàn)化(huà),这(zhè)就(jiù)像军隊里(lǐ)的(de)令旗(qí),所(suǒ)有(yǒu)军隊在(zài)看(kàn)到(dào)令旗(qí)到(dào)来(lái)的(de)时(shí)刻,執行已經(jīng)設定(dìng)好(hǎo)的(de)命令。

时(shí)鐘(zhōng)这(zhè)块(kuài)令旗(qí)影響着整體(tǐ)電(diàn)路(lù)的(de)稳定(dìng)。首先(xiān),时(shí)鐘(zhōng)要(yào)非(fēi)常地(dì)稳定(dìng)跳動(dòng)。就(jiù)如(rú)军隊令旗(qí),时(shí)快(kuài)时(shí)慢(màn),就(jiù)会(huì)讓人(rén)无所(suǒ)适從,容易出(chū)錯。而(ér)如(rú)果(guǒ)令旗(qí)非(fēi)常稳定(dìng),每个(gè)人(rén)都知道(dào)令旗(qí)什麼(me)时(shí)候过(guò)来(lái),在(zài)令旗(qí)到(dào)来(lái)前(qián)能(néng)不(bù)能(néng)完成(chéng)任务,不(bù)能(néng)就(jiù)通(tòng)知改正(zhèng)(修改代(dài)碼),避免系(xì)統出(chū)錯。

其次(cì),一(yī)个(gè)高(gāo)效的(de)军隊,令旗(qí)越少(shǎo)越好(hǎo),不(bù)同(tóng)部(bù)隊看(kàn)不(bù)同(tóng)的(de)令旗(qí),那(nà)麼(me)部(bù)隊協作就(jiù)容易出(chū)現(xiàn)問(wèn)題(tí),整个(gè)军隊必定(dìng)做不(bù)到(dào)高(gāo)效,或(huò)者(zhě)容易出(chū)錯。同(tóng)樣(yàng)道(dào)理,FPGA系(xì)統的(de)时(shí)鐘(zhōng),必定(dìng)是(shì)越少(shǎo)越好(hǎo),最(zuì)好(hǎo)就(jiù)是(shì)一(yī)个(gè)时(shí)鐘(zhōng)。这(zhè)也(yě)是(shì)要(yào)求读(dú)者(zhě),不(bù)要(yào)把信(xìn)号(hào)放(fàng)在(zài)时(shí)序邏輯敏感(gǎn)列表(biǎo)的(de)原因(yīn)。


7 模块(kuài)

7.1 模块(kuài)結構

需要(yào)看(kàn)对(duì)應(yìng)的(de)視頻,請點(diǎn)擊視頻編号(hào):001100000051

1、本(běn)节(jié)主(zhǔ)要(yào)介紹模块(kuài)結構,模块(kuài)(module)是(shì)verilog的(de)基本(běn)描述單位,是(shì)用(yòng)于(yú)描述某个(gè)設計(jì)功能(néng)或(huò)結構及(jí)與(yǔ)其他(tā)模块(kuài)通(tòng)信(xìn)的(de)外(wài)部(bù)端口(kǒu),有(yǒu)5个(gè)主(zhǔ)要(yào)部(bù)分(fēn):端口(kǒu)定(dìng)義、參數定(dìng)義(可(kě)選)、I/O说(shuō)明(míng)、內(nèi)部(bù)信(xìn)号(hào)聲明(míng)、功能(néng)定(dìng)義。                                                                                                          2、2、这(zhè)是(shì)ALTERA和(hé)VIVADO文(wén)檔

   模块(kuài)(module)是(shì)Verilog 的(de)基本(běn)描述單位,用(yòng)于(yú)描述某个(gè)設計(jì)的(de)功能(néng)或(huò)結構及(jí)與(yǔ)其他(tā)模块(kuài)通(tòng)信(xìn)的(de)外(wài)部(bù)端口(kǒu)。

   模块(kuài)在(zài)概念上(shàng)可(kě)等同(tóng)一(yī)个(gè)器件(jiàn)就(jiù)如(rú)我(wǒ)们(men)調用(yòng)通(tòng)用(yòng)器件(jiàn)(與(yǔ)門(mén)、三(sān)态門(mén)等)或(huò)通(tòng)用(yòng)宏單元(yuán)(計(jì)數器、ALUCPU)等,因(yīn)此(cǐ),一(yī)个(gè)模块(kuài)可(kě)在(zài)另(lìng)一(yī)个(gè)模块(kuài)中(zhōng)調用(yòng)。一(yī)个(gè)電(diàn)路(lù)設計(jì)可(kě)由(yóu)多(duō)个(gè)模块(kuài)組合而(ér)成(chéng),因(yīn)此(cǐ)一(yī)个(gè)模块(kuài)的(de)設計(jì)只(zhī)是(shì)一(yī)个(gè)系(xì)統設計(jì)中(zhōng)的(de)某个(gè)层次(cì)設計(jì),模块(kuài)設計(jì)可(kě)采用(yòng)多(duō)種(zhǒng)建模方(fāng)式。

每个(gè)模块(kuài)实現(xiàn)特(tè)定(dìng)的(de)功能(néng),模块(kuài)可(kě)進(jìn)行层次(cì)的(de)嵌套(tào),因(yīn)此(cǐ)可(kě)以(yǐ)将大型的(de)數字(zì)電(diàn)路(lù)設計(jì)分(fēn)割成(chéng)大小不(bù)一(yī)的(de)小模块(kuài)来(lái)实現(xiàn)特(tè)定(dìng)的(de)功能(néng),最(zuì)後(hòu)通(tòng)过(guò)由(yóu)頂层模块(kuài)調用(yòng)子模块(kuài)来(lái)实現(xiàn)整體(tǐ)功能(néng),这(zhè)就(jiù)是(shì)Top-Down的(de)設計(jì)思(sī)想(xiǎng),

   Verilog 的(de)基本(běn)設計(jì)單元(yuán)是(shì)“模块(kuài)”。采用(yòng)模块(kuài)化(huà)的(de)設計(jì)使系(xì)統看(kàn)起来(lái)更(gèng)有(yǒu)条(tiáo)理也(yě)便于(yú)仿真(zhēn)和(hé)测試,那(nà)麼(me)整个(gè)項目的(de)設計(jì)思(sī)想(xiǎng)就(jiù)是(shì)模块(kuài)套(tào)模块(kuài),自(zì)頂向(xiàng)下(xià)依次(cì)展(zhǎn)開(kāi)。

本(běn)書(shū)主(zhǔ)要(yào)以(yǐ)verilog硬(yìng)件(jiàn)描述語(yǔ)言为(wèi)主(zhǔ),模块(kuài)是(shì)Verilog的(de)基本(běn)描述單位,用(yòng)于(yú)描述每个(gè)設計(jì)的(de)功能(néng)和(hé)結構,以(yǐ)及(jí)其他(tā)模块(kuài)通(tòng)信(xìn)的(de)外(wài)部(bù)接口(kǒu)。

模块(kuài)有(yǒu)五(wǔ)个(gè)主(zhǔ)要(yào)部(bù)分(fēn):端口(kǒu)定(dìng)義、參數定(dìng)義(可(kě)選)、 I/O说(shuō)明(míng)、內(nèi)部(bù)信(xìn)号(hào)聲明(míng)、功能(néng)定(dìng)義。且模块(kuài)總(zǒng)是(shì)以(yǐ)關(guān)鍵词module開(kāi)始,以(yǐ)關(guān)鍵词endmodule結尾。它(tā)的(de)一(yī)般語(yǔ)法結構如(rú)下(xià)所(suǒ)示:

下(xià)面(miàn)我(wǒ)们(men)来(lái)詳细(xì)分(fēn)析一(yī)下(xià)这(zhè)段(duàn)代(dài)碼:


7.2 模块(kuài)的(de)端口(kǒu)定(dìng)義

第(dì)1至(zhì)5行聲明(míng)了(le)模块(kuài)的(de)名字(zì)和(hé)輸入(rù)輸出(chū)口(kǒu)。其格式如(rú)下(xià):

module 模块(kuài)名(端口(kǒu) 1,端口(kǒu) 2,端口(kǒu) 3……)

其中(zhōng)模块(kuài)是(shì)以(yǐ)module開(kāi)始,以(yǐ)endmodule結束(shù)。模块(kuài)名是(shì)模块(kuài)唯一(yī)的(de)标(biāo)識符,我(wǒ)们(men)建議模块(kuài)名盡量(liàng)用(yòng)能(néng)够描述其功能(néng)的(de)名字(zì)来(lái)命名,并且模块(kuài)名和(hé)文(wén)件(jiàn)名相同(tóng)。

模块(kuài)的(de)端口(kǒu)表(biǎo)示的(de)是(shì)模块(kuài)的(de)輸入(rù)和(hé)輸出(chū)口(kǒu)名,也(yě)就(jiù)是(shì)它(tā)與(yǔ)别的(de)模块(kuài)聯系(xì)端口(kǒu)的(de)标(biāo)識。


7.3 參數定(dìng)義

第(dì)7行參數定(dìng)義是(shì)将常量(liàng)用(yòng)符号(hào)代(dài)替,以(yǐ)增加代(dài)碼可(kě)读(dú)性(xìng)和(hé)可(kě)修改性(xìng),是(shì)一(yī)个(gè)可(kě)選擇的(de)語(yǔ)句(jù),用(yòng)不(bù)到(dào)可(kě)以(yǐ)省(shěng)略,參數定(dìng)義一(yī)般格式如(rú)下(xià):

parameter  DATA_W = x;


7.4 I/O 说(shuō)明(míng)

第(dì)9至(zhì)12行是(shì)I/O说(shuō)明(míng),模块(kuài)的(de)端口(kǒu)可(kě)以(yǐ)是(shì)輸入(rù)端口(kǒu)、輸出(chū)端口(kǒu)或(huò)双(shuāng)向(xiàng)端口(kǒu)。其说(shuō)明(míng)格式如(rú)下(xià)。

輸入(rù)口(kǒu): input [信(xìn)号(hào)位宽(kuān)-1 0] 端口(kǒu)名 1

input [信(xìn)号(hào)位宽(kuān)-1 0] 端口(kǒu)名 2

……;

輸出(chū)口(kǒu): output [信(xìn)号(hào)位宽(kuān)-1 0] 端口(kǒu)名 1

output [信(xìn)号(hào)位宽(kuān)-1 0] 端口(kǒu)名 2

……;

双(shuāng)向(xiàng)口(kǒu):inout [信(xìn)号(hào)位宽(kuān)-1 0] 端口(kǒu)名 1

inout [信(xìn)号(hào)位宽(kuān)-1 0] 端口(kǒu)名 2

……;


7.5 信(xìn)号(hào)類(lèi)型

需要(yào)看(kàn)对(duì)應(yìng)的(de)視頻,請點(diǎn)擊視頻編号(hào):001100000052

1、本(běn)节(jié)主(zhǔ)要(yào)介紹,Verilog HDL的(de)信(xìn)号(hào)類(lèi)型,主(zhǔ)要(yào)包(bāo)括两(liǎng)種(zhǒng)數據(jù)類(lèi)型:線(xiàn)网(wǎng)類(lèi)型(net type)和(hé)寄存器類(lèi)型(reg type),在(zài)進(jìn)行工程設計(jì)中(zhōng)也(yě)只(zhī)会(huì)使用(yòng)到(dào)这(zhè)两(liǎng)个(gè)類(lèi)型的(de)信(xìn)号(hào);信(xìn)号(hào)位宽(kuān),定(dìng)義信(xìn)号(hào)類(lèi)型的(de)同(tóng)时(shí),必須定(dìng)義好(hǎo)信(xìn)号(hào)的(de)位宽(kuān),取(qǔ)決于(yú)該信(xìn)号(hào)要(yào)表(biǎo)示的(de)最(zuì)大值,例如(rú)a信(xìn)号(hào)的(de)最(zuì)大值为(wèi)1000,那(nà)麼(me)信(xìn)号(hào)a的(de)位宽(kuān)必須大于(yú)或(huò)等于(yú)10位;線(xiàn)网(wǎng)類(lèi)型wire,用(yòng)于(yú)对(duì)結構化(huà)器件(jiàn)之間(jiān)的(de)物(wù)理連(lián)接的(de)建模,代(dài)表(biǎo)的(de)是(shì)物(wù)理連(lián)接線(xiàn),不(bù)存儲其邏輯值,通(tòng)常用(yòng)assign進(jìn)行賦值;寄存器類(lèi)型reg,通(tòng)常用(yòng)于(yú)对(duì)存儲單元(yuán)的(de)描述,如(rú)D型觸發(fà)器、ROM等。必須注意(yì)的(de)是(shì):reg類(lèi)型的(de)變(biàn)量(liàng)不(bù)一(yī)定(dìng)是(shì)存儲單元(yuán),如(rú)在(zài)always語(yǔ)句(jù)中(zhōng)進(jìn)行描述的(de)必須是(shì)用(yòng)reg類(lèi)型的(de)變(biàn)量(liàng);wire和(hé)reg的(de)區(qū)别,本(běn)書(shū)總(zǒng)結出(chū)一(yī)套(tào)解(jiě)決方(fāng)法:在(zài)本(běn)模块(kuài)中(zhōng)使用(yòng)always設計(jì)的(de)信(xìn)号(hào)都定(dìng)義为(wèi)reg型,其他(tā)都定(dìng)義为(wèi)wire型。                                 

2、这(zhè)是(shì)ALTERA和(hé)VIVADO文(wén)檔



第(dì)16至(zhì)18行定(dìng)義了(le)信(xìn)号(hào)的(de)類(lèi)型。在(zài)模块(kuài)內(nèi)用(yòng)到(dào)的(de)和(hé)與(yǔ)端口(kǒu)有(yǒu)關(guān)的(de) wire 和(hé) reg 類(lèi)型變(biàn)量(liàng)的(de)聲明(míng)。如(rú):
reg [width-1 : 0] R 變(biàn)量(liàng) 1R 變(biàn)量(liàng) 2 ……

wire [width-1 : 0] W 變(biàn)量(liàng) 1W 變(biàn)量(liàng) 2……

如(rú)果(guǒ)不(bù)写,默認是(shì)wire型,并且信(xìn)号(hào)位宽(kuān)为(wèi)1


7.6 功能(néng)描述

第(dì)21至(zhì)31行是(shì)功能(néng)描述部(bù)分(fēn)。模块(kuài)中(zhōng)最(zuì)重(zhòng)要(yào)的(de)部(bù)分(fēn)是(shì)邏輯功能(néng)定(dìng)義部(bù)分(fēn)。有(yǒu)三(sān)種(zhǒng)方(fāng)法可(kě)在(zài)模块(kuài)中(zhōng)産生(shēng)邏輯。

1. 用(yòng)“assign”聲明(míng)語(yǔ)句(jù),如(rú)描述一(yī)个(gè)两(liǎng)輸入(rù)與(yǔ)門(mén):assign  a = b & c

2. 用(yòng)“always”块(kuài)。即前(qián)面(miàn)介紹的(de)时(shí)序邏輯和(hé)組合邏輯。

3. 模块(kuài)例化(huà)。


7.6.1 例化(huà)

对(duì)一(yī)个(gè)數字(zì)系(xì)統的(de)設計(jì),我(wǒ)们(men)采用(yòng)的(de)是(shì)自(zì)頂向(xiàng)下(xià)的(de)設計(jì)方(fāng)式。可(kě)把系(xì)統劃(huà)分(fēn)成(chéng)幾(jǐ)个(gè)功能(néng)模块(kuài),每个(gè)功能(néng)模块(kuài)再劃(huà)分(fēn)成(chéng)下(xià)一(yī)层的(de)子模块(kuài)。每个(gè)模块(kuài)的(de)設計(jì)对(duì)應(yìng)一(yī)个(gè)module ,一(yī)个(gè)module 設計(jì)成(chéng)一(yī)个(gè)verilog HDL 程序文(wén)件(jiàn)。因(yīn)此(cǐ),对(duì)一(yī)个(gè)系(xì)統的(de)頂层模块(kuài),我(wǒ)们(men)采用(yòng)結構化(huà)的(de)設計(jì),即頂层模块(kuài)分(fēn)别調用(yòng)了(le)各(gè)个(gè)功能(néng)模块(kuài)。

一(yī)个(gè)模块(kuài)能(néng)够在(zài)另(lìng)外(wài)一(yī)个(gè)模块(kuài)中(zhōng)被(bèi)引用(yòng),这(zhè)樣(yàng)就(jiù)建立了(le)描述的(de)层次(cì)。模块(kuài)实例化(huà)語(yǔ)句(jù)形式如(rú)下(xià):

module_name instance_name(port_associations) ;

信(xìn)号(hào)端口(kǒu)可(kě)以(yǐ)通(tòng)过(guò)位置或(huò)名稱關(guān)聯;但是(shì)關(guān)聯方(fāng)式不(bù)能(néng)够混合使用(yòng)。端口(kǒu)關(guān)聯形式如(rú)下(xià):

port_expr / /通(tòng)过(guò)位置。

.PortName (port_expr) / /通(tòng)过(guò)名稱。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

module  and CAB);

input  AB

output   C

//省(shěng)略

endmodule

module and_2(xxxxx)

...

//实例化(huà)时(shí)采用(yòng)位置關(guān)聯,T3对(duì)應(yìng)輸出(chū)端口(kǒu)CA对(duì)應(yìng)AB对(duì)應(yìng)B

and A1 (T3, A, B );

//实例化(huà)时(shí)采用(yòng)名字(zì)關(guān)聯,.C是(shì)and 器件(jiàn)的(de)端口(kǒu),其與(yǔ)信(xìn)号(hào)T3相連(lián)

and  A2

.CT3),

.AA),

.BB));

建議:在(zài)例化(huà)的(de)端口(kǒu)映射中(zhōng)請采用(yòng)名字(zì)關(guān)聯,这(zhè)樣(yàng),當被(bèi)調用(yòng)的(de)模块(kuài)管(guǎn)脚改變(biàn)时(shí)不(bù)易出(chū)錯。

在(zài)我(wǒ)们(men)的(de)实例化(huà)中(zhōng),可(kě)能(néng)有(yǒu)些管(guǎn)脚沒(méi)用(yòng)到(dào),可(kě)在(zài)映射中(zhōng)采用(yòng)空白处理,如(rú):

1

2

3

4

5

6

DFF d1 (

.Q(QS),

.Qbar ( ),

.Data (D ) ,

.Preset ( ),     // 該管(guǎn)脚懸空

.Clock (CK) ); //名稱对(duì)應(yìng)方(fāng)式。

对(duì)輸入(rù)管(guǎn)脚懸空的(de),則該管(guǎn)脚輸入(rù)为(wèi)高(gāo)阻 Z,輸出(chū)管(guǎn)脚被(bèi)懸空的(de),該輸出(chū)管(guǎn)脚廢棄不(bù)用(yòng)。

下(xià)面(miàn)以(yǐ)一(yī)个(gè)实例(一(yī)个(gè)頻率計(jì)數器系(xì)統)说(shuō)明(míng)如(rú)何用(yòng)HDL進(jìn)行系(xì)統設計(jì)。

在(zài)該系(xì)統中(zhōng),我(wǒ)们(men)劃(huà)分(fēn)成(chéng)如(rú)下(xià)三(sān)个(gè)部(bù)分(fēn):2輸入(rù)與(yǔ)門(mén)模块(kuài),LED顯示模块(kuài),4位計(jì)數器模块(kuài)。系(xì)統的(de)层次(cì)描述如(rú)下(xià):

图(tú) 47

頂层模块(kuài)CNT_BCD,文(wén)件(jiàn)名CNT_BCD.v,該模块(kuài)調用(yòng)了(le)低层模块(kuài) AND2CNT_4b和(hé) HEX2LED 。系(xì)統的(de)電(diàn)路(lù)結構图(tú)如(rú)下(xià):

图(tú) 48

頂层模块(kuài)CNT_BCD对(duì)應(yìng)的(de)設計(jì)文(wén)件(jiàn) CNT_BCD.v 內(nèi)容为(wèi):

1

2

3

4

5

6

module CNT_BCD (BCD_A,BCD_B,BCD_C,BCD_D,CLK,GATE,RESET) ;

// ------------ Port declarations --------- //

input CLK;

input GATE;

input RESET;

output [3:0] BCD_A;

output [3:0] BCD_B;

output [3:0] BCD_C;

output [3:0] BCD_D;

wire CLK;

wire GATE;

wire RESET;

wire [3:0] BCD_A;

wire [3:0] BCD_B;

wire [3:0] BCD_C;

wire [3:0] BCD_D;

// ----------- Signal declarations -------- //

wire NET104;

wire NET116;

wire NET124;

wire NET132;

wire NET80;

wire NET92;

// -------- Component instantiations -------//

CNT_4bU0( .CLK(CLK),

.ENABLE(GATE),

.FULL(NET80),

.Q(BCD_A),

.RESET(RESET) );

CNT_4b U1(

.CLK(CLK),

.ENABLE(NET116),

.FULL(NET92),

.Q(BCD_B),

.RESET(RESET)

);

CNT_4bU2(

.CLK(CLK),

.ENABLE(NET124),

.FULL(NET104),

.Q(BCD_C),

.RESET(RESET) );

CNT_4b U3(

.CLK(CLK),

.ENABLE(NET132),

.Q(BCD_D),

.RESET(RESET) );

AND2 U4(

.A0(NET80),

.A1(GATE),

.Y(NET116) );

AND2 U5(

.A0(NET92),

.A1(NET116),

.Y(NET124) );

AND2 U6(

.A0(NET104),

.A1(NET124),

.Y(NET132) );

endmodule

注意(yì):这(zhè)里(lǐ)的(de)AND2是(shì)为(wèi)了(le)舉例说(shuō)明(míng),在(zài)实際設計(jì)中(zhōng),对(duì)門(mén)級不(bù)要(yào)重(zhòng)新設計(jì)成(chéng)一(yī)个(gè)模块(kuài),同(tóng)时(shí)对(duì)涉及(jí)保留字(zì)的(de)(不(bù)管(guǎn)大小写)相類(lèi)似的(de)标(biāo)識符最(zuì)好(hǎo)不(bù)用(yòng)。


7.7 模块(kuài)案(àn)例

下(xià)面(miàn)先(xiān)介紹幾(jǐ)个(gè)簡單的(de)Verilog HDL程序。

[1] 加法器

1

2

3

4

5

6

module addr (a, b, cin, count, sum);

input [2:0] a;

input [2:0] b;

input cin;

output count;

output [2:0] sum;

assign  {count,sum} = a +b + cin;

endmodule

該例描述一(yī)个(gè)3位加法器,從例子可(kě)看(kàn)出(chū)整个(gè)模块(kuài)是(shì)以(yǐ)module 開(kāi)始,endmodule 結束(shù)。

例[2]   比較器

1

2

3

4

5

6

module compare equalab);

input [1:0]   a,b;    // declare  the  input  signal ;

output equare ;      // declare  the output signal;

assign equare = (a == b) ? 1:0 ;

endmodule

該例描述一(yī)个(gè)比較器,從上(shàng)可(kě)看(kàn)到(dào),/*  .... */ 和(hé) // ... 表(biǎo)示注釋部(bù)分(fēn)。注釋只(zhī)是(shì)为(wèi)了(le)方(fāng)便設計(jì)者(zhě)读(dú)懂代(dài)碼,对(duì)編譯并不(bù)起作用(yòng)。

例[3]  三(sān)态驅動(dòng)器

1

2

3

4

5

6

module mytri (din, d_en, d_out);

input din;

input d_en;

output d_out;

// -- Enter your statements here -- //

assign d_out = d_en ? din :'bz;

endmodule

module trist (din, d_en, d_out);

input din;

input d_en;

output d_out;

// -- statements here -- //

mytri  u_mytri(din,d_en,d_out);

endmodule

該例描述了(le)一(yī)个(gè)三(sān)态驅動(dòng)器。其中(zhōng)三(sān)态驅動(dòng)門(mén)在(zài)模块(kuài) mytri 中(zhōng)描述,而(ér)在(zài)模块(kuài)trist 中(zhōng)調用(yòng)了(le)模块(kuài)mytri 。模块(kuài)mytri 对(duì)trist 而(ér)言相當于(yú)一(yī)个(gè)已存在(zài)的(de)器件(jiàn),在(zài)trist 模块(kuài)中(zhōng)对(duì)該器件(jiàn)進(jìn)行实例化(huà),实例化(huà)名 u_mytri 。


8 可(kě)綜合設計(jì)

需要(yào)看(kàn)对(duì)應(yìng)的(de)視頻,請點(diǎn)擊視頻編号(hào):001000000049

1、本(běn)节(jié)主(zhǔ)要(yào)介紹使用(yòng)綜合器对(duì)Verilog代(dài)碼進(jìn)行解(jiě)釋并将代(dài)碼轉(zhuǎn)化(huà)成(chéng)实際電(diàn)路(lù)来(lái)表(biǎo)示,最(zuì)終(zhōng)産生(shēng)实際電(diàn)路(lù)(网(wǎng)表(biǎo)),即綜合;为(wèi)了(le)避免在(zài)編写好(hǎo)代(dài)碼、綜合成(chéng)電(diàn)路(lù)、燒写到(dào)FPGA後(hòu)才發(fà)現(xiàn)問(wèn)題(tí),此(cǐ)时(shí)再去(qù)定(dìng)位問(wèn)題(tí)就(jiù)会(huì)非(fēi)常的(de)地(dì)困難,所(suǒ)以(yǐ),在(zài)綜合前(qián),設計(jì)师(shī)可(kě)以(yǐ)通(tòng)过(guò)仿真(zhēn)软(ruǎn)件(jiàn)对(duì)代(dài)碼進(jìn)行仿真(zhēn)测試,檢测出(chū)BUG并将其解(jiě)決,最(zuì)後(hòu)再将程序燒写進(jìn)FPGA,即仿真(zhēn);在(zài)Veriglog語(yǔ)言中(zhōng),有(yǒu)些語(yǔ)法結構只(zhī)是(shì)以(yǐ)仿真(zhēn)测試为(wèi)目的(de),是(shì)不(bù)能(néng)與(yǔ)实際硬(yìng)件(jiàn)電(diàn)路(lù)对(duì)應(yìng)起来(lái)的(de),也(yě)稱之为(wèi)不(bù)可(kě)綜合語(yǔ)法,

2、本(běn)节(jié)整理了(le)不(bù)可(kě)綜合或(huò)者(zhě)不(bù)推薦使用(yòng)的(de)代(dài)碼。       

3、ALTERA和(hé)VIVADO文(wén)檔

Verilog硬(yìng)件(jiàn)描述語(yǔ)言有(yǒu)很完整的(de)語(yǔ)法結構和(hé)系(xì)統,類(lèi)似高(gāo)級語(yǔ)言,这(zhè)些語(yǔ)法結構的(de)應(yìng)用(yòng)給(gěi)我(wǒ)们(men)的(de)設計(jì)描述带(dài)来(lái)很多(duō)方(fāng)便。但是(shì),Verilog是(shì)描述硬(yìng)件(jiàn)電(diàn)路(lù)的(de),它(tā)是(shì)建立在(zài)硬(yìng)件(jiàn)電(diàn)路(lù)的(de)基礎上(shàng)的(de)。有(yǒu)些語(yǔ)法結構只(zhī)是(shì)为(wèi)了(le)仿真(zhēn)测試目的(de),是(shì)不(bù)能(néng)與(yǔ)实際硬(yìng)件(jiàn)電(diàn)路(lù)对(duì)應(yìng)起来(lái)的(de),也(yě)就(jiù)是(shì)说(shuō)我(wǒ)们(men)在(zài)把一(yī)个(gè)語(yǔ)言描述的(de)程序映射成(chéng)实際硬(yìng)件(jiàn)電(diàn)路(lù)中(zhōng)的(de)結構时(shí)是(shì)不(bù)能(néng)实現(xiàn)的(de)。

綜合就(jiù)是(shì)把你写的(de)rtl代(dài)碼轉(zhuǎn)換成(chéng)对(duì)應(yìng)的(de)实際電(diàn)路(lù)。

比如(rú)你写代(dài)碼assign a=b&c

EDA綜合工具就(jiù)会(huì)去(qù)元(yuán)件(jiàn)庫里(lǐ)拿一(yī)个(gè)二(èr)輸入(rù)與(yǔ)門(mén)出(chū)来(lái),然後(hòu)輸入(rù)端分(fēn)别接上(shàng)b和(hé)c,輸出(chū)端接上(shàng)a

假如(rú)你写了(le)很多(duō)这(zhè)樣(yàng)的(de)語(yǔ)句(jù)

assign a=b&c;

assign c=e|f;

assign e=x^y;

……

綜合工具就(jiù)会(huì)像搭積木(mù)一(yī)樣(yàng)的(de)把你这(zhè)些“邏輯”電(diàn)路(lù)用(yòng)一(yī)些“門(mén)”電(diàn)路(lù)来(lái)搭起来(lái)。當然,工具会(huì)对(duì)必要(yào)的(de)地(dì)方(fāng)做一(yī)些优化(huà),比如(rú)你写一(yī)个(gè)電(diàn)路(lù)assing a=b&~b,这(zhè)樣(yàng)工具就(jiù)吧a恒接为(wèi)0了(le),而(ér)不(bù)会(huì)去(qù)給(gěi)你找(zhǎo)一(yī)个(gè)與(yǔ)門(mén)来(lái)搭这(zhè)个(gè)電(diàn)路(lù)。

所(suǒ)以(yǐ),“綜合”要(yào)做的(de)事(shì)情(qíng)有(yǒu):編譯rtl代(dài)碼,從庫里(lǐ)選擇用(yòng)到(dào)的(de)門(mén)器件(jiàn),把这(zhè)些器件(jiàn)按照“邏輯”搭建成(chéng)“門(mén)”電(diàn)路(lù)。

不(bù)可(kě)綜合,是(shì)指找(zhǎo)不(bù)到(dào)对(duì)應(yìng)的(de)“門(mén)”器件(jiàn)来(lái)实現(xiàn)相應(yìng)的(de)代(dài)碼。比如(rú)#100之類(lèi)的(de)延时(shí)功能(néng),簡單的(de)門(mén)器件(jiàn)是(shì)无法实現(xiàn)延时(shí)100个(gè)單元(yuán)的(de)。還(huán)有(yǒu)打(dǎ)印(yìn)語(yǔ)句(jù)等,也(yě)是(shì)門(mén)器件(jiàn)无法实現(xiàn)的(de)。

我(wǒ)们(men)在(zài)設計(jì)的(de)时(shí)候,要(yào)确保所(suǒ)写的(de)代(dài)碼是(shì)可(kě)以(yǐ)綜合的(de),这(zhè)一(yī)个(gè)是(shì)依賴于(yú)設計(jì)者(zhě)的(de)能(néng)力,知道(dào)什麼(me)是(shì)可(kě)綜合的(de)代(dài)碼,什麼(me)是(shì)不(bù)可(kě)綜合的(de)代(dài)碼。对(duì)于(yú)初学者(zhě)来(lái)说(shuō),最(zuì)好(hǎo)是(shì)先(xiān)記(jì)住規則,遵守規則,先(xiān)按規則来(lái)設計(jì)電(diàn)路(lù)。在(zài)这(zhè)一(yī)过(guò)程中(zhōng),逐漸理解(jiě),这(zhè)是(shì)一(yī)个(gè)最(zuì)好(hǎo)的(de)学習路(lù)徑。

下(xià)面(miàn)表(biǎo)格,列出(chū)了(le)不(bù)可(kě)綜合或(huò)者(zhě)不(bù)推薦使用(yòng)的(de)代(dài)碼。

表(biǎo)不(bù)可(kě)綜合或(huò)不(bù)推薦使用(yòng)的(de)代(dài)碼

代(dài)碼

要(yào)求

initial

嚴禁在(zài)設計(jì)中(zhōng)使用(yòng),只(zhī)能(néng)在(zài)测試文(wén)件(jiàn)中(zhōng)使用(yòng)。

task/function

不(bù)推薦在(zài)設計(jì)中(zhōng)使用(yòng),在(zài)测試文(wén)件(jiàn)中(zhōng)可(kě)用(yòng)。

for

在(zài)設計(jì)中(zhōng)、测試文(wén)件(jiàn)中(zhōng)均可(kě)以(yǐ)使用(yòng)。但在(zài)設計(jì)中(zhōng)多(duō)數会(huì)将其用(yòng)錯,所(suǒ)以(yǐ)建議在(zài)初期(qī)設計(jì)时(shí)不(bù)使用(yòng),熟練後(hòu)按規範使用(yòng)

while/repeat/forever

嚴禁在(zài)設計(jì)中(zhōng)使用(yòng),只(zhī)能(néng)在(zài)测試文(wén)件(jiàn)中(zhōng)使用(yòng)

integer

不(bù)推薦在(zài)設計(jì)中(zhōng)使用(yòng)

三(sān)态門(mén)

內(nèi)部(bù)模块(kuài)不(bù)能(néng)有(yǒu)三(sān)态接口(kǒu),三(sān)态門(mén)只(zhī)有(yǒu)頂层文(wén)件(jiàn)才使用(yòng)。三(sān)态門(mén)目的(de)是(shì)为(wèi)了(le)节(jié)省(shěng)管(guǎn)脚,FPGA內(nèi)部(bù)完全(quán)沒(méi)有(yǒu)必要(yào)使用(yòng)。關(guān)于(yú)三(sān)态門(mén)的(de)介紹,請看(kàn)後(hòu)續三(sān)态門(mén)章(zhāng)节(jié)內(nèi)容

casex/casez

設計(jì)代(dài)碼內(nèi)部(bù)不(bù)能(néng)有(yǒu)X态和(hé)Z态,因(yīn)此(cǐ)casezcasex設計(jì)时(shí)不(bù)使用(yòng)。

force/wait/fork

嚴禁在(zài)設計(jì)中(zhōng)使用(yòng),只(zhī)能(néng)在(zài)测試文(wén)件(jiàn)中(zhōng)使用(yòng)

#n

嚴禁在(zài)設計(jì)中(zhōng)使用(yòng),只(zhī)能(néng)在(zài)测試文(wén)件(jiàn)中(zhōng)使用(yòng)

下(xià)表(biǎo)是(shì)明(míng)德揚推薦使用(yòng)的(de)設計(jì)。

表(biǎo)明(míng)德揚規範推薦使用(yòng)的(de)代(dài)碼及(jí)其说(shuō)明(míng)

代(dài)碼

備注

reg/wire

設計(jì)中(zhōng)所(suǒ)有(yǒu)的(de)信(xìn)号(hào)類(lèi)型定(dìng)義,只(zhī)有(yǒu)reg和(hé)wire两(liǎng)種(zhǒng)

parameter

設計(jì)代(dài)碼中(zhōng)所(suǒ)有(yǒu)的(de)位宽(kuān)、长度(dù)、狀态機(jī)命名等,建議都用(yòng)參數表(biǎo)示,閱读(dú)方(fāng)便并且修改容易。

assign/always

程序块(kuài)主(zhǔ)要(yào)部(bù)分(fēn),明(míng)德揚对(duì)always使用(yòng)有(yǒu)嚴格規範。

組合邏輯格式为(wèi):

always@(*) begin

代(dài)碼語(yǔ)句(jù);

end

或(huò)者(zhě)用(yòng)assign

时(shí)序邏輯格式为(wèi):

always@(posedge clk or negedge rstn) begin

if(rstn==1’b0)begin

代(dài)碼語(yǔ)句(jù);

end

else begin

代(dài)碼語(yǔ)句(jù);

end

end

时(shí)序邏輯中(zhōng),敏感(gǎn)列表(biǎo)一(yī)定(dìng)是(shì)clk的(de)上(shàng)升(shēng)沿和(hé)複位的(de)下(xià)降沿、最(zuì)開(kāi)始必須判斷複位。詳细(xì)見(jiàn)看(kàn)本(běn)章(zhāng)組合邏輯和(hé)时(shí)序邏輯一(yī)节(jié)。

if else和(hé)case

always里(lǐ)面(miàn)的(de)語(yǔ)句(jù),使用(yòng)if else和(hé)case两(liǎng)種(zhǒng)方(fāng)法用(yòng)来(lái)作選擇判斷,可(kě)以(yǐ)完成(chéng)全(quán)部(bù)設計(jì)。

算術(shù)運算符

(+,-,×/,%)

可(kě)以(yǐ)直(zhí)接綜合出(chū)相对(duì)應(yìng)的(de)電(diàn)路(lù)。但除法和(hé)求餘運算的(de)電(diàn)路(lù)面(miàn)積一(yī)般比較大,不(bù)建議直(zhí)接使用(yòng)除法和(hé)求餘。

賦值運算符(=<=)

时(shí)序邏輯用(yòng)<=,組合邏輯用(yòng)=;其他(tā)情(qíng)況不(bù)存在(zài)。

關(guān)系(xì)運算符==,!=><>=<=)

詳细(xì)見(jiàn)本(běn)章(zhāng)組合邏輯一(yī)节(jié)

邏輯運算符(&&||!)

位運算符(~|^&)

移位運算符(<<>>)

拼接運算符({ })


8.1 組合邏輯及(jí)其Verilog設計(jì)


表(biǎo)門(mén)級邏輯及(jí)其verilog設計(jì)

類(lèi)型

情(qíng)況

功能(néng)

verilog代(dài)碼

電(diàn)路(lù)示意(yì)图(tú)

備注

連(lián)線(xiàn)

1位相連(lián)

将两(liǎng)根(gēn)線(xiàn)連(lián)接

reg A,B;

always@(*)begin

B=A;

end

多(duō)位相連(lián)

将两(liǎng)端的(de)線(xiàn)一(yī)对(duì)一(yī)連(lián)接

reg[3:0]  A,B;

always@(*)begin

B=A;

end

A和(hé)B是(shì)n位时(shí),实際就(jiù)有(yǒu)n根(gēn)線(xiàn)。但为(wèi)看(kàn)图(tú)方(fāng)便,我(wǒ)们(men)通(tòng)常只(zhī)画(huà)出(chū)一(yī)根(gēn)線(xiàn)表(biǎo)示

移位

(右(yòu)移:>>

左(zuǒ)移:<<)

A向(xiàng)右(yòu)或(huò)向(xiàng)左(zuǒ)移動(dòng)後(hòu),賦值給(gěi)B

reg[3:0]  A;

reg[2:0]  B;

always@(*)begin

B=A>>2;

end

移位操作,实際上(shàng)是(shì)選哪線(xiàn)相連(lián)。

拼接

(符号(hào):{})

将大括号(hào)內(nèi)的(de)內(nèi),按位置一(yī)对(duì)一(yī)連(lián)接

reg[3:0]  A;

reg[2:0]  B;

always@(*)begin

B={A[2],A[3],A[0]};

end

拼接,实際上(shàng)是(shì)選哪線(xiàn)相連(lián)。

反(fǎn)

1位反(fǎn)相器

(符号(hào):~

将值取(qǔ)反(fǎn)

reg  A,B;

always@(*)begin

B=~A;

end

多(duō)位反(fǎn)相器(符号(hào):~

将值取(qǔ)反(fǎn)

reg[1:0]  A,B;

always@(*)begin

B=~A;

end

如(rú)果(guǒ)A和(hé)B都是(shì)n位,实際電(diàn)路(lù)就(jiù)是(shì)有(yǒu)n个(gè)反(fǎn)相器。画(huà)電(diàn)路(lù)图(tú)时(shí)可(kě)画(huà)一(yī)个(gè)来(lái)簡化(huà)。

與(yǔ)門(mén)

1位邏輯與(yǔ)(符号(hào):&&

A和(hé)B都为(wèi)1C为(wèi)1;否則C为(wèi)0

reg A,B;

always@(*)begin

C=A&&B;

end

注意(yì):FPGA支持(chí)多(duō)輸入(rù)的(de)與(yǔ)門(mén),例如(rú)四(sì)輸入(rù)與(yǔ)門(mén),輸入(rù)可(kě)为(wèi)ABCD,輸出(chū)为(wèi)E,當ABCD同(tóng)时(shí)为(wèi)1时(shí),E为(wèi)1

多(duō)位邏輯與(yǔ)(符号(hào):&&

A或(huò)B都不(bù)为(wèi)0时(shí),C为(wèi)1,否則为(wèi)0

reg[2:0] ABC;

always@(*)begin

C=A&&B;

end

多(duō)位信(xìn)号(hào)之間(jiān)的(de)邏輯與(yǔ),很容易引起歧義,設計(jì)最(zuì)好(hǎo)不(bù)要(yào)用(yòng)多(duō)位數的(de)邏輯與(yǔ)。如(rú)果(guǒ)要(yào)实現(xiàn)上(shàng)面(miàn)功能(néng),建議代(dài)碼改为(wèi)如(rú)下(xià):

always@(*)begin

C=(A!=0)&&(B!=0);

end

按位與(yǔ)

(符号(hào):&

常用(yòng)1

A和(hé)B对(duì)應(yìng)的(de)比特(tè)分(fēn)别相與(yǔ)。

reg[2:0] ABC;

always@(*)begin

C=A&B;

end

按位與(yǔ)

(符号(hào):&

常用(yòng)2

A的(de)各(gè)位之間(jiān)相與(yǔ)。

reg[2:0] A;

always@(*)begin

C=&A;

end

或(huò)門(mén)

1位邏輯或(huò)

(符号(hào):||

A和(hé)B其中(zhōng)1个(gè)为(wèi)1C为(wèi)1;否則C为(wèi)0

reg A,B;

always@(*)begin

C=A||B;

end

注意(yì):FPGA支持(chí)多(duō)輸入(rù)的(de)與(yǔ)門(mén),例如(rú)四(sì)輸入(rù)與(yǔ)門(mén),輸入(rù)可(kě)为(wèi)ABCD,輸出(chū)为(wèi)E,當ABCD同(tóng)时(shí)为(wèi)1时(shí),E为(wèi)1

多(duō)位邏輯或(huò)

(符号(hào):||

A和(hé)B其中(zhōng)1个(gè)非(fēi)0C为(wèi)1;否則C为(wèi)0

reg[2:0] ABC;

always@(*)begin

C=A||B;

end

多(duō)位信(xìn)号(hào)之間(jiān)的(de)邏輯或(huò),很容易引起歧義。最(zuì)好(hǎo)不(bù)要(yào)用(yòng)多(duō)位的(de)邏輯或(huò)。如(rú)果(guǒ)要(yào)实現(xiàn)相同(tóng)功能(néng),建議改为(wèi)如(rú)下(xià):

always@(*)begin

C=(A!=0)||(B!=0);

end

按位或(huò)

(符号(hào):|

常用(yòng)1

A和(hé)B对(duì)應(yìng)的(de)比特(tè)相或(huò)。

reg[2:0] ABC;

always@(*)begin

C=A|B;

end

按位或(huò)

(符号(hào):||

常用(yòng)2

A的(de)各(gè)位之間(jiān)相或(huò)

reg[2:0] A;

always@(*)begin

C=|A;

end

表(biǎo)選擇器和(hé)比較器及(jí)其verilog設計(jì)

分(fēn)類(lèi)

情(qíng)況

功能(néng)

代(dài)碼

電(diàn)路(lù)示意(yì)图(tú)

備注

選擇器

常見(jiàn)

形式1

通(tòng)过(guò)S,選擇輸入(rù)給(gěi)輸出(chū)C

always@(*)begin

case(S)

2’b00  :  C=D0;

2’b01  :  C=D1;

2’b10  :  C=D2;

default : C= D3;

endcase

end

常見(jiàn)

形式2

通(tòng)过(guò)S,選擇輸入(rù)給(gěi)輸出(chū)C

always@(*)begin

C = D[S];

end

此(cǐ)时(shí)代(dài)碼亦非(fēi)常常用(yòng),其本(běn)質(zhì)也(yě)是(shì)選擇器。

用(yòng)if else

通(tòng)过(guò)判斷s来(lái)選擇。

always@(*)begin

if(S==0)

C=D0;

else if(S==2b01)

C=D1;

else

C=D2;

end

請注意(yì)此(cǐ)处用(yòng)到(dào)了(le)相等比較器和(hé)選擇器。請掌握这(zhè)種(zhǒng)if else代(dài)碼的(de)画(huà)法。

比較器

相等

相等則为(wèi)1

always@(*)begin

if(A==B)

C=1;

else

C=0;

end

大于(yú)

大于(yú)則为(wèi)1

always@(*)begin

if(A>B)

C=1;

else

C=0;

end

大于(yú)

等于(yú)

大于(yú)等于(yú)則为(wèi)1

always@(*)begin

if(A>=B)

C=1;

else

C=0;

end

小于(yú)

小于(yú)則为(wèi)1

always@(*)begin

if(A

C=1;

else

C=0;

end

小于(yú)

等于(yú)

小于(yú)等于(yú)則为(wèi)1

always@(*)begin

if(A<=B)

C=1;

else

C=0;

end

表(biǎo)運算邏輯及(jí)其verilog設計(jì)

分(fēn)類(lèi)

功能(néng)

代(dài)碼

電(diàn)路(lù)示意(yì)图(tú)

備注

加法器

两(liǎng)數相加

always@(*)begin

C =A+B;

end

本(běn)質(zhì)上(shàng),運算邏輯都是(shì)由(yóu)與(yǔ)門(mén)、或(huò)門(mén)等門(mén)邏輯搭建起来(lái)的(de)電(diàn)路(lù),例如(rú)1位的(de)加法就(jiù)是(shì)S= A ^B;Cout= A&&B

減法器

两(liǎng)數相減

always@(*)begin

C =A-B;

end

乘法器

两(liǎng)數相乘

always@(*)begin

C =A*B;

end

在(zài)二(èr)進(jìn)制運算中(zhōng),乘法運算实質(zhì)上(shàng)就(jiù)是(shì)加法運算,例如(rú)1111*111 = 1111+ 11110+111100)。所(suǒ)以(yǐ)乘法器会(huì)比加法器消耗的(de)資源多(duō)。

除法器

两(liǎng)數相除

always@(*)begin

C =A/B;

end

二(èr)進(jìn)制運算中(zhōng),除法和(hé)求餘涉及(jí)到(dào)加法、減法和(hé)移位等運算,所(suǒ)以(yǐ)除法和(hé)求餘電(diàn)路(lù)資源都非(fēi)常大,在(zài)設計(jì)时(shí)要(yào)盡力避免除法和(hé)求餘。如(rú)果(guǒ)一(yī)定(dìng)要(yào)用(yòng)到(dào)除法,盡量(liàng)讓除數为(wèi)2的(de)n次(cì)方(fāng),如(rú)24816等。因(yīn)为(wèi)a/2实質(zhì)就(jiù)是(shì)a向(xiàng)右(yòu)移1位;a/4实質(zhì)就(jiù)是(shì)a向(xiàng)右(yòu)移2位。移位運算是(shì)不(bù)消耗資源的(de)。

求餘器

两(liǎng)數求餘

always@(*)begin

C =A%B;

end


8.2 时(shí)序邏輯verilog設計(jì)方(fāng)法


时(shí)序邏輯的(de)代(dài)碼一(yī)般有(yǒu)两(liǎng)種(zhǒng),同(tóng)步複位的(de)时(shí)序邏輯和(hé)异(yì)步複位的(de)时(shí)序邏輯。同(tóng)步複位的(de)时(shí)序邏輯,即複位不(bù)是(shì)立即有(yǒu)效,而(ér)在(zài)时(shí)鐘(zhōng)上(shàng)升(shēng)沿时(shí)複位才有(yǒu)效。代(dài)碼結構如(rú)下(xià):

always@(posedge clk) begin

if(rstn==1’b0)

代(dài)碼語(yǔ)句(jù);

else begin

代(dài)碼語(yǔ)句(jù);

end

end

异(yì)步複位的(de)时(shí)序邏輯,複位立即有(yǒu)效,與(yǔ)时(shí)鐘(zhōng)无關(guān)。代(dài)碼結構如(rú)下(xià):

always@(posedge clk or negedge rstn) begin

if(rstn==1’b0)

代(dài)碼語(yǔ)句(jù);

else begin

代(dài)碼語(yǔ)句(jù);

end

end

对(duì)于(yú)时(shí)序邏輯verilog設計(jì)明(míng)德揚提(tí)出(chū)以(yǐ)下(xià)建議:

为(wèi)了(le)教学的(de)方(fāng)便,明(míng)德揚的(de)代(dài)碼統一(yī)采用(yòng)异(yì)步时(shí)鐘(zhōng)邏輯,建議同(tóng)学们(men)都采用(yòng)此(cǐ)結構,这(zhè)樣(yàng)設計(jì)时(shí)只(zhī)需考慮是(shì)用(yòng)时(shí)序邏輯還(huán)是(shì)組合邏輯結構来(lái)写代(dài)碼即可(kě);实際工作,請遵從公司規範。

在(zài)明(míng)德揚提(tí)供的(de)gVim版本(běn)软(ruǎn)件(jiàn)中(zhōng)打(dǎ)開(kāi)代(dài)碼後(hòu),輸入(rù)“Zuhe”命令(回(huí)車後(hòu))可(kě)得到(dào)組合邏輯的(de)代(dài)碼結構;輸入(rù)“Shixu”命令(回(huí)車後(hòu))可(kě)得到(dào)时(shí)序邏輯的(de)代(dài)碼結構;

时(shí)序邏輯沒(méi)有(yǒu)複位信(xìn)号(hào)是(shì)不(bù)規範的(de)代(dài)碼,建議不(bù)要(yào)这(zhè)樣(yàng)使用(yòng)。


上(shàng)一(yī)篇(piān):2.15 插值濾波(bō)器設計(jì)
下(xià)一(yī)篇(piān):2.6 數碼管(guǎn)動(dòng)态掃描
   拓展(zhǎn)閱读(dú)
⁩⁣⁩⁨ ⁩⁤⁢⁢⁢⁥⁩ ⁥⁣⁦⁡ ⁣⁤⁨ ⁡⁨⁠⁤⁠ ⁦⁧⁡⁤⁣⁡⁡⁨⁤ NrEnE8Gui⁤⁥⁧⁦⁦⁡⁧
⁢⁢⁦⁡⁩⁢⁡
⁣⁧⁡⁤ ⁦⁥⁣⁣ ⁦⁩⁣⁥⁥⁤⁢⁢⁨ ⁥⁤⁦⁢⁦⁦⁠⁠ ⁠⁣ ⁩⁡⁠⁢⁦⁢ J2JwAm⁤⁦⁨⁣⁢⁤⁦⁨ ⁢⁦⁤⁦⁤⁡⁩ ⁧⁨⁨ ⁡⁠⁥⁡⁥⁢⁣ XjPR4LJxih⁧⁨⁦⁠⁥⁧⁩⁠⁥ ⁦⁤⁠⁦⁧⁨⁤⁩
⁦⁢⁨⁤
⁢⁠⁤⁦⁨

⁩⁩⁡

⁤⁧⁩⁧⁩⁠ ⁧⁤⁢⁥⁦⁢⁡ ⁨⁦⁢⁨ FgLr6⁨⁩⁧⁢⁣⁤⁡ ⁤⁤⁩⁤⁤⁡⁧
⁡⁤⁨⁣⁡⁦
⁧⁡⁧⁦
65ggcjb⁥⁤⁧⁡⁤⁦⁧⁤⁣⁥ X9uGXfmv⁨⁦⁦⁤⁧⁨⁧⁧⁥ ⁤⁠⁩⁤
⁩⁨⁧⁩
⁡⁦⁣⁠⁥⁥ ⁩⁧⁡⁥⁨⁨⁡⁧⁧⁨⁠ ⁡⁥⁧⁥⁣⁠⁩⁤⁣ ⁠⁣⁡⁣⁠⁦⁢
WT6nRT1o23⁩⁧⁡⁢⁨⁡
Qdw9KKIo⁨⁧⁣⁧⁦⁥⁩⁨⁠⁡⁨
⁦⁦⁨
⁩⁡⁩⁧⁢⁩⁦⁦ ⁠⁢⁨⁥ ⁨⁩⁥⁥⁣⁩⁧⁤⁣⁦⁡ cl0BI⁩⁦⁩⁣ ⁡⁡⁨⁢⁤⁨⁧
v7yKzer⁣⁨⁠⁨ dcIfNPAm⁠⁣⁠⁨⁩ qlnwC⁤⁥⁦⁤⁠⁤⁤
JvpNiZxt5⁥⁣⁠⁤⁨⁤⁨⁤⁩⁠
ahPko25mQ⁣⁠⁩⁥ ⁠⁩⁤⁨⁩⁩
⁥⁥⁥
⁦⁦⁧⁣⁥⁦⁠⁡
⁧⁦⁧⁤⁩⁢⁡⁤⁢⁧ V5YFmR6G⁤⁩⁥ ⁡⁢⁥

⁧⁨⁡⁩⁣⁡⁥

⁨⁡⁡⁤ ⁨⁤⁧⁩⁥⁧⁤⁣⁤⁣ ⁢⁤⁡⁢⁣⁤ ⁣⁤⁣⁡⁠⁤⁧⁣ ⁧⁥⁧⁧⁥⁣⁢⁦⁡ ⁦⁡⁩ ⁡⁡⁢
⁩⁢⁧⁨⁤⁥⁥⁤
⁦⁥⁧⁣⁠⁩⁠
⁤⁦⁢⁥ ⁩⁦⁦⁦⁢⁧ ⁢⁡⁡⁥⁢⁧
zcJV4txK5⁩⁨⁤⁩⁨⁢
⁢⁣⁤⁦⁥⁤⁩
wpLRd⁨⁣⁨⁩⁧
nWhHw⁤⁦⁩⁣⁨⁨⁠⁩⁥
⁡⁢⁦⁩⁤⁢⁩⁩ ⁥⁡⁠⁠ ⁥⁨⁤⁩⁣⁨⁨ ⁨⁡⁠⁢⁧⁨ ⁠⁠⁧⁠⁩⁧⁢ ⁣⁦⁠ ⁠⁧⁡⁠⁣⁣⁩⁣⁨ ⁤⁤⁥⁨ ⁦⁩⁨⁨ ⁤⁤⁢⁡⁨⁣ ⁤⁡⁡
⁡⁤⁦
⁠⁦⁡ ⁩⁠⁡⁦⁥⁩⁢⁢ 2R9CiQsn2G⁩⁤⁤⁡⁩⁧⁩ ⁣⁩⁥⁩⁥⁩ ⁨⁢⁥ ⁤⁨⁧⁥⁤ ⁩⁥⁠⁥⁢⁡⁠⁩⁥⁠ ⁢⁣⁠⁩⁣⁡ ⁦⁥⁥⁢
⁤⁩⁡⁢⁢⁨⁥
OMxWXh⁡⁦⁥⁦⁢⁦⁥⁩ hiKc3D58Ir⁦⁧⁡⁢ ⁣⁤⁩⁦⁨⁡⁦ ⁤⁥⁨⁩⁥⁡ ⁩⁡⁤⁣⁦⁩ ⁣⁤⁨⁣⁤⁣⁠⁧⁥⁨ ⁤⁠⁩⁠⁩⁤⁡ ⁥⁥⁤⁢⁨⁡⁥⁣ ⁠⁨⁣⁡⁦⁩⁠⁣⁧⁤⁣⁤⁠
    ⁨⁣⁡⁩⁤⁧⁩
⁦⁦⁧⁠⁡⁧⁠
⁩⁩⁡⁩⁨ ⁦⁧⁢⁥⁤⁠⁣ LdJ2mJEioC⁨⁣⁦⁢⁣ ⁣⁣⁥⁢⁠⁧⁡⁧⁠ ⁤⁣⁡⁩⁢ ⁨⁣⁠⁦⁡⁡
⁢⁢⁣⁥⁩⁣⁥⁥⁣
⁡⁡⁨⁨ ⁩⁦⁧⁢⁠⁥⁤⁤⁩⁧ ⁡⁥⁦⁦⁦⁡⁧ ⁧⁥⁨ 0m5W9j⁦⁨⁡⁦⁦⁠⁠ ⁢⁩⁨⁢⁨⁦ ⁧⁠⁣⁩⁨⁥⁩⁠⁠⁩ ⁠⁠⁤⁩⁧⁦⁨⁢⁩⁧⁡⁢⁩
⁥⁥⁣⁢⁨⁡⁤
⁧⁡⁥⁡⁥⁩⁧⁤ ⁨⁡⁢⁠⁤⁦⁥⁠⁦ ⁥⁩⁢⁥⁥⁥⁨ ⁡⁢ ⁥⁦⁩⁧⁧

⁡⁦⁣⁥⁤⁧⁡

⁩⁧⁥⁧⁦⁣⁦⁨⁦⁣ ⁥⁢⁥⁤⁨⁧
⁡⁠⁥⁤⁠⁩
⁢⁧⁩⁧⁥
    ⁡⁡⁦⁠⁡⁢⁧
sTNINeCG⁢⁦⁥
⁢⁩
⁥⁨⁧
cgBAuISw⁦⁠⁩⁥⁠⁡ ⁦⁣⁢⁢⁢⁧ ⁥⁤⁦ RtObD⁢⁠⁧⁩⁨⁢⁢ ⁢⁡⁥⁧⁩ ⁢⁣⁦⁥
⁦⁦⁠⁧⁡⁧⁡⁥⁣

⁢⁢⁣⁣⁥

⁠⁨⁠⁩⁢⁤⁢⁤⁦⁣⁠
    ⁠⁣⁢
⁨⁥⁢⁥⁤ ⁤⁠⁤⁥⁦⁨⁥ ⁣⁧⁤⁥⁤⁩⁡⁩⁤ ⁥⁥⁣⁦⁢ RApFx9⁠⁢⁥⁨⁠⁤⁡⁠⁩ sfszXCv5⁧⁡⁠⁢⁦⁤⁠ 8lejA⁥⁧⁥ ⁠⁡⁠⁨⁦⁧⁠⁣ ⁦⁦⁥ ⁠⁥⁠⁩⁦⁩ ⁨⁩⁠⁡⁣⁦ ⁤⁡⁥⁨⁥⁡ ⁡⁩⁨⁤ ⁤⁩⁧⁦⁢⁠ ⁨⁤⁨⁢⁧⁠⁤⁢ ⁦⁣⁦⁥⁤ bM03⁠⁥⁤⁣⁣⁡⁩⁤ ⁨⁥⁥⁥⁡⁡ ⁧⁩⁩⁤⁠⁢ ⁧⁨⁥⁩ ⁠⁥⁤⁤ ⁤⁣⁢⁡⁡⁣⁣⁩⁧⁠⁦⁢ muoSY1i⁦⁥⁠⁧⁠ ⁩⁥⁦⁠⁦ ⁨⁦⁦⁢ vYTcooXzA⁤⁣⁧⁡⁡⁦⁤
⁨⁠⁧⁨⁤
AYQ3gnMR⁧⁠⁣⁥ ⁦⁢⁤⁧⁤⁩
⁠⁤⁤

xDsToeNDG7⁥⁠⁢

⁧⁨⁥⁨