⁩⁣⁩⁨ ⁩⁤⁢⁢⁢⁥⁩ ⁥⁣⁦⁡ ⁣⁤⁨ ⁡⁨⁠⁤⁠ ⁦⁧⁡⁤⁣⁡⁡⁨⁤ 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ī)
您的(de)當前(qián)位置:主(zhǔ)页(yè) > 技術(shù)文(wén)章(zhāng) >

邊(biān)緣檢测工程:串口(kǒu)接收(shōu)模块(kuài)代(dài)碼解(jiě)析(附參考代(dài)碼)-明(míng)德揚科教(minyingyiyuan.com)

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



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

串口(kǒu)接收(shōu)模块(kuài)的(de)功能(néng):接收(shōu)上(shàng)位機(jī)通(tòng)过(guò)串口(kǒu)發(fà)送过(guò)来(lái)的(de)數據(jù),進(jìn)行串并轉(zhuǎn)換之後(hòu)送給(gěi)下(xià)遊模块(kuài)。

      注:串口(kǒu)波(bō)特(tè)率9600,无奇偶校(xiào)验(yàn)位。

一(yī)、設計(jì)架構

上(shàng)图(tú)是(shì)與(yǔ)上(shàng)位機(jī)通(tòng)信(xìn)的(de)串口(kǒu)的(de)时(shí)序图(tú)。我(wǒ)们(men)從图(tú)中(zhōng)可(kě)以(yǐ)獲取(qǔ)到(dào)如(rú)下(xià)關(guān)鍵信(xìn)息。

1. 串口(kǒu)數據(jù)線(xiàn)位宽(kuān)为(wèi)1bit,默認狀态下(xià)为(wèi)高(gāo)電(diàn)平。

2. 每次(cì)上(shàng)遊模块(kuài)發(fà)送數據(jù),都是(shì)先(xiān)發(fà)送1位的(de)起始位0,然後(hòu)發(fà)送8位的(de)數據(jù),最(zuì)後(hòu)是(shì)1位的(de)停止位1。

3. 1位所(suǒ)占的(de)时(shí)間(jiān),可(kě)以(yǐ)通(tòng)过(guò)波(bō)特(tè)率来(lái)計(jì)算。計(jì)算方(fāng)法如(rú)下(xià):

      波(bō)特(tè)率是(shì)指1s內(nèi)發(fà)送或(huò)接受了(le)多(duō)少(shǎo)比特(tè)數據(jù),若波(bō)特(tè)率为(wèi)9600 bit/s,則1s可(kě)以(yǐ)傳輸9600bit,那(nà)麼(me)傳輸1bit的(de)时(shí)間(jiān)为(wèi):1/9600(s)。以(yǐ)mp801開(kāi)發(fà)板为(wèi)例,时(shí)鐘(zhōng)頻率为(wèi)50M,那(nà)麼(me)發(fà)送1bit就(jiù)需要(yào)5208个(gè)时(shí)鐘(zhōng)周期(qī)。

串口(kǒu)接收(shōu)模块(kuài)采用(yòng)两(liǎng)个(gè)計(jì)數器的(de)架構,这(zhè)两(liǎng)个(gè)計(jì)數器分(fēn)别表(biǎo)示接收(shōu)1bit需要(yào)的(de)时(shí)間(jiān)和(hé)共(gòng)需要(yào)接收(shōu)多(duō)少(shǎo)bit。其結構图(tú)如(rú)下(xià)

      計(jì)數器cnt0:对(duì)接收(shōu)1bit數據(jù)需要(yào)的(de)时(shí)間(jiān)進(jìn)行計(jì)數接收(shōu)1bit需要(yào)5208个(gè)时(shí)鐘(zhōng)周期(qī)。該計(jì)數器的(de)計(jì)數周期(qī)为(wèi)5208。

      計(jì)數器cnt1:对(duì)接收(shōu)多(duō)少(shǎo)bit的(de)數據(jù)進(jìn)行計(jì)數停止位不(bù)參與(yǔ),起始位加上(shàng)數據(jù)位共(gòng)9bit。該計(jì)數器的(de)計(jì)數周期(qī)为(wèi)9


      本(běn)工程使用(yòng)了(le)檢测信(xìn)号(hào)下(xià)降沿的(de)方(fāng)法,信(xìn)号(hào)下(xià)降沿的(de)檢测方(fāng)法:

檢查uart_rx的(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)檢测。就(jiù)比如(rú)前(qián)面(miàn)uart_rx由(yóu)1變(biàn)0时(shí),就(jiù)出(chū)現(xiàn)了(le)下(xià)降沿,接着一(yī)次(cì)指令結束(shù),uart_rx由(yóu)0變(biàn)1时(shí),就(jiù)出(chū)現(xiàn)了(le)上(shàng)升(shēng)沿,邊(biān)沿檢测技術(shù)这(zhè)在(zài)FPGA電(diàn)路(lù)設計(jì)泛。電(diàn)路(lù)图(tú)如(rú)下(xià):




对(duì)應(yìng)的(de)信(xìn)号(hào)列表(biǎo)如(rú)下(xià)图(tú)所(suǒ)示:




      中(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è)原理,信(xìn)号(hào)的(de)波(bō)形图(tú)如(rú)下(xià):


Tri_ff0是(shì)觸發(fà)器的(de)輸出(chū),因(yīn)此(cǐ)tri_ff0的(de)信(xìn)号(hào)與(yǔ)trigger信(xìn)号(hào)相似,但是(shì)相差了(le)一(yī)个(gè)时(shí)鐘(zhōng)周期(qī)。我(wǒ)们(men)也(yě)可(kě)以(yǐ)理解(jiě)为(wèi):每个(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)值。
我(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)理在(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)沿。

      本(běn)模块(kuài)輸入(rù)信(xìn)号(hào)uart_rx是(shì)异(yì)步信(xìn)号(hào),异(yì)步信(xìn)号(hào)都需要(yào)經(jīng)验(yàn)同(tóng)步化(huà)後(hòu),才能(néng)够使用(yòng)。异(yì)步信(xìn)号(hào)同(tóng)步化(huà)如(rú)下(xià):
在(zài)前(qián)面(miàn)讨論邊(biān)沿檢测的(de)波(bō)形中(zhōng),我(wǒ)们(men)把trigger當做理想(xiǎng)的(de)同(tóng)步信(xìn)号(hào)来(lái)考慮,也(yě)就(jiù)是(shì)trigger滿足D觸發(fà)器的(de)建立和(hé)保持(chí)时(shí)間(jiān),在(zài)同(tóng)步系(xì)統中(zhōng)实現(xiàn)邊(biān)沿檢测不(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),以(yǐ)及(jí)本(běn)工程的(de)uart_rx信(xìn)号(hào)。这(zhè)些信(xìn)号(hào)什麼(me)时(shí)候産生(shēng)變(biàn)化(huà),是(shì)外(wài)部(bù)傳輸指令給(gěi)FPGA,对(duì)于(yú)FPGA来(lái)说(shuō)完全(quán)是(shì)随機(jī)的(de)。很有(yǒu)可(kě)能(néng)出(chū)現(xiàn),信(xìn)号(hào)在(zài)时(shí)鐘(zhōng)上(shàng)升(shēng)沿産生(shēng)變(biàn)化(huà)的(de)情(qíng)況,從而(ér)无法滿足觸發(fà)器的(de)建立时(shí)間(jiān)和(hé)保持(chí)时(shí)間(jiān)要(yào)求,出(chū)現(xiàn)亞稳态的(de)情(qíng)況,從而(ér)導致(zhì)系(xì)統崩潰。如(rú)下(xià)图(tú),我(wǒ)们(men)先(xiān)将信(xìn)号(hào)用(yòng)2个(gè)觸發(fà)器進(jìn)行了(le)寄存,确定(dìng)了(le)信(xìn)号(hào)的(de)稳定(dìng)性(xìng),然後(hòu)再進(jìn)行邊(biān)沿檢测,达(dá)成(chéng)了(le)同(tóng)步系(xì)統中(zhōng)实現(xiàn)邊(biān)沿檢测的(de)需求。


       那(nà)麼(me)邊(biān)沿檢测的(de)代(dài)碼設計(jì)就(jiù)需要(yào)先(xiān)進(jìn)行觸發(fà)器的(de)設計(jì),假設輸入(rù)的(de)信(xìn)号(hào)trigger不(bù)是(shì)同(tóng)步信(xìn)号(hào),要(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ì),在(zài)第(dì)一(yī)个(gè)觸發(fà)器階(jiē)段(duàn),信(xìn)号(hào)依旧(jiù)有(yǒu)亞稳态的(de)情(qíng)況,因(yīn)此(cǐ)tri_ff0絕对(duì)不(bù)可(kě)以(yǐ)拿来(lái)當条(tiáo)件(jiàn)使用(yòng),只(zhī)能(néng)使用(yòng)tri_ff1。接着進(jìn)行檢测邊(biān)沿,根(gēn)據(jù)前(qián)面(miàn)所(suǒ)说(shuō),得出(chū)同(tóng)步信(xìn)号(hào)後(hòu)再用(yòng)寄存器寄存,得到(dào)tri_ff2。根(gēn)據(jù)tri_ff1和(hé)tri_ff2,我(wǒ)们(men)就(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)效,代(dài)碼如(rú)下(xià):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
1

always  @(posedgeclk or negedgerst_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
[size=9.0000pt]
assign neg_edge = tri_ff1==0 && tri_ff2==1;
assign pos_edge = tri_ff1==1 && tri_ff2==0;

綜上(shàng)所(suǒ)述,如(rú)果(guǒ)進(jìn)来(lái)的(de)信(xìn)号(hào)是(shì)异(yì)步信(xìn)号(hào),那(nà)麼(me)就(jiù)需要(yào)先(xiān)進(jìn)行同(tóng)步化(huà),再做檢测,即通(tòng)过(guò)打(dǎ)两(liǎng)拍的(de)方(fāng)式,实現(xiàn)了(le)信(xìn)号(hào)的(de)同(tóng)步化(huà);再通(tòng)过(guò)打(dǎ)一(yī)拍的(de)方(fāng)式,实現(xiàn)邊(biān)沿檢测電(diàn)路(lù)。反(fǎn)之,如(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),可(kě)以(yǐ)直(zhí)接做邊(biān)沿檢测。


二(èr)、信(xìn)号(hào)的(de)意(yì)義

信(xìn)号(hào)
類(lèi)型
意(yì)義
clk
輸入(rù)信(xìn)号(hào)
时(shí)鐘(zhōng)信(xìn)号(hào)。
rst_n
輸入(rù)信(xìn)号(hào)
複位信(xìn)号(hào),低電(diàn)平有(yǒu)效。
uart_rx
輸入(rù)信(xìn)号(hào)


串口(kǒu)接收(shōu)數據(jù)線(xiàn),位宽(kuān)为(wèi)1bit,空閑时(shí)为(wèi)高(gāo)電(diàn)平,開(kāi)始接收(shōu)时(shí),

会(huì)變(biàn)为(wèi)低電(diàn)平,持(chí)續1/9600(s),然後(hòu)是(shì)數據(jù)、停止位等。


rx_data
輸出(chū)信(xìn)号(hào)
從串口(kǒu)中(zhōng)接收(shōu)到(dào)的(de)1字(zì)节(jié)數據(jù)。
rx_vld
輸出(chū)信(xìn)号(hào)


串口(kǒu)接收(shōu)數據(jù)有(yǒu)效指示信(xìn)号(hào)。當其为(wèi)高(gāo)電(diàn)平时(shí),对(duì)應(yìng)的(de)輸出(chū)rx_data有(yǒu)效,

表(biǎo)示接收(shōu)到(dào)1个(gè)字(zì)节(jié)的(de)數據(jù)。注意(yì),1个(gè)时(shí)鐘(zhōng)的(de)高(gāo)電(diàn)平表(biǎo)示接收(shōu)到(dào)1个(gè)字(zì)节(jié)數據(jù)。


uart_ff0
內(nèi)部(bù)信(xìn)号(hào)
輸入(rù)進(jìn)来(lái)的(de)uart_rx信(xìn)号(hào)寄存一(yī)拍後(hòu)的(de)信(xìn)号(hào)。
該信(xìn)号(hào)的(de)目的(de)是(shì)为(wèi)了(le)做时(shí)序同(tóng)步。
uart_ff1
內(nèi)部(bù)信(xìn)号(hào)


对(duì)uart_ff0寄存一(yī)拍後(hòu)的(de)信(xìn)号(hào)。

該信(xìn)号(hào)的(de)目的(de)是(shì)为(wèi)了(le)做时(shí)序同(tóng)步。該信(xìn)号(hào)就(jiù)是(shì)同(tóng)步化(huà)後(hòu)的(de),

可(kě)以(yǐ)使用(yòng)的(de)信(xìn)号(hào)。


uart_ff2
內(nèi)部(bù)信(xìn)号(hào)
对(duì)uart_ff1寄存一(yī)拍的(de)信(xìn)号(hào)。
該信(xìn)号(hào)的(de)目的(de),是(shì)與(yǔ)uart_ff1配合,檢测uart_ff1的(de)下(xià)降沿。
flag_add
內(nèi)部(bù)信(xìn)号(hào)


模块(kuài)处于(yú)接收(shōu)數據(jù)狀态的(de)指示信(xìn)号(hào),當其为(wèi)1时(shí),

表(biǎo)示正(zhèng)在(zài)接收(shōu)數據(jù);为(wèi)0时(shí),表(biǎo)示空閑狀态。

産生(shēng)邏輯是(shì):檢测到(dào)uart_ff1的(de)下(xià)降沿时(shí)變(biàn)高(gāo)

當接收(shōu)完整个(gè)字(zì)节(jié)數據(jù)时(shí)(計(jì)數器cnt1數完了(le)就(jiù)變(biàn)低。


cnt0
內(nèi)部(bù)信(xìn)号(hào)


对(duì)每輸入(rù)1bit數據(jù)的(de)时(shí)間(jiān)進(jìn)行計(jì)數,接收(shōu)1bit需要(yào)5208个(gè)时(shí)鐘(zhōng)周期(qī)。

該計(jì)數器的(de)計(jì)數周期(qī)为(wèi)5208。


add_cnt0
內(nèi)部(bù)信(xìn)号(hào)
計(jì)數器cnt0計(jì)數有(yǒu)效信(xìn)号(hào)。當处于(yú)处于(yú)接收(shōu)狀态时(shí),該信(xìn)号(hào)有(yǒu)效。
end_cnt0
內(nèi)部(bù)信(xìn)号(hào)


計(jì)數器cnt0的(de)結束(shù)条(tiáo)件(jiàn)接收(shōu)1bit需要(yào)5208个(gè)时(shí)鐘(zhōng)周期(qī),

所(suǒ)以(yǐ)數到(dào)5208个(gè)就(jiù)結束(shù)。


cnt1
內(nèi)部(bù)信(xìn)号(hào)


对(duì)接收(shōu)多(duō)少(shǎo)bit的(de)數據(jù)進(jìn)行計(jì)數,停止位不(bù)參與(yǔ),

起始位加上(shàng)數據(jù)位共(gòng)9bit。該計(jì)數器的(de)計(jì)數周期(qī)为(wèi)9。


add_cnt1
內(nèi)部(bù)信(xìn)号(hào)
計(jì)數器cnt1的(de)加一(yī)条(tiáo)件(jiàn)。接收(shōu)完1位(end_cnt0),就(jiù)有(yǒu)效。
end_cnt1
內(nèi)部(bù)信(xìn)号(hào)

計(jì)數器cnt1的(de)結束(shù)条(tiáo)件(jiàn),共(gòng)接收(shōu)9bit數據(jù),

所(suǒ)以(yǐ)數到(dào)9个(gè)就(jiù)結束(shù)。

add_en
內(nèi)部(bù)信(xìn)号(hào)


uart_ff1下(xià)降沿有(yǒu)效指示信(xìn)号(hào)

當檢测到(dào)接收(shōu)的(de)數據(jù)前(qián)一(yī)时(shí)刻uart_ff2为(wèi)高(gāo)電(diàn)平,

當前(qián)时(shí)刻uart_ff1为(wèi)低電(diàn)平时(shí),就(jiù)有(yǒu)效




三(sān)、參考代(dài)碼

下(xià)面(miàn)展(zhǎn)出(chū)本(běn)模块(kuài)的(de)設計(jì),欢迎進(jìn)一(yī)步交流,如(rú)果(guǒ)需要(yào)整个(gè)項目源代(dài)碼,欢迎與(yǔ)明(míng)德揚聯系(xì)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
module uart_rx(
    clk     ,
    rst_n   ,
    uart_rx ,
    rx_vld  ,
    rx_data
    );
[size=9.0000pt]

    parameter      CNT_BTL =     20'd2604;
    parameter      CNT_MID =     20'd1302;
    parameter      CNT_RX =         4'd9;
    parameter      DATA_W =         8;
[size=9.0000pt]
    input               clk             ;
    input               rst_n           ;
    input               uart_rx         ;
[size=9.0000pt]
    wire                uart_rx         ;
    output[DATA_W-1:0]  rx_data         ;
    output               rx_vld         ;
[size=9.0000pt]
    reg   [DATA_W-1:0]  rx_data         ;
    reg                 rx_vld          ;
[size=9.0000pt]
    reg                 uart_rx_ff0     ;
    reg                 uart_rx_ff1     ;
    reg                 uart_rx_ff2     ;
    reg                 flag_add_add            ;
    reg   [19:0]        cnt0            ;
    wire                add_cnt0        ;
    wire                end_cnt0        ;
[size=9.0000pt]
    reg   [3:0]         cnt1            ;
    wire                add_cnt1        ;
    wire                end_cnt1        ;
    wire                add_en          ;
[size=9.0000pt]
    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
[size=9.0000pt]
    assign add_cnt0 = flag_add[size=9.0000pt];
    assign end_cnt0 = add_cnt0 && cnt0== CNT_BTL-1;
[size=9.0000pt]
    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
[size=9.0000pt]
    assign add_cnt1 = end_cnt0;
    assign end_cnt1 = add_cnt1 && cnt1== CNT_RX-1;
[size=9.0000pt]
    always  @(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin
            uart_rx_ff0  <= 1'b1;
            uart_rx_ff1 <= 1'b1;
            uart_rx_ff2 <= 1'b1;
        end
        else begin
            uart_rx_ff0  <= uart_rx;
            uart_rx_ff1 <= uart_rx_ff0;
            uart_rx_ff2 <= uart_rx_ff1;
        end
    end
    assign  add_en = uart_rx_ff2&&~uart_rx_ff1;

    always  @(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin
            flag_add <= 1'b0;
        end
        else if(add_en)begin
            flag_add <= 1'b1;
        end
        else if(end_cnt1)begin
            flag_add <= 1'b0;
        end
    end

    always  @(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin
            rx_vld <= 1'b0;
        end
        else if(end_cnt1)begin
            rx_vld <= 1'b1;
        end
        else begin
            rx_vld <= 1'b0;
        end
    end

    always  @(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin
            rx_data <= 8'b0;
        end
        else if(cnt1!=0&&add_cnt0&&cnt0==CNT_MID-1)begin
            rx_data[cnt1-1] <= uart_rx_r2;
        end
    end

endmodule


以(yǐ)上(shàng)就(jiù)是(shì)基于(yú)FPGA的(de)邊(biān)緣檢测工程串口(kǒu)接收(shōu)模块(kuài)的(de)代(dài)碼分(fēn)享,關(guān)注明(míng)德揚獲取(qǔ)邊(biān)緣檢测工程完整的(de)源代(dài)碼!


  •   
  •   
  •   
  •  
  • FPGA教育領域第(dì)一(yī)品牌(pái)
  • 咨詢热(rè)線(xiàn):020-39002701
  • 技術(shù)交流Q群(qún):544453837
⁩⁣⁩⁨ ⁩⁤⁢⁢⁢⁥⁩ ⁥⁣⁦⁡ ⁣⁤⁨ ⁡⁨⁠⁤⁠ ⁦⁧⁡⁤⁣⁡⁡⁨⁤ 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⁥⁠⁢

⁧⁨⁥⁨