第(dì)三(sān)篇(piān) FPGA至(zhì)簡設計(jì)項目实踐
本(běn)文(wén)的(de)文(wén)檔編号(hào):002700000016
需要(yào)看(kàn)对(duì)應(yìng)的(de)視頻,請點(diǎn)擊視頻編号(hào):000900000098
1.至(zhì)簡原理與(yǔ)應(yìng)用(yòng)配套(tào)的(de)案(àn)例
2.实現(xiàn)通(tòng)过(guò)串口(kǒu)調試助手(shǒu)發(fà)送一(yī)个(gè)8位的(de)數據(jù)data,其可(kě)以(yǐ)控制開(kāi)發(fà)板上(shàng)的(de)8个(gè)LED燈(dēng),data[0]~data[7]分(fēn)别控制LED0~LED7燈(dēng)。當數據(jù)位为(wèi)0时(shí),对(duì)應(yìng)的(de)LED燈(dēng)點(diǎn)亮(liàng),數據(jù)为(wèi)1时(shí),对(duì)應(yìng)的(de)LED燈(dēng)熄滅。
3. 这(zhè)是(shì)ALTERA入(rù)門(mén)学習案(àn)例文(wén)檔
第(dì)四(sì)章(zhāng) 串口(kǒu)通(tòng)信(xìn)
第(dì)1节(jié) 項目背景
信(xìn)息數據(jù)被(bèi)逐位按順序傳送的(de)通(tòng)訊方(fāng)式稱为(wèi)串行通(tòng)信(xìn)。串行接口(kǒu)(SerialInterface),簡稱串口(kǒu),即是(shì)采用(yòng)串行通(tòng)信(xìn)方(fāng)式的(de)擴展(zhǎn)接口(kǒu)。其采用(yòng)一(yī)位一(yī)位的(de)方(fāng)式順序的(de)傳送數據(jù),又可(kě)稱串行通(tòng)信(xìn)接口(kǒu)或(huò)串行通(tòng)訊接口(kǒu)(通(tòng)常指COM接口(kǒu))。串行接口(kǒu)的(de)特(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),因(yīn)此(cǐ)非(fēi)常适用(yòng)于(yú)遠(yuǎn)距離通(tòng)信(xìn),但傳送的(de)速度(dù)較慢(màn)。
1980年(nián)前(qián)後(hòu)串口(kǒu)首次(cì)出(chū)現(xiàn),其數據(jù)傳輸率是(shì)115kbps~230kbps。初期(qī),串口(kǒu)是(shì)为(wèi)了(le)实現(xiàn)計(jì)算機(jī)外(wài)設的(de)連(lián)接,一(yī)般用(yòng)来(lái)連(lián)接鼠标(biāo)和(hé)外(wài)置Modem以(yǐ)及(jí)老(lǎo)式攝像头(tóu)和(hé)写字(zì)板等設備,也(yě)可(kě)以(yǐ)應(yìng)用(yòng)于(yú)两(liǎng)台(tái)計(jì)算機(jī)(或(huò)設備)之間(jiān)的(de)互聯及(jí)數據(jù)傳輸。目前(qián),串口(kǒu)多(duō)用(yòng)于(yú)工控和(hé)测量(liàng)設備以(yǐ)及(jí)部(bù)分(fēn)通(tòng)信(xìn)設備中(zhōng)。
根(gēn)據(jù)通(tòng)信(xìn)方(fāng)式的(de)不(bù)同(tóng),串口(kǒu)可(kě)分(fēn)成(chéng)同(tóng)步串行接口(kǒu)(SynchronousSerial Interface,SSI)和(hé)异(yì)步串行接口(kǒu)(UniversalAsynchronous Receiver/Transmitter,UART)。SSI常用(yòng)于(yú)工業通(tòng)信(xìn),UART通(tòng)用(yòng)于(yú)异(yì)步接收(shōu)/發(fà)送。按照電(diàn)气(qì)标(biāo)準及(jí)協議的(de)不(bù)同(tóng),串口(kǒu)包(bāo)括RS-232-C、RS-422、RS485等。其中(zhōng),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ò)協議。下(xià)面(miàn)将具體(tǐ)介紹一(yī)下(xià)这(zhè)些常用(yòng)的(de)串口(kǒu)。
RS-232:RS-232是(shì)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)準,其全(quán)稱为(wèi)“數據(jù)終(zhōng)端設備(DTE)和(hé)數據(jù)通(tòng)訊設備(DCE)之間(jiān)串行二(èr)進(jìn)制數據(jù)交換接口(kǒu)技術(shù)标(biāo)準”,又被(bèi)稱为(wèi)标(biāo)準串口(kǒu)。RS-232是(shì)最(zuì)常用(yòng)的(de)一(yī)種(zhǒng)串行通(tòng)訊接口(kǒu),采用(yòng)标(biāo)準25芯D型插头(tóu)座(DB25),後(hòu)簡化(huà)为(wèi)9芯D型插座(DB9),現(xiàn)25芯插头(tóu)座在(zài)應(yìng)用(yòng)中(zhōng)已很少(shǎo)采用(yòng)。RS-232采取(qǔ)不(bù)平衡的(de)傳輸方(fāng)式,即所(suǒ)謂的(de)單端通(tòng)訊。由(yóu)于(yú)其發(fà)送電(diàn)平與(yǔ)接收(shōu)電(diàn)平僅差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Ω,因(yīn)此(cǐ)其适合本(běn)地(dì)設備之間(jiān)的(de)通(tòng)信(xìn)。
RS-422:RS-422标(biāo)準的(de)全(quán)稱是(shì)“平衡電(diàn)壓數字(zì)接口(kǒu)電(diàn)路(lù)的(de)電(diàn)气(qì)特(tè)性(xìng)”,其对(duì)接口(kǒu)電(diàn)路(lù)的(de)特(tè)性(xìng)進(jìn)行了(le)定(dìng)義,采用(yòng)DB9連(lián)接器。典型的(de)RS-422是(shì)四(sì)線(xiàn)接口(kǒu),实際上(shàng)還(huán)存在(zài)一(yī)根(gēn)信(xìn)号(hào)地(dì)線(xiàn),共(gòng)为(wèi)5根(gēn)線(xiàn)。由(yóu)于(yú)接收(shōu)器采用(yòng)高(gāo)輸入(rù)阻抗和(hé)發(fà)送驅動(dòng)器,RS-422比RS232的(de)驅動(dòng)能(néng)力更(gèng)強(qiáng),因(yīn)此(cǐ)其可(kě)在(zài)相同(tóng)傳輸線(xiàn)上(shàng)連(lián)接多(duō)个(gè)接收(shōu)节(jié)點(diǎn)(最(zuì)多(duō)可(kě)接10个(gè))。RS-422支持(chí)點(diǎn)对(duì)多(duō)的(de)双(shuāng)向(xiàng)通(tòng)信(xìn),主(zhǔ)設備(Master)一(yī)台(tái),其餘为(wèi)從設備(Slave),且從設備之間(jiān)不(bù)能(néng)通(tòng)信(xìn)。接收(shōu)器的(de)輸入(rù)阻抗为(wèi)4k,故最(zuì)大負载能(néng)力是(shì)10×4k+100Ω(終(zhōng)接電(diàn)阻)。由(yóu)于(yú)采用(yòng)單独的(de)發(fà)送和(hé)接收(shōu)通(tòng)道(dào),RS-422四(sì)線(xiàn)接口(kǒu)不(bù)必控制數據(jù)方(fāng)向(xiàng),各(gè)裝(zhuāng)置之間(jiān)的(de)信(xìn)号(hào)交換均可(kě)以(yǐ)通(tòng)过(guò)软(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)比,只(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,在(zài)100kb/s速率以(yǐ)下(xià)才可(kě)能(néng)使用(yòng)規定(dìng)最(zuì)长的(de)電(diàn)缆(lǎn)长度(dù)。
RS-485:RS-485從RS-422基礎上(shàng)發(fà)展(zhǎn)而(ér)来(lái),因(yīn)此(cǐ)其许多(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)阻等。與(yǔ)RS-422相同(tóng),其最(zuì)大傳輸距離約为(wèi)1219米(mǐ),最(zuì)大傳輸速率为(wèi)10Mb/s,平衡双(shuāng)絞線(xiàn)的(de)长度(dù)與(yǔ)傳輸速率成(chéng)反(fǎn)比,只(zhī)有(yǒu)在(zài)很短(duǎn)的(de)距離下(xià)才能(néng)獲得最(zuì)高(gāo)速率傳輸。RS-485可(kě)以(yǐ)采用(yòng)二(èr)線(xiàn)與(yǔ)四(sì)線(xiàn)两(liǎng)種(zhǒng)連(liá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)四(sì)線(xiàn)制與(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ī)台(tái)主(zhǔ)(Master)設備,其餘为(wèi)從設備。但无論四(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è)設備,與(yǔ)RS-422相比有(yǒu)一(yī)定(dìng)的(de)提(tí)升(shēng)。此(cǐ)外(wài),RS-485與(yǔ)RS-422的(de)共(gòng)模輸出(chū)電(diàn)壓不(bù)同(tóng),RS-485的(de)輸出(chū)範圍是(shì)-7V至(zhì)+12V,而(ér)RS-422是(shì)-7V至(zhì)+7V。RS-485接收(shōu)器最(zuì)小輸入(rù)阻抗为(wèi)12kΩ,而(ér)RS-422是(shì)4kΩ。可(kě)以(yǐ)看(kàn)出(chū)RS-485滿足RS-422的(de)所(suǒ)有(yǒu)規範,因(yīn)此(cǐ)其可(kě)以(yǐ)在(zài)RS-422网(wǎng)絡中(zhōng)應(yìng)用(yòng)。
CH340:由(yóu)于(yú)串口(kǒu)(COM)不(bù)支持(chí)热(rè)插拔及(jí)傳輸速率較低,目前(qián)大部(bù)分(fēn)新主(zhǔ)板和(hé)便攜電(diàn)腦已開(kāi)始取(qǔ)消CH340接口(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)。因(yīn)此(cǐ),为(wèi)了(le)使用(yòng)該串口(kǒu),需要(yào)使用(yòng)USB轉(zhuǎn)串口(kǒu)的(de)芯片(piàn)来(lái)使電(diàn)腦把USB當串口(kǒu)来(lái)使用(yòng)。这(zhè)種(zhǒng)類(lèi)型的(de)芯片(piàn)很多(duō),本(běn)書(shū)使用(yòng)的(de)是(shì)CH340芯片(piàn)。CH320是(shì)一(yī)个(gè)USB總(zǒng)線(xiàn)的(de)轉(zhuǎn)接芯片(piàn),用(yòng)来(lái)实現(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)等功能(néng)。在(zài)串口(kǒu)方(fāng)式下(xià),CH340可(kě)以(yǐ)为(wèi)計(jì)算機(jī)擴展(zhǎn)异(yì)步串口(kǒu)提(tí)供常用(yòng)的(de)MODE聯絡信(xìn)号(hào),或(huò)将普通(tòng)的(de)串口(kǒu)設備直(zhí)接升(shēng)級到(dào)USB總(zǒng)線(xiàn)。
本(běn)書(shū)的(de)串口(kǒu)功能(néng)原理如(rú)下(xià)图(tú)所(suǒ)示,通(tòng)过(guò)USB線(xiàn)将電(diàn)腦與(yǔ)教学板上(shàng)的(de)USB接口(kǒu)相連(lián),USB接口(kǒu)的(de)另(lìng)一(yī)端與(yǔ)CH340芯片(piàn)連(lián)接,CH340芯片(piàn)與(yǔ)FPGA相連(lián)。從FPGA的(de)角(jiǎo)度(dù)来(lái)看(kàn),串口(kǒu)其实就(jiù)是(shì)两(liǎng)根(gēn)線(xiàn):輸入(rù)線(xiàn)USB_RXD和(hé)輸出(chū)線(xiàn)USB_TXD,通(tòng)过(guò)USB_RXD接收(shōu)来(lái)自(zì)電(diàn)腦过(guò)来(lái)的(de)串口(kǒu)數據(jù),通(tòng)过(guò)USB_TXD将數據(jù)傳送給(gěi)電(diàn)腦。其他(tā)電(diàn)气(qì)特(tè)性(xìng)、電(diàn)平轉(zhuǎn)換的(de)工作,都可(kě)以(yǐ)通(tòng)过(guò)CH340完成(chéng)。

图(tú)3.4-1教学板串口(kǒu)实現(xiàn)架構图(tú)
進(jìn)行傳輸數據(jù)时(shí),USB_RXD和(hé)USB_TXD将數據(jù)字(zì)符按位傳輸,其串口(kǒu)时(shí)序如(rú)下(xià)图(tú)所(suǒ)示。USB_RXD的(de)时(shí)序由(yóu)CH340芯片(piàn)産生(shēng),FPGA依此(cǐ)来(lái)接收(shōu)數據(jù)。反(fǎn)过(guò)来(lái),FPGA芯片(piàn)按規範産生(shēng)USB_TXD的(de)时(shí)序,使得CH340可(kě)以(yǐ)正(zhèng)确地(dì)接收(shōu)。其中(zhōng),産生(shēng)时(shí)序的(de)为(wèi)MASTER(主(zhǔ)),接收(shōu)數據(jù)为(wèi)SLAVE(從)。

图(tú)3.4-2串口(kǒu)时(shí)序图(tú)
串口(kǒu)时(shí)序主(zhǔ)要(yào)包(bāo)括:空閑、起始位、數據(jù)拉、校(xiào)验(yàn)位和(hé)停止位。下(xià)面(miàn)逐一(yī)朋友解(jiě)釋每个(gè)时(shí)序位的(de)狀态。
空閑:空閑狀态下(xià),數據(jù)線(xiàn)一(yī)直(zhí)处于(yú)高(gāo)電(diàn)平狀态。
起始位:當MASTER準備發(fà)送數據(jù)时(shí),会(huì)先(xiān)将數據(jù)線(xiàn)拉低“一(yī)段(duàn)时(shí)間(jiān)”,以(yǐ)此(cǐ)来(lái)告知SLAVE做好(hǎo)數據(jù)傳輸的(de)準備。
數據(jù)位:起始位之後(hòu)是(shì)數據(jù)位,其位數由(yóu)主(zhǔ)從双(shuāng)方(fāng)共(gòng)同(tóng)約定(dìng),支持(chí)4、5、6、7、8位等,完成(chéng)約定(dìng)後(hòu)才能(néng)正(zhèng)确地(dì)傳輸。傳輸順序是(shì)從低位開(kāi)始,每个(gè)數據(jù)位傳輸时(shí)都会(huì)占用(yòng)“一(yī)段(duàn)时(shí)間(jiān)”。從图(tú)3.4-2中(zhōng)可(kě)以(yǐ)看(kàn)出(chū),傳輸從LSB開(kāi)始,至(zhì)MSB結束(shù),LSB即表(biǎo)示低位,MSB表(biǎo)示高(gāo)位。以(yǐ)數據(jù)8’b00000001为(wèi)例,傳輸該數據(jù)时(shí)最(zuì)先(xiān)傳送的(de)即是(shì)最(zuì)低位的(de)“1”。
檢验(yàn)位:顧名思(sī)義,校(xiào)验(yàn)位是(shì)用(yòng)于(yú)數據(jù)校(xiào)验(yàn)。目前(qián)簡單常用(yòng)的(de)數據(jù)校(xiào)验(yàn)方(fāng)式是(shì)奇偶校(xiào)验(yàn),分(fēn)为(wèi)奇校(xiào)验(yàn)和(hé)偶校(xiào)验(yàn)。奇校(xiào)验(yàn)需要(yào)保證傳輸數據(jù)總(zǒng)共(gòng)有(yǒu)奇數个(gè)邏輯高(gāo)電(diàn)平,偶校(xiào)验(yàn)則需保證傳輸數據(jù)有(yǒu)偶數个(gè)邏輯高(gāo)電(diàn)平。即“奇偶”指的(de)是(shì)數據(jù)中(zhōng)(包(bāo)括該校(xiào)验(yàn)位)1的(de)个(gè)數。例如(rú):傳輸的(de)數據(jù)是(shì)0100_0011。如(rú)果(guǒ)校(xiào)验(yàn)方(fāng)式是(shì)奇校(xiào)验(yàn)則校(xiào)验(yàn)位是(shì)0,若是(shì)偶校(xiào)验(yàn)則校(xiào)验(yàn)位是(shì)1。傳輸中(zhōng)校(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)方(fāng)式。
停止位:字(zì)符幀的(de)最(zuì)後(hòu)一(yī)位是(shì)停止位。由(yóu)于(yú)每台(tái)設備都有(yǒu)其自(zì)身(shēn)时(shí)鐘(zhōng),在(zài)通(tòng)信(xìn)中(zhōng)两(liǎng)台(tái)設備間(jiān)可(kě)能(néng)出(chū)現(xiàn)了(le)小小的(de)不(bù)同(tóng)步,從而(ér)影響了(le)數據(jù)傳輸結果(guǒ)。因(yīn)此(cǐ),MASTER必須保證有(yǒu)停止位,即數據(jù)線(xiàn)需拉高(gāo)“一(yī)段(duàn)时(shí)間(jiān)”。停止位不(bù)僅僅是(shì)表(biǎo)示傳輸的(de)結束(shù),也(yě)是(shì)一(yī)个(gè)校(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à)送时(shí)SLAVE无法判斷下(xià)一(yī)轮的(de)起始位。对(duì)于(yú)SLAVE来(lái)说(shuō),數據(jù)位或(huò)校(xiào)验(yàn)位接收(shōu)後(hòu)就(jiù)已經(jīng)完成(chéng)接收(shōu)工作,在(zài)停止位无需任何操作,只(zhī)需等待下(xià)一(yī)轮起始即可(kě)。
上(shàng)文(wén)中(zhōng)提(tí)到(dào)每个(gè)數據(jù)都会(huì)傳輸“一(yī)段(duàn)时(shí)間(jiān)”,这(zhè)段(duàn)时(shí)間(jiān)并不(bù)是(shì)随便定(dìng)義的(de),需要(yào)傳輸双(shuāng)方(fāng)做好(hǎo)約定(dìng),否則就(jiù)不(bù)能(néng)正(zhèng)确地(dì)進(jìn)行通(tòng)信(xìn)。那(nà)麼(me)“一(yī)段(duàn)时(shí)間(jiān)”究竟是(shì)指多(duō)长时(shí)間(jiān)呢?这(zhè)與(yǔ)波(bō)特(tè)率有(yǒu)關(guān)。波(bō)特(tè)率在(zài)串口(kǒu)通(tòng)信(xìn)中(zhōng)是(shì)一(yī)个(gè)非(fēi)常重(zhòng)要(yào)的(de)概念,其为(wèi)模拟信(xìn)号(hào)線(xiàn)路(lù)的(de)速率。在(zài)串口(kǒu)通(tòng)信(xìn)中(zhōng)常用(yòng)的(de)波(bō)特(tè)率是(shì)9600、19200、38400、57600、115200,代(dài)表(biǎo)每个(gè)碼元(yuán)傳輸的(de)速率。在(zài)二(èr)進(jìn)制數據(jù)傳輸中(zhōng),波(bō)特(tè)率和(hé)比特(tè)率相同(tóng)都为(wèi)每个(gè)比特(tè)數據(jù)傳輸的(de)速率,其倒數为(wèi)1bit數據(jù)的(de)位宽(kuān),也(yě)就(jiù)是(shì)1bit數據(jù)持(chí)續的(de)时(shí)間(jiān)。确定(dìng)了(le)这(zhè)一(yī)时(shí)間(jiān),就(jiù)可(kě)用(yòng)FPGA構造計(jì)數器实現(xiàn)比特(tè)周期(qī)的(de)延时(shí),從而(ér)实現(xiàn)特(tè)定(dìng)波(bō)特(tè)率的(de)數據(jù)傳輸。
舉个(gè)例子,假設波(bō)特(tè)率为(wèi)9600,數據(jù)位为(wèi)8位,无校(xiào)验(yàn)位。電(diàn)腦要(yào)傳送數據(jù)8’b00110001給(gěi)FPGA。由(yóu)于(yú)波(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)将如(rú)下(xià)图(tú)所(suǒ)示進(jìn)行變(biàn)化(huà)。

图(tú)3.4-3带(dài)时(shí)間(jiān)信(xìn)息的(de)串口(kǒu)时(shí)序图(tú)
在(zài)使用(yòng)開(kāi)發(fà)板的(de)串口(kǒu)前(qián),需要(yào)安(ān)裝(zhuāng)CH340的(de)驅動(dòng)程序(下(xià)载鍊(liàn)接:http://www.fpgabbs.cn/forum.php?mod=viewthread&tid=433),下(xià)载後(hòu)直(zhí)接解(jiě)壓安(ān)裝(zhuāng)就(jiù)可(kě)以(yǐ)進(jìn)行使用(yòng)。
使用(yòng)USB線(xiàn)将電(diàn)腦和(hé)開(kāi)發(fà)板進(jìn)行連(lián)接後(hòu)将開(kāi)發(fà)板上(shàng)電(diàn),打(dǎ)開(kāi)電(diàn)腦的(de)“設備管(guǎn)理器”。當出(chū)現(xiàn)如(rú)下(xià)图(tú)所(suǒ)示的(de)界面(miàn)时(shí)表(biǎo)示驅動(dòng)程序安(ān)裝(zhuāng)成(chéng)功并且已經(jīng)被(bèi)電(diàn)腦正(zhèng)确地(dì)識别。

图(tú)3.4-4驅動(dòng)程序成(chéng)功安(ān)裝(zhuāng)且被(bèi)電(diàn)腦正(zhèng)确地(dì)識别界面(miàn)
在(zài)“設備管(guǎn)理器”中(zhōng)可(kě)以(yǐ)查看(kàn)串口(kǒu)号(hào),點(diǎn)擊“USBSerial Port(COM3)”,如(rú)下(xià)图(tú)所(suǒ)示。

图(tú)3.4-5在(zài)設備管(guǎn)理器中(zhōng)查看(kàn)串口(kǒu)号(hào)
随後(hòu)點(diǎn)擊“端口(kǒu)設置”選擇“高(gāo)級”選項,如(rú)下(xià)图(tú)所(suǒ)示。

图(tú)3.4-6端口(kǒu)設置界面(miàn)
下(xià)图(tú)中(zhōng)可(kě)見(jiàn)端口(kǒu)号(hào)的(de)具體(tǐ)設置信(xìn)息,其串口(kǒu)号(hào)为(wèi)COM3。

图(tú)3.4-7高(gāo)級設置界面(miàn)
點(diǎn)擊CON端口(kǒu)号(hào),可(kě)以(yǐ)对(duì)串口(kǒu)号(hào)進(jìn)行修改,如(rú)下(xià)图(tú)所(suǒ)示。

图(tú)3.4-8更(gèng)改串口(kǒu)号(hào)
電(diàn)腦發(fà)送數據(jù)給(gěi)FPGA这(zhè)一(yī)操作中(zhōng)需要(yào)使用(yòng)串口(kǒu)調試助手(shǒu)(下(xià)载鍊(liàn)接:http://www.fpgabbs.cn/forum.php?mod=viewthread&tid=437),其界面(miàn)如(rú)下(xià)图(tú)所(suǒ)示,下(xià)面(miàn)对(duì)其具體(tǐ)參數設置進(jìn)行说(shuō)明(míng)。

图(tú)3.4-9串口(kǒu)調試助手(shǒu)界面(miàn)
串口(kǒu):選擇串口(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)在(zài)設備管(guǎn)理器中(zhōng)修改串口(kǒu)号(hào),詳细(xì)參見(jiàn)前(qián)文(wén)描述。
波(bō)特(tè)率:選擇串口(kǒu)的(de)波(bō)特(tè)率,支持(chí)9600、19200、38400、57600、115200。該選項決定(dìng)了(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ù)位:設置數據(jù)位的(de)位數,可(kě)選擇4~8位的(de)數據(jù)拉。
停止位:設置停止位的(de)时(shí)間(jiān)长度(dù)。可(kě)選擇1位、1.5位和(hé)2位。
打(dǎ)開(kāi)/關(guān)閉串口(kǒu):打(dǎ)開(kāi)软(ruǎn)件(jiàn)时(shí),該串口(kǒu)默認是(shì)關(guān)閉狀态。这(zhè)里(lǐ)要(yào)注意(yì)有(yǒu)關(guān)串口(kǒu)使用(yòng)的(de)方(fāng)法:一(yī)定(dìng)要(yào)先(xiān)設置好(hǎo)參數後(hòu),才能(néng)打(dǎ)開(kāi)串口(kǒu);反(fǎn)之,一(yī)定(dìng)要(yào)先(xiān)關(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)制顯示。若勾選了(le)十(shí)六(liù)進(jìn)制顯示,软(ruǎn)件(jiàn)就(jiù)会(huì)顯示十(shí)六(liù)進(jìn)制。例如(rú)FPGA發(fà)送數據(jù)8’b00110001,软(ruǎn)件(jiàn)收(shōu)到(dào)後(hòu)会(huì)顯示为(wèi)十(shí)六(liù)進(jìn)制,即31。反(fǎn)之如(rú)果(guǒ)不(bù)勾選十(shí)六(liù)進(jìn)制顯示,則会(huì)顯示ASCII碼。如(rú)果(guǒ)FPGA依然發(fà)送8’b00110001,对(duì)照下(xià)图(tú)的(de)ASCII表(biǎo)可(kě)看(kàn)出(chū)其所(suǒ)对(duì)應(yìng)的(de)图(tú)形为(wèi)“1”,因(yīn)此(cǐ)软(ruǎn)件(jiàn)会(huì)顯示“1”;假設FPGA發(fà)送的(de)是(shì)8’h00100011,下(xià)表(biǎo)中(zhōng)其所(suǒ)对(duì)應(yìng)的(de)是(shì)图(tú)形是(shì)“#”,因(yīn)此(cǐ)软(ruǎn)件(jiàn)会(huì)顯示“#”。

图(tú)3.4-10ASCII編碼图(tú)
十(shí)六(liù)進(jìn)制發(fà)送:同(tóng)樣(yàng)的(de),本(běn)软(ruǎn)件(jiàn)支持(chí)ASCII發(fà)送和(hé)十(shí)六(liù)進(jìn)制發(fà)送。若勾選十(shí)六(liù)進(jìn)制發(fà)送,软(ruǎn)件(jiàn)則会(huì)以(yǐ)十(shí)六(liù)進(jìn)制形式發(fà)送。例如(rú)填写“31”後(hòu)手(shǒu)動(dòng)發(fà)送,那(nà)麼(me)FPGA收(shōu)到(dào)的(de)值为(wèi)8’b00110001。如(rú)果(guǒ)不(bù)勾選十(shí)六(liù)進(jìn)制發(fà)送,則软(ruǎn)件(jiàn)以(yǐ)ASCII碼形式發(fà)送。若同(tóng)樣(yàng)填写“31”後(hòu)手(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,即FPGA将收(shōu)到(dào)两(liǎng)个(gè)字(zì)节(jié)數據(jù):8’h33和(hé)8’h31。
第(dì)2节(jié) 設計(jì)目标(biāo)
了(le)解(jiě)了(le)串口(kǒu)通(tòng)信(xìn)的(de)原理後(hòu),本(běn)書(shū)将完成(chéng)串口(kǒu)通(tòng)信(xìn)的(de)設計(jì)。按照至(zhì)簡設計(jì)法的(de)思(sī)路(lù),進(jìn)行設計(jì)之前(qián)首先(xiān)應(yìng)明(míng)确設計(jì)目标(biāo),後(hòu)續設計(jì)中(zhōng)每一(yī)个(gè)步驟都是(shì)圍繞着設計(jì)目标(biāo)的(de)实現(xiàn)来(lái)針(zhēn)对(duì)性(xìng)的(de)展(zhǎn)開(kāi)。如(rú)果(guǒ)沒(méi)有(yǒu)明(míng)确設計(jì)目标(biāo)就(jiù)開(kāi)始操作实踐,最(zuì)終(zhōng)的(de)作品也(yě)只(zhī)是(shì)東(dōng)拼西(xī)湊的(de)産物(wù)。在(zài)这(zhè)種(zhǒng)狀态下(xià)的(de)工程調試过(guò)程如(rú)果(guǒ)出(chū)現(xiàn)了(le)問(wèn)題(tí),則需要(yào)花費大量(liàng)的(de)精力進(jìn)行尋找(zhǎo)修複。因(yīn)此(cǐ)建議初学者(zhě)在(zài)最(zuì)開(kāi)始学習时(shí)養成(chéng)良好(hǎo)的(de)工作習慣,在(zài)後(hòu)續工作中(zhōng)会(huì)受益无窮。
本(běn)設計(jì)中(zhōng)串口(kǒu)調試助手(shǒu)的(de)參數設置为(wèi):波(bō)特(tè)率9600;數據(jù)位为(wèi)8位;无奇偶校(xiào)验(yàn)位;停止位为(wèi)2比特(tè);接收(shōu)和(hé)發(fà)送都是(shì)16進(jìn)制數。
本(běn)設計(jì)中(zhōng),用(yòng)戶通(tòng)过(guò)串口(kǒu)調試助手(shǒu)發(fà)送一(yī)个(gè)8位的(de)數據(jù)data,其可(kě)以(yǐ)控制開(kāi)發(fà)板上(shàng)的(de)8个(gè)LED燈(dēng),data[0]~data[7]分(fēn)别控制LED0~LED7燈(dēng)。當數據(jù)位为(wèi)0时(shí),对(duì)應(yìng)的(de)LED燈(dēng)點(diǎn)亮(liàng),數據(jù)为(wèi)1时(shí),对(duì)應(yìng)的(de)LED燈(dēng)熄滅。例如(rú),用(yòng)戶發(fà)送數據(jù)data=8’b10000000後(hòu),開(kāi)發(fà)板上(shàng)的(de)LED0、LED1、LED2LED3、LED4、LED5、LED6保持(chí)为(wèi)亮(liàng),LED7保持(chí)为(wèi)滅。这(zhè)里(lǐ)要(yào)注意(yì),信(xìn)号(hào)的(de)傳輸順序是(shì)從低到(dào)高(gāo)的(de),數據(jù)的(de)最(zuì)後(hòu)一(yī)位“0”对(duì)應(yìng)LED0,倒數第(dì)二(èr)位“0”对(duì)應(yìng)LED1,倒數第(dì)三(sān)位“0”对(duì)應(yìng)LED2,依次(cì)類(lèi)推,第(dì)一(yī)位“1”对(duì)應(yìng)LED7。
設計(jì)完成(chéng)後(hòu)的(de)上(shàng)板效果(guǒ)如(rú)下(xià)图(tú)所(suǒ)示。

图(tú)3.4-11串口(kǒu)通(tòng)信(xìn)实現(xiàn)效果(guǒ)图(tú)
第(dì)3节(jié) 設計(jì)实現(xiàn)
确定(dìng)設計(jì)目标(biāo)後(hòu),下(xià)面(miàn)会(huì)逐步分(fēn)析講解(jiě)工程的(de)实現(xiàn)步驟。本(běn)書(shū)不(bù)僅分(fēn)享案(àn)例,還(huán)会(huì)在(zài)操作过(guò)程中(zhōng)剖析設計(jì)理念及(jí)原理,同(tóng)时(shí)也(yě)分(fēn)享一(yī)些至(zhì)簡設計(jì)法的(de)設計(jì)技巧以(yǐ)鍛煉独立設計(jì)工程的(de)能(néng)力。因(yīn)此(cǐ),建議初学者(zhě)認真(zhēn)学習每一(yī)步。當然,在(zài)已經(jīng)擁有(yǒu)扎实的(de)功底、只(zhī)是(shì)想(xiǎng)要(yào)根(gēn)據(jù)步驟完成(chéng)設計(jì)的(de)情(qíng)況下(xià)可(kě)以(yǐ)跳过(guò)此(cǐ)部(bù)分(fēn),直(zhí)接進(jìn)入(rù)後(hòu)續章(zhāng)节(jié)中(zhōng)的(de)簡略版操作步驟。
3.1 頂层信(xìn)号(hào)
新建目录(lù):D:mdy_bookuart,并在(zài)此(cǐ)目录(lù)中(zhōng)新建一(yī)个(gè)名为(wèi)uart.v的(de)文(wén)件(jiàn)。并用(yòng)GVIM打(dǎ)開(kāi)該文(wén)件(jiàn)後(hòu)開(kāi)始編写代(dài)碼。在(zài)这(zhè)里(lǐ)再次(cì)強(qiáng)調,初学者(zhě)一(yī)定(dìng)要(yào)按照本(běn)書(shū)提(tí)供的(de)文(wén)件(jiàn)路(lù)徑以(yǐ)及(jí)文(wén)件(jiàn)名進(jìn)行設置,避免後(hòu)面(miàn)出(chū)現(xiàn)未知錯誤。
根(gēn)據(jù)設計(jì)目标(biāo)可(kě)知,用(yòng)戶通(tòng)过(guò)串口(kǒu)調試助手(shǒu)向(xiàng)FPGA發(fà)送數據(jù),即CH340控制RX信(xìn)号(hào)讓其根(gēn)據(jù)串口(kǒu)时(shí)序變(biàn)化(huà),從而(ér)将數據(jù)信(xìn)号(hào)傳送至(zhì)FPGA。因(yīn)此(cǐ)FPGA工程必須有(yǒu)一(yī)个(gè)接口(kǒu)信(xìn)号(hào),本(běn)書(shū)将其命名为(wèi)rx_uart。
本(běn)設計(jì)中(zhōng)需要(yào)控制8个(gè)LED燈(dēng)的(de)亮(liàng)滅,按照之前(qián)章(zhāng)节(jié)中(zhōng)信(xìn)号(hào)與(yǔ)燈(dēng)的(de)对(duì)應(yìng)方(fāng)法,需要(yào)8个(gè)信(xìn)号(hào)来(lái)進(jìn)行控制:led0,led1,led2,led3,led4,led5,led6,led7。然而(ér)本(běn)設計(jì)是(shì)采用(yòng)串口(kǒu)指令控制小燈(dēng),且8个(gè)信(xìn)号(hào)數目过(guò)于(yú)繁多(duō)。因(yīn)此(cǐ),可(kě)以(yǐ)選擇使用(yòng)一(yī)个(gè)8比特(tè)的(de)信(xìn)号(hào),将其命名为(wèi)led。既然如(rú)此(cǐ),那(nà)之間(jiān)幾(jǐ)个(gè)章(zhāng)节(jié)中(zhōng)的(de)工程可(kě)以(yǐ)用(yòng)这(zhè)種(zhǒng)方(fāng)法吗?答(dá)案(àn)是(shì)肯定(dìng)的(de),可(kě)以(yǐ)将led0,led1,led2,led3四(sì)个(gè)信(xìn)号(hào)轉(zhuǎn)換为(wèi)一(yī)个(gè)4比特(tè)的(de)信(xìn)号(hào)led。虽然設計(jì)內(nèi)容與(yǔ)需求不(bù)同(tóng),但是(shì)至(zhì)簡設計(jì)法一(yī)定(dìng)会(huì)分(fēn)享最(zuì)合适最(zuì)簡單的(de)方(fāng)法。
硬(yìng)件(jiàn)電(diàn)路(lù)的(de)連(lián)接關(guān)系(xì)如(rú)下(xià)表(biǎo)所(suǒ)示。本(běn)設計(jì)中(zhōng)采用(yòng)8比特(tè)的(de)信(xìn)号(hào)led来(lái)控制8个(gè)LED燈(dēng),工程的(de)时(shí)鐘(zhōng)管(guǎn)脚为(wèi)G1,对(duì)應(yìng)FPGA工程信(xìn)号(hào)为(wèi)clk;複位管(guǎn)脚为(wèi)AB12,对(duì)應(yìng)FPGA工程信(xìn)号(hào)为(wèi)rst_n;串口(kǒu)輸入(rù)管(guǎn)脚为(wèi)D6,对(duì)應(yìng)FPGA工程信(xìn)号(hào)为(wèi)rx_uart。因(yīn)此(cǐ)本(běn)工程共(gòng)需要(yào)4个(gè)信(xìn)号(hào):8位信(xìn)号(hào)led,时(shí)鐘(zhōng)clk,複位rst_n和(hé)串口(kǒu)輸入(rù)信(xìn)号(hào)rx_uart。
表(biǎo)3.4 - 1信(xìn)号(hào)和(hé)管(guǎn)脚關(guān)系(xì)
将module的(de)名稱定(dìng)義为(wèi)uart,在(zài)頂层信(xìn)号(hào)代(dài)碼中(zhōng)将與(yǔ)外(wài)部(bù)相連(lián)接的(de)輸入(rù)/輸出(chū)信(xìn)号(hào)列出(chū),從而(ér)实現(xiàn)信(xìn)号(hào)與(yǔ)管(guǎn)脚的(de)連(lián)接。已知該模块(kuài)有(yǒu)四(sì)个(gè)信(xìn)号(hào):clk、rst_n、rx_uart和(hé)led,其具體(tǐ)代(dài)碼如(rú)下(xià):
随後(hòu)对(duì)信(xìn)号(hào)的(de)輸入(rù)輸出(chū)屬性(xìng)進(jìn)行聲明(míng),指出(chū)对(duì)于(yú)FPGA来(lái)说(shuō)这(zhè)一(yī)信(xìn)号(hào)屬于(yú)輸入(rù)還(huán)是(shì)輸出(chū),若为(wèi)輸入(rù),聲明(míng)則为(wèi)input;若为(wèi)輸出(chū),聲明(míng)則为(wèi)output。在(zài)本(běn)設計(jì)中(zhōng)由(yóu)于(yú)clk是(shì)外(wài)部(bù)的(de)晶振輸送給(gěi)FPGA的(de),因(yīn)此(cǐ)在(zài)FPGA中(zhōng)clk为(wèi)輸入(rù)信(xìn)号(hào)input;同(tóng)樣(yàng)地(dì),rst_n是(shì)外(wài)部(bù)按鍵給(gěi)FPGA的(de),在(zài)FPGA中(zhōng)也(yě)是(shì)輸入(rù)信(xìn)号(hào)input;同(tóng)时(shí)可(kě)知led是(shì)FPGA輸出(chū)給(gěi)LED燈(dēng)的(de),是(shì)輸出(chū)信(xìn)号(hào)output。clk、rst_n、rx_uart三(sān)个(gè)信(xìn)号(hào)的(de)值都为(wèi)0或(huò)1,用(yòng)一(yī)根(gēn)線(xiàn)表(biǎo)示即可(kě),而(ér)led信(xìn)号(hào)位宽(kuān)为(wèi)8。根(gēn)據(jù)信(xìn)号(hào)屬性(xìng)将輸入(rù)輸出(chū)端口(kǒu)定(dìng)義補充完整,其代(dài)碼如(rú)下(xià):
3.2 信(xìn)号(hào)設計(jì)
由(yóu)前(qián)文(wén)可(kě)知,led信(xìn)号(hào)控制了(le)8个(gè)LED燈(dēng)的(de)亮(liàng)滅,然而(ér)其亮(liàng)滅控制還(huán)是(shì)取(qǔ)決于(yú)串口(kǒu)發(fà)送數據(jù)。那(nà)麼(me)就(jiù)存在(zài)这(zhè)樣(yàng)一(yī)个(gè)問(wèn)題(tí):串口(kǒu)發(fà)送的(de)數據(jù)是(shì)如(rú)何告知FPGA并與(yǔ)led对(duì)應(yìng)起来(lái)呢?下(xià)面(miàn)本(běn)書(shū)就(jiù)来(lái)分(fēn)析一(yī)下(xià)串口(kǒu)數據(jù)的(de)时(shí)序,CH340控制信(xìn)号(hào)rx_uart的(de)时(shí)序如(rú)下(xià)图(tú)所(suǒ)示。

图(tú)3.4-12串口(kǒu)时(shí)序图(tú)
從时(shí)序图(tú)中(zhōng)可(kě)以(yǐ)看(kàn)出(chū):發(fà)送8位數據(jù)data前(qián),信(xìn)号(hào)rx_uart会(huì)先(xiān)變(biàn)为(wèi)0并持(chí)續一(yī)段(duàn)时(shí)間(jiān)(起啟位),然後(hòu)發(fà)送data[0]、data[1],以(yǐ)此(cǐ)類(lèi)推直(zhí)至(zhì)發(fà)送完data[7],發(fà)送每位數據(jù)时(shí)都会(huì)持(chí)續一(yī)段(duàn)时(shí)間(jiān),發(fà)送完畢後(hòu)rx_uart会(huì)變(biàn)为(wèi)1并持(chí)續一(yī)段(duàn)时(shí)間(jiān)(結束(shù)位)。至(zhì)此(cǐ),CH340完成(chéng)了(le)數據(jù)的(de)發(fà)送。可(kě)以(yǐ)看(kàn)出(chū)每段(duàn)有(yǒu)效信(xìn)号(hào)的(de)開(kāi)始前(qián)和(hé)結束(shù)後(hòu),都会(huì)有(yǒu)特(tè)殊信(xìn)号(hào):有(yǒu)效數據(jù)開(kāi)始前(qián)会(huì)有(yǒu)一(yī)段(duàn)變(biàn)0的(de)信(xìn)号(hào),用(yòng)以(yǐ)告
知FPGA開(kāi)始傳送數據(jù);結束(shù)後(hòu)会(huì)有(yǒu)一(yī)段(duàn)變(biàn)1的(de)信(xìn)号(hào),告知FPGA此(cǐ)數據(jù)傳送結束(shù)。
例如(rú),CH340要(yào)發(fà)送的(de)數據(jù)为(wèi)data=8’h00110001,則rx_uart的(de)波(bō)形如(rú)下(xià)。

3.4-13串口(kǒu)通(tòng)信(xìn)时(shí)序图(tú)
由(yóu)于(yú)波(bō)特(tè)率設置为(wèi)9600,考慮时(shí)間(jiān)信(xìn)息,每位持(chí)續的(de)时(shí)間(jiān)是(shì)1s/9600=104166ns。補充时(shí)間(jiān)信(xìn)息後(hòu)的(de)时(shí)序如(rú)下(xià)图(tú)所(suǒ)示。

图(tú)3.4-14带(dài)时(shí)間(jiān)的(de)时(shí)序图(tú)
本(běn)開(kāi)發(fà)板的(de)晶振时(shí)鐘(zhōng)是(shì)50Mz,对(duì)應(yìng)时(shí)間(jiān)周期(qī)为(wèi)20ns。由(yóu)此(cǐ)可(kě)知每位數據(jù)持(chí)續时(shí)間(jiān)为(wèi)104166ns/20ns=5208.3个(gè)时(shí)鐘(zhōng)周期(qī),近(jìn)似为(wèi)5208个(gè)时(shí)鐘(zhōng)周期(qī)。由(yóu)于(yú)5208只(zhī)是(shì)估計(jì)的(de)大概數字(zì),实際情(qíng)況会(huì)産生(shēng)一(yī)定(dìng)的(de)偏差。在(zài)实現(xiàn)过(guò)程中(zhōng),應(yìng)对(duì)數據(jù)位數進(jìn)行計(jì)數,以(yǐ)此(cǐ)来(lái)判斷開(kāi)始位、數據(jù)位和(hé)停止位等。

图(tú)3.4-15串口(kǒu)通(tòng)信(xìn)实現(xiàn)架構图(tú)【这(zhè)个(gè)图(tú)要(yào)去(qù)掉ns】
通(tòng)过(guò)上(shàng)文(wén)分(fēn)析可(kě)知:本(běn)設計(jì)一(yī)共(gòng)需要(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。
首先(xiān)讨論cnt0的(de)实現(xiàn),至(zhì)簡設計(jì)法中(zhōng)計(jì)數器的(de)設計(jì)只(zhī)考慮两(liǎng)个(gè)因(yīn)素:加1条(tiáo)件(jiàn)和(hé)計(jì)數數量(liàng)。由(yóu)于(yú)1比特(tè)的(de)位宽(kuān)长度(dù)是(shì)5208个(gè)时(shí)鐘(zhōng)周期(qī),因(yīn)此(cǐ)cnt0的(de)計(jì)數數量(liàng)是(shì)5208。
确定(dìng)了(le)計(jì)數數量(liàng)後(hòu)来(lái)分(fēn)析一(yī)下(xià)cnt0的(de)加1条(tiáo)件(jiàn)。为(wèi)了(le)更(gèng)好(hǎo)理解(jiě)加1条(tiáo)件(jiàn)的(de)概念,这(zhè)里(lǐ)以(yǐ)停車位来(lái)進(jìn)行比喻。一(yī)般情(qíng)況下(xià)对(duì)每个(gè)停車位置会(huì)進(jìn)行对(duì)應(yìng)編号(hào),但是(shì)如(rú)果(guǒ)某个(gè)位置上(shàng)放(fàng)置了(le)一(yī)块(kuài)石(dàn)头(tóu)无法作为(wèi)停車位时(shí),該位置就(jiù)不(bù)能(néng)獲得对(duì)應(yìng)的(de)編号(hào)。反(fǎn)之則可(kě)以(yǐ)認为(wèi)停車位編号(hào)的(de)加1条(tiáo)件(jiàn)就(jiù)是(shì):对(duì)應(yìng)位置上(shàng)沒(méi)有(yǒu)石(dàn)头(tóu),其可(kě)以(yǐ)繼續的(de)進(jìn)行編号(hào),即assign add_cnt0 = “沒(méi)有(yǒu)石(dàn)头(tóu)”。因(yīn)此(cǐ)如(rú)果(guǒ)在(zài)設計(jì)中(zhōng)計(jì)數器一(yī)直(zhí)沒(méi)有(yǒu)阻礙地(dì)進(jìn)行計(jì)數工作,就(jiù)可(kě)以(yǐ)認为(wèi)加1条(tiáo)件(jiàn)是(shì)一(yī)直(zhí)有(yǒu)效的(de)。根(gēn)據(jù)設計(jì)目标(biāo),可(kě)以(yǐ)确定(dìng)cnt0的(de)加1區(qū)域为(wèi)其一(yī)直(zhí)工作的(de)區(qū)域,如(rú)下(xià)图(tú)灰色(sè)區(qū)域所(suǒ)示。

图(tú)3.4-16計(jì)數器cnt0的(de)加1區(qū)域
虽然确定(dìng)了(le)cnt0的(de)加1區(qū)域,但現(xiàn)有(yǒu)設計(jì)中(zhōng)沒(méi)有(yǒu)任何一(yī)个(gè)信(xìn)号(hào)可(kě)以(yǐ)單独表(biǎo)示出(chū)这(zhè)一(yī)區(qū)域。在(zài)这(zhè)種(zhǒng)情(qíng)況下(xià),進(jìn)行对(duì)信(xìn)号(hào)進(jìn)行補充。因(yīn)此(cǐ)本(běn)設計(jì)添加一(yī)个(gè)“flag_add”信(xìn)号(hào),該信(xìn)号(hào)为(wèi)1时(shí)表(biǎo)示上(shàng)述灰色(sè)區(qū)域,即cnt0的(de)加1區(qū)域。这(zhè)樣(yàng)就(jiù)可(kě)以(yǐ)明(míng)确計(jì)數器cnt0的(de)加1条(tiáo)件(jiàn)为(wèi)“flag_add==1”。

图(tú)3.4-17補充加1条(tiáo)件(jiàn)flag_add
确定(dìng)好(hǎo)cnt0的(de)加1条(tiáo)件(jiàn)和(hé)計(jì)數數量(liàng)後(hòu),就(jiù)開(kāi)始進(jìn)行代(dài)碼編写,以(yǐ)往都是(shì)一(yī)行行的(de)輸入(rù)相應(yìng)代(dài)碼。但是(shì)至(zhì)簡設計(jì)法有(yǒu)一(yī)个(gè)小技巧,可(kě)以(yǐ)节(jié)省(shěng)代(dài)碼編写时(shí)間(jiān)的(de)同(tóng)时(shí)在(zài)一(yī)定(dìng)程度(dù)上(shàng)降低了(le)代(dài)碼的(de)出(chū)錯率。至(zhì)簡設計(jì)法将日(rì)常代(dài)碼中(zhōng)常用(yòng)到(dào)的(de)固定(dìng)部(bù)分(fēn)制作成(chéng)模板,進(jìn)行代(dài)碼編程时(shí)可(kě)以(yǐ)調用(yòng)相應(yìng)模板後(hòu)根(gēn)據(jù)邏輯輸入(rù)对(duì)應(yìng)設計(jì)的(de)變(biàn)量(liàng)将代(dài)碼補充完整。这(zhè)里(lǐ)就(jiù)可(kě)以(yǐ)用(yòng)模板編写計(jì)數器代(dài)碼,感(gǎn)受一(yī)下(xià)这(zhè)个(gè)炫酷的(de)功能(néng)。
打(dǎ)開(kāi)GVIM工具,在(zài)命令模式下(xià)輸入(rù)“:Mdyjsq”後(hòu)點(diǎn)擊回(huí)車,調出(chū)对(duì)應(yìng)模板如(rú)下(xià)图(tú)所(suǒ)示。

图(tú)3.4-18至(zhì)簡設計(jì)法調用(yòng)計(jì)數器代(dài)碼模板
通(tòng)过(guò)上(shàng)文(wén)分(fēn)析可(kě)知,cnt0的(de)加1条(tiáo)件(jiàn)是(shì)“flag_add==1”,計(jì)數數量(liàng)为(wèi)5208。将其填入(rù)到(dào)模板中(zhōng),可(kě)以(yǐ)得到(dào)完整正(zhèng)确的(de)計(jì)數器cnt0代(dài)碼如(rú)下(xià):
下(xià)面(miàn)来(lái)設計(jì)計(jì)數器cnt1,該計(jì)數器用(yòng)于(yú)表(biǎo)示數到(dào)第(dì)幾(jǐ)比特(tè),每个(gè)比特(tè)結束(shù),即“end_cnt0”时(shí),cnt1就(jiù)会(huì)加1。因(yīn)此(cǐ)cnt1的(de)加1条(tiáo)件(jiàn)是(shì):end_cnt0。通(tòng)过(guò)設計(jì)目标(biāo)中(zhōng)可(kě)知cnt1的(de)計(jì)數數量(liàng)为(wèi)9。打(dǎ)開(kāi)GVIM,繼續調用(yòng)模板,在(zài)命令模式下(xià)輸入(rù)“:Mdyjsq”,點(diǎn)擊回(huí)車。将“add_cnt1”和(hé)“end_cnt1”補充完整,得到(dào)cnt1的(de)代(dài)碼为(wèi):
在(zài)設計(jì)cnt0时(shí),考慮到(dào)其加1条(tiáo)件(jiàn)增加了(le)輔助信(xìn)号(hào)flag_add,下(xià)面(miàn)就(jiù)来(lái)思(sī)考如(rú)何設計(jì)这(zhè)一(yī)信(xìn)号(hào)。通(tòng)过(guò)分(fēn)析可(kě)知flag_add具有(yǒu)两(liǎng)个(gè)變(biàn)化(huà)點(diǎn):變(biàn)0和(hé)變(biàn)1,这(zhè)两(liǎng)種(zhǒng)變(biàn)化(huà)可(kě)以(yǐ)從功能(néng)上(shàng)進(jìn)行理解(jiě)。工程通(tòng)電(diàn)後(hòu),如(rú)果(guǒ)PC端沒(méi)有(yǒu)發(fà)送任何數據(jù),則rx_uart始終(zhōng)保持(chí)为(wèi)1,cnt0和(hé)cnt1无須計(jì)數,flag_add信(xìn)号(hào)也(yě)一(yī)直(zhí)保持(chí)为(wèi)0。當PC端要(yào)發(fà)送數據(jù)时(shí),rx_uart就(jiù)会(huì)按串口(kǒu)时(shí)序産生(shēng)變(biàn)化(huà),首先(xiān)会(huì)發(fà)送一(yī)个(gè)開(kāi)始位,即rx_uart由(yóu)1變(biàn)成(chéng)0。FPGA接收(shōu)到(dào)这(zhè)一(yī)信(xìn)号(hào)後(hòu),就(jiù)明(míng)白PC要(yào)開(kāi)始傳送數據(jù),此(cǐ)时(shí)cnt0和(hé)cnt1要(yào)計(jì)數了(le),即flag_add要(yào)變(biàn)为(wèi)1。
可(kě)以(yǐ)通(tòng)过(guò)下(xià)图(tú)来(lái)輔助分(fēn)析,可(kě)以(yǐ)看(kàn)到(dào)當rx_uart为(wèi)1时(shí),flag_add为(wèi)0,此(cǐ)时(shí)PC沒(méi)有(yǒu)發(fà)来(lái)任何數據(jù),cnt0和(hé)cnt1不(bù)計(jì)數。當rx_uart數第(dì)1比特(tè),即開(kāi)始位时(shí),即通(tòng)知FPGA準備好(hǎo)接收(shōu)數據(jù),这(zhè)时(shí)rx_uart變(biàn)0时(shí),flag_add變(biàn)1,cnt0和(hé)cnt1開(kāi)始計(jì)數。

图(tú)3.4-19确定(dìng)flag_add信(xìn)号(hào)
從上(shàng)图(tú)可(kě)以(yǐ)很容易看(kàn)出(chū):當rx_uart由(yóu)1變(biàn)0时(shí),flag_add就(jiù)由(yóu)0變(biàn)成(chéng)1。其中(zhōng),rx_uart信(xìn)号(hào)的(de)由(yóu)1變(biàn)0波(bō)動(dòng)被(bèi)稱为(wèi)下(xià)降沿,在(zài)图(tú)中(zhōng)可(kě)以(yǐ)清(qīng)晰的(de)看(kàn)出(chū)此(cǐ)时(shí)波(bō)形是(shì)下(xià)降的(de)。那(nà)麼(me)又如(rú)何得知下(xià)降沿的(de)到(dào)来(lái)呢?这(zhè)里(lǐ)就(jiù)需要(yào)引入(rù)一(yī)个(gè)邊(biān)沿檢测電(diàn)路(lù)工程来(lái)輔助設計(jì)。
檢测rx_uart的(de)下(xià)降沿需要(yào)用(yòng)到(dào)FPGA中(zhōng)的(de)邊(biān)沿檢测技術(shù)。所(suǒ)謂邊(biān)沿檢测,就(jiù)是(shì)檢测輸入(rù)信(xìn)号(hào)或(huò)FPGA內(nèi)部(bù)邏輯信(xìn)号(hào)的(de)跳變(biàn),即檢测上(shàng)升(shēng)沿或(huò)下(xià)降沿。这(zhè)一(yī)技術(shù)这(zhè)在(zài)FPGA電(diàn)路(lù)設計(jì)中(zhōng)被(bèi)廣泛應(yìng)用(yòng),其電(diàn)路(lù)图(tú)及(jí)各(gè)信(xìn)号(hào)定(dìng)義如(rú)下(xià)所(suǒ)示。

图(tú)3.4-20邊(biān)緣檢测实現(xiàn)原理图(tú)

图(tú)3.4-21各(gè)信(xìn)号(hào)定(dìng)義
可(kě)以(yǐ)看(kàn)出(chū)中(zhōng)間(jiān)信(xìn)号(hào)trigger與(yǔ)觸發(fà)器的(de)信(xìn)号(hào)輸入(rù)端D連(lián)接,将trigger信(xìn)号(hào)取(qǔ)反(fǎn)後(hòu)與(yǔ)觸發(fà)器的(de)輸出(chū)tri_ff0相與(yǔ)得到(dào)信(xìn)号(hào)neg_edge。如(rú)果(guǒ)neg_edge=1就(jiù)表(biǎo)示檢测到(dào)trigger的(de)下(xià)降沿。将觸發(fà)器的(de)輸出(chū)tri_ff0取(qǔ)反(fǎn)與(yǔ)trigger相與(yǔ)後(hòu)得到(dào)信(xìn)号(hào)pos_edge,如(rú)果(guǒ)pos_edge=1則表(biǎo)示檢测到(dào)trigger的(de)上(shàng)升(shēng)沿。利用(yòng)这(zhè)一(yī)原理可(kě)以(yǐ)画(huà)出(chū)信(xìn)号(hào)的(de)波(bō)形图(tú)如(rú)下(xià)图(tú)所(suǒ)示。

图(tú)3.4-22邊(biān)緣檢测電(diàn)路(lù)波(bō)形图(tú)
tri_ff0是(shì)觸發(fà)器的(de)輸出(chū),因(yīn)此(cǐ)tri_ff0的(de)信(xìn)号(hào)與(yǔ)trigger信(xìn)号(hào)只(zhī)是(shì)相差了(le)一(yī)个(gè)时(shí)鐘(zhōng)周期(qī)。这(zhè)里(lǐ)也(yě)可(kě)以(yǐ)这(zhè)樣(yàng)理解(jiě):每个(gè)时(shí)鐘(zhōng)上(shàng)升(shēng)沿看(kàn)到(dào)的(de)tri_ff0值实際上(shàng)是(shì)上(shàng)一(yī)个(gè)时(shí)鐘(zhōng)看(kàn)到(dào)的(de)trigger信(xìn)号(hào)值,即tri_ff0的(de)值是(shì)trigger在(zài)上(shàng)一(yī)时(shí)刻的(de)值。
以(yǐ)記(jì)录(lù)的(de)體(tǐ)重(zhòng)值为(wèi)例来(lái)幫助理解(jiě),假設第(dì)一(yī)天(tiān)的(de)體(tǐ)重(zhòng)是(shì)49kg,第(dì)二(èr)天(tiān)是(shì)50kg,第(dì)三(sān)天(tiān)是(shì)50kg,第(dì)四(sì)天(tiān)为(wèi)49kg,可(kě)以(yǐ)看(kàn)到(dào)體(tǐ)重(zhòng)值在(zài)發(fà)生(shēng)變(biàn)化(huà)。此(cǐ)时(shí)tigger信(xìn)号(hào)为(wèi)當天(tiān)記(jì)录(lù)的(de)體(tǐ)重(zhòng)值,而(ér)tri_ff0信(xìn)号(hào)为(wèi)前(qián)一(yī)天(tiān)的(de)體(tǐ)重(zhòng)值,即第(dì)二(èr)天(tiān)的(de)tigger值为(wèi)當天(tiān)體(tǐ)重(zhòng)50kg,tri_ff0值为(wèi)前(qián)一(yī)天(tiān)體(tǐ)重(zhòng)49kg,第(dì)三(sān)天(tiān)的(de)tigger值为(wèi)當天(tiān)體(tǐ)重(zhòng)50kg,tri_ff0值为(wèi)前(qián)一(yī)天(tiān)體(tǐ)重(zhòng)50kg,以(yǐ)此(cǐ)類(lèi)推。在(zài)生(shēng)活中(zhōng)将當天(tiān)的(de)體(tǐ)重(zhòng)和(hé)前(qián)一(yī)天(tiān)進(jìn)行对(duì)比就(jiù)可(kě)以(yǐ)得知體(tǐ)重(zhòng)的(de)變(biàn)化(huà),通(tòng)过(guò)两(liǎng)个(gè)信(xìn)号(hào)的(de)对(duì)比也(yě)能(néng)得知信(xìn)号(hào)的(de)變(biàn)化(huà)。比如(rú)第(dì)二(èr)天(tiān)的(de)tigger值50kg,此(cǐ)时(shí)tri_ff0为(wèi)49kg,50大于(yú)49,可(kě)以(yǐ)看(kàn)到(dào)體(tǐ)重(zhòng)上(shàng)升(shēng),对(duì)應(yìng)信(xìn)号(hào)變(biàn)化(huà)即可(kě)視作迎来(lái)了(le)一(yī)次(cì)上(shàng)升(shēng)沿。綜上(shàng)所(suǒ)述,rx_uart的(de)上(shàng)升(shēng)沿/下(xià)降沿檢测依據(jù)为(wèi)这(zhè)一(yī)刻的(de)狀态與(yǔ)上(shàng)一(yī)刻的(de)狀态有(yǒu)0到(dào)1或(huò)者(zhě)1到(dào)0的(de)變(biàn)化(huà)。
從图(tú)3.4- 22可(kě)以(yǐ)看(kàn)出(chū),第(dì)3个(gè)时(shí)鐘(zhōng)的(de)上(shàng)升(shēng)沿处trigger值为(wèi)0,而(ér)tri_ff0值为(wèi)1,即trigger的(de)值發(fà)生(shēng)了(le)從1到(dào)0的(de)變(biàn)化(huà),即迎来(lái)下(xià)降沿,此(cǐ)时(shí)neg_edge为(wèi)1。反(fǎn)之,當neg_edge的(de)值为(wèi)1,就(jiù)表(biǎo)示檢测到(dào)了(le)trigger的(de)下(xià)降沿。同(tóng)理,在(zài)第(dì)7个(gè)时(shí)鐘(zhōng)的(de)上(shàng)升(shēng)沿处trigger值为(wèi)1,而(ér)tri_ff0值为(wèi)0,此(cǐ)时(shí)pos_edge的(de)值为(wèi)1,表(biǎo)示檢测到(dào)了(le)trigger的(de)上(shàng)升(shēng)沿。
綜上(shàng)所(suǒ)述,可(kě)以(yǐ)得出(chū)Verilog实現(xiàn)邊(biān)沿檢测電(diàn)路(lù)的(de)代(dài)碼如(rú)下(xià):
3.2.2异(yì)步信(xìn)号(hào)同(tóng)步化(huà)
在(zài)邊(biān)沿檢测波(bō)形的(de)讨論中(zhōng)将trigger信(xìn)号(hào)視为(wèi)理想(xiǎng)的(de)同(tóng)步信(xìn)号(hào),即trigger滿足D觸發(fà)器的(de)建立和(hé)保持(chí)时(shí)間(jiān),这(zhè)種(zhǒng)情(qíng)況下(xià)在(zài)同(tóng)步系(xì)統中(zhōng)实現(xiàn)邊(biān)沿檢测不(bù)是(shì)問(wèn)題(tí)。但如(rú)果(guǒ)trigger信(xìn)号(hào)不(bù)是(shì)理想(xiǎng)的(de)同(tóng)步信(xìn)号(hào)(如(rú)外(wài)部(bù)按鍵信(xìn)号(hào)或(huò)是(shì)本(běn)工程的(de)rx_uart信(xìn)号(hào))时(shí),信(xìn)号(hào)的(de)變(biàn)化(huà)由(yóu)外(wài)部(bù)傳輸指令給(gěi)FPGA,对(duì)于(yú)FPGA来(lái)说(shuō)这(zhè)些信(xìn)号(hào)什麼(me)时(shí)候産生(shēng)變(biàn)化(huà)是(shì)完全(quán)随機(jī)的(de)。因(yīn)此(cǐ),很可(kě)能(néng)出(chū)現(xiàn)信(xìn)号(hào)在(zài)时(shí)鐘(zhōng)上(shàng)升(shēng)沿發(fà)生(shēng)變(biàn)化(huà),无法滿足觸發(fà)器的(de)建立时(shí)間(jiān)和(hé)保持(chí)时(shí)間(jiān)要(yào)求,從而(ér)出(chū)現(xiàn)亞稳态,導致(zhì)系(xì)統崩潰。詳细(xì)原因(yīn)可(kě)以(yǐ)參看(kàn)至(zhì)簡設計(jì)法D觸發(fà)器中(zhōng)亞稳态一(yī)节(jié)的(de)相關(guān)內(nèi)容。根(gēn)據(jù)这(zhè)一(yī)結論,本(běn)設計(jì)需要(yào)对(duì)輸入(rù)的(de)信(xìn)号(hào)延遲两(liǎng)拍即先(xiān)用(yòng)两(liǎng)个(gè)觸發(fà)器寄存後(hòu)再進(jìn)行使用(yòng)。如(rú)下(xià)图(tú)所(suǒ)示,用(yòng)2个(gè)觸發(fà)器对(duì)信(xìn)号(hào)進(jìn)行寄存,确定(dìng)了(le)信(xìn)号(hào)的(de)稳定(dìng)性(xìng),然後(hòu)再進(jìn)行邊(biān)沿檢测,滿足了(le)同(tóng)步系(xì)統中(zhōng)实現(xiàn)邊(biān)沿檢测的(de)需求。

图(tú)3.4-23异(yì)步信(xìn)号(hào)同(tóng)步化(huà)電(diàn)路(lù)图(tú)
因(yīn)此(cǐ),在(zài)邊(biān)沿檢测代(dài)碼設計(jì)前(qián)需要(yào)先(xiān)对(duì)觸發(fà)器進(jìn)行設計(jì)。假設輸入(rù)的(de)信(xìn)号(hào)trigger不(bù)是(shì)同(tóng)步信(xìn)号(hào),則該信(xìn)号(hào)需要(yào)用(yòng)2个(gè)觸發(fà)器進(jìn)行寄存,得到(dào)信(xìn)号(hào)tri_ff0和(hé)tri_ff1。需要(yào)特(tè)别注意(yì)的(de)是(shì),在(zài)第(dì)一(yī)个(gè)觸發(fà)器階(jiē)段(duàn),信(xìn)号(hào)依旧(jiù)存在(zài)亞稳态的(de)情(qíng)況,因(yīn)此(cǐ)tri_ff0絕对(duì)不(bù)可(kě)以(yǐ)作为(wèi)条(tiáo)件(jiàn)使用(yòng),只(zhī)能(néng)以(yǐ)信(xìn)号(hào)tri_ff1作为(wèi)条(tiáo)件(jiàn)。得到(dào)同(tóng)步信(xìn)号(hào)後(hòu)用(yòng)寄存器寄存,得到(dào)信(xìn)号(hào)tri_ff2,根(gēn)據(jù)tri_ff1和(hé)tri_ff2就(jiù)可(kě)以(yǐ)得到(dào)邊(biān)沿檢测結果(guǒ)。即當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)效,其具體(tǐ)代(dài)碼如(rú)下(xià):
綜上(shàng)所(suǒ)述,如(rú)果(guǒ)輸入(rù)信(xìn)号(hào)是(shì)异(yì)步信(xìn)号(hào),需要(yào)先(xiān)对(duì)其進(jìn)行同(tóng)步化(huà)之後(hòu)再做檢测,即通(tòng)过(guò)延遲两(liǎng)拍的(de)方(fāng)式实現(xiàn)信(xìn)号(hào)的(de)同(tóng)步化(huà),再通(tòng)过(guò)延遲一(yī)拍的(de)方(fāng)式实現(xiàn)邊(biān)沿檢测電(diàn)路(lù)。反(fǎn)之,如(rú)果(guǒ)輸入(rù)信(xìn)号(hào)本(běn)身(shēn)就(jiù)是(shì)同(tóng)步信(xìn)号(hào),則沒(méi)有(yǒu)必要(yào)進(jìn)行同(tóng)步化(huà)了(le),可(kě)以(yǐ)直(zhí)接对(duì)其進(jìn)行邊(biān)沿檢测。
回(huí)到(dào)本(běn)設計(jì)中(zhōng),此(cǐ)时(shí)需要(yào)檢测的(de)是(shì)rx_uart的(de)下(xià)降沿,并以(yǐ)此(cǐ)为(wèi)条(tiáo)件(jiàn)拉高(gāo)信(xìn)号(hào)flag_add。由(yóu)于(yú)PC端随機(jī)地(dì)給(gěi)FPGA發(fà)送數據(jù),其發(fà)送时(shí)刻是(shì)不(bù)确定(dìng)的(de),因(yīn)此(cǐ)本(běn)設計(jì)中(zhōng)rx_uart是(shì)异(yì)步信(xìn)号(hào)。根(gēn)據(jù)邊(biān)緣檢测的(de)設計(jì)方(fāng)法,此(cǐ)时(shí)需先(xiān)将rx_uart進(jìn)行同(tóng)步化(huà)後(hòu)再对(duì)其進(jìn)行下(xià)降沿檢测。其具體(tǐ)設計(jì)代(dài)碼如(rú)下(xià):
如(rú)此(cǐ)一(yī)来(lái),flag_add變(biàn)1的(de)条(tiáo)件(jiàn)就(jiù)變(biàn)成(chéng):rx_uart_ff1==0&& rx_uart_ff2==1。
确定(dìng)flag_add變(biàn)1条(tiáo)件(jiàn)後(hòu),再来(lái)讨論一(yī)下(xià)其變(biàn)0的(de)条(tiáo)件(jiàn)。當完成(chéng)9比特(tè)數據(jù)的(de)傳輸後(hòu),flag_add的(de)值變(biàn)为(wèi)0,不(bù)再計(jì)數。因(yīn)此(cǐ),其變(biàn)0条(tiáo)件(jiàn)为(wèi)end_cnt1。根(gēn)據(jù)以(yǐ)上(shàng)分(fēn)析可(kě)以(yǐ)得到(dào)flag_add的(de)代(dài)碼如(rú)下(xià)。
下(xià)面(miàn)来(lái)設計(jì)data信(xìn)号(hào),根(gēn)據(jù)串口(kǒu)时(shí)序可(kě)知,該信(xìn)号(hào)的(de)值来(lái)自(zì)下(xià)图(tú)中(zhōng)第(dì)2~第(dì)9比特(tè)的(de)值。其中(zhōng)第(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ú)3.4-24串口(kǒu)通(tòng)信(xìn)实現(xiàn)架構图(tú)【去(qù)掉ns】
由(yóu)于(yú)每一(yī)个(gè)比特(tè)都会(huì)持(chí)續5208个(gè)时(shí)鐘(zhōng)周期(qī),因(yīn)此(cǐ)必須選定(dìng)一(yī)个(gè)具體(tǐ)时(shí)刻来(lái)将值賦給(gěi)data。此(cǐ)处可(kě)能(néng)会(huì)有(yǒu)这(zhè)樣(yàng)的(de)疑慮:直(zhí)接在(zài)每个(gè)比特(tè)計(jì)數結束(shù)的(de)时(shí)刻,即在(zài)end_cnt0的(de)时(shí)刻賦值不(bù)就(jiù)可(kě)以(yǐ)了(le)麼(me)?然而(ér)实際上(shàng),这(zhè)一(yī)时(shí)刻并不(bù)可(kě)取(qǔ)。end_cnt0的(de)时(shí)刻在(zài)下(xià)图(tú)中(zhōng)用(yòng)點(diǎn)表(biǎo)示出(chū)来(lái),此(cǐ)时(shí)的(de)5208个(gè)时(shí)鐘(zhōng)周期(qī)是(shì)理想(xiǎng)、估算的(de)數值,而(ér)在(zài)实際計(jì)算中(zhōng)很有(yǒu)可(kě)能(néng)出(chū)現(xiàn)偏差,如(rú)果(guǒ)在(zài)end_cnt0的(de)时(shí)候取(qǔ)值,就(jiù)有(yǒu)可(kě)能(néng)会(huì)出(chū)現(xiàn)錯誤。
图(tú)3.4-25邊(biān)緣取(qǔ)值方(fāng)法【去(qù)掉ns】
因(yīn)此(cǐ),最(zuì)保险的(de)做法是(shì)在(zài)中(zhōng)間(jiān)點(diǎn)取(qǔ)值,如(rú)下(xià)图(tú)所(suǒ)示。在(zài)这(zhè)種(zhǒng)取(qǔ)值方(fāng)法下(xià),即使有(yǒu)較多(duō)的(de)偏差,也(yě)不(bù)会(huì)影響到(dào)采樣(yàng)的(de)正(zhèng)确性(xìng)。

图(tú)3.4-26中(zhōng)間(jiān)取(qǔ)值的(de)方(fāng)法
綜上(shàng)所(suǒ)述,本(běn)設計(jì)在(zài)cnt0計(jì)數到(dào)一(yī)半时(shí)将采到(dào)的(de)當前(qián)rx_uart值賦給(gěi)led,其中(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]。将其用(yòng)代(dài)碼的(de)形式表(biǎo)現(xiàn)出(chū)来(lái)則为(wèi):當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]。其具體(tǐ)代(dài)碼如(rú)下(xià)所(suǒ)示。
对(duì)以(yǐ)上(shàng)代(dài)碼進(jìn)行优化(huà),可(kě)簡写为(wèi):
在(zài)進(jìn)行設計(jì)时(shí),通(tòng)常是(shì)首先(xiān)想(xiǎng)到(dào)实現(xiàn)功能(néng),所(suǒ)以(yǐ)会(huì)先(xiān)写出(chū)第(dì)一(yī)段(duàn)的(de)优化(huà)前(qián)代(dài)碼。在(zài)功能(néng)实現(xiàn)的(de)前(qián)提(tí)下(xià),再考慮有(yǒu)沒(méi)有(yǒu)优化(huà)空間(jiān),從而(ér)对(duì)其進(jìn)行优化(huà)得到(dào)第(dì)二(èr)段(duàn)代(dài)碼。設計(jì)过(guò)程中(zhōng),好(hǎo)的(de)代(dài)碼也(yě)是(shì)这(zhè)樣(yàng)一(yī)步步优化(huà)出(chū)来(lái)的(de)。至(zhì)此(cǐ),主(zhǔ)體(tǐ)程序已經(jīng)完成(chéng)。
3.3 信(xìn)号(hào)定(dìng)義
下(xià)面(miàn)需要(yào)将module補充完整,首先(xiān)来(lái)定(dìng)義信(xìn)号(hào)類(lèi)型。reg和(hé)wire的(de)判斷很容易搞不(bù)清(qīng)楚總(zǒng)会(huì)有(yǒu)其餘的(de)聯想(xiǎng),比如(rú)認为(wèi)reg就(jiù)是(shì)寄存器,wire是(shì)線(xiàn);或(huò)者(zhě)認为(wèi)reg的(de)会(huì)綜合成(chéng)寄存器,wire不(bù)会(huì)綜合成(chéng)寄存器。但是(shì)这(zhè)些其实和(hé)reg型還(huán)是(shì)wire型都是(shì)沒(méi)有(yǒu)關(guān)系(xì)的(de),因(yīn)此(cǐ)在(zài)信(xìn)号(hào)類(lèi)型判斷时(shí)不(bù)需要(yào)做任何的(de)聯想(xiǎng),只(zhī)要(yào)記(jì)住一(yī)个(gè)規則“用(yòng)always实現(xiàn)的(de)是(shì)reg型,其他(tā)都是(shì)wire型”就(jiù)可(kě)以(yǐ)了(le)。
cnt0是(shì)用(yòng)always産生(shēng)的(de)信(xìn)号(hào),因(yīn)此(cǐ)類(lèi)型为(wèi)reg。根(gēn)據(jù)前(qián)文(wén)分(fēn)析可(kě)知,該計(jì)數器計(jì)數的(de)最(zuì)大值为(wèi)5208,因(yīn)此(cǐ)需要(yào)用(yòng)13根(gēn)線(xiàn)表(biǎo)示,即位宽(kuān)是(shì)13位。
關(guān)于(yú)信(xìn)号(hào)位宽(kuān)的(de)獲取(qǔ),至(zhì)簡設計(jì)法在(zài)此(cǐ)分(fēn)享一(yī)个(gè)非(fēi)常实用(yòng)的(de)技巧:打(dǎ)開(kāi)計(jì)算器,點(diǎn)擊“查看(kàn)”,選擇“程序員”模式,在(zài)“十(shí)進(jìn)制”下(xià)将信(xìn)号(hào)值輸入(rù),就(jiù)会(huì)獲得对(duì)應(yìng)的(de)信(xìn)号(hào)位宽(kuān),如(rú)下(xià)图(tú)所(suǒ)示,将計(jì)數器的(de)最(zuì)大值5208輸入(rù),可(kě)以(yǐ)看(kàn)出(chū)其位宽(kuān)为(wèi)13。

图(tú)3.4-27通(tòng)过(guò)計(jì)算器獲取(qǔ)信(xìn)号(hào)位宽(kuān)
綜上(shàng)所(suǒ)述,cnt0的(de)信(xìn)号(hào)定(dìng)義代(dài)碼如(rú)下(xià):
cnt1也(yě)是(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位。編輯模式下(xià)輸入(rù)“Reg4”調用(yòng)至(zhì)簡設計(jì)法模板,補充完整後(hòu)得到(dào)代(dài)碼表(biǎo)示如(rú)下(xià):
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,用(yòng)1根(gēn)線(xiàn)表(biǎo)示即可(kě)。編輯模式下(xià)輸入(rù)“Wire1”調用(yòng)模板,得到(dào)代(dài)碼表(biǎo)示如(rú)下(xià):
add_cnt1和(hé)end_cnt1也(yě)是(shì)用(yòng)assign方(fāng)式設計(jì)的(de),因(yīn)此(cǐ)類(lèi)型为(wèi)wire。其值是(shì)0或(huò)者(zhě)1,用(yòng)1根(gēn)線(xiàn)表(biǎo)示即可(kě),其代(dài)碼如(rú)下(xià):
flag_add是(shì)用(yòng)always方(fāng)式設計(jì)的(de),因(yīn)此(cǐ)類(lèi)型为(wèi)reg。其值是(shì)0或(huò)者(zhě)1,用(yòng)1根(gēn)線(xiàn)表(biǎo)示即可(kě)。編輯模式下(xià)輸入(rù)“Reg1”調用(yòng)模板,得到(dào)代(dài)碼如(rú)下(xià):
rx_uart_ff0、rx_uart_ff1和(hé)rx_uart_ff2也(yě)都是(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ě)。編輯模式下(xià)輸入(rù)“Reg1”調用(yòng)模板,得到(dào)代(dài)碼表(biǎo)示如(rú)下(xià):
至(zhì)此(cǐ),整个(gè)代(dài)碼的(de)設計(jì)工作已經(jīng)完成(chéng),完整的(de)工程代(dài)碼如(rú)下(xià):
4.1 新建工程
打(dǎ)開(kāi)软(ruǎn)件(jiàn)Quartus Ⅱ,點(diǎn)擊“File”下(xià)拉列表(biǎo)中(zhōng)的(de)New ProjectWzard...新建工程選項,如(rú)下(xià)图(tú)所(suǒ)示。

图(tú)3.4-28Quartus新建工程
然後(hòu)会(huì)出(chū)現(xiàn)Quartus新建工程介紹,如(rú)下(xià)图(tú)所(suǒ)示,直(zhí)接點(diǎn)擊“Next”。

图(tú)3.4-29Quartus新建工程介紹
此(cǐ)时(shí)会(huì)出(chū)現(xiàn)的(de)是(shì)工程文(wén)件(jiàn)夾、工程名、頂层模块(kuài)名設置界面(miàn),如(rú)图(tú)3.4-30所(suǒ)示。設置目录(lù)为(wèi):D:/mdy_book/uart,工程名和(hé)頂层名为(wèi)uart。这(zhè)里(lǐ)再次(cì)強(qiáng)調,为(wèi)了(le)避免初学者(zhě)使用(yòng)过(guò)程中(zhōng)出(chū)現(xiàn)報錯情(qíng)況,強(qiáng)烈建議按照本(běn)書(shū)的(de)工程名和(hé)文(wén)件(jiàn)名進(jìn)行設置,設置完成(chéng)後(hòu)點(diǎn)擊“Next”。

图(tú)3.4-30QUARTUS新建工程設置名稱
新建工程類(lèi)型設置選擇“Empty project”,如(rú)下(xià)图(tú)所(suǒ)示,然後(hòu)點(diǎn)擊“Next”。

图(tú)3.4-31QUARTUS新建工程類(lèi)型
文(wén)件(jiàn)添加界面(miàn)如(rú)图(tú)3.4- 32所(suǒ)示,點(diǎn)擊右(yòu)側的(de)“Add”按鈕,選擇之前(qián)写好(hǎo)的(de)“uart.v”文(wén)件(jiàn),可(kě)以(yǐ)看(kàn)到(dào)界面(miàn)下(xià)方(fāng)会(huì)顯示出(chū)文(wén)件(jiàn),随後(hòu)點(diǎn)擊“Next”。

图(tú)3.4-32QUARTUS添加文(wén)件(jiàn)
芯片(piàn)型号(hào)選擇界面(miàn)如(rú)图(tú)3.4- 33所(suǒ)示,選擇“Cyclone ⅣE”,在(zài)芯片(piàn)型号(hào)選擇处選擇“EP4CE15F23C8”,之後(hòu)點(diǎn)擊“Next”。

图(tú)3.4-33QUARTUS選擇芯片(piàn)型号(hào)
图(tú)3.4- 34为(wèi)QUARTUS設置工具界面(miàn),不(bù)必做任何修改,直(zhí)接點(diǎn)擊“Next”即可(kě)。

图(tú)3.4-34QUARTUS設置工具界面(miàn)
下(xià)图(tú)可(kě)以(yǐ)看(kàn)到(dào)新建工程的(de)彙總(zǒng)情(qíng)況,點(diǎn)擊“Finish”,完成(chéng)新建工程。

图(tú)3.4-35QUARTUS新建工程彙總(zǒng)界面(miàn)
4.2 綜合
新建工程步驟完成(chéng)後(hòu),就(jiù)会(huì)出(chū)現(xiàn)如(rú)下(xià)所(suǒ)示的(de)QUARTUS界面(miàn)。

图(tú)3.4-36QUARTUS新建工程後(hòu)界面(miàn)
點(diǎn)擊編譯按鈕,可(kě)以(yǐ)对(duì)整个(gè)工程進(jìn)行編譯。編譯成(chéng)功的(de)界面(miàn),如(rú)图(tú)3.4- 37所(suǒ)示。

图(tú)3.4-37QUARTUS編譯後(hòu)界面(miàn)
4.3 配置管(guǎn)脚
下(xià)面(miàn)需要(yào)对(duì)相應(yìng)管(guǎn)脚進(jìn)行配置。如(rú)下(xià)图(tú)所(suǒ)示,在(zài)菜單欄中(zhōng)選中(zhōng)“Assignments”,然後(hòu)選擇“Pin Planner”,就(jiù)会(huì)弹出(chū)配置管(guǎn)脚的(de)窗(chuāng)口(kǒu)。

图(tú)3.4-38QUARTUS配置管(guǎn)脚選項
在(zài)配置窗(chuāng)口(kǒu)最(zuì)下(xià)方(fāng)中(zhōng)的(de)“location”一(yī)列,參考信(xìn)号(hào)和(hé)管(guǎn)脚關(guān)系(xì),按照表(biǎo)3.4- 1中(zhōng)最(zuì)右(yòu)两(liǎng)列配置好(hǎo)FPGA管(guǎn)脚。配置管(guǎn)理来(lái)源參見(jiàn)管(guǎn)脚配置环(huán)节(jié),配置結果(guǒ)如(rú)图(tú)3.4- 39所(suǒ)示。配置完成(chéng)後(hòu),關(guān)閉“PinPlanner”,软(ruǎn)件(jiàn)自(zì)動(dòng)会(huì)保存管(guǎn)脚配置信(xìn)息。
表(biǎo)3.4 - 1信(xìn)号(hào)和(hé)管(guǎn)脚關(guān)系(xì)

图(tú)3.4-39 QUARTUS配置管(guǎn)脚
4.4 再次(cì)綜合
再次(cì)打(dǎ)開(kāi)“QUARTUS”软(ruǎn)件(jiàn),在(zài)菜單欄中(zhōng)選中(zhōng)“Processing”,然後(hòu)選擇“StartCompilation”,再次(cì)对(duì)整个(gè)工程進(jìn)行編譯和(hé)綜合,如(rú)下(xià)图(tú)所(suǒ)示。

图(tú)3.4-40QUARTUS編譯選項
當出(chū)現(xiàn)如(rú)下(xià)所(suǒ)示的(de)編譯成(chéng)功标(biāo)志时(shí),说(shuō)明(míng)編譯綜合成(chéng)功。

图(tú)3.4-41QUARTUS編譯成(chéng)功标(biāo)志
4.5 連(lián)接開(kāi)發(fà)板
完成(chéng)編譯後(hòu)開(kāi)始進(jìn)行上(shàng)板調試操作,按照下(xià)图(tú)的(de)方(fāng)式,将下(xià)载器接入(rù)電(diàn)腦USB接口(kǒu),接上(shàng)開(kāi)發(fà)板電(diàn)源後(hòu)按下(xià)開(kāi)發(fà)板下(xià)方(fāng)藍(lán)色(sè)開(kāi)關(guān),硬(yìng)件(jiàn)連(lián)接完畢。

图(tú)3.4-42開(kāi)發(fà)板連(lián)接图(tú)
4.6 上(shàng)板
打(dǎ)開(kāi)QUARTUS界面(miàn),單擊界面(miàn)中(zhōng)的(de) ,弹出(chū)配置界面(miàn)。點(diǎn)擊“add file”添加“.sof”文(wén)件(jiàn),點(diǎn)擊“Start”,会(huì)在(zài)“Progress”出(chū)現(xiàn)顯示進(jìn)度(dù)。

图(tú)3.4-43QUARTUS界面(miàn)
當進(jìn)度(dù)条(tiáo)到(dào)100%时(shí)提(tí)示成(chéng)功,即表(biǎo)示上(shàng)板結束(shù)。

图(tú)3.4-44QUARTUS下(xià)载程序界面(miàn)
4.7 串口(kǒu)調試
開(kāi)發(fà)板連(lián)接完成(chéng)後(hòu)按下(xià)電(diàn)源鍵,随後(hòu)打(dǎ)開(kāi)電(diàn)腦的(de)設備管(guǎn)理器,确認串口(kǒu)的(de)端口(kǒu)号(hào)。從下(xià)图(tú)可(kě)以(yǐ)看(kàn)出(chū),當前(qián)串口(kǒu)的(de)端口(kǒu)号(hào)为(wèi)COM3。

图(tú)3.4-45設備管(guǎn)理器顯示端口(kǒu)号(hào)
前(qián)文(wén)提(tí)供了(le)串口(kǒu)調試工具下(xià)载地(dì)址,安(ān)裝(zhuāng)完成(chéng)後(hòu),打(dǎ)開(kāi)串口(kǒu)調試助手(shǒu),其界面(miàn)如(rú)下(xià)图(tú)所(suǒ)示。在(zài)操作界面(miàn)進(jìn)行設置:在(zài)串口(kǒu)選項中(zhōng)選擇端口(kǒu)号(hào),这(zhè)里(lǐ)要(yào)注意(yì)端口(kǒu)号(hào)的(de)選擇需要(yào)與(yǔ)設備管(guǎn)理器中(zhōng)端口(kǒu)号(hào)顯示一(yī)致(zhì),即为(wèi)“COM3”;波(bō)特(tè)率選項選擇“9600”;校(xiào)验(yàn)位選項選擇“无校(xiào)验(yàn)位”;數據(jù)位選項選擇“8”;停止位選項選擇“2”;注意(yì)一(yī)定(dìng)要(yào)勾選“十(shí)六(liù)進(jìn)制顯示”和(hé)“十(shí)六(liù)進(jìn)制發(fà)送”两(liǎng)个(gè)選項:

图(tú)3.4-46串口(kǒu)調試助手(shǒu)界面(miàn)
設置好(hǎo)串口(kǒu)助手(shǒu)後(hòu),就(jiù)可(kě)以(yǐ)观察發(fà)送數據(jù)的(de)現(xiàn)象(xiàng)。在(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)點(diǎn)擊手(shǒu)動(dòng)發(fà)送,即可(kě)在(zài)開(kāi)發(fà)板上(shàng)观察到(dào)相應(yìng)的(de)現(xiàn)象(xiàng)。可(kě)以(yǐ)嘗試發(fà)送不(bù)同(tóng)的(de)指令,看(kàn)是(shì)否可(kě)以(yǐ)得到(dào)相應(yìng)的(de)LED燈(dēng)變(biàn)化(huà)效果(guǒ)。特(tè)别要(yào)注意(yì)的(de)是(shì),指令的(de)順序應(yìng)與(yǔ)小燈(dēng)亮(liàng)的(de)順序相同(tóng),如(rú)果(guǒ)两(liǎng)者(zhě)不(bù)同(tóng),則需檢查指令順序是(shì)否發(fà)生(shēng)輸入(rù)錯誤。
同(tóng)樣(yàng)这(zhè)里(lǐ)也(yě)会(huì)分(fēn)享簡化(huà)版的(de)步驟,方(fāng)便複習以(yǐ)及(jí)反(fǎn)複实操。
5.1.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)碼。
确定(dìng)頂层信(xìn)号(hào)。本(běn)工程共(gòng)需要(yào)4个(gè)信(xìn)号(hào),一(yī)个(gè)8位信(xìn)号(hào)led,时(shí)鐘(zhōng)clk,複位rst_n和(hé)串口(kǒu)輸入(rù)信(xìn)号(hào)rx_uart,工程信(xìn)号(hào)和(hé)管(guǎn)脚關(guān)系(xì)图(tú)如(rú)下(xià):
表(biǎo)3.4 - 1信(xìn)号(hào)和(hé)管(guǎn)脚關(guān)系(xì)
写出(chū)頂层信(xìn)号(hào)代(dài)碼:
聲明(míng)輸入(rù)輸出(chū)屬性(xìng):
5.1.2信(xìn)号(hào)設計(jì)
首先(xiān)進(jìn)行架構設計(jì),串口(kǒu)时(shí)序图(tú)如(rú)下(xià)所(suǒ)示:

图(tú)3.4-2串口(kǒu)时(shí)序图(tú)
串口(kǒu)通(tòng)信(xìn)实現(xiàn)架構图(tú)如(rú)下(xià):

图(tú)3.4-15串口(kǒu)通(tòng)信(xìn)实現(xiàn)架構图(tú)【去(qù)掉ns】
添加一(yī)个(gè)“flag_add”信(xìn)号(hào),從而(ér)滿足計(jì)數器的(de)加1条(tiáo)件(jiàn)。

图(tú)3.4-17補充加1条(tiáo)件(jiàn)flag_add[去(qù)掉ns]
設計(jì)計(jì)數器架構,对(duì)表(biǎo)示1比特(tè)位宽(kuān)长度(dù)的(de)計(jì)數器cnt0進(jìn)行設計(jì),其代(dài)碼如(rú)下(xià):
計(jì)算比特(tè)个(gè)數的(de)計(jì)數器cnt1的(de)設計(jì)代(dài)碼如(rú)下(xià):
rx_uart的(de)代(dài)碼如(rú)下(xià):
flag_add的(de)代(dài)碼如(rú)下(xià):
led代(dài)碼如(rú)下(xià):
至(zhì)此(cǐ),主(zhǔ)體(tǐ)程序完成(chéng),下(xià)面(miàn)将module補充完整。
定(dìng)義信(xìn)号(hào)類(lèi)型,其中(zhōng)cnt0的(de)信(xìn)号(hào)定(dìng)義如(rú)下(xià):
add_cnt0 和(hé) end_cnt0 的(de)信(xìn)号(hào)定(dìng)義如(rú)下(xià):
cnt1 的(de)信(xìn)号(hào)定(dìng)義如(rú)下(xià):
add_cnt1 和(hé) end_cnt1 的(de)信(xìn)号(hào)定(dìng)義如(rú)下(xià):
flag_add的(de)信(xìn)号(hào)定(dìng)義如(rú)下(xià):
rx_uart_ff0、rx_uart_ff1和(hé)rx_uart_ff2的(de)信(xìn)号(hào)定(dìng)義如(rú)下(xià):
至(zhì)此(cǐ),整个(gè)工程的(de)代(dài)碼的(de)設計(jì)工作已經(jīng)完成(chéng),接下(xià)来(lái)新建工程,对(duì)代(dài)碼進(jìn)行編譯綜合後(hòu)上(shàng)板查看(kàn)現(xiàn)象(xiàng)。
5.2.1新建工程
打(dǎ)開(kāi)软(ruǎn)件(jiàn)Quartus Ⅱ,點(diǎn)擊“File”下(xià)拉列表(biǎo)中(zhōng)的(de)New ProjectWzard...新建工程選項。

图(tú)3.4-28Quartus新建工程
直(zhí)接點(diǎn)擊“Next”:

图(tú)3.4-29Quartus新建工程介紹
此(cǐ)时(shí)出(chū)現(xiàn)的(de)是(shì)工程文(wén)件(jiàn)夾、工程名、頂层模块(kuài)名設置界面(miàn),完成(chéng)設置後(hòu)點(diǎn)擊“Next”:

图(tú) 3.4 - 43QUARTUS新建工程設置名稱
選擇“Empty project”後(hòu)點(diǎn)擊“Next”。

图(tú)3.4-31QUARTUS新建工程類(lèi)型
點(diǎn)擊右(yòu)側的(de)“Add”按鈕,選擇“huxiled.v”文(wén)件(jiàn)完成(chéng)添加後(hòu)點(diǎn)擊“Next”。

图(tú)3.4-32QUARTUS添加文(wén)件(jiàn)
“Device family”選項中(zhōng)選擇“Cyclone ⅣE”,“Available devices”選項下(xià)選擇“EP4CE15F23C8”,随後(hòu)點(diǎn)擊“Next”。

图(tú)3.4-33QUARTUS選擇芯片(piàn)型号(hào)
直(zhí)接點(diǎn)擊“Next”。

图(tú)3.4-34QUARTUS設置工具界面(miàn)
點(diǎn)擊“Finish”,完成(chéng)新建工程。

图(tú)3.4-35QUARTUS新建工程彙總(zǒng)界面(miàn)
5.2.2綜合
新建工程後(hòu)界面(miàn)如(rú)下(xià)图(tú)所(suǒ)示,點(diǎn)擊“編譯”。

图(tú)3.4-36QUARTUS新建工程後(hòu)界面(miàn)
編譯成(chéng)功如(rú)下(xià)图(tú)所(suǒ)示。

图(tú)3.4-37QUARTUS編譯後(hòu)界面(miàn)
5.2.3配置管(guǎn)脚
在(zài)菜單欄中(zhōng)點(diǎn)擊“Assignments”後(hòu)點(diǎn)擊“Pin Planner”,随後(hòu)会(huì)弹出(chū)配置管(guǎn)脚的(de)窗(chuāng)口(kǒu)。

图(tú)3.4-38QUARTUS配置管(guǎn)脚選項
在(zài)配置窗(chuāng)口(kǒu)“location”根(gēn)據(jù)信(xìn)号(hào)和(hé)管(guǎn)脚關(guān)系(xì)配置管(guǎn)脚,配置完成(chéng)關(guān)閉“Pin Planner”即可(kě)自(zì)動(dòng)保存配置信(xìn)息。

图(tú)3.4-39QUARTUS配置管(guǎn)脚
表(biǎo)3.4–1 信(xìn)号(hào)和(hé)管(guǎn)脚關(guān)系(xì)
5.2.4再次(cì)綜合
打(dǎ)開(kāi)“QUARTUS”软(ruǎn)件(jiàn),在(zài)菜單欄中(zhōng)選擇“Processing”,點(diǎn)擊“StartCompilation”再次(cì)進(jìn)行綜合。

图(tú)3.4-40QUARTUS編譯選項
出(chū)現(xiàn) QUARTUS 編譯成(chéng)功标(biāo)志則表(biǎo)示編譯成(chéng)功。

图(tú)3.4-41QUARTUS編譯成(chéng)功标(biāo)志
下(xià)载器接入(rù)電(diàn)腦 USB 接口(kǒu),開(kāi)發(fà)板接上(shàng)電(diàn)源後(hòu)按下(xià)藍(lán)色(sè)開(kāi)關(guān)。

图(tú)3.4-42開(kāi)發(fà)板連(lián)接图(tú)
5.2.6上(shàng)板
打(dǎ)開(kāi)QUARTUS界面(miàn),單擊“ ”图(tú)标(biāo)後(hòu)弹出(chū)配置界面(miàn)。點(diǎn)擊“add file”添加“.sof”文(wén)件(jiàn)後(hòu)點(diǎn)擊“Start”,在(zài)“Progress”中(zhōng)会(huì)顯示當前(qián)進(jìn)度(dù)。

图(tú)3.4-43QUARTUS界面(miàn)
如(rú)下(xià)图(tú)所(suǒ)示,進(jìn)度(dù)条(tiáo)顯示为(wèi)100%,提(tí)示成(chéng)功,即表(biǎo)示上(shàng)板結束(shù)。

图(tú)3.4-44QUARTUS下(xià)载程序界面(miàn)
5.2.7串口(kǒu)調試
開(kāi)發(fà)板連(lián)接完成(chéng)後(hòu),按下(xià)開(kāi)發(fà)板的(de)電(diàn)源鍵,打(dǎ)開(kāi)電(diàn)腦的(de)設備管(guǎn)理器并确認串口(kǒu)的(de)端口(kǒu)号(hào),如(rú)下(xià)图(tú)所(suǒ)示:

图(tú)3.4-45設備管(guǎn)理器顯示端口(kǒu)号(hào)
下(xià)载本(běn)書(shū)提(tí)供的(de)串口(kǒu)調試工具後(hòu),打(dǎ)開(kāi)串口(kǒu)調試助手(shǒu)。对(duì)串口(kǒu)調試助手(shǒu)進(jìn)行設置:選擇端口(kǒu)号(hào)、波(bō)特(tè)率選“9600”、校(xiào)验(yàn)位選“无校(xiào)验(yàn)位”、數據(jù)位選“8”、停止位選“2”、一(yī)定(dìng)要(yào)勾選“十(shí)六(liù)進(jìn)制顯示”和(hé)“十(shí)六(liù)進(jìn)制發(fà)送”两(liǎng)个(gè)選項。

图(tú)3.4-46串口(kǒu)調試助手(shǒu)界面(miàn)
在(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)點(diǎn)擊手(shǒu)動(dòng)發(fà)送,即可(kě)在(zài)開(kāi)發(fà)板上(shàng)观察現(xiàn)象(xiàng)。
至(zhì)此(cǐ)整个(gè)串口(kǒu)通(tòng)信(xìn)的(de)設計(jì)就(jiù)分(fēn)享完畢了(le)。在(zài)学会(huì)整个(gè)設計(jì)之後(hòu)可(kě)以(yǐ)展(zhǎn)開(kāi)思(sī)考,嘗試發(fà)送不(bù)同(tóng)的(de)指令,看(kàn)是(shì)否可(kě)以(yǐ)得到(dào)相應(yìng)的(de)LED燈(dēng)變(biàn)化(huà)效果(guǒ)。在(zài)基于(yú)原理不(bù)變(biàn)的(de)情(qíng)況下(xià)多(duō)做一(yī)些嘗試,这(zhè)樣(yàng)可(kě)以(yǐ)更(gèng)深刻的(de)掌握案(àn)例,也(yě)欢迎有(yǒu)更(gèng)好(hǎo)思(sī)路(lù)和(hé)想(xiǎng)法的(de)同(tóng)学前(qián)往至(zhì)簡設計(jì)法論壇進(jìn)行讨論。








