第(dì)二(èr)階(jiē)段(duàn) 項目实踐
第(dì)五(wǔ)章(zhāng) 串口(kǒu)通(tòng)信(xìn)
本(běn)文(wén)的(de)文(wén)檔編号(hào):002700000016
需要(yào)看(kàn)对(duì)應(yìng)的(de)視頻,請點(diǎn)擊視頻編号(hào):000900000038
1.至(zhì)簡原理與(yǔ)應(yìng)用(yòng)配套(tào)的(de)案(àn)例
1 項目背景
串行接口(kǒu)簡稱串口(kǒu),也(yě)稱串行通(tòng)信(xìn)接口(kǒu)或(huò)串行通(tòng)訊接口(kǒu)(通(tòng)常指COM接口(kǒu)),是(shì)采用(yòng)串行通(tòng)信(xìn)方(fāng)式的(de)擴展(zhǎn)接口(kǒu)。串行接口(kǒu) (Serial Interface) 是(shì)指數據(jù)一(yī)位一(yī)位地(dì)順序傳送,其特(tè)點(diǎn)是(shì)通(tòng)信(xìn)線(xiàn)路(lù)簡單,只(zhī)要(yào)一(yī)对(duì)傳輸線(xiàn)就(jiù)可(kě)以(yǐ)实現(xiàn)双(shuāng)向(xiàng)通(tòng)信(xìn)(可(kě)以(yǐ)直(zhí)接利用(yòng)電(diàn)話(huà)線(xiàn)作为(wèi)傳輸線(xiàn)),從而(ér)大大降低了(le)成(chéng)本(běn),特(tè)别适用(yòng)于(yú)遠(yuǎn)距離通(tòng)信(xìn),但傳送速度(dù)較慢(màn)。一(yī)条(tiáo)信(xìn)息的(de)各(gè)位數據(jù)被(bèi)逐位按順序傳送的(de)通(tòng)訊方(fāng)式稱为(wèi)串行通(tòng)訊。
串口(kǒu)的(de)出(chū)現(xiàn)是(shì)在(zài)1980年(nián)前(qián)後(hòu),數據(jù)傳輸率是(shì)115kbps~230kbps。串口(kǒu)出(chū)現(xiàn)的(de)初期(qī)是(shì)为(wèi)了(le)实現(xiàn)連(lián)接計(jì)算機(jī)外(wài)設的(de)目的(de),初期(qī)串口(kǒu)一(yī)般用(yòng)来(lái)連(lián)接鼠标(biāo)和(hé)外(wài)置Modem以(yǐ)及(jí)老(lǎo)式攝像头(tóu)和(hé)写字(zì)板等設備。串口(kǒu)也(yě)可(kě)以(yǐ)應(yìng)用(yòng)于(yú)两(liǎng)台(tái)計(jì)算機(jī)(或(huò)設備)之間(jiān)的(de)互聯及(jí)數據(jù)傳輸。
接口(kǒu)劃(huà)分(fēn)标(biāo)準
串口(kǒu)可(kě)分(fēn)成(chéng)同(tóng)步串行接口(kǒu)和(hé)异(yì)步串行接口(kǒu)。
同(tóng)步串行接口(kǒu)(英文(wén):SynchronousSerialInterface,SSI)是(shì)一(yī)種(zhǒng)常用(yòng)的(de)工業用(yòng)通(tòng)信(xìn)接口(kǒu)。
异(yì)步串行是(shì)指UART(Universal Asynchronous Receiver/Transmitter),通(tòng)用(yòng)异(yì)步接收(shōu)/發(fà)送。
串行接口(kǒu)按電(diàn)气(qì)标(biāo)準及(jí)協議来(lái)分(fēn)包(bāo)括RS-232-C、RS-422、RS485等。RS-232-C、RS-422與(yǔ)RS-485标(biāo)準只(zhī)对(duì)接口(kǒu)的(de)電(diàn)气(qì)特(tè)性(xìng)做出(chū)規定(dìng),不(bù)涉及(jí)接插件(jiàn)、電(diàn)缆(lǎn)或(huò)協議。
RS-232
也(yě)稱标(biāo)準串口(kǒu),最(zuì)常用(yòng)的(de)一(yī)種(zhǒng)串行通(tòng)訊接口(kǒu)。它(tā)是(shì)在(zài)1970年(nián)由(yóu)美國(guó)電(diàn)子工業協会(huì)(EIA)聯合貝爾系(xì)統、調制解(jiě)調器廠(chǎng)家(jiā)及(jí)計(jì)算機(jī)終(zhōng)端生(shēng)産廠(chǎng)家(jiā)共(gòng)同(tóng)制定(dìng)的(de)用(yòng)于(yú)串行通(tòng)訊的(de)标(biāo)準。它(tā)的(de)全(quán)名是(shì)“數據(jù)終(zhōng)端設備(DTE)和(hé)數據(jù)通(tòng)訊設備(DCE)之間(jiān)串行二(èr)進(jìn)制數據(jù)交換接口(kǒu)技術(shù)标(biāo)準”。傳統的(de)RS-232-C接口(kǒu)标(biāo)準有(yǒu)22根(gēn)線(xiàn),采用(yòng)标(biāo)準25芯D型插头(tóu)座(DB25),後(hòu)来(lái)使用(yòng)簡化(huà)为(wèi)9芯D型插座(DB9),現(xiàn)在(zài)應(yìng)用(yòng)中(zhōng)25芯插头(tóu)座已很少(shǎo)采用(yòng)。
RS-232采取(qǔ)不(bù)平衡傳輸方(fāng)式,即所(suǒ)謂單端通(tòng)訊。由(yóu)于(yú)其發(fà)送電(diàn)平與(yǔ)接收(shōu)電(diàn)平的(de)差僅为(wèi)2V至(zhì)3V左(zuǒ)右(yòu),所(suǒ)以(yǐ)其共(gòng)模抑制能(néng)力差,再加上(shàng)双(shuāng)絞線(xiàn)上(shàng)的(de)分(fēn)布(bù)電(diàn)容,其傳送距離最(zuì)大为(wèi)約15米(mǐ),最(zuì)高(gāo)速率为(wèi)20kb/s。RS-232是(shì)为(wèi)點(diǎn)对(duì)點(diǎn)(即只(zhī)用(yòng)一(yī)对(duì)收(shōu)、發(fà)設備)通(tòng)訊而(ér)設計(jì)的(de),其驅動(dòng)器負载为(wèi)3~7kΩ。所(suǒ)以(yǐ)RS-232适合本(běn)地(dì)設備之間(jiān)的(de)通(tòng)信(xìn)。
RS-422
标(biāo)準全(quán)稱是(shì)“平衡電(diàn)壓數字(zì)接口(kǒu)電(diàn)路(lù)的(de)電(diàn)气(qì)特(tè)性(xìng)”,它(tā)定(dìng)義了(le)接口(kǒu)電(diàn)路(lù)的(de)特(tè)性(xìng)。典型的(de)RS-422是(shì)四(sì)線(xiàn)接口(kǒu)。实際上(shàng)還(huán)有(yǒu)一(yī)根(gēn)信(xìn)号(hào)地(dì)線(xiàn),共(gòng)5根(gēn)線(xiàn)。其DB9連(lián)接器引脚定(dìng)義。由(yóu)于(yú)接收(shōu)器采用(yòng)高(gāo)輸入(rù)阻抗和(hé)發(fà)送驅動(dòng)器比RS232更(gèng)強(qiáng)的(de)驅動(dòng)能(néng)力,故允许在(zài)相同(tóng)傳輸線(xiàn)上(shàng)連(lián)接多(duō)个(gè)接收(shōu)节(jié)點(diǎn),最(zuì)多(duō)可(kě)接10个(gè)节(jié)點(diǎn)。即一(yī)个(gè)主(zhǔ)設備(Master),其餘为(wèi)從設備(Slave),從設備之間(jiān)不(bù)能(néng)通(tòng)信(xìn),所(suǒ)以(yǐ)RS-422支持(chí)點(diǎn)对(duì)多(duō)的(de)双(shuāng)向(xiàng)通(tòng)信(xìn)。接收(shōu)器輸入(rù)阻抗为(wèi)4k,故發(fà)端最(zuì)大負载能(néng)力是(shì)10×4k+100Ω(終(zhōng)接電(diàn)阻)。RS-422四(sì)線(xiàn)接口(kǒu)由(yóu)于(yú)采用(yòng)單独的(de)發(fà)送和(hé)接收(shōu)通(tòng)道(dào),因(yīn)此(cǐ)不(bù)必控制數據(jù)方(fāng)向(xiàng),各(gè)裝(zhuāng)置之間(jiān)任何必須的(de)信(xìn)号(hào)交換均可(kě)以(yǐ)按软(ruǎn)件(jiàn)方(fāng)式(XON/XOFF握手(shǒu))或(huò)硬(yìng)件(jiàn)方(fāng)式(一(yī)对(duì)單独的(de)双(shuāng)絞線(xiàn))实現(xiàn)。
RS-422的(de)最(zuì)大傳輸距離为(wèi)1219米(mǐ),最(zuì)大傳輸速率为(wèi)10Mb/s。其平衡双(shuāng)絞線(xiàn)的(de)长度(dù)與(yǔ)傳輸速率成(chéng)反(fǎn)比,在(zài)100kb/s速率以(yǐ)下(xià),才可(kě)能(néng)达(dá)到(dào)最(zuì)大傳輸距離。只(zhī)有(yǒu)在(zài)很短(duǎn)的(de)距離下(xià)才能(néng)獲得最(zuì)高(gāo)速率傳輸。一(yī)般100米(mǐ)长的(de)双(shuāng)絞線(xiàn)上(shàng)所(suǒ)能(néng)獲得的(de)最(zuì)大傳輸速率僅为(wèi)1Mb/s。
RS-485
是(shì)從RS-422基礎上(shàng)發(fà)展(zhǎn)而(ér)来(lái)的(de),所(suǒ)以(yǐ)RS-485许多(duō)電(diàn)气(qì)規定(dìng)與(yǔ)RS-422相仿。如(rú)都采用(yòng)平衡傳輸方(fāng)式、都需要(yào)在(zài)傳輸線(xiàn)上(shàng)接終(zhōng)接電(diàn)阻等。RS-485可(kě)以(yǐ)采用(yòng)二(èr)線(xiàn)與(yǔ)四(sì)線(xiàn)方(fāng)式,二(èr)線(xiàn)制可(kě)实現(xiàn)真(zhēn)正(zhèng)的(de)多(duō)點(diǎn)双(shuāng)向(xiàng)通(tòng)信(xìn),而(ér)采用(yòng)四(sì)線(xiàn)連(lián)接时(shí),與(yǔ)RS-422一(yī)樣(yàng)只(zhī)能(néng)实現(xiàn)點(diǎn)对(duì)多(duō)的(de)通(tòng)信(xìn),即只(zhī)能(néng)有(yǒu)一(yī)个(gè)主(zhǔ)(Master)設備,其餘为(wèi)從設備,但它(tā)比RS-422有(yǒu)改進(jìn),无論四(sì)線(xiàn)還(huán)是(shì)二(èr)線(xiàn)連(lián)接方(fāng)式總(zǒng)線(xiàn)上(shàng)可(kě)多(duō)接到(dào)32个(gè)設備。
RS-485與(yǔ)RS-422的(de)不(bù)同(tóng)還(huán)在(zài)于(yú)其共(gòng)模輸出(chū)電(diàn)壓是(shì)不(bù)同(tóng)的(de),RS-485是(shì)-7V至(zhì)+12V之間(jiān),而(ér)RS-422在(zài)-7V至(zhì)+7V之間(jiān),RS-485接收(shōu)器最(zuì)小輸入(rù)阻抗为(wèi)12kΩ、RS-422是(shì)4kΩ;由(yóu)于(yú)RS-485滿足所(suǒ)有(yǒu)RS-422的(de)規範,所(suǒ)以(yǐ)RS-485的(de)驅動(dòng)器可(kě)以(yǐ)在(zài)RS-422网(wǎng)絡中(zhōng)應(yìng)用(yòng)。
RS-485與(yǔ)RS-422一(yī)樣(yàng),其最(zuì)大傳輸距離約为(wèi)1219米(mǐ),最(zuì)大傳輸速率为(wèi)10Mb/s。平衡双(shuāng)絞線(xiàn)的(de)长度(dù)與(yǔ)傳輸速率成(chéng)反(fǎn)比,在(zài)100kb/s速率以(yǐ)下(xià),才可(kě)能(néng)使用(yòng)規定(dìng)最(zuì)长的(de)電(diàn)缆(lǎn)长度(dù)。只(zhī)有(yǒu)在(zài)很短(duǎn)的(de)距離下(xià)才能(néng)獲得最(zuì)高(gāo)速率傳輸。一(yī)般100米(mǐ)长双(shuāng)絞線(xiàn)最(zuì)大傳輸速率僅为(wèi)1Mb/s。
CH340
由(yóu)于(yú)串口(kǒu)(COM)不(bù)支持(chí)热(rè)插拔及(jí)傳輸速率較低,目前(qián)大部(bù)分(fēn)新主(zhǔ)板和(hé)便攜電(diàn)腦已開(kāi)始取(qǔ)消該接口(kǒu),只(zhī)有(yǒu)工控和(hé)测量(liàng)設備以(yǐ)及(jí)部(bù)分(fēn)通(tòng)信(xìn)設備中(zhōng)還(huán)保留有(yǒu)串口(kǒu)。
現(xiàn)在(zài)的(de)電(diàn)腦大部(bù)分(fēn)都有(yǒu)USB接口(kǒu)而(ér)沒(méi)有(yǒu)串口(kǒu),为(wèi)了(le)使用(yòng)串口(kǒu),我(wǒ)们(men)需要(yào)一(yī)个(gè)USB轉(zhuǎn)串口(kǒu)的(de)芯片(piàn),它(tā)的(de)功能(néng)是(shì)讓電(diàn)腦把USB當串口(kǒu)来(lái)使用(yòng)。这(zhè)種(zhǒng)類(lèi)型的(de)芯片(piàn)很多(duō),明(míng)德揚教学板使用(yòng)的(de)是(shì)CH340芯片(piàn)。
CH340是(shì)一(yī)个(gè)USB總(zǒng)線(xiàn)的(de)轉(zhuǎn)接芯片(piàn),实現(xiàn)USB轉(zhuǎn)串口(kǒu)、USB轉(zhuǎn)IrDA紅(hóng)外(wài)或(huò)者(zhě)USB轉(zhuǎn)打(dǎ)印(yìn)口(kǒu)。
在(zài)串口(kǒu)方(fāng)式下(xià),CH340提(tí)供常用(yòng)的(de)MODE聯絡信(xìn)号(hào),用(yòng)于(yú)为(wèi)計(jì)算機(jī)擴展(zhǎn)异(yì)步串口(kǒu)中(zhōng),或(huò)者(zhě)将普通(tòng)的(de)串口(kǒu)設備直(zhí)接升(shēng)級到(dào)USB總(zǒng)線(xiàn)。
明(míng)德揚教学板的(de)串口(kǒu)功能(néng)原理如(rú)下(xià)图(tú)所(suǒ)示。電(diàn)腦通(tòng)过(guò)USB線(xiàn),連(lián)接到(dào)教学板上(shàng)的(de)USB接口(kǒu),USB接口(kǒu)連(lián)接到(dào)CH340芯片(piàn),CH340芯片(piàn)與(yǔ)FPGA相連(lián)。在(zài)FPGA看(kàn)来(lái),串口(kǒu)其实就(jiù)是(shì)两(liǎng)根(gēn)線(xiàn):輸入(rù)線(xiàn)USB_RXD和(hé)輸出(chū)線(xiàn)USB_TXD,其他(tā)電(diàn)气(qì)特(tè)性(xìng)、電(diàn)平轉(zhuǎn)換的(de)工作,都由(yóu)CH340搞好(hǎo)了(le)。FPGA通(tòng)过(guò)USB_RXD接收(shōu)来(lái)自(zì)電(diàn)腦过(guò)来(lái)的(de)串口(kǒu)數據(jù);通(tòng)过(guò)USB_TXD發(fà)數據(jù)給(gěi)電(diàn)腦。
图(tú) 199
串口(kǒu)时(shí)序
USB_RXD和(hé)USB_TXD傳輸數據(jù)时(shí),是(shì)将傳輸數據(jù)的(de)每个(gè)字(zì)符一(yī)位接一(yī)位地(dì)傳輸。下(xià)面(miàn)是(shì)USB_RXD和(hé)USB_TXD的(de)时(shí)序。USB_RXD的(de)时(shí)序由(yóu)CH340芯片(piàn)産生(shēng),FPGA根(gēn)據(jù)时(shí)序来(lái)接收(shōu)數據(jù);USB_TXD的(de)时(shí)序由(yóu)FPGA芯片(piàn)産生(shēng),FPGA要(yào)按規範来(lái)産生(shēng)时(shí)序,使得CH340可(kě)以(yǐ)正(zhèng)确地(dì)接收(shōu)。我(wǒ)们(men)可(kě)以(yǐ)把産生(shēng)时(shí)序的(de)叫MASTER(主(zhǔ)),接收(shōu)數據(jù)叫SLAVE(從)。
图(tú) 200
串口(kǒu)时(shí)序主(zhǔ)要(yào)包(bāo)括:空閑、起始位、數據(jù)拉、校(xiào)验(yàn)位和(hé)停止位。
空閑:空閑狀态下(xià),數據(jù)線(xiàn)一(yī)直(zhí)处于(yú)高(gāo)電(diàn)平狀态。
起始位:當MASTER要(yào)發(fà)送數據(jù)时(shí),首先(xiān)会(huì)将數據(jù)線(xiàn)拉低“一(yī)段(duàn)时(shí)間(jiān)”,從而(ér)告知SLAVE有(yǒu)數據(jù)要(yào)傳輸了(le),要(yào)做好(hǎo)準備。
數據(jù)位:起始位之後(hòu)是(shì)數據(jù)位,數據(jù)位的(de)位數由(yóu)双(shuāng)方(fāng)約定(dìng),支持(chí)4、5、6、7、8位等。双(shuāng)方(fāng)約定(dìng)後(hòu)才能(néng)正(zhèng)确地(dì)傳輸。每个(gè)數據(jù)位傳輸时(shí)都会(huì)占用(yòng)“一(yī)段(duàn)时(shí)間(jiān)”,并且是(shì)從低位開(kāi)始傳輸。图(tú)中(zhōng)LSB是(shì)低位的(de)意(yì)思(sī),MSB是(shì)高(gāo)位的(de)意(yì)思(sī)。例如(rú)要(yào)傳輸數據(jù)8’b00000001,傳輸时(shí)是(shì)先(xiān)送最(zuì)低位的(de)“1”。
檢验(yàn)位:奇偶校(xiào)验(yàn)是(shì)一(yī)種(zhǒng)非(fēi)常簡單常用(yòng)的(de)數據(jù)校(xiào)验(yàn)方(fāng)式,分(fēn)为(wèi)奇校(xiào)验(yàn)和(hé)偶校(xiào)验(yàn)。奇校(xiào)验(yàn)需要(yào)保證傳輸的(de)數據(jù)總(zǒng)共(gòng)有(yǒu)奇數个(gè)邏輯高(gāo)電(diàn)平,若是(shì)偶校(xiào)验(yàn)則要(yào)保證傳輸的(de)數據(jù)有(yǒu)偶數个(gè)邏輯高(gāo)電(diàn)平。即“奇偶”的(de)意(yì)思(sī)就(jiù)是(shì)數據(jù)中(zhōng)(包(bāo)括該校(xiào)验(yàn)位)中(zhōng)1的(de)个(gè)數。例如(rú):傳輸的(de)數據(jù)位是(shì)0100_0011。如(rú)果(guǒ)是(shì)奇校(xiào)验(yàn),校(xiào)验(yàn)位是(shì)0,偶校(xiào)验(yàn)校(xiào)验(yàn)位是(shì)1。校(xiào)验(yàn)位不(bù)是(shì)必須項,双(shuāng)方(fāng)可(kě)以(yǐ)約定(dìng)不(bù)需要(yào)校(xiào)验(yàn)位,或(huò)者(zhě)用(yòng)奇校(xiào)验(yàn),或(huò)者(zhě)使用(yòng)偶校(xiào)验(yàn)。
停止位:最(zuì)後(hòu)一(yī)个(gè)是(shì)停止位,MASTER必須保證有(yǒu)停止位,即把數據(jù)線(xiàn)變(biàn)高(gāo)“一(yī)段(duàn)时(shí)間(jiān)”。由(yóu)于(yú)數據(jù)是(shì)在(zài)傳輸線(xiàn)上(shàng)定(dìng)时(shí)的(de),并且每一(yī)个(gè)設備有(yǒu)其自(zì)己的(de)时(shí)鐘(zhōng),很可(kě)能(néng)在(zài)通(tòng)信(xìn)中(zhōng)两(liǎng)台(tái)設備間(jiān)出(chū)現(xiàn)了(le)小小的(de)不(bù)同(tóng)步。因(yīn)此(cǐ)停止位不(bù)僅僅是(shì)表(biǎo)示傳輸的(de)結束(shù),并且提(tí)供計(jì)算機(jī)校(xiào)正(zhèng)时(shí)鐘(zhōng)同(tóng)步的(de)機(jī)会(huì)。讓SLAVE可(kě)以(yǐ)正(zhèng)确地(dì)識别下(xià)一(yī)轮數據(jù)的(de)起始位。假如(rú)沒(méi)有(yǒu)停止位,校(xiào)验(yàn)碼刚好(hǎo)是(shì)0,數據(jù)連(lián)續發(fà)送,那(nà)麼(me)SLAVE就(jiù)沒(méi)法判斷下(xià)一(yī)轮的(de)起始位。对(duì)于(yú)SLAVE来(lái)说(shuō),接收(shōu)完數據(jù)位或(huò)校(xiào)验(yàn)位後(hòu)就(jiù)表(biǎo)示接收(shōu)完成(chéng),在(zài)停止位不(bù)需要(yào)做什麼(me),只(zhī)是(shì)等待下(xià)一(yī)轮起始就(jiù)够了(le)。
在(zài)时(shí)序图(tú)中(zhōng),每个(gè)數據(jù)都会(huì)傳輸“一(yī)段(duàn)时(shí)間(jiān)”,这(zhè)个(gè)一(yī)段(duàn)时(shí)間(jiān)非(fēi)常重(zhòng)要(yào),傳輸双(shuāng)方(fāng)都要(yào)做好(hǎo)約定(dìng),否則就(jiù)不(bù)能(néng)正(zhèng)确地(dì)通(tòng)信(xìn)。那(nà)麼(me)这(zhè)个(gè)“一(yī)段(duàn)时(shí)間(jiān)”是(shì)多(duō)长时(shí)間(jiān)呢?这(zhè)跟波(bō)特(tè)率有(yǒu)關(guān)。在(zài)串口(kǒu)通(tòng)信(xìn)中(zhōng),波(bō)特(tè)率是(shì)一(yī)个(gè)非(fēi)常重(zhòng)要(yào)的(de)概念。串口(kǒu)通(tòng)信(xìn)中(zhōng)常用(yòng)的(de)波(bō)特(tè)率是(shì)9600、19200、38400、57600、115200。波(bō)特(tè)率是(shì)每个(gè)碼元(yuán)傳輸的(de)速率,在(zài)二(èr)進(jìn)制數據(jù)傳輸中(zhōng),和(hé)比特(tè)率相同(tóng),都是(shì)每个(gè)比特(tè)數據(jù)傳輸的(de)速率,其倒數为(wèi)1bit數據(jù)的(de)位宽(kuān),也(yě)就(jiù)是(shì)1bit數據(jù)持(chí)續的(de)时(shí)間(jiān)。有(yǒu)了(le)这(zhè)一(yī)时(shí)間(jiān)段(duàn),就(jiù)可(kě)用(yòng)FPGA構造計(jì)數器实現(xiàn)比特(tè)周期(qī)的(de)延时(shí),從而(ér)实現(xiàn)特(tè)定(dìng)的(de)數據(jù)傳輸波(bō)特(tè)率。
例如(rú),假設波(bō)特(tè)率为(wèi)9600,數據(jù)位为(wèi)8位,沒(méi)有(yǒu)校(xiào)验(yàn)位,電(diàn)腦要(yào)發(fà)數據(jù)8’b00110001給(gěi)FPGA。考慮到(dào)波(bō)特(tè)率为(wèi)9600,即每位占用(yòng)时(shí)間(jiān)为(wèi)1s/9600=104166ns。那(nà)麼(me)FPGA的(de)USB_RXD(图(tú)中(zhōng)的(de)rx_uart)这(zhè)根(gēn)線(xiàn)将如(rú)下(xià)图(tú)變(biàn)化(huà)。
图(tú) 201
在(zài)使用(yòng)教学板的(de)串口(kǒu)前(qián),需要(yào)安(ān)裝(zhuāng)CH340的(de)驅動(dòng)程序(下(xià)载鍊(liàn)接:www.mdy-edu.coc/xxxxx)。下(xià)载後(hòu)直(zhí)接解(jiě)壓安(ān)裝(zhuāng)就(jiù)可(kě)以(yǐ)了(le)。
當用(yòng)USB線(xiàn)接上(shàng)電(diàn)腦和(hé)教学板,并且教学板上(shàng)電(diàn)後(hòu),打(dǎ)開(kāi)電(diàn)腦的(de)“設備管(guǎn)理器”,将会(huì)看(kàn)到(dào)如(rú)下(xià)顯示。當出(chū)現(xiàn)該顯示时(shí),表(biǎo)示驅程安(ān)裝(zhuāng)成(chéng)功并且已經(jīng)被(bèi)電(diàn)腦正(zhèng)确地(dì)識别。
我(wǒ)们(men)可(kě)以(yǐ)從“設備管(guǎn)理器”中(zhōng)查看(kàn)串口(kǒu)号(hào),如(rú)下(xià)图(tú)所(suǒ)示。图(tú)中(zhōng)表(biǎo)示該串口(kǒu)号(hào)为(wèi)XX。我(wǒ)们(men)可(kě)以(yǐ)修改串口(kǒu)号(hào),方(fāng)法是(shì):XXXXXX。
電(diàn)腦要(yào)發(fà)送數據(jù)給(gěi)FPGA,需要(yào)用(yòng)到(dào)串口(kǒu)調試助手(shǒu)(下(xià)载鍊(liàn)接:old.mdy-edu.com/xxxxx)。
图(tú) 202
串口(kǒu):可(kě)以(yǐ)選擇串口(kǒu)号(hào),支持(chí)串口(kǒu)号(hào)1~4。如(rú)果(guǒ)連(lián)接的(de)串口(kǒu)号(hào)不(bù)在(zài)此(cǐ)範圍,則需要(yào)從設備管(guǎn)理器中(zhōng)修改串口(kǒu)号(hào),詳细(xì)見(jiàn)本(běn)章(zhāng)前(qián)面(miàn)的(de)描述。
波(bō)特(tè)率:選擇串口(kǒu)的(de)波(bō)特(tè)率,支持(chí)9600、19200、38400、57600、115200。該選項影響了(le)每一(yī)位碼元(yuán)占用(yòng)的(de)时(shí)間(jiān)。
校(xiào)验(yàn)位:可(kě)選擇沒(méi)有(yǒu)檢验(yàn)位、奇校(xiào)验(yàn)和(hé)偶校(xiào)验(yàn)。
數據(jù)位:可(kě)以(yǐ)設置數據(jù)位的(de)位數,可(kě)選擇4~8位的(de)數據(jù)拉。
停止位:可(kě)以(yǐ)設置停止位的(de)时(shí)間(jiān)长度(dù)。有(yǒu)1位、1.5位和(hé)2位可(kě)供選擇。
打(dǎ)開(kāi)/關(guān)閉串口(kǒu):用(yòng)来(lái)打(dǎ)開(kāi)和(hé)關(guān)閉串口(kǒu)。打(dǎ)開(kāi)软(ruǎn)件(jiàn)时(shí),串口(kǒu)默認是(shì)關(guān)閉狀态。注意(yì),一(yī)定(dìng)要(yào)設置好(hǎo)參數後(hòu),才能(néng)打(dǎ)開(kāi)串口(kǒu);一(yī)定(dìng)要(yào)關(guān)閉串口(kǒu)後(hòu),才能(néng)關(guān)掉教学板電(diàn)源和(hé)撥掉USB線(xiàn)。
十(shí)六(liù)進(jìn)制顯示:本(běn)软(ruǎn)件(jiàn)支持(chí)ASCII顯示和(hé)十(shí)六(liù)進(jìn)制顯示。勾選後(hòu),用(yòng)十(shí)六(liù)進(jìn)制顯示。例如(rú)FPGA發(fà)送8’b00110001,本(běn)软(ruǎn)件(jiàn)收(shōu)到(dào)後(hòu)会(huì)顯示31。如(rú)果(guǒ)不(bù)勾選,則是(shì)用(yòng)ASCII碼顯示。下(xià)图(tú)就(jiù)是(shì)ASCII表(biǎo)。FPGA發(fà)送8’b00110001,即下(xià)表(biǎo)中(zhōng)十(shí)六(liù)進(jìn)制的(de)31,它(tā)所(suǒ)对(duì)應(yìng)的(de)图(tú)形为(wèi)1,所(suǒ)以(yǐ)软(ruǎn)件(jiàn)只(zhī)会(huì)顯示1。假設FPGA發(fà)送的(de)是(shì)8’h00100011,即下(xià)表(biǎo)中(zhōng)十(shí)六(liù)進(jìn)制的(de)23,它(tā)所(suǒ)对(duì)應(yìng)的(de)是(shì)图(tú)形是(shì)#,所(suǒ)示软(ruǎn)件(jiàn)会(huì)顯示#。
图(tú) 203
十(shí)六(liù)進(jìn)制發(fà)送:本(běn)软(ruǎn)件(jiàn)支持(chí)ASCII發(fà)送和(hé)十(shí)六(liù)進(jìn)制發(fà)送。勾選後(hòu),用(yòng)十(shí)六(liù)進(jìn)制發(fà)送。例如(rú)填写“31”,按手(shǒu)動(dòng)發(fà)送,那(nà)麼(me)FPGA收(shōu)到(dào)的(de)值是(shì)8’b00110001。如(rú)果(guǒ)不(bù)勾選,則是(shì)用(yòng)ASCII碼發(fà)送。例如(rú)填写“31”,按下(xià)手(shǒu)動(dòng)發(fà)送,软(ruǎn)件(jiàn)将首先(xiān)發(fà)送ASCII碼“3”所(suǒ)对(duì)應(yìng)的(de)十(shí)六(liù)進(jìn)制值8’h33,再發(fà)送ASCII碼“1”所(suǒ)对(duì)應(yìng)的(de)十(shí)六(liù)進(jìn)制值8’h31。也(yě)就(jiù)是(shì)FPGA将收(shōu)到(dào)两(liǎng)个(gè)字(zì)节(jié)數據(jù):8’h33和(hé)8’h31。
2 設計(jì)目标(biāo)
用(yòng)戶設置串口(kǒu)調試助手(shǒu)的(de)參數:波(bō)特(tè)率为(wèi)9600;數據(jù)位为(wèi)8位;无奇偶校(xiào)验(yàn)位;停止位为(wèi)2比特(tè);接收(shōu)和(hé)發(fà)送都是(shì)16進(jìn)制數。
用(yòng)戶通(tòng)过(guò)串口(kǒu)調試助手(shǒu)發(fà)送一(yī)个(gè)8位數據(jù)data,該8位數據(jù)data用(yòng)于(yú)控制開(kāi)發(fà)板上(shàng)的(de)8个(gè)LED燈(dēng)。其中(zhōng)data[0]~data[7]分(fēn)别控制LED0~LED7。當对(duì)應(yìng)的(de)數據(jù)位为(wèi)0时(shí),該LED燈(dēng)保持(chí)为(wèi)亮(liàng),如(rú)果(guǒ)对(duì)應(yìng)的(de)數據(jù)为(wèi)1时(shí),該LED保持(chí)为(wèi)滅。例如(rú),用(yòng)記(jì)發(fà)送數據(jù)data=8’b10110010,發(fà)送後(hòu),開(kāi)發(fà)板上(shàng)的(de)LED1、LED4、LED5和(hé)LED7保持(chí)为(wèi)滅,其他(tā)保持(chí)为(wèi)亮(liàng)。
上(shàng)板效果(guǒ)图(tú)如(rú)下(xià)图(tú)所(suǒ)示
图(tú) 204
3 設計(jì)实現(xiàn)
3.1 頂层信(xìn)号(hào)
新建目录(lù):D:mdy_bookuart。在(zài)該目录(lù)中(zhōng),新建一(yī)个(gè)名为(wèi)uart.v的(de)文(wén)件(jiàn),并用(yòng)GVIM打(dǎ)開(kāi),開(kāi)始編写代(dài)碼。
我(wǒ)们(men)分(fēn)析一(yī)下(xià)功能(néng)。串口(kǒu)調試助手(shǒu)發(fà)數據(jù)給(gěi)FPGA,站在(zài)FPGA的(de)角(jiǎo)度(dù)来(lái)看(kàn),就(jiù)是(shì)CH340通(tòng)过(guò)控制RX信(xìn)号(hào),讓RX信(xìn)号(hào)根(gēn)據(jù)串口(kǒu)时(shí)序變(biàn)化(huà),從而(ér)告知FPGA數據(jù)信(xìn)号(hào)。那(nà)麼(me)FPGA工程必須有(yǒu)一(yī)个(gè)接口(kǒu)信(xìn)号(hào),命名为(wèi)rx_uart。
FPGA要(yào)控制8个(gè)LED燈(dēng)的(de)亮(liàng)滅,那(nà)就(jiù)要(yào)8个(gè)信(xìn)号(hào),或(huò)者(zhě)一(yī)个(gè)8比特(tè)的(de)信(xìn)号(hào),命令为(wèi)led。
下(xià)面(miàn)表(biǎo)格表(biǎo)示了(le)硬(yìng)件(jiàn)電(diàn)路(lù)图(tú)的(de)連(lián)接關(guān)系(xì)。
|
器件(jiàn) |
原理图(tú)信(xìn)号(hào) |
FPGA管(guǎn)脚 |
FPGA工程信(xìn)号(hào) |
|
LED6 |
LED1_NET |
AA4 |
led[0] |
|
LED7 |
LED2_NET |
AB4 |
led[1] |
|
LED8 |
LED3_NET |
AA5 |
led[2] |
|
LED9 |
LED4_NET |
AB8 |
led[3] |
|
LED10 |
LED5_NET |
AA10 |
led[4] |
|
LED11 |
LED6_NET |
AB13 |
led[5] |
|
LED12 |
LED7_NET |
AB14 |
led[6] |
|
LED13 |
LED8_NET |
AB16 |
led[7] |
|
U11 |
USB_RXD |
D6 |
rx_uart |
|
X1 |
SYS_CLK |
G1 |
clk |
|
K1 |
SYS_RST |
AB12 |
rst_n |
綜上(shàng)所(suǒ)述,我(wǒ)们(men)这(zhè)个(gè)工程需要(yào)4个(gè)信(xìn)号(hào),时(shí)鐘(zhōng)clk,複位rst_n,串口(kǒu)輸入(rù)信(xìn)号(hào)rx_uart和(hé)輸出(chū)控制LED燈(dēng)的(de)8位信(xìn)号(hào)led。
将module的(de)名稱定(dìng)義为(wèi)uart。并且我(wǒ)们(men)已經(jīng)知道(dào)該模块(kuài)有(yǒu)四(sì)个(gè)信(xìn)号(hào):clk、rst_n、rx_uart和(hé)dout。为(wèi)此(cǐ),代(dài)碼如(rú)下(xià):
|
1 2 3 4 5 6 |
module uart( clk , rst_n , rx_uart , led ); |
其中(zhōng)clk、rst_n和(hé)rx_uart是(shì)輸入(rù)信(xìn)号(hào),dout是(shì)輸出(chū)信(xìn)号(hào),其中(zhōng)clk、rst_n、rx_uart的(de)值是(shì)0或(huò)者(zhě)1,一(yī)根(gēn)線(xiàn)即可(kě),dout为(wèi)8位位宽(kuān)的(de),根(gēn)據(jù)这(zhè)些信(xìn)息,我(wǒ)们(men)補充輸入(rù)輸出(chū)端口(kǒu)定(dìng)義。代(dài)碼如(rú)下(xià):
|
1 2 3 4 |
input clk ; input rst_n ; input rx_uart; output [7:0] led ; |
3.2 信(xìn)号(hào)設計(jì)
我(wǒ)们(men)先(xiān)分(fēn)析要(yào)实現(xiàn)的(de)功能(néng),led信(xìn)号(hào)控制了(le)8个(gè)LED燈(dēng)的(de)亮(liàng)滅,而(ér)具體(tǐ)哪些燈(dēng)亮(liàng)哪些燈(dēng)滅,是(shì)取(qǔ)決于(yú)串口(kǒu)过(guò)来(lái)的(de)數據(jù)。那(nà)串口(kǒu)过(guò)来(lái)的(de)數據(jù),是(shì)如(rú)何告知FPGA,并與(yǔ)led对(duì)應(yìng)起来(lái)呢?我(wǒ)们(men)可(kě)以(yǐ)看(kàn)一(yī)下(xià)串口(kǒu)过(guò)来(lái)的(de)时(shí)序。
图(tú) 205
上(shàng)面(miàn)波(bō)形是(shì)CH340控制的(de)信(xìn)号(hào)rx_uart。如(rú)果(guǒ)CH340要(yào)發(fà)送一(yī)个(gè)8位數據(jù)data,它(tā)首先(xiān)会(huì)将信(xìn)号(hào)rx_uart變(biàn)0并持(chí)續一(yī)段(duàn)时(shí)間(jiān)(起啟位),然後(hòu)發(fà)送data[0]并持(chí)續一(yī)段(duàn)时(shí)間(jiān),然後(hòu)發(fà)送data[1]并持(chí)續一(yī)段(duàn)时(shí)間(jiān),以(yǐ)此(cǐ)類(lèi)推,發(fà)送data[7]并持(chí)續一(yī)段(duàn)时(shí)間(jiān),最(zuì)後(hòu)CH340将rx_uart为(wèi)1并持(chí)續一(yī)段(duàn)时(shí)間(jiān)(結束(shù)位)。这(zhè)樣(yàng)CH340就(jiù)完成(chéng)了(le)數據(jù)的(de)發(fà)送。
例如(rú),CH340要(yào)發(fà)送的(de)數據(jù)data=8’h00110001,則rx_uart的(de)波(bō)形如(rú)下(xià)。
图(tú) 206
再考慮一(yī)下(xià)时(shí)間(jiān)信(xìn)息。由(yóu)于(yú)波(bō)特(tè)率是(shì)9600,那(nà)麼(me)每位持(chí)續的(de)时(shí)間(jiān)是(shì)1s/9600=104166ns。将时(shí)間(jiān)信(xìn)息補上(shàng)波(bō)形。
图(tú) 207
本(běn)開(kāi)發(fà)板的(de)晶振时(shí)鐘(zhōng)是(shì)50Mz,104166ns/20ns 約等于(yú)5208个(gè)时(shí)鐘(zhōng)周期(qī)。也(yě)就(jiù)是(shì)说(shuō)上(shàng)面(miàn)波(bō)形中(zhōng),每个(gè)比特(tè)的(de)持(chí)續时(shí)間(jiān)約等于(yú)5208个(gè)时(shí)鐘(zhōng)周期(qī)。需要(yào)注意(yì)的(de)是(shì),5208只(zhī)是(shì)一(yī)个(gè)估計(jì)的(de)大概數字(zì),实際情(qíng)況会(huì)有(yǒu)偏差。同(tóng)时(shí),我(wǒ)们(men)還(huán)有(yǒu)計(jì)數这(zhè)是(shì)第(dì)幾(jǐ)个(gè)比特(tè),用(yòng)于(yú)讓我(wǒ)们(men)判斷是(shì)開(kāi)始位、數據(jù)位和(hé)停止位等。
图(tú) 208
可(kě)以(yǐ)看(kàn)出(chū),我(wǒ)们(men)需要(yào)2个(gè)計(jì)數器,1个(gè)計(jì)數器用(yòng)于(yú)計(jì)算1比特(tè)的(de)位宽(kuān)长度(dù):5208个(gè)时(shí)鐘(zhōng)周期(qī),命名为(wèi)cnt0;另(lìng)一(yī)个(gè)用(yòng)于(yú)計(jì)算有(yǒu)多(duō)少(shǎo)个(gè)比特(tè),命名为(wèi)cnt1。
很明(míng)顯cnt0每次(cì)都是(shì)數5208个(gè),但cnt0的(de)加1条(tiáo)件(jiàn)需要(yào)仔细(xì)分(fēn)析。我(wǒ)们(men)很清(qīng)楚cnt0的(de)加1區(qū)域是(shì)下(xià)面(miàn)的(de)灰度(dù)地(dì)方(fāng)。
图(tú) 209
目前(qián)沒(méi)有(yǒu)任何信(xìn)号(hào)可(kě)以(yǐ)區(qū)分(fēn)出(chū)此(cǐ)區(qū)域。參考至(zhì)簡設計(jì)法案(àn)例2的(de)方(fāng)法,設計(jì)一(yī)个(gè)信(xìn)号(hào)flag_add,當其为(wèi)1表(biǎo)示上(shàng)述灰度(dù)區(qū)域,即cnt0的(de)加1區(qū)域。
图(tú) 210
有(yǒu)了(le)flag_add,我(wǒ)们(men)就(jiù)很明(míng)确,cnt0的(de)加1条(tiáo)件(jiàn)是(shì)flag_add==1,數到(dào)5208下(xià)就(jiù)結束(shù)。为(wèi)此(cǐ),可(kě)以(yǐ)写出(chū)cnt0的(de)代(dài)碼。
|
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)begin cnt0 <= 0; end else if(add_cnt0)begin if(end_cnt0) cnt0 <= 0; else cnt0 <= cnt0 + 1; end end
assign add_cnt0 = flag_add==1 ; assign end_cnt0 = add_cnt0 && cnt0 == 5208-1 ; |
接下(xià)来(lái)思(sī)考cnt1。Cnt1用(yòng)于(yú)表(biǎo)示數到(dào)第(dì)幾(jǐ)比特(tè),每間(jiān)隔一(yī)个(gè)比特(tè)时(shí)間(jiān),cnt1就(jiù)会(huì)加1,也(yě)就(jiù)是(shì)说(shuō),每當end_cnt0时(shí),cnt1就(jiù)会(huì)加1。所(suǒ)以(yǐ)cnt1的(de)加1条(tiáo)件(jiàn)是(shì):end_cnt0。而(ér)cnt1一(yī)共(gòng)要(yào)數9个(gè)。故可(kě)以(yǐ)写出(chū)cnt1的(de)代(dài)碼。
|
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)begin cnt1 <= 0; end else if(add_cnt1)begin if(end_cnt1) cnt1 <= 0; else cnt1 <= cnt1 + 1; end end
assign add_cnt1 = end_cnt0; assign end_cnt1 = add_cnt1 && cnt1 == 9-1 ; |
我(wǒ)们(men)增加了(le)輔導信(xìn)号(hào)flag_add,現(xiàn)在(zài)我(wǒ)们(men)来(lái)思(sī)考如(rú)何設計(jì)这(zhè)个(gè)flag_add。Flag_add有(yǒu)2个(gè)變(biàn)化(huà)點(diǎn):變(biàn)0和(hé)變(biàn)1。Flag_add什麼(me)时(shí)候会(huì)變(biàn)1呢?我(wǒ)们(men)從功能(néng)上(shàng)来(lái)理解(jiě)一(yī)下(xià)。上(shàng)電(diàn)後(hòu),PC如(rú)果(guǒ)沒(méi)有(yǒu)發(fà)送任何數據(jù),rx_uart是(shì)一(yī)直(zhí)保持(chí)为(wèi)1。此(cǐ)时(shí)cnt0和(hé)cnt1也(yě)无須計(jì)數,也(yě)就(jiù)是(shì)flag_add也(yě)一(yī)直(zhí)保持(chí)为(wèi)0。當PC要(yào)發(fà)送數據(jù)了(le),rx_uart就(jiù)按串口(kǒu)时(shí)序變(biàn)化(huà),首先(xiān)会(huì)發(fà)送一(yī)个(gè)開(kāi)始位,即rx_uart由(yóu)1變(biàn)成(chéng)0。FPGA看(kàn)到(dào)rx_uart變(biàn)1變(biàn)成(chéng)0後(hòu),就(jiù)明(míng)白PC有(yǒu)數據(jù)要(yào)过(guò)来(lái)了(le),并且現(xiàn)在(zài)是(shì)開(kāi)始位,此(cǐ)时(shí)cnt0和(hé)cnt1要(yào)計(jì)數了(le),也(yě)就(jiù)是(shì)flag_add要(yào)變(biàn)成(chéng)1了(le)。
從功能(néng)上(shàng)理解(jiě),很容易就(jiù)知道(dào)當原来(lái)flag_add为(wèi)0,此(cǐ)时(shí)收(shōu)到(dào)rx_uart由(yóu)1變(biàn)0(下(xià)降沿)时(shí),flag_add就(jiù)變(biàn)成(chéng)1。關(guān)鍵的(de)是(shì),我(wǒ)们(men)如(rú)何知道(dào)rx_uart變(biàn)1變(biàn)成(chéng)0呢?
3.2.1 邊(biān)沿檢测電(diàn)路(lù)設計(jì)
有(yǒu)读(dú)者(zhě)会(huì)用(yòng)下(xià)面(miàn)方(fāng)式来(lái)檢测rx_uart的(de)下(xià)降沿。
|
1 2 3 4 5 6 7 8 |
always @(posedge clk or negedge rst_n)begin if(rst_n==1'b0)begin flag_add <= 1 ; end else if(end_cnt1)begin flag_add <= 0 ; end end |
将rx_uart放(fàng)到(dào)ALWAYS語(yǔ)句(jù)的(de)敏感(gǎn)列表(biǎo),而(ér)敏感(gǎn)列表(biǎo)里(lǐ)刚好(hǎo)有(yǒu)一(yī)个(gè)negedge檢测下(xià)降沿的(de)語(yǔ)句(jù),这(zhè)樣(yàng)就(jiù)实現(xiàn)了(le)rx_uart的(de)下(xià)降沿檢测。不(bù)得不(bù)说(shuō),这(zhè)是(shì)一(yī)个(gè)聰明(míng)的(de)做法。從代(dài)碼层面(miàn)来(lái)说(shuō),这(zhè)个(gè)功能(néng)貌似是(shì)可(kě)以(yǐ)实現(xiàn)的(de)。并且如(rú)果(guǒ)是(shì)实验(yàn)工程,好(hǎo)像也(yě)能(néng)得到(dào)正(zhèng)确的(de)結果(guǒ)。然而(ér),在(zài)真(zhēn)正(zhèng)的(de)工程实踐中(zhōng),这(zhè)是(shì)不(bù)可(kě)取(qǔ)的(de)做法。
读(dú)者(zhě)有(yǒu)沒(méi)有(yǒu)想(xiǎng)过(guò),为(wèi)什麼(me)我(wǒ)们(men)數字(zì)電(diàn)路(lù)里(lǐ)都是(shì)二(èr)進(jìn)制0和(hé)1?也(yě)就(jiù)是(shì)低電(diàn)平为(wèi)0,高(gāo)電(diàn)平为(wèi)1。有(yǒu)读(dú)者(zhě)覺得这(zhè)多(duō)浪費啊,为(wèi)啥不(bù)搞多(duō)幾(jǐ)个(gè)電(diàn)平,例如(rú)可(kě)以(yǐ)低電(diàn)平为(wèi)0,1V为(wèi)1,2V为(wèi)2,3V为(wèi)3。这(zhè)樣(yàng)一(yī)根(gēn)線(xiàn)就(jiù)可(kě)以(yǐ)表(biǎo)示4種(zhǒng)狀态,也(yě)是(shì)四(sì)進(jìn)制,效率不(bù)是(shì)提(tí)高(gāo)了(le)一(yī)倍吗?对(duì)于(yú)一(yī)根(gēn)線(xiàn)来(lái)说(shuō)是(shì)这(zhè)樣(yàng)的(de),但对(duì)于(yú)一(yī)个(gè)系(xì)統来(lái)说(shuō)則完成(chéng)不(bù)同(tóng)。系(xì)統要(yào)求器件(jiàn)越簡單越好(hǎo),考慮得越少(shǎo)越好(hǎo),这(zhè)樣(yàng)才能(néng)方(fāng)便集成(chéng)和(hé)擴展(zhǎn),才能(néng)无限地(dì)複制。1个(gè)四(sì)進(jìn)制的(de)器件(jiàn),情(qíng)願選擇2个(gè)二(èr)進(jìn)制的(de)器件(jiàn)。另(lìng)外(wài),越簡單的(de)器件(jiàn),故障的(de)可(kě)能(néng)性(xìng)就(jiù)越低。越簡單的(de)器件(jiàn),越容易优化(huà)和(hé)發(fà)展(zhǎn)。例如(rú),二(èr)進(jìn)制器件(jiàn),我(wǒ)们(men)不(bù)斷地(dì)优化(huà)其體(tǐ)積和(hé)電(diàn)壓範圍,則能(néng)不(bù)斷地(dì)發(fà)展(zhǎn)。則四(sì)進(jìn)制器件(jiàn),則会(huì)收(shōu)到(dào)各(gè)个(gè)方(fāng)面(miàn)的(de)制約,是(shì)会(huì)受到(dào)瓶颈的(de)。这(zhè)也(yě)是(shì)为(wèi)什麼(me)數字(zì)電(diàn)路(lù)比模块(kuài)電(diàn)路(lù)快(kuài)速發(fà)展(zhǎn)的(de)原因(yīn)。
至(zhì)簡設計(jì)法也(yě)是(shì)同(tóng)樣(yàng)道(dào)理。别看(kàn)我(wǒ)们(men)的(de)規則簡單,但就(jiù)是(shì)制定(dìng)了(le)这(zhè)麼(me)簡單的(de)規則,我(wǒ)们(men)的(de)設計(jì)角(jiǎo)度(dù)就(jiù)從波(bō)形設計(jì)轉(zhuǎn)到(dào)了(le)功能(néng)設計(jì)。我(wǒ)们(men)的(de)头(tóu)腦中(zhōng),不(bù)再去(qù)想(xiǎng)複雜的(de)波(bō)形,不(bù)再去(qù)想(xiǎng)着对(duì)齊波(bō)形时(shí)序。我(wǒ)们(men)更(gèng)關(guān)注的(de)是(shì)功能(néng),例如(rú)計(jì)數10下(xià),我(wǒ)们(men)就(jiù)直(zhí)接用(yòng)add_cnt && cnt==10-1表(biǎo)示。Dout信(xìn)号(hào)在(zài)數到(dào)10个(gè)时(shí)就(jiù)變(biàn)高(gāo),我(wǒ)们(men)就(jiù)会(huì)写出(chū)下(xià)面(miàn)代(dài)碼:
If(add_cnt && cnt==10-1)
dout <= 1;
这(zhè)就(jiù)是(shì)功能(néng)設計(jì)。
當然,有(yǒu)读(dú)者(zhě)会(huì)疑問(wèn),这(zhè)樣(yàng)不(bù)用(yòng)考慮波(bō)形,真(zhēn)能(néng)保證波(bō)形是(shì)正(zhèng)确的(de)吗?其实,这(zhè)方(fāng)面(miàn)已經(jīng)有(yǒu)明(míng)德揚的(de)規範来(lái)保證,只(zhī)要(yào)遵守了(le)明(míng)德揚的(de)規範,一(yī)定(dìng)能(néng)保證正(zhèng)确性(xìng)。读(dú)者(zhě)可(kě)以(yǐ)試着挑些代(dài)碼,從波(bō)形上(shàng)验(yàn)證正(zhèng)确性(xìng)。
有(yǒu)工程师(shī)工作了(le)10年(nián),但卻只(zhī)有(yǒu)2年(nián)的(de)工作經(jīng)验(yàn)。即使工作10年(nián),也(yě)只(zhī)是(shì)旧(jiù)經(jīng)验(yàn)的(de)簡單重(zhòng)複,丝(sī)毫(háo)沒(méi)有(yǒu)层次(cì)的(de)上(shàng)升(shēng)。正(zhèng)常的(de)上(shàng)升(shēng)道(dào)路(lù)應(yìng)該是(shì):一(yī)年(nián)波(bō)形設計(jì)(熟練掌握各(gè)種(zhǒng)接口(kǒu)时(shí)序設計(jì)),2年(nián)功能(néng)設計(jì)(任何算法和(hé)功能(néng),都能(néng)簡單高(gāo)效地(dì)設計(jì)出(chū)来(lái)),5年(nián)FPGA架構設計(jì)(能(néng)設計(jì)出(chū)高(gāo)效的(de)FPGA內(nèi)部(bù)架構,精通(tòng)模块(kuài)劃(huà)分(fēn)),7年(nián)項目設計(jì)(ARM、DSP和(hé)FPGA之間(jiān)的(de)功能(néng)劃(huà)分(fēn)),10年(nián)産品設計(jì)(客戶需求的(de)落(là)地(dì),轉(zhuǎn)化(huà)到(dào)項目設計(jì))。
时(shí)鐘(zhōng)和(hé)複位,關(guān)系(xì)到(dào)整个(gè)FPGA工程的(de)稳定(dìng)。一(yī)般要(yào)求时(shí)鐘(zhōng)精确稳定(dìng),抖動(dòng)要(yào)小。FPGA里(lǐ)所(suǒ)有(yǒu)的(de)觸發(fà)器,都在(zài)时(shí)鐘(zhōng)的(de)节(jié)拍下(xià),統一(yī)進(jìn)行翻轉(zhuǎn)。由(yóu)于(yú)时(shí)鐘(zhōng)周期(qī)是(shì)固定(dìng)的(de),工程师(shī)在(zài)設計(jì)时(shí)会(huì)考慮電(diàn)路(lù)延时(shí),以(yǐ)便在(zài)时(shí)鐘(zhōng)下(xià)次(cì)上(shàng)升(shēng)沿前(qián)計(jì)算完畢。只(zhī)要(yào)所(suǒ)有(yǒu)的(de)電(diàn)路(lù)延时(shí),都能(néng)够在(zài)在(zài)下(xià)次(cì)时(shí)鐘(zhōng)沿前(qián)处理完畢,統一(yī)翻轉(zhuǎn),那(nà)麼(me)整个(gè)系(xì)統都是(shì)稳定(dìng)的(de)。但如(rú)果(guǒ)一(yī)个(gè)系(xì)統中(zhōng),时(shí)鐘(zhōng)过(guò)多(duō),擁有(yǒu)不(bù)同(tóng)的(de)时(shí)鐘(zhōng)周期(qī),那(nà)麼(me)每个(gè)電(diàn)路(lù)延时(shí)要(yào)求就(jiù)不(bù)盡相同(tóng),工程师(shī)要(yào)考慮的(de)也(yě)就(jiù)越多(duō),系(xì)統也(yě)就(jiù)越不(bù)稳定(dìng)。所(suǒ)以(yǐ),一(yī)个(gè)工程,时(shí)鐘(zhōng)越少(shǎo)越好(hǎo),越簡單就(jiù)越稳定(dìng)。複位也(yě)是(shì)同(tóng)樣(yàng)的(de)道(dào)理。所(suǒ)以(yǐ),我(wǒ)们(men)在(zài)設計(jì)时(shí),切(qiè)忌将信(xìn)号(hào)接到(dào)敏感(gǎn)列表(biǎo)那(nà)里(lǐ),接到(dào)那(nà)里(lǐ)的(de)信(xìn)号(hào),就(jiù)会(huì)被(bèi)系(xì)統認为(wèi)是(shì)时(shí)鐘(zhōng)或(huò)者(zhě)複位。
檢查rx_uart的(de)下(xià)降沿,就(jiù)要(yào)用(yòng)到(dào)FPGA里(lǐ)的(de)邊(biān)沿檢测技術(shù)。所(suǒ)謂的(de)邊(biān)沿檢测,就(jiù)是(shì)檢测輸入(rù)信(xìn)号(hào),或(huò)者(zhě)FPGA內(nèi)部(bù)邏輯信(xìn)号(hào)的(de)跳變(biàn),即上(shàng)升(shēng)沿或(huò)者(zhě)下(xià)降沿的(de)檢测。这(zhè)在(zài)FPGA電(diàn)路(lù)設計(jì)中(zhōng)相當的(de)廣泛。其電(diàn)路(lù)图(tú)如(rú)下(xià)。
图(tú) 211
图(tú) 212
中(zhōng)間(jiān)信(xìn)号(hào),trigger連(lián)到(dào)觸發(fà)器的(de)信(xìn)号(hào)輸入(rù)端D,觸發(fà)器的(de)輸出(chū)器連(lián)的(de)是(shì)tri_ff0。将trigger取(qǔ)反(fǎn),與(yǔ)tri_ff0相與(yǔ),就(jiù)得到(dào)信(xìn)号(hào)neg_edge,如(rú)果(guǒ)neg_edge=1就(jiù)表(biǎo)示檢测到(dào)trigger的(de)下(xià)降沿。将tri_ff0取(qǔ)反(fǎn),與(yǔ)trigger相與(yǔ),就(jiù)得到(dào)信(xìn)号(hào)pos_edge,如(rú)果(guǒ)pos_edge=1,就(jiù)表(biǎo)示檢测到(dào)trigger的(de)上(shàng)升(shēng)沿。
我(wǒ)们(men)来(lái)講解(jiě)这(zhè)个(gè)原理,画(huà)出(chū)信(xìn)号(hào)的(de)波(bō)形图(tú)。
图(tú) 213
Tri_ff0是(shì)觸發(fà)器的(de)輸出(chū),因(yīn)此(cǐ)tri_ff0的(de)信(xìn)号(hào)與(yǔ)trigger信(xìn)号(hào)相似,只(zhī)是(shì)相差一(yī)个(gè)时(shí)鐘(zhōng)周期(qī)。我(wǒ)们(men)也(yě)可(kě)以(yǐ)这(zhè)樣(yàng)理解(jiě):每个(gè)时(shí)鐘(zhōng)上(shàng)升(shēng)沿看(kàn)到(dào)的(de)tri_ff0的(de)值,其实就(jiù)是(shì)triffer信(xìn)号(hào)上(shàng)一(yī)个(gè)时(shí)鐘(zhōng)看(kàn)到(dào)的(de)值,也(yě)就(jiù)是(shì)tri_ff0是(shì)trigger之前(qián)的(de)值。
然後(hòu)我(wǒ)们(men)在(zài)看(kàn)第(dì)3时(shí)鐘(zhōng)上(shàng)升(shēng)沿,此(cǐ)时(shí)trigger值为(wèi)0,而(ér)tri_ff0的(de)值为(wèi)1,即當前(qián)trigger的(de)值为(wèi)0,之前(qián)的(de)值为(wèi)1,这(zhè)就(jiù)是(shì)下(xià)降沿,此(cǐ)时(shí)neg_edge为(wèi)1。當看(kàn)到(dào)neg_edge为(wèi)1,就(jiù)表(biǎo)示檢测到(dào)trigger的(de)下(xià)降沿了(le)。
同(tóng)樣(yàng)道(dào)理,在(zài)第(dì)7个(gè)时(shí)鐘(zhōng)上(shàng)升(shēng)沿,看(kàn)到(dào)trigger值为(wèi)1,而(ér)之前(qián)值为(wèi)0,pos_edge为(wèi)1,表(biǎo)示檢测到(dào)trigger的(de)上(shàng)升(shēng)沿。
Verilog实現(xiàn)邊(biān)沿檢测電(diàn)路(lù)的(de)代(dài)碼。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
always @(posedge clk or negedge rst_n)begin if(rst_n==1'b0)begin tri_ff0 <= 0; end else begin tri_ff0 <= trigger ; end end
assign neg_edge = trigger==0 && tri_ff0==1; assign pos_edge = trigger==1 && tri_ff0==0;
|
3.2.2 异(yì)步信(xìn)号(hào)同(tóng)步化(huà)
在(zài)讨論邊(biān)沿檢测的(de)波(bō)形中(zhōng),我(wǒ)们(men)把trigger當成(chéng)理想(xiǎng)的(de)同(tóng)步信(xìn)号(hào),也(yě)就(jiù)是(shì)trigger是(shì)滿足D觸發(fà)器的(de)建立和(hé)保持(chí)时(shí)間(jiān)的(de),这(zhè)在(zài)同(tóng)步系(xì)統中(zhōng)不(bù)是(shì)問(wèn)題(tí)。但如(rú)果(guǒ)trigger不(bù)是(shì)理想(xiǎng)的(de)同(tóng)步信(xìn)号(hào),例如(rú)外(wài)部(bù)按鍵信(xìn)号(hào),例如(rú)本(běn)工程的(de)rx_uart信(xìn)号(hào)。这(zhè)些信(xìn)号(hào)什麼(me)时(shí)候變(biàn)化(huà),完全(quán)是(shì)随機(jī)的(de)。很有(yǒu)可(kě)能(néng),在(zài)时(shí)鐘(zhōng)上(shàng)升(shēng)沿變(biàn)化(huà),從而(ér)不(bù)滿足觸發(fà)器的(de)建立时(shí)間(jiān)和(hé)保持(chí)时(shí)間(jiān)要(yào)求,從而(ér)出(chū)現(xiàn)亞稳态,導致(zhì)系(xì)統崩潰。詳细(xì)的(de)原因(yīn),可(kě)以(yǐ)看(kàn)D觸發(fà)器中(zhōng),亞稳态一(yī)节(jié)的(de)內(nèi)容。根(gēn)據(jù)这(zhè)一(yī)节(jié)內(nèi)容的(de)結論,我(wǒ)们(men)需要(yào)对(duì)進(jìn)来(lái)的(de)信(xìn)号(hào)打(dǎ)两(liǎng)拍(用(yòng)两(liǎng)个(gè)觸發(fà)器寄存一(yī)下(xià)),再来(lái)使用(yòng)。

图(tú) 214
假設輸入(rù)的(de)信(xìn)号(hào)trigger不(bù)是(shì)同(tóng)步信(xìn)号(hào),那(nà)麼(me)要(yào)将該信(xìn)号(hào)用(yòng)2个(gè)觸發(fà)器進(jìn)行寄存,得到(dào)tri_ff0和(hé)tri_ff1。需要(yào)特(tè)别注意(yì)的(de)是(shì),tri_ff0絕对(duì)不(bù)要(yào)拿来(lái)當条(tiáo)件(jiàn)使用(yòng),只(zhī)能(néng)使用(yòng)tri_ff1。我(wǒ)们(men)還(huán)需要(yào)檢测邊(biān)沿,根(gēn)據(jù)前(qián)面(miàn)所(suǒ)说(shuō),再用(yòng)寄存器寄存,得到(dào)tri_ff2。根(gēn)據(jù)tri_ff1和(hé)tri_ff2,我(wǒ)们(men)就(jiù)可(kě)以(yǐ)得到(dào)邊(biān)沿檢测。當tri_ff1==1且tri_ff2==0时(shí),上(shàng)升(shēng)沿的(de)pos_edge有(yǒu)效;當tri_ff1==0且tri_ff2==1时(shí),下(xià)降沿的(de)neg_edge有(yǒu)效。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 1 |
always @(posedge clk or negedge rst_n)begin if(rst_n==1'b0)begin tri_ff0 <= 0; tri_ff1 <= 0; tri_ff2 <= 0; end else begin tri_ff0 <= trigger ; tri_ff1 <= tri_ff0 ; tri_ff2 <= tri_ff1 ; end end
assign neg_edge = tri_ff1==0 && tri_ff2==1; assign pos_edge = tri_ff1==1 && tri_ff2==0; |
我(wǒ)们(men)總(zǒng)結一(yī)下(xià)。如(rú)果(guǒ)通(tòng)过(guò)打(dǎ)两(liǎng)拍的(de)方(fāng)式,实現(xiàn)了(le)信(xìn)号(hào)的(de)同(tóng)步化(huà)。我(wǒ)们(men)通(tòng)过(guò)打(dǎ)一(yī)拍的(de)方(fāng)式,实現(xiàn)邊(biān)沿檢测電(diàn)路(lù)。这(zhè)两(liǎng)者(zhě)不(bù)是(shì)一(yī)定(dìng)同(tóng)时(shí)出(chū)現(xiàn)的(de)。如(rú)果(guǒ)進(jìn)来(lái)的(de)信(xìn)号(hào)是(shì)异(yì)步信(xìn)号(hào),那(nà)就(jiù)必須先(xiān)同(tóng)步化(huà),然後(hòu)再做檢测。如(rú)果(guǒ)進(jìn)来(lái)的(de)信(xìn)号(hào)本(běn)身(shēn)就(jiù)是(shì)同(tóng)步信(xìn)号(hào),那(nà)就(jiù)沒(méi)有(yǒu)必要(yào)做同(tóng)步化(huà)了(le),直(zhí)接做邊(biān)沿檢测即可(kě)。
回(huí)到(dào)本(běn)工程的(de)設計(jì),我(wǒ)们(men)需要(yào)檢测rx_uart的(de)下(xià)降沿,從而(ér)讓flag_add變(biàn)高(gāo)。同(tóng)时(shí),我(wǒ)们(men)注意(yì)到(dào)rx_uart是(shì)异(yì)步信(xìn)号(hào)(PC 什麼(me)时(shí)候發(fà)送數據(jù)就(jiù)是(shì)随機(jī)的(de))。所(suǒ)以(yǐ)需要(yào)将rx_uart先(xiān)同(tóng)步化(huà),再做下(xià)降沿檢测。所(suǒ)以(yǐ)先(xiān)設計(jì)如(rú)下(xià)代(dài)碼:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
always @(posedge clk or negedge rst_n)begin if(rst_n==1'b0)begin rx_uart_ff0 <= 0 ; rx_uart_ff1 <= 0 ; rx_uart_ff2 <= 0 ; end else begin rx_uart_ff0 <= rx_uart ; rx_uart_ff1 <= rx_uart_ff0 ; rx_uart_ff2 <= rx_uart_ff1 ; end end |
这(zhè)樣(yàng),flag_add變(biàn)1的(de)条(tiáo)件(jiàn)就(jiù)變(biàn)成(chéng):rx_uart_ff1==0 && rx_uart_ff2==1。
Flag_add變(biàn)0的(de)条(tiáo)件(jiàn),可(kě)以(yǐ)完成(chéng)收(shōu)完9比特(tè)數據(jù)就(jiù)變(biàn)0,不(bù)用(yòng)再計(jì)數了(le)。所(suǒ)以(yǐ)變(biàn)0条(tiáo)件(jiàn):end_cnt1。
綜上(shàng)所(suǒ)述,可(kě)以(yǐ)写出(chū)flag_add的(de)代(dài)碼。
|
1 2 3 4 5 6 7 8 9 10 11 |
always @(posedge clk or negedge rst_n)begin if(rst_n==1'b0)begin flag_add <= 0 ; end else if(rx_uart_ff1==0 && rx_uart_ff2==1)begin flag_add <= 1 ; end else if(end_cnt1)begin flag_add <= 0 ; end end |
設計(jì)下(xià)data信(xìn)号(hào),該信(xìn)号(hào)的(de)值来(lái)自(zì)于(yú)图(tú)中(zhōng)第(dì)2~第(dì)9比特(tè)的(de)值。第(dì)2比特(tè)的(de)值賦給(gěi)data[0],第(dì)3比特(tè)的(de)值賦給(gěi)data[1],以(yǐ)此(cǐ)類(lèi)推,第(dì)9比特(tè)的(de)值賦給(gěi)data[7]。

图(tú) 215
由(yóu)于(yú)每一(yī)个(gè)比特(tè)都持(chí)續5208个(gè)时(shí)鐘(zhōng)周期(qī),我(wǒ)们(men)必須選定(dìng)一(yī)个(gè)时(shí)刻,将值賦給(gěi)data。
图(tú) 216
首先(xiān),不(bù)能(néng)在(zài)end_cnt0的(de)时(shí)候賦值,如(rú)上(shàng)图(tú)的(de)點(diǎn)。因(yīn)为(wèi)我(wǒ)们(men)这(zhè)里(lǐ)的(de)5208个(gè)时(shí)鐘(zhōng)周期(qī)是(shì)理想(xiǎng)、估算的(de)數值,实際上(shàng)是(shì)非(fēi)常有(yǒu)可(kě)能(néng)有(yǒu)偏差的(de)。如(rú)果(guǒ)我(wǒ)们(men)在(zài)end_cnt0的(de)时(shí)候取(qǔ)值,就(jiù)有(yǒu)可(kě)能(néng)采錯。
最(zuì)保险的(de)做法是(shì)在(zài)中(zhōng)間(jiān)點(diǎn)取(qǔ)值。这(zhè)樣(yàng),即使有(yǒu)比較多(duō)的(de)偏差,都不(bù)会(huì)影響到(dào)采樣(yàng)的(de)正(zhèng)确性(xìng)。
图(tú) 217
綜上(shàng)所(suǒ)述,我(wǒ)们(men)在(zài)cnt0數到(dào)一(yī)半时(shí)采到(dào)當前(qián)rx_uart的(de)值賦給(gěi)dout,其中(zhōng)第(dì)2比特(tè)賦給(gěi)led[0],第(dì)3比特(tè)賦給(gěi)led[1],以(yǐ)此(cǐ)類(lèi)推,第(dì)9比特(tè)賦給(gěi)led[7]。
進(jìn)一(yī)步用(yòng)信(xìn)号(hào)表(biǎo)示,可(kě)翻譯成(chéng):數到(dào)add_cnt0 && cnt0==5208/2 -1时(shí),如(rú)果(guǒ)cnt1==1,則将rx_uart_ff1賦給(gěi)led[0]。如(rú)果(guǒ)cnt1==2,則将rx_uart_ff1賦給(gěi)led[1],以(yǐ)此(cǐ)類(lèi)推,如(rú)果(guǒ)cnt1==8,将rx_uart_ff1賦給(gěi)led[7]。
那(nà)麼(me)直(zhí)接翻譯成(chéng)代(dài)碼。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
always @(posedge clk or negedge rst_n)begin if(rst_n==1'b0)begin led <= 0 ; end else if(add_cnt0 && cnt0==5208/2-1)begin if(cnt1==1) led [0] <= rx_uart_ff1 ; else if(cnt1==2) led [1] <= rx_uart_ff1 ; else if(cnt1==3) led [2] <= rx_uart_ff1 ; else if(cnt1==4) led [3] <= rx_uart_ff1 ; else if(cnt1==5) led [4] <= rx_uart_ff1 ; else if(cnt1==6) led [5] <= rx_uart_ff1 ; else if(cnt1==7) led [6] <= rx_uart_ff1 ; else led [7] <= rx_uart_ff1 ; end end |
上(shàng)面(miàn)代(dài)碼可(kě)优化(huà),簡写成(chéng)如(rú)下(xià):
|
1 2 3 4 5 6 7 8 |
always @(posedge clk or negedge rst_n)begin if(rst_n==1'b0)begin led <= 0 ; end else if(add_cnt0 && cnt0==5208/2-1 && cnt1>=1 && cnt1<9)begin led [cnt1-1] <= rx_uart_ff1 ; end end |
通(tòng)常我(wǒ)们(men)設計(jì)时(shí),首先(xiān)是(shì)想(xiǎng)到(dào)实現(xiàn)功能(néng),所(suǒ)以(yǐ)会(huì)先(xiān)写出(chū)前(qián)面(miàn)代(dài)碼。在(zài)功能(néng)实現(xiàn)的(de)前(qián)提(tí)下(xià),再考慮有(yǒu)沒(méi)有(yǒu)优化(huà)空間(jiān),從而(ér)写出(chū)後(hòu)面(miàn)代(dài)碼。好(hǎo)代(dài)碼都是(shì)一(yī)步步优化(huà)出(chū)来(lái)的(de)。
注意(yì),上(shàng)面(miàn)代(dài)碼,我(wǒ)们(men)采集的(de)是(shì)rx_uart_ff1而(ér)不(bù)是(shì)rx_uart信(xìn)号(hào)。这(zhè)是(shì)因(yīn)为(wèi)rx_uart是(shì)异(yì)步信(xìn)号(hào),我(wǒ)们(men)只(zhī)能(néng)用(yòng)同(tóng)步化(huà)後(hòu)的(de)信(xìn)号(hào),否則会(huì)引起亞稳态。所(suǒ)以(yǐ)只(zhī)能(néng)是(shì)rx_uart_ff1。
至(zhì)此(cǐ),主(zhǔ)體(tǐ)程序已經(jīng)完成(chéng)。接下(xià)来(lái)是(shì)将module補充完整。
3.3 信(xìn)号(hào)定(dìng)義
cnt0是(shì)用(yòng)always産生(shēng)的(de)信(xìn)号(hào),因(yīn)此(cǐ)類(lèi)型为(wèi)reg。cnt0計(jì)數的(de)最(zuì)大值为(wèi)5208,需要(yào)用(yòng)13根(gēn)線(xiàn)表(biǎo)示,即位宽(kuān)是(shì)13位。因(yīn)此(cǐ)代(dài)碼如(rú)下(xià):
|
1 |
reg [12:0] cnt0 ; |
add_cnt0和(hé)end_cnt0都是(shì)用(yòng)assign方(fāng)式設計(jì)的(de),因(yīn)此(cǐ)類(lèi)型为(wèi)wire。并且其值是(shì)0或(huò)者(zhě)1,1个(gè)線(xiàn)表(biǎo)示即可(kě)。因(yīn)此(cǐ)代(dài)碼如(rú)下(xià):
|
1 2 |
wire add_cnt0 ; wire end_cnt0 ; |
cnt1是(shì)用(yòng)always産生(shēng)的(de)信(xìn)号(hào),因(yīn)此(cǐ)類(lèi)型为(wèi)reg。cnt1計(jì)數的(de)最(zuì)大值为(wèi)9,需要(yào)用(yòng)4根(gēn)線(xiàn)表(biǎo)示,即位宽(kuān)是(shì)4位。因(yīn)此(cǐ)代(dài)碼如(rú)下(xià):
|
1 |
reg [3:0] cnt1; |
add_cnt1和(hé)end_cnt1都是(shì)用(yòng)assign方(fāng)式設計(jì)的(de),因(yīn)此(cǐ)類(lèi)型为(wèi)wire。并且其值是(shì)0或(huò)者(zhě)1,1根(gēn)線(xiàn)表(biǎo)示即可(kě)。因(yīn)此(cǐ)代(dài)碼如(rú)下(xià):
|
1 2 |
wire add_cnt1; wire end_cnt1; |
flag_add是(shì)用(yòng)always方(fāng)式設計(jì)的(de),因(yīn)此(cǐ)類(lèi)型为(wèi)reg。并且其值是(shì)0或(huò)者(zhě)1,1根(gēn)線(xiàn)表(biǎo)示即可(kě)。因(yīn)此(cǐ)代(dài)碼如(rú)下(xià):
|
1 |
reg flag_add; |
rx_uart_ff0、rx_uart_ff1和(hé)rx_uart_ff2是(shì)用(yòng)always方(fāng)式設計(jì)的(de),因(yīn)此(cǐ)類(lèi)型为(wèi)reg。并且其值是(shì)0或(huò)1,需要(yào)1根(gēn)線(xiàn)表(biǎo)示即可(kě)。因(yīn)此(cǐ)代(dài)碼如(rú)下(xià):
|
1 2 3 |
reg rx_uart_ff0; reg rx_uart_ff1; reg rx_uart_ff2; |
至(zhì)此(cǐ),整个(gè)代(dài)碼的(de)設計(jì)工作已經(jīng)完成(chéng)。下(xià)一(yī)步是(shì)新建工程和(hé)上(shàng)板查看(kàn)現(xiàn)象(xiàng)。
4 綜合工程和(hé)上(shàng)板
4.1 新建工程
1. 首先(xiān)在(zài)d盤中(zhōng)創建名为(wèi)“uart”的(de)工程文(wén)件(jiàn)夾,将写的(de)代(dài)碼命名为(wèi)“uart.v”,頂层模块(kuài)名为(wèi)“uart”。
图(tú) 218
图(tú) 219
2. 然後(hòu)打(dǎ)開(kāi)Quartus Ⅱ,點(diǎn)擊File下(xià)拉列表(biǎo)中(zhōng)的(de)New Project Wzard...新建工程選項。
图(tú) 220
3.在(zài)出(chū)現(xiàn)的(de)界面(miàn)中(zhōng)直(zhí)接點(diǎn)擊最(zuì)下(xià)方(fāng)的(de)“Next”。
图(tú) 221
4.之後(hòu)出(chū)現(xiàn)的(de)是(shì)工程文(wén)件(jiàn)夾、工程名、頂层模块(kuài)名設置界面(miàn)。按照之前(qián)的(de)命名進(jìn)行填写,第(dì)一(yī)欄選擇工程文(wén)件(jiàn)夾“uart”,第(dì)二(èr)欄選擇工程文(wén)件(jiàn)“uart.v”,最(zuì)後(hòu)一(yī)欄選擇頂层模块(kuài)名“uart”,然後(hòu)點(diǎn)擊”Next”,再出(chū)現(xiàn)的(de)界面(miàn)選擇empty project。
图(tú) 222
图(tú) 223
5.之後(hòu)是(shì)文(wén)件(jiàn)添加界面(miàn)。在(zài)上(shàng)方(fāng)一(yī)欄中(zhōng)添加之前(qián)写的(de)uart.v文(wén)件(jiàn),點(diǎn)擊右(yòu)側的(de)“Add”按鈕,之後(hòu)文(wén)件(jiàn)還(huán)会(huì)出(chū)現(xiàn)在(zài)大方(fāng)框中(zhōng),之後(hòu)點(diǎn)擊“Next”。
图(tú) 224
6. 器件(jiàn)型号(hào)選擇界面(miàn)。在(zài)“Device family”处選擇Cyclone ⅣE,在(zài)“Available devices”处選擇EP4CE15F23C8,然後(hòu)點(diǎn)擊“Next”。
图(tú) 225
7. EDA工具界面(miàn)。該页(yè)面(miàn)用(yòng)默認的(de)就(jiù)行,直(zhí)接點(diǎn)擊最(zuì)下(xià)方(fāng)“Next”。
图(tú) 226
8. 之後(hòu)出(chū)現(xiàn)的(de)界面(miàn)是(shì)我(wǒ)们(men)前(qián)面(miàn)的(de)設置的(de)總(zǒng)結,确認沒(méi)有(yǒu)錯誤後(hòu)點(diǎn)擊“Finish”。
图(tú) 227
4.2 綜合
1.新建工程步驟完成(chéng)後(hòu),就(jiù)会(huì)出(chū)現(xiàn)以(yǐ)下(xià)界面(miàn)。在(zài)“Project Navigator”下(xià)選中(zhōng)要(yào)編譯的(de)文(wén)件(jiàn),點(diǎn)擊上(shàng)方(fāng)工具欄中(zhōng)“Start Compilation”編譯按鈕(藍(lán)色(sè)三(sān)角(jiǎo)形)。
图(tú) 228
2.編譯成(chéng)功後(hòu)会(huì)出(chū)現(xiàn)以(yǐ)下(xià)界面(miàn),點(diǎn)擊“OK”。
图(tú) 229
4.3 配置管(guǎn)脚
图(tú) 230
在(zài)菜單欄中(zhōng),選中(zhōng)Assignments,然後(hòu)選擇Pin Planner,就(jiù)会(huì)弹出(chū)配置管(guǎn)脚的(de)窗(chuāng)口(kǒu)。
图(tú) 231
在(zài)配置窗(chuāng)口(kǒu)最(zuì)下(xià)方(fāng)中(zhōng)的(de)location一(yī)列,參考下(xià)表(biǎo)中(zhōng)最(zuì)右(yòu)两(liǎng)列配置好(hǎo)FPGA管(guǎn)脚。
|
器件(jiàn) |
原理图(tú)信(xìn)号(hào) |
FPGA管(guǎn)脚 |
FPGA工程信(xìn)号(hào) |
|
LED6 |
LED1_NET |
AA4 |
led[0] |
|
LED7 |
LED2_NET |
AB4 |
led[1] |
|
LED8 |
LED3_NET |
AA5 |
led[2] |
|
LED9 |
LED4_NET |
AB8 |
led[3] |
|
LED10 |
LED5_NET |
AA10 |
led[4] |
|
LED11 |
LED6_NET |
AB13 |
led[5] |
|
LED12 |
LED7_NET |
AB14 |
led[6] |
|
LED13 |
LED8_NET |
AB16 |
led[7] |
|
U11 |
USB_RXD |
D6 |
rx_uart |
|
X1 |
SYS_CLK |
G1 |
clk |
|
K1 |
SYS_RST |
AB12 |
rst_n |
配置完成(chéng)後(hòu),關(guān)閉Pin Planner,软(ruǎn)件(jiàn)自(zì)動(dòng)会(huì)保存管(guǎn)脚配置信(xìn)息。
4.4 再次(cì)綜合
图(tú) 232
在(zài)菜單欄中(zhōng),選中(zhōng)Processing,然後(hòu)選擇Start Compilation,再次(cì)对(duì)整个(gè)工程進(jìn)行編譯和(hé)綜合。
图(tú) 233
出(chū)現(xiàn)上(shàng)面(miàn)的(de)界面(miàn),就(jiù)说(shuō)明(míng)編譯綜合成(chéng)功。
4.5 連(lián)接開(kāi)發(fà)板
图(tú)中(zhōng),下(xià)载器接入(rù)電(diàn)腦USB接口(kǒu),電(diàn)源接入(rù)電(diàn)源,uart線(xiàn)連(lián)接電(diàn)腦USB,然後(hòu)摁下(xià)電(diàn)源開(kāi)關(guān),看(kàn)到(dào)開(kāi)發(fà)板燈(dēng)亮(liàng)。
图(tú) 234
4.6 上(shàng)板
1.双(shuāng)擊Tasks一(yī)欄中(zhōng)”Program Device”。
图(tú) 235
2.会(huì)出(chū)現(xiàn)如(rú)下(xià)界面(miàn),點(diǎn)擊add file添加.sof文(wén)件(jiàn),在(zài)右(yòu)側點(diǎn)擊“Start”,会(huì)在(zài)上(shàng)方(fāng)的(de)“Progress”处顯示進(jìn)度(dù)。
图(tú) 236
3.進(jìn)度(dù)条(tiáo)中(zhōng)提(tí)示成(chéng)功後(hòu),即可(kě)在(zài)顯示器上(shàng)观察到(dào)相應(yìng)的(de)現(xiàn)象(xiàng)。
4.7 串口(kǒu)調試
1.安(ān)裝(zhuāng)串口(kǒu)調試工具。
图(tú) 237
2.開(kāi)發(fà)板連(lián)接完成(chéng),打(dǎ)開(kāi)電(diàn)源後(hòu),在(zài)設備管(guǎn)理器中(zhōng)查看(kàn)串口(kǒu)名。
图(tú) 238
3.打(dǎ)開(kāi)串口(kǒu)調試助手(shǒu),在(zài)串口(kǒu)处選擇之前(qián)查看(kàn)的(de)串口(kǒu)名,波(bō)特(tè)率、校(xiào)验(yàn)位、數據(jù)位、停止位根(gēn)據(jù)之前(qián)給(gěi)出(chū)的(de)數據(jù)進(jìn)行填写,發(fà)送和(hé)接收(shōu)都選擇十(shí)六(liù)進(jìn)制。
图(tú) 239
4.上(shàng)板成(chéng)功之後(hòu),在(zài)發(fà)送數據(jù)欄輸入(rù)相應(yìng)的(de)數據(jù)(将8个(gè)LED燈(dēng)对(duì)應(yìng)的(de)8位二(èr)進(jìn)制數轉(zhuǎn)化(huà)为(wèi)十(shí)六(liù)進(jìn)制),然後(hòu)發(fà)送,即可(kě)在(zài)開(kāi)發(fà)板上(shàng)看(kàn)到(dào)相應(yìng)的(de)現(xiàn)象(xiàng)。








