|
需要(yào)看(kàn)对(duì)應(yìng)的(de)視頻,請點(diǎn)擊視頻編号(hào):001100000066
1、本(běn)視頻通(tòng)过(guò)示例代(dài)碼和(hé)綜合後(hòu)的(de)RTL視图(tú)詳解(jiě)verilog語(yǔ)言中(zhōng)条(tiáo)件(jiàn)運算符中(zhōng)的(de)if語(yǔ)句(jù)、case語(yǔ)句(jù)、選擇語(yǔ)句(jù)的(de)使用(yòng)场景和(hé)方(fāng)法。
if和(hé)case
5.8.2 if語(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};
其含義为(wèi):
如(rú)果(guǒ)对(duì)condition_1 条(tiáo)件(jiàn)滿足,不(bù)管(guǎn)其餘的(de)条(tiáo)件(jiàn)是(shì)否滿足,都執行procedural_statement_1, procedural_statement_2和(hé)procedural_statement_3都不(bù)執行。 如(rú)果(guǒ)condition_1不(bù)滿足而(ér)condition_2滿足,則執行procedural_statement_2, 而(ér)procedural_statement_1和(hé)procedural_statement_3都不(bù)執行。 如(rú)果(guǒ)condition_1不(bù)滿足并且condition_2也(yě)不(bù)滿足时(shí),執行procedural_statement_3, 而(ér)procedural_statement_1和(hé)procedural_statement_2都不(bù)執行。
通(tòng)过(guò)下(xià)面(miàn)一(yī)个(gè)例子来(lái)具體(tǐ)说(shuō)明(míng):
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ì)用(yòng)括号(hào)括起来(lái),如(rú)果(guǒ)使用(yòng)if -if - else 格式, 那(nà)麼(me)可(kě)能(néng)会(huì)有(yǒu)二(èr)義性(xìng),如(rú)下(xià)面(miàn)的(de)示例所(suǒ)示:
if(Clk)
if(Reset)
Q = 0;
else
Q = D;
这(zhè)里(lǐ)存在(zài)一(yī)个(gè)疑問(wèn):最(zuì)後(hòu)一(yī)个(gè)else 屬于(yú)哪一(yī)个(gè)if語(yǔ)句(jù)? 是(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語(yǔ)句(jù)相關(guān)聯来(lái)解(jiě)決。 在(zài)这(zhè)个(gè)例子中(zhōng), else 與(yǔ)內(nèi)层if 語(yǔ)句(jù)相關(guān)聯。
下(xià)面(miàn)再舉一(yī)个(gè)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;
笔(bǐ)者(zhě)建議:
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,如(rú)下(xià)所(suǒ)示。
if(Clk) begin
if(Reset)
Q = 0;
else
Q = D;
end
以(yǐ)上(shàng)两(liǎng)點(diǎn)建議是(shì)为(wèi)了(le)使代(dài)碼更(gèng)加清(qīng)晰,防止出(chū)錯。
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à)首先(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ù)。可(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語(yǔ)句(jù)的(de)缺省(shěng)項必須写,防止産生(shēng)鎖存器。
Verilog語(yǔ)法中(zhōng)有(yǒu)一(yī)个(gè)常用(yòng)的(de)選擇語(yǔ)句(jù),其語(yǔ)法形式为(wèi):
vect[a +: b]或(huò)vect [a -: b];
vect为(wèi)變(biàn)量(liàng)名字(zì),a为(wèi)起始位置,加号(hào)或(huò)者(zhě)減号(hào)代(dài)表(biǎo)着升(shēng)序或(huò)者(zhě)降序, b表(biǎo)示進(jìn)行升(shēng)序或(huò)者(zhě)降序的(de)宽(kuān)度(dù)。 vect[a +: b]等同(tóng)于(yú)vect[a : a+b-1],vect的(de)區(qū)間(jiān)從a開(kāi)始向(xiàng)大于(yú)a的(de)方(fāng)向(xiàng)進(jìn)行b次(cì)計(jì)數; vect [a -: b]等同(tóng)于(yú)vect[a : a-b+1],vect的(de)區(qū)間(jiān)從a開(kāi)始向(xiàng)a小的(de)方(fāng)向(xiàng)進(jìn)行b次(cì)計(jì)數。 a可(kě)以(yǐ)是(shì)一(yī)个(gè)常數也(yě)可(kě)以(yǐ)是(shì)一(yī)个(gè)可(kě)變(biàn)的(de)數,但b必須是(shì)一(yī)个(gè)常數。
例1:vect[7 +: 3];
其中(zhōng),起始位置为(wèi)7,+代(dài)表(biǎo)着升(shēng)序,宽(kuān)度(dù)为(wèi)3。即從7開(kāi)始向(xiàng)比7大的(de)方(fāng)向(xiàng)數3个(gè)數。 其等價形式为(wèi):vect[7 +: 3]==vect[7: 9]。
例2:vect[9 -: 4];
其中(zhōng),起始位置为(wèi)9,-代(dài)表(biǎo)着降序,宽(kuān)度(dù)为(wèi)4。即從9開(kāi)始向(xiàng)比9小的(de)方(fāng)向(xiàng)數4个(gè)數。 其等價形式为(wèi):vect[9 -:4]==vect[9 : 6]。 在(zài)实際使用(yòng)的(de)过(guò)程中(zhōng)該語(yǔ)法最(zuì)常用(yòng)的(de)形式是(shì)将a作为(wèi)一(yī)个(gè)可(kě)變(biàn)的(de)數来(lái)使用(yòng)。 例如(rú)需要(yào)設計(jì)具有(yǒu)如(rú)下(xià)功能(néng)的(de)代(dài)碼:
當cnt==0时(shí),将din[7:0]賦值給(gěi)data[15:8];當cnt==1时(shí)将din[7:0]賦值給(gěi)data[7:0]。
在(zài)設計(jì)的(de)时(shí)候便可(kě)以(yǐ)写成(chéng):data[15-8*cnt-: 8] <= din[7:0](此(cǐ)时(shí)需要(yào)将15-8*cnt視为(wèi)一(yī)个(gè)整體(tǐ)a, 其会(huì)随着cnt變(biàn)化(huà)而(ér)發(fà)生(shēng)變(biàn)化(huà)),这(zhè)樣(yàng)一(yī)来(lái)就(jiù)完成(chéng)了(le)对(duì)代(dài)碼的(de)精簡工作。 選擇語(yǔ)句(jù)的(de)硬(yìng)件(jiàn)電(diàn)路(lù)結構如(rú)下(xià)图(tú)所(suǒ)示,其本(běn)質(zhì)上(shàng)是(shì)一(yī)个(gè)選擇器。當cnt==0时(shí), 選中(zhōng)data[15:8]的(de)鎖存器,将din[7:0]賦值給(gěi)data[15:8],而(ér)data[7:0]的(de)鎖存器保持(chí)輸出(chū)不(bù)變(biàn); 當cnt==1时(shí),選中(zhōng)data[7:0]的(de)鎖存器,将din[7:0]賦值給(gěi)data[7:0],而(ér)data[15:8]的(de)鎖存器保持(chí)輸出(chū)不(bù)變(biàn)。
用(yòng)Modelsim对(duì)以(yǐ)上(shàng)例子進(jìn)行功能(néng)仿真(zhēn)後(hòu)的(de)仿真(zhēn)图(tú)如(rú)下(xià)所(suǒ)示。
可(kě)以(yǐ)看(kàn)出(chū)仿真(zhēn)結果(guǒ)滿足实際的(de)設計(jì)需求。
笔(bǐ)者(zhě)經(jīng)验(yàn):在(zài)实際工程中(zhōng)可(kě)以(yǐ)多(duō)使用(yòng)選擇語(yǔ)句(jù)vect[a +: b]或(huò)vect [a -: b]的(de)形式来(lái)進(jìn)行代(dài)碼編写, 这(zhè)将有(yǒu)助于(yú)精簡設計(jì)代(dài)碼。 5.8.5 經(jīng)验(yàn)總(zǒng)結 if 語(yǔ)句(jù)和(hé)case語(yǔ)句(jù)是(shì)Verilog里(lǐ)两(liǎng)个(gè)非(fēi)常重(zhòng)要(yào)的(de)語(yǔ)句(jù), if 和(hé) case語(yǔ)句(jù)有(yǒu)一(yī)定(dìng)的(de)相關(guān)性(xìng),也(yě)有(yǒu)一(yī)定(dìng)的(de)區(qū)别。 相同(tóng)的(de)地(dì)方(fāng)在(zài)于(yú)两(liǎng)者(zhě)幾(jǐ)乎可(kě)以(yǐ)实現(xiàn)一(yī)樣(yàng)的(de)功能(néng),下(xià)面(miàn)主(zhǔ)要(yào)介紹一(yī)下(xià)两(liǎng)者(zhě)之間(jiān)的(de)區(qū)别。
if 語(yǔ)句(jù)每个(gè)分(fēn)支之間(jiān)是(shì)有(yǒu)优先(xiān)級的(de),綜合得到(dào)的(de)電(diàn)路(lù)是(shì)類(lèi)似級聯的(de)結構。case語(yǔ)句(jù)每个(gè)分(fēn)支是(shì)平等的(de), 綜合得到(dào)的(de)電(diàn)路(lù)則是(shì)一(yī)个(gè)多(duō)路(lù)選擇器。因(yīn)此(cǐ),多(duō)个(gè)if else-if語(yǔ)句(jù)綜合得到(dào)的(de)邏輯電(diàn)路(lù)延时(shí)有(yǒu)可(kě)能(néng)会(huì)比case語(yǔ)句(jù)稍大。 对(duì)于(yú)初学者(zhě)而(ér)言,在(zài)一(yī)開(kāi)始学習Veriolg的(de)过(guò)程中(zhōng)往往喜欢用(yòng)if else-if語(yǔ)句(jù),因(yīn)为(wèi)这(zhè)種(zhǒng)語(yǔ)法表(biǎo)达(dá)起来(lái)更(gèng)加直(zhí)接。 但是(shì)在(zài)運行速度(dù)比較關(guān)鍵的(de)項目中(zhōng),使用(yòng)case語(yǔ)句(jù)的(de)效果(guǒ)会(huì)更(gèng)好(hǎo)。下(xià)面(miàn)通(tòng)过(guò)一(yī)个(gè)具體(tǐ)的(de)案(àn)例来(lái)对(duì)比一(yī)下(xià), 使用(yòng)if語(yǔ)句(jù)和(hé)case語(yǔ)句(jù)来(lái)描述同(tóng)一(yī)功能(néng)電(diàn)路(lù)的(de)綜合結果(guǒ)。
首先(xiān)是(shì)用(yòng)if語(yǔ)句(jù)写的(de)代(dài)碼:
其綜合後(hòu)的(de)RTL視图(tú)如(rú)下(xià)所(suǒ)示。
從上(shàng)图(tú)中(zhōng)所(suǒ)示的(de)RTL图(tú)可(kě)以(yǐ)看(kàn)到(dào),此(cǐ)電(diàn)路(lù)中(zhōng)含有(yǒu)两(liǎng)个(gè)二(èr)選一(yī)多(duō)路(lù)選擇器, 并且右(yòu)邊(biān)的(de)优先(xiān)級要(yào)高(gāo)于(yú)左(zuǒ)邊(biān)(因(yīn)为(wèi)q的(de)值是(shì)直(zhí)接與(yǔ)右(yòu)邊(biān)的(de)二(èr)選一(yī)選擇器連(lián)接), 當en[0]不(bù)为(wèi)1时(shí)才会(huì)繼續判斷en[1]。也(yě)就(jiù)是(shì)说(shuō),在(zài)if語(yǔ)句(jù)下(xià)綜合出(chū)的(de)電(diàn)路(lù)含有(yǒu)优先(xiān)級。
接下(xià)来(lái)分(fēn)析一(yī)下(xià)使用(yòng)case語(yǔ)句(jù)描述的(de)代(dài)碼。
其綜合後(hòu)的(de)RTL視图(tú)如(rú)下(xià)所(suǒ)示:
可(kě)以(yǐ)看(kàn)出(chū),使用(yòng)case語(yǔ)句(jù)編写的(de)邏輯代(dài)碼綜合出(chū)的(de)電(diàn)路(lù)是(shì)并行的(de),沒(méi)有(yǒu)优先(xiān)級, 不(bù)影響電(diàn)路(lù)的(de)運行速度(dù)。 虽然在(zài)RTL視图(tú)中(zhōng),两(liǎng)種(zhǒng)語(yǔ)句(jù)綜合出(chū)的(de)電(diàn)路(lù)存在(zài)着較大的(de)差别,但是(shì)由(yóu)于(yú)目前(qián)的(de)開(kāi)發(fà)工具已經(jīng)足够智能(néng), 在(zài)布(bù)局(jú)布(bù)線(xiàn)的(de)时(shí)候会(huì)自(zì)動(dòng)对(duì)電(diàn)路(lù)進(jìn)行优化(huà),其最(zuì)終(zhōng)映射到(dào)FPGA內(nèi)部(bù)的(de)電(diàn)路(lù)之間(jiān)基本(běn)毫(háo)无差别。
最(zuì)後(hòu)總(zǒng)結一(yī)下(xià)if語(yǔ)句(jù)和(hé)case語(yǔ)句(jù)之間(jiān)的(de)區(qū)别與(yǔ)聯系(xì):
If語(yǔ)句(jù)具有(yǒu)优先(xiān)級,當if下(xià)的(de)条(tiáo)件(jiàn)不(bù)滿足时(shí)才執行else後(hòu)面(miàn)的(de)部(bù)分(fēn)。而(ér)case語(yǔ)句(jù)是(shì)并行的(de), 沒(méi)有(yǒu)优先(xiān)級,这(zhè)在(zài)两(liǎng)者(zhě)綜合出(chū)来(lái)的(de)RTL視图(tú)中(zhōng)可(kě)以(yǐ)明(míng)顯的(de)观察出(chū)来(lái)。但由(yóu)于(yú)現(xiàn)在(zài)的(de)仿真(zhēn)和(hé)綜合工具已經(jīng)足够強(qiáng)大, 最(zuì)後(hòu)綜合後(hòu)的(de)結果(guǒ)if..else...與(yǔ)case...語(yǔ)句(jù)其实并无不(bù)同(tóng),只(zhī)不(bù)过(guò)是(shì)两(liǎng)種(zhǒng)不(bù)同(tóng)的(de)实現(xiàn)方(fāng)式而(ér)已, 因(yīn)此(cǐ)基本(běn)上(shàng)不(bù)用(yòng)考慮这(zhè)两(liǎng)者(zhě)間(jiān)的(de)區(qū)别。在(zài)不(bù)影響功能(néng)的(de)前(qián)提(tí)下(xià)設計(jì)师(shī)不(bù)需要(yào)做局(jú)部(bù)的(de)优化(huà)工作, 例如(rú)不(bù)需要(yào)考慮if/case語(yǔ)句(jù)的(de)資源耗費差异(yì)、不(bù)需要(yào)考慮优化(huà)電(diàn)路(lù)。只(zhī)有(yǒu)在(zài)影響功能(néng)(即时(shí)序約束(shù)報錯)的(de)前(qián)提(tí)下(xià), 根(gēn)據(jù)提(tí)示对(duì)電(diàn)路(lù)進(jìn)行优化(huà)。 相關(guān)視頻:https://www.bilibili.com/video/BV1yf4y1R7gH?p=20
|








