⁩⁣⁩⁨ ⁩⁤⁢⁢⁢⁥⁩ ⁥⁣⁦⁡ ⁣⁤⁨ ⁡⁨⁠⁤⁠ ⁦⁧⁡⁤⁣⁡⁡⁨⁤ 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ī)

第(dì)一(yī)章(zhāng) FPGA知識大串講01_学習誤區(qū)

發(fà)布(bù)时(shí)間(jiān):2023-06-30   作者(zhě):lanlumei 浏覽量(liàng):

第(dì)一(yī)章(zhāng)  FPGA知識大串講01_学習誤區(qū)

作者(zhě):潘文(wén)明(míng)
本(běn)文(wén)为(wèi)明(míng)德揚原創文(wén)章(zhāng),轉(zhuǎn)载請注明(míng)出(chū)处!

学習FPGA,笔(bǐ)者(zhě)推崇的(de)学習方(fāng)法是(shì)先(xiān)整體(tǐ)再局(jú)部(bù)。先(xiān)对(duì)FPGA 有(yǒu)一(yī)个(gè)整體(tǐ)的(de)認識,包(bāo)括知道(dào)有(yǒu)哪些知識點(diǎn),这(zhè)些知識點(diǎn)所(suǒ)处的(de)位置和(hé)作用(yòng)。然後(hòu)在(zài)此(cǐ)基礎上(shàng)再逐个(gè)突破。

FPGA知識大串講是(shì)一(yī)个(gè)系(xì)列文(wén)章(zhāng),先(xiān)概括性(xìng)地(dì)将FPGA的(de)知識點(diǎn)串聯起来(lái),使读(dú)者(zhě)对(duì)FPGA有(yǒu)一(yī)个(gè)整體(tǐ)的(de)認識,为(wèi)後(hòu)續的(de)各(gè)項学習打(dǎ)下(xià)堅实基礎。

本(běn)系(xì)列文(wén)章(zhāng)由(yóu)6篇(piān)文(wén)章(zhāng)組成(chéng)。第(dì)一(yī)篇(piān)文(wén)章(zhāng)闡述大部(bù)分(fēn)同(tóng)学的(de)学習誤區(qū)。第(dì)二(èr)篇(piān)文(wén)章(zhāng),介紹了(le)FPGA所(suǒ)有(yǒu)的(de)知識點(diǎn),并将其串聯起来(lái)。剩下(xià)的(de)4篇(piān)文(wén)章(zhāng),是(shì)对(duì)所(suǒ)有(yǒu)知識的(de)分(fēn)别概述,其內(nèi)容包(bāo)括:組合邏輯、D觸發(fà)器、时(shí)序邏輯和(hé)FPGA 时(shí)序。

首先(xiān)我(wǒ)们(men)看(kàn)一(yī)下(xià)学習誤區(qū)。


第(dì)1节(jié) 誤區(qū)1:学習語(yǔ)法过(guò)多(duō)

大部(bù)分(fēn)初学者(zhě)最(zuì)大的(de)学習誤區(qū)就(jiù)是(shì)花費大量(liàng)的(de)时(shí)間(jiān)用(yòng)于(yú)VERILOG語(yǔ)法的(de)語(yǔ)法,并作为(wèi)学習的(de)重(zhòng)點(diǎn)。

入(rù)門(mén)就(jiù)看(kàn)VERILOG,相信(xìn)这(zhè)是(shì)很多(duō)读(dú)者(zhě)入(rù)門(mén)FPGA的(de)普遍(biàn)做法,甚至(zhì),甚至(zhì)部(bù)分(fēn)同(tóng)学花了(le)幾(jǐ)个(gè)月(yuè)时(shí)間(jiān)用(yòng)来(lái)学習語(yǔ)法。

但其实VERILOG 里(lǐ)面(miàn)的(de)語(yǔ)法百(bǎi)分(fēn)之九十(shí)的(de)是(shì)用(yòng)来(lái)测試用(yòng)的(de),設計(jì)僅僅用(yòng)到(dào)其中(zhōng)10%的(de)語(yǔ)法,而(ér)且設計(jì)語(yǔ)法非(fēi)常之簡單,大部(bù)分(fēn)代(dài)碼是(shì)由(yóu)一(yī)个(gè)一(yī)个(gè)alwaysassign和(hé)例化(huà)等組成(chéng)的(de)

上(shàng)图(tú)是(shì)实現(xiàn)FPGA例化(huà)功能(néng)的(de)代(dài)碼,将模块(kuài)test_edge放(fàng)到(dào)本(běn)模块(kuài)中(zhōng)来(lái),其作用(yòng)類(lèi)似于(yú)C語(yǔ)言的(de)函(hán)數調用(yòng),其語(yǔ)法亦相似,将接口(kǒu)信(xìn)号(hào)一(yī)个(gè)一(yī)个(gè)關(guān)聯起来(lái)即可(kě)。還(huán)未掌握例化(huà)語(yǔ)法的(de)读(dú)者(zhě),可(kě)以(yǐ)自(zì)行查找(zhǎo)相關(guān)知識。

FPGA的(de)設計(jì),通(tòng)过(guò)使用(yòng)ALWAYS的(de)格式来(lái)实現(xiàn)。ALWAYS格式有(yǒu)两(liǎng)種(zhǒng),时(shí)序邏輯的(de)ALWAYS和(hé)組合邏輯的(de)ALWAYS,其結構如(rú)下(xià)。

當要(yào)实現(xiàn)不(bù)同(tóng)功能(néng)时(shí),在(zài)ALWAYS格式里(lǐ),添加if else,以(yǐ)及(jí)加減乘除、邏輯運算等即可(kě),如(rú)下(xià)面(miàn)的(de)代(dài)碼

上(shàng)面(miàn)实現(xiàn)串口(kǒu)接收(shōu)功能(néng)、一(yī)个(gè)典型的(de)FPGA代(dài)碼。第(dì)1至(zhì)38行是(shì)接口(kǒu)、信(xìn)号(hào)的(de)定(dìng)義,其他(tā)則是(shì)主(zhǔ)體(tǐ)的(de)設計(jì)部(bù)分(fēn)。由(yóu)上(shàng)面(miàn)代(dài)碼可(kě)以(yǐ)看(kàn)出(chū)FPGA的(de)代(dài)碼有(yǒu)以(yǐ)下(xià)幾(jǐ)个(gè)特(tè)點(diǎn)。

Ø  FPGA代(dài)碼由(yóu)多(duō)个(gè)結構簡單、相似的(de)ALWAYS和(hé)ASSIGN組成(chéng)的(de)。本(běn)例中(zhōng)一(yī)共(gòng)用(yòng)到(dào)了(le)8个(gè)ALWAYS語(yǔ)句(jù)和(hé)7个(gè)ASSIGN語(yǔ)句(jù),除此(cǐ)之外(wài)沒(méi)有(yǒu)其他(tā)結構。複雜點(diǎn)的(de)FPGA代(dài)碼,亦僅是(shì)多(duō)了(le)一(yī)个(gè)例化(huà)功能(néng)。

Ø  每个(gè)ALWAYS块(kuài)只(zhī)用(yòng)到(dào)簡單的(de)語(yǔ)法,均是(shì)由(yóu)if else,以(yǐ)及(jí)加減乘除、邏輯判斷等基本(běn)操作。沒(méi)有(yǒu)複雜的(de)東(dōng)西(xī),相信(xìn)具有(yǒu)C語(yǔ)言基礎的(de)读(dú)者(zhě),一(yī)般能(néng)读(dú)懂,或(huò)者(zhě)能(néng)猜到(dào)大概功能(néng)。

Ø  除了(le)第(dì)一(yī)个(gè)簡單的(de)ALWAYS之外(wài),其他(tā)每个(gè)ALWAYS只(zhī)設計(jì)一(yī)个(gè)信(xìn)号(hào)。例如(rú),第(dì)53至(zhì)62行只(zhī)設計(jì)cnt0,第(dì)92至(zhì)98行只(zhī)設計(jì)dout信(xìn)号(hào)。这(zhè)是(shì)至(zhì)簡設計(jì)法的(de)一(yī)大特(tè)色(sè),这(zhè)樣(yàng)的(de)設計(jì)才符合硬(yìng)件(jiàn)設計(jì)的(de)特(tè)點(diǎn)。这(zhè)不(bù)是(shì)沒(méi)有(yǒu)根(gēn)據(jù)的(de),規範的(de)企業如(rú)華为(wèi)海思(sī)、中(zhōng)興等,均是(shì)如(rú)此(cǐ)风格的(de)代(dài)碼。

由(yóu)此(cǐ)可(kě)見(jiàn),VERILOG語(yǔ)法是(shì)非(fēi)常簡單的(de)。虽然語(yǔ)法簡單,但如(rú)何通(tòng)过(guò)簡單的(de)if else以(yǐ)及(jí)加減乘除,就(jiù)实現(xiàn)強(qiáng)大的(de)FPGA功能(néng),这(zhè)又很不(bù)簡單,所(suǒ)以(yǐ)不(bù)同(tóng)于(yú)学習CC++等软(ruǎn)件(jiàn)語(yǔ)言,学習FPGA沒(méi)有(yǒu)必要(yào)花太多(duō)的(de)精力于(yú)語(yǔ)法上(shàng),關(guān)鍵在(zài)于(yú)應(yìng)用(yòng)。



第(dì)2节(jié) 誤區(qū)2:追求代(dài)碼精簡

鑽(zuàn)研VERILOG語(yǔ)法,追求使用(yòng)最(zuì)少(shǎo)的(de)代(dài)碼实現(xiàn)功能(néng),这(zhè)又是(shì)一(yī)个(gè)大誤區(qū)。

放(fàng)在(zài)CC++JAVA等語(yǔ)言上(shàng),追求精簡的(de)代(dài)碼实現(xiàn),是(shì)一(yī)个(gè)正(zhèng)常的(de)需求。但放(fàng)在(zài)FPGA,則完全(quán)不(bù)是(shì)这(zhè)回(huí)事(shì)。

衡量(liàng)FPGA設計(jì)优秀的(de)标(biāo)準,不(bù)是(shì)看(kàn)代(dài)碼量(liàng)的(de)多(duō)少(shǎo),而(ér)是(shì)比較綜合出(chū)来(lái)的(de)電(diàn)路(lù),它(tā)使用(yòng)了(le)多(duō)少(shǎo)資源,能(néng)够支持(chí)的(de)时(shí)鐘(zhōng)頻率高(gāo)低等。

例如(rú)一(yī)个(gè)加法器,在(zài)200M的(de)时(shí)鐘(zhōng)頻率下(xià),可(kě)以(yǐ)直(zhí)接使用(yòng)“+”来(lái)实現(xiàn)。但假如(rú)要(yào)跑到(dào)300M或(huò)者(zhě)更(gèng)高(gāo)頻率,業界会(huì)把該加法器拆分(fēn)成(chéng)多(duō)个(gè)邏輯門(mén),并且在(zài)邏輯門(mén)之間(jiān)增加寄存器(即流水(shuǐ)線(xiàn)設計(jì))。这(zhè)樣(yàng)設計(jì),代(dài)碼会(huì)由(yóu)原来(lái)的(de)1行,變(biàn)成(chéng)上(shàng)百(bǎi)行,并且難以(yǐ)读(dú)懂。虽然代(dài)碼量(liàng)增加了(le),但電(diàn)路(lù)卻更(gèng)优秀了(le)。

總(zǒng)而(ér)言之,不(bù)要(yào)追求VERILOG代(dài)碼的(de)精簡,而(ér)是(shì)追求電(diàn)路(lù)的(de)优秀設計(jì),多(duō)学習流水(shuǐ)線(xiàn)、資源換速度(dù)、速度(dù)換資源等設計(jì)方(fāng)式,这(zhè)才是(shì)好(hǎo)的(de)FPGA学習方(fāng)向(xiàng)。




第(dì)3节(jié) 誤區(qū)3:膚淺的(de)实验(yàn)

通(tòng)过(guò)開(kāi)發(fà)板学習FPGA是(shì)一(yī)个(gè)較好(hǎo)的(de)入(rù)門(mén)方(fāng)法,例如(rú)MDY的(de)ALTERA学習板MP801XILINX学習板MP802,既有(yǒu)LED燈(dēng)、數碼管(guǎn)、VGA等簡單接口(kǒu),還(huán)有(yǒu)SDRAMDDR、千(qiān)兆(zhào)网(wǎng)等高(gāo)級接口(kǒu),其擁有(yǒu)大量(liàng)免費的(de)学習資源,包(bāo)括工程、視頻、文(wén)檔等,是(shì)学習FPGA非(fēi)常好(hǎo)的(de)方(fāng)法。

但部(bù)分(fēn)读(dú)者(zhě)拿到(dào)学習工程後(hòu),每个(gè)工程都是(shì)新建工程、編譯工程、上(shàng)板、看(kàn)現(xiàn)象(xiàng),僅此(cǐ)而(ér)已。实验(yàn)做了(le)很多(duō),設計(jì)能(néng)力卻提(tí)高(gāo)得很慢(màn)。因(yīn)为(wèi)这(zhè)里(lǐ)缺少(shǎo)關(guān)鍵的(de)一(yī)步:自(zì)己去(qù)写代(dài)碼。

读(dú)懂功能(néng)要(yào)求後(hòu),要(yào)親自(zì)去(qù)写一(yī)写代(dài)碼,邊(biān)写邊(biān)仿真(zhēn),邊(biān)仿真(zhēn)邊(biān)修改。写不(bù)出(chū)来(lái)的(de)时(shí)候,对(duì)着仿真(zhēn)波(bō)形多(duō)思(sī)考思(sī)考。通(tòng)过(guò)这(zhè)種(zhǒng)方(fāng)法,訓練代(dài)碼設計(jì)能(néng)力、仿真(zhēn)調試能(néng)力,掌握MODELSIM等工具的(de)使用(yòng)。

代(dài)碼完成(chéng)設計(jì)後(hòu),上(shàng)板验(yàn)證,这(zhè)个(gè)时(shí)候現(xiàn)象(xiàng)大概率是(shì)不(bù)正(zhèng)确的(de),使用(yòng)在(zài)線(xiàn)調試工具去(qù)定(dìng)位問(wèn)題(tí)找(zhǎo)到(dào)問(wèn)題(tí)。通(tòng)过(guò)这(zhè)種(zhǒng)方(fāng)法,訓練定(dìng)位問(wèn)題(tí)能(néng)力、解(jiě)決問(wèn)題(tí)能(néng)力,掌握在(zài)線(xiàn)調試工具的(de)使用(yòng)。

最(zuì)後(hòu),将自(zì)己設計(jì)的(de)代(dài)碼,與(yǔ)開(kāi)發(fà)板的(de)官方(fāng)代(dài)碼对(duì)比,吸收(shōu)好(hǎo)的(de)方(fāng)面(miàn),改進(jìn)自(zì)己的(de)設計(jì)能(néng)力。

按照上(shàng)面(miàn)步驟,當您親自(zì)完成(chéng)一(yī)个(gè)功能(néng)設計(jì),獲得极(jí)大成(chéng)就(jiù)感(gǎn)和(hé)滿足感(gǎn)的(de)同(tóng)时(shí),設計(jì)能(néng)力也(yě)切(qiè)实得到(dào)了(le)提(tí)高(gāo),这(zhè)樣(yàng)幾(jǐ)个(gè)設計(jì)循环(huán)上(shàng)来(lái),基本(běn)上(shàng)就(jiù)掌握FPGA設計(jì)了(le)。



第(dì)4节(jié) 誤區(qū)4:软(ruǎn)件(jiàn)思(sī)維

VERILOG是(shì)硬(yìng)件(jiàn)描述語(yǔ)言,它(tā)是(shì)对(duì)硬(yìng)件(jiàn)的(de)描述,而(ér)非(fēi)软(ruǎn)件(jiàn)的(de)設計(jì)。FPGA開(kāi)發(fà)本(běn)質(zhì)上(shàng)是(shì)硬(yìng)件(jiàn)的(de)開(kāi)發(fà),與(yǔ)設計(jì)電(diàn)路(lù)原理图(tú)是(shì)相似的(de),因(yīn)此(cǐ)要(yào)用(yòng)硬(yìng)件(jiàn)思(sī)維。而(ér)CC++JAVA等語(yǔ)言是(shì)软(ruǎn)件(jiàn)開(kāi)發(fà),使用(yòng)的(de)是(shì)软(ruǎn)件(jiàn)思(sī)維。

有(yǒu)C語(yǔ)言基礎的(de)同(tóng)学,很容易按照软(ruǎn)件(jiàn)思(sī)維来(lái)進(jìn)行FPGA設計(jì),这(zhè)是(shì)不(bù)正(zhèng)确的(de)一(yī)種(zhǒng)思(sī)想(xiǎng)。那(nà)麼(me),硬(yìng)件(jiàn)思(sī)維和(hé)软(ruǎn)件(jiàn)思(sī)維本(běn)質(zhì)上(shàng)有(yǒu)什麼(me)不(bù)同(tóng)呢?

我(wǒ)们(men)先(xiān)看(kàn)下(xià)软(ruǎn)件(jiàn)是(shì)如(rú)何設計(jì)的(de)。

上(shàng)面(miàn)4行是(shì)软(ruǎn)件(jiàn)代(dài)碼,先(xiān)讓a为(wèi)1;然後(hòu)讓b=a+1,即讓b为(wèi)2;再讓a为(wèi)2;最(zuì)後(hòu)c=a+2,即讓c为(wèi)4。这(zhè)有(yǒu)什麼(me)特(tè)色(sè)?

Ø  软(ruǎn)件(jiàn)代(dài)碼是(shì)一(yī)行一(yī)行順序執行的(de);

Ø  软(ruǎn)件(jiàn)是(shì)一(yī)種(zhǒng)过(guò)程設計(jì),是(shì)讓信(xìn)号(hào)怎麼(me)做、怎麼(me)變(biàn)的(de)設計(jì)。

Ø  软(ruǎn)件(jiàn)考慮的(de)是(shì)此(cǐ)时(shí)此(cǐ)刻,該信(xìn)号(hào)要(yào)怎麼(me)做。


而(ér)硬(yìng)件(jiàn)設計(jì)思(sī)維,我(wǒ)们(men)可(kě)以(yǐ)通(tòng)过(guò)MP801開(kāi)發(fà)板的(de)電(diàn)路(lù)設計(jì)为(wèi)例進(jìn)行闡述。

假設我(wǒ)们(men)要(yào)設計(jì)一(yī)款MP801開(kāi)發(fà)板,这(zhè)个(gè)開(kāi)發(fà)板使用(yòng)了(le)多(duō)个(gè)元(yuán)器件(jiàn),例如(rú)有(yǒu)FPGA主(zhǔ)芯片(piàn)、ADDA、數碼管(guǎn)、按鍵等。每个(gè)元(yuán)器件(jiàn)都有(yǒu)它(tā)自(zì)己独特(tè)的(de)功能(néng)。

首先(xiān),每个(gè)元(yuán)器件(jiàn)不(bù)一(yī)定(dìng)有(yǒu)輸入(rù),但一(yī)定(dìng)会(huì)有(yǒu)輸出(chū)。例如(rú),晶振輸出(chū)50M时(shí)鐘(zhōng);當按下(xià)按鍵时(shí),電(diàn)平輸出(chū)为(wèi)0,未按下(xià)时(shí)輸出(chū)为(wèi)1;數碼管(guǎn)的(de)輸出(chū),則是(shì)顔色(sè)的(de)發(fà)光(guāng)狀态等。

其次(cì),每个(gè)元(yuán)器件(jiàn)通(tòng)常都有(yǒu)一(yī)个(gè)數據(jù)手(shǒu)册,該手(shǒu)册描述的(de)是(shì)該元(yuán)器件(jiàn)的(de)輸出(chū)功能(néng),即在(zài)什麼(me)樣(yàng)情(qíng)況下(xià),会(huì)有(yǒu)怎麼(me)樣(yàng)的(de)輸出(chū)。以(yǐ)晶振为(wèi)例,文(wén)檔一(yī)般会(huì)说(shuō)明(míng)電(diàn)源電(diàn)壓为(wèi)多(duō)少(shǎo),然後(hòu)輸出(chū)50M的(de)时(shí)鐘(zhōng)信(xìn)号(hào)。再以(yǐ)AD9280为(wèi)例,文(wén)檔会(huì)说(shuō)明(míng)輸入(rù)二(èr)進(jìn)制值为(wèi)多(duō)少(shǎo)时(shí),輸出(chū)什麼(me)樣(yàng)的(de)電(diàn)平,例如(rú)值为(wèi)8’h00时(shí),輸出(chū)電(diàn)壓为(wèi)0V;值为(wèi)8’hff时(shí),輸出(chū)電(diàn)壓为(wèi)5V等。

再次(cì),您可(kě)以(yǐ)發(fà)現(xiàn),每个(gè)數據(jù)手(shǒu)册一(yī)定(dìng)会(huì)说(shuō)明(míng)清(qīng)楚,在(zài)所(suǒ)有(yǒu)的(de)情(qíng)況下(xià),輸出(chū)会(huì)有(yǒu)什麼(me)樣(yàng)的(de)變(biàn)化(huà)。

最(zuì)後(hòu),當選中(zhōng)了(le)元(yuán)器件(jiàn)後(hòu),硬(yìng)件(jiàn)工程师(shī)的(de)工作,就(jiù)是(shì)把它(tā)们(men)正(zhèng)确地(dì)連(lián)起来(lái)。

當電(diàn)路(lù)板開(kāi)發(fà)并生(shēng)産完成(chéng)後(hòu),一(yī)通(tòng)電(diàn),全(quán)部(bù)元(yuán)器件(jiàn)都同(tóng)时(shí)在(zài)工作。不(bù)存在(zài)说(shuō)某个(gè)元(yuán)器件(jiàn)工作,另(lìng)一(yī)个(gè)元(yuán)器件(jiàn)不(bù)工作的(de)情(qíng)況(这(zhè)里(lǐ)不(bù)工作是(shì)指不(bù)通(tòng)電(diàn)的(de)情(qíng)況,而(ér)不(bù)是(shì)不(bù)變(biàn)化(huà)。事(shì)实上(shàng),不(bù)變(biàn)化(huà)也(yě)是(shì)該元(yuán)器件(jiàn)的(de)一(yī)个(gè)輸出(chū)功能(néng))。當然,更(gèng)不(bù)存在(zài),此(cǐ)时(shí)元(yuán)器件(jiàn)A工作,元(yuán)器件(jiàn)B消失的(de)情(qíng)況,事(shì)实上(shàng),这(zhè)些元(yuán)器件(jiàn)是(shì)一(yī)直(zhí)保持(chí)存在(zài)的(de)。


上(shàng)面(miàn)就(jiù)是(shì)硬(yìng)件(jiàn)的(de)設計(jì)过(guò)程,我(wǒ)们(men)可(kě)以(yǐ)總(zǒng)結出(chū)硬(yìng)件(jiàn)思(sī)維的(de)特(tè)色(sè)。

Ø  硬(yìng)件(jiàn)首先(xiān)是(shì)描述一(yī)个(gè)“元(yuán)器件(jiàn)”,它(tā)是(shì)什麼(me),它(tā)有(yǒu)什麼(me)功能(néng),即在(zài)什麼(me)情(qíng)況下(xià),有(yǒu)什麼(me)樣(yàng)的(de)輸出(chū)。软(ruǎn)件(jiàn)是(shì)讓它(tā)怎麼(me)做,过(guò)多(duō)久为(wèi)1,过(guò)多(duō)久又为(wèi)2等。这(zhè)就(jiù)是(shì)VERILOG这(zhè)个(gè)硬(yìng)件(jiàn)描述語(yǔ)言的(de)特(tè)性(xìng),一(yī)个(gè)ALWAYS語(yǔ)句(jù),就(jiù)相當于(yú)一(yī)个(gè)“元(yuán)器件(jiàn)”,每个(gè)ALWAYS都是(shì)描述“元(yuán)器件(jiàn)”(設計(jì)信(xìn)号(hào))的(de)變(biàn)化(huà)情(qíng)況。

Ø  描述一(yī)个(gè)“元(yuán)器件(jiàn)”是(shì)什麼(me)时(shí),就(jiù)要(yào)概括所(suǒ)有(yǒu)的(de)情(qíng)況,就(jiù)如(rú)數據(jù)手(shǒu)册般的(de)清(qīng)晰。对(duì)應(yìng)的(de)是(shì)FPGA的(de)ALWAYS語(yǔ)句(jù),其設計(jì)的(de)信(xìn)号(hào),一(yī)定(dìng)是(shì)所(suǒ)有(yǒu)条(tiáo)件(jiàn)if else下(xià)的(de)變(biàn)化(huà)。特(tè)别注意(yì)的(de)是(shì),不(bù)同(tóng)于(yú)软(ruǎn)件(jiàn)只(zhī)考慮此(cǐ)时(shí)此(cǐ)刻值为(wèi)多(duō)少(shǎo),硬(yìng)件(jiàn)和(hé)FPGA考慮的(de)是(shì)“整个(gè)電(diàn)路(lù)生(shēng)命周期(qī)”下(xià)的(de)各(gè)種(zhǒng)情(qíng)況处理方(fāng)式。

Ø  當您選完了(le)“元(yuán)器件(jiàn)”後(hòu),就(jiù)是(shì)把元(yuán)器件(jiàn)連(lián)接起来(lái)。对(duì)應(yìng)FPGA,則是(shì)通(tòng)过(guò)相同(tóng)“信(xìn)号(hào)名”来(lái)接各(gè)个(gè)部(bù)分(fēn)連(lián)接起来(lái)。

Ø  最(zuì)後(hòu),一(yī)通(tòng)電(diàn),全(quán)部(bù)“元(yuán)器件(jiàn)”都同(tóng)时(shí)工作了(le)。对(duì)應(yìng)FPGA,就(jiù)是(shì)VERILOG代(dài)碼会(huì)綜合成(chéng)電(diàn)路(lù)网(wǎng)表(biǎo),最(zuì)終(zhōng)会(huì)下(xià)载到(dào)FPGA,像電(diàn)路(lù)般全(quán)部(bù)同(tóng)时(shí)運行。ALWAYS設計(jì)的(de)各(gè)種(zhǒng)信(xìn)号(hào)是(shì)一(yī)直(zhí)物(wù)理存在(zài)的(de)。


認真(zhēn)體(tǐ)会(huì)软(ruǎn)件(jiàn)思(sī)維和(hé)硬(yìng)件(jiàn)思(sī)維的(de)异(yì)同(tóng),有(yǒu)助于(yú)我(wǒ)们(men)更(gèng)好(hǎo)更(gèng)規範地(dì)進(jìn)行FPGA開(kāi)發(fà)。同(tóng)时(shí),正(zhèng)确地(dì)理解(jiě)硬(yìng)件(jiàn)思(sī)維,对(duì)于(yú)一(yī)些錯誤观念和(hé)設計(jì)法,就(jiù)有(yǒu)自(zì)己的(de)判斷了(le)。

1:有(yǒu)部(bù)分(fēn)读(dú)者(zhě)閱读(dú)VERILOG代(dài)碼时(shí),会(huì)想(xiǎng)當然地(dì)認为(wèi)begin 里(lǐ)面(miàn)代(dài)碼都是(shì)串行執行的(de),例如(rú)下(xià)面(miàn)的(de)代(dài)碼,会(huì)認为(wèi)按順序從第(dì)2至(zhì)11行順序地(dì)串行執行。


從嚴格的(de)意(yì)義上(shàng),笔(bǐ)者(zhě)認为(wèi)“順序串行執行”这(zhè)个(gè)概念是(shì)不(bù)正(zhèng)确的(de),FPGA本(běn)身(shēn)就(jiù)沒(méi)有(yǒu)“執行”的(de)概念。由(yóu)前(qián)面(miàn)講述可(kě)知,ALWAYS僅是(shì)像數據(jù)手(shǒu)册那(nà)樣(yàng),描述“元(yuán)器件(jiàn)”cnt的(de)功能(néng),即描述cnt在(zài)所(suǒ)有(yǒu)情(qíng)況下(xià)的(de)變(biàn)化(huà)情(qíng)況。所(suǒ)以(yǐ),正(zhèng)确的(de)理解(jiě),應(yìng)當是(shì)像读(dú)“數據(jù)手(shǒu)册”那(nà)般,“閱读(dú)”cnt的(de)功能(néng)。

 

2:大家(jiā)可(kě)以(yǐ)看(kàn)出(chū)下(xià)面(miàn)代(dài)碼,是(shì)按软(ruǎn)件(jiàn)思(sī)維,還(huán)是(shì)按硬(yìng)件(jiàn)思(sī)維設計(jì)的(de)呢?

不(bù)用(yòng)理解(jiě)上(shàng)面(miàn)代(dài)碼实現(xiàn)了(le)什麼(me)功能(néng),從风格上(shàng)就(jiù)可(kě)以(yǐ)看(kàn)出(chū)其是(shì)用(yòng)软(ruǎn)件(jiàn)思(sī)維来(lái)設計(jì)的(de)。可(kě)以(yǐ)猜想(xiǎng)其写代(dài)碼的(de)过(guò)程,如(rú)先(xiān)写第(dì)13行代(dài)碼,讓byte_satee1;然後(hòu)写第(dì)14至(zhì)18行代(dài)碼,讓Pre_CMOS_iData變(biàn)化(huà),这(zhè)怎麼(me)看(kàn)起来(lái),都像是(shì)软(ruǎn)件(jiàn)的(de)一(yī)種(zhǒng)过(guò)程思(sī)維。其次(cì),将多(duō)个(gè)信(xìn)号(hào)放(fàng)在(zài)一(yī)个(gè)ALWAYS中(zhōng)描述,就(jiù)像将多(duō)个(gè)不(bù)同(tóng)元(yuán)器件(jiàn)都写在(zài)一(yī)个(gè)數據(jù)手(shǒu)册上(shàng),必定(dìng)是(shì)雜亂无章(zhāng),講不(bù)清(qīng)楚的(de)。

比較規範的(de)設計(jì)方(fāng)法,推薦一(yī)个(gè)ALWAYS設計(jì)一(yī)个(gè)信(xìn)号(hào),如(rú)下(xià)面(miàn)代(dài)碼,就(jiù)是(shì)实現(xiàn)了(le)相似的(de)功能(néng)。一(yī)个(gè)信(xìn)号(hào)一(yī)个(gè)信(xìn)号(hào)地(dì)描述設計(jì),长期(qī)堅持(chí),必定(dìng)能(néng)写出(chū)越来(lái)越优秀的(de)代(dài)碼。



温(wēn)馨提(tí)示:明(míng)德揚除了(le)培訓学習還(huán)有(yǒu)項目承接業务,擅长的(de)項目主(zhǔ)要(yào)包(bāo)括的(de)方(fāng)向(xiàng)有(yǒu)以(yǐ)下(xià)幾(jǐ)个(gè)方(fāng)面(miàn):


1. MIPI視頻拼接


2. SLVS-EC轉(zhuǎn)MIPI接口(kǒu)(IMX472 IMX492)

3. PCIE采集系(xì)統

4. 图(tú)像項目

5. 高(gāo)速多(duō)通(tòng)道(dào)ADDA系(xì)統

6. 基于(yú)FPGA板卡(kǎ)研發(fà)

7. 前(qián)端模拟采集、射頻、電(diàn)荷靈敏前(qián)置放(fàng)大器




上(shàng)一(yī)篇(piān):光(guāng)纤項目系(xì)統概述
   拓展(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⁥⁠⁢

⁧⁨⁥⁨