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

【案(àn)例】串口(kǒu)回(huí)环(huán)工程

發(fà)布(bù)时(shí)間(jiān):2023-04-13   作者(zhě):admin 浏覽量(liàng):
【上(shàng)板現(xiàn)象(xiàng)】

串口(kǒu)回(huí)环(huán)工程現(xiàn)象(xiàng):  https://www.bilibili.com/BV1Af4y117H4?p=18


【設計(jì)教程】



至(zhì)簡設計(jì)系(xì)列_串口(kǒu)回(huí)环(huán)工程

--作者(zhě):小黑(hēi)同(tóng)学

本(běn)案(àn)例的(de)編号(hào)为(wèi):000900000237,如(rú)果(guǒ)有(yǒu)疑問(wèn),請按編号(hào)在(zài)下(xià)面(miàn)贴子查找(zhǎo)答(dá)案(àn):MDY案(àn)例交流【彙總(zǒng)贴】_FPGA-明(míng)德揚科教 (minyingyiyuan.com)


 

本(běn)文(wén)为(wèi)明(míng)德揚原創及(jí)录(lù)用(yòng)文(wén)章(zhāng),轉(zhuǎn)载請注明(míng)出(chū)处

1.1 總(zǒng)體(tǐ)設計(jì)1.1.1 概述
     串行接口(kǒu)簡稱串口(kǒu),也(yě)稱串行通(tòng)訊接口(kǒu)或(huò)者(zhě)串行通(tòng)信(xìn)接口(kǒu),是(shì)采用(yòng)串行通(tòng)信(xìn)方(fāng)式的(de)擴展(zhǎn)接口(kǒu)。串行接口(kǒu)是(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)信(xìn)方(fāng)式稱作串行通(tòng)信(xìn)。串行通(tòng)信(xìn)的(de)特(tè)點(diǎn)是(shì):數據(jù)位的(de)傳送,按位順序進(jìn)行,最(zuì)少(shǎo)只(zhī)需要(yào)一(yī)根(gēn)傳輸線(xiàn)即可(kě)完成(chéng);成(chéng)本(běn)低,但傳送速度(dù)慢(màn)。串行通(tòng)信(xìn)的(de)距離可(kě)以(yǐ)從幾(jǐ)米(mǐ)到(dào)幾(jǐ)千(qiān)米(mǐ);根(gēn)據(jù)信(xìn)息的(de)傳送方(fāng)向(xiàng),串行通(tòng)信(xìn)可(kě)以(yǐ)進(jìn)一(yī)步分(fēn)为(wèi)單工、半双(shuāng)工和(hé)全(quán)双(shuāng)工三(sān)種(zhǒ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ù)傳輸。由(yóu)于(yú)串口(kǒu)不(bù)支持(chí)热(rè)插拔及(jí)傳輸速率較低,部(bù)分(fēn)新主(zhǔ)板和(hé)大部(bù)分(fēn)便攜電(diàn)腦已開(kāi)始取(qǔ)消該接口(kǒu)。串口(kǒu)多(duō)用(yòng)于(yú)工業控制和(hé)测量(liàng)設備以(yǐ)及(jí)部(bù)分(fēn)通(tòng)信(xìn)設備中(zhōng)。

1.1.2 設計(jì)目标(biāo)
本(běn)練習要(yào)求实現(xiàn)串口(kǒu)回(huí)环(huán)功能(néng),具體(tǐ)功能(néng)要(yào)求如(rú)下(xià)
1、  上(shàng)位機(jī)于(yú)FPGA之間(jiān)通(tòng)过(guò)串口(kǒu)進(jìn)行通(tòng)信(xìn),規定(dìng)波(bō)特(tè)率为(wèi)9600,數據(jù)位为(wèi)8bit,无奇偶校(xiào)验(yàn)位,停止位为(wèi)1。
2、  FPGA內(nèi)部(bù)有(yǒu)一(yī)个(gè)可(kě)保存128字(zì)节(jié)的(de)FIFO。
3、  FPGA從上(shàng)位機(jī)接收(shōu)到(dào)數據(jù)後(hòu),将數據(jù)保存到(dào)FIFO中(zhōng)。
4、  當FIFO保存的(de)數據(jù)超过(guò)60个(gè)數據(jù)时(shí),啟動(dòng)發(fà)送數據(jù)操作:读(dú)取(qǔ)FIFO的(de)數據(jù),将數據(jù)返回(huí)給(gěi)上(shàng)位機(jī)。
5、  在(zài)啟動(dòng)發(fà)送數據(jù)操作过(guò)程中(zhōng),如(rú)果(guǒ)FIFO變(biàn)空,結束(shù)發(fà)送操作,等待下(xià)一(yī)次(cì)的(de)啟動(dòng)。
注意(yì):上(shàng)位機(jī)接收(shōu)到(dào)的(de)數據(jù)與(yǔ)發(fà)送的(de)數據(jù)相同(tóng),不(bù)能(néng)多(duō)也(yě)不(bù)能(néng)少(shǎo)。

1.1.3 系(xì)統結構框图(tú)
系(xì)統結構框图(tú)如(rú)下(xià)所(suǒ)示:


图(tú)二(èr)
1.1.4模块(kuài)功能(néng)


串口(kǒu)接收(shōu)模块(kuài)实現(xiàn)功能(néng)
1、  将輸入(rù)數據(jù)進(jìn)行同(tóng)步化(huà)处理。
2、  解(jiě)析串口(kǒu)时(shí)序,将有(yǒu)效數據(jù)進(jìn)行串并轉(zhuǎn)換。
Ø  數據(jù)处理模块(kuài)实現(xiàn)功能(néng)
1、  包(bāo)含一(yī)个(gè)FIFO,用(yòng)来(lái)存儲接收(shōu)到(dào)的(de)數據(jù)。
2、  滿足發(fà)送条(tiáo)件(jiàn)後(hòu),读(dú)出(chū)FIFO的(de)數據(jù)送給(gěi)下(xià)遊模块(kuài)。
Ø  串口(kǒu)發(fà)送模块(kuài)实現(xiàn)功能(néng)
1、  将接收(shōu)到(dào)的(de)數據(jù)進(jìn)行并串轉(zhuǎn)換,發(fà)送給(gěi)上(shàng)位機(jī)。


1.1.5頂层信(xìn)号(hào)


  
信(xìn)号(hào)名
  
接口(kǒu)方(fāng)向(xiàng)
定(dìng)義
  
clk
  
輸入(rù)
系(xì)統时(shí)鐘(zhōng),50Mhz
  
rst_n
  
輸入(rù)
低電(diàn)平複位信(xìn)号(hào)
  
rx_uart
  
輸入(rù)
1位串口(kǒu)數據(jù)接收(shōu)信(xìn)号(hào)
  
tx_uart
  
輸出(chū)
1位串口(kǒu)數據(jù)發(fà)送信(xìn)号(hào)





1.1.6
參考代(dài)碼
下(xià)面(miàn)是(shì)本(běn)工程的(de)頂层代(dài)碼:
  1. module mdyUartLoopBack(
  2.     rst_n  ,
  3.     clk    ,
  4.     rx_uart,
  5.     tx_uart
  6. );
  7. parameter               BPS          =        5208;

  8. input               rst_n       ;
  9. input               clk         ;
  10. input               rx_uart     ;
  11. output              tx_uart     ;

  12. wire  [7:0]         uart_in     ;
  13. wire                uart_in_vld ;
  14. wire  [7:0]         uart_out    ;
  15. wire                uart_out_vld;
  16. wire                rdy         ;

  17. uart_rx#(.BPS(BPS))  uart_rx(
  18.                  .clk     (clk        ),
  19.                  .rst_n   (rst_n      ),
  20.                  .din     (rx_uart    ),
  21.                  .dout    (uart_in    ),
  22.                  .dout_vld(uart_in_vld)
  23.              );
  24. uart_tx#(.BPS(BPS))  uart_tx(
  25.                  .clk     (clk         ),
  26.                  .rst_n   (rst_n       ),
  27.                  .din     (uart_out    ),
  28.                  .din_vld (uart_out_vld),
  29.                  .rdy     (rdy         ),
  30.                  .dout    (tx_uart     )
  31.              );
  32. data_handle  u_data_handle(
  33.                  .clk     (clk         ),
  34.                  .rst_n   (rst_n       ),
  35.                  .din     (uart_in     ),
  36.                  .din_vld (uart_in_vld ),
  37.                  .dout    (uart_out    ),
  38.                  .dout_vld(uart_out_vld),
  39.                  .rdy     (rdy         )   
  40.                   );         
  41.          
  42. endmodule  
複制代(dài)碼



1.2 串口(kǒu)接收(shōu)模块(kuài)設計(jì)1.2.1 接口(kǒu)信(xìn)号(hào)


  
信(xìn)号(hào)
  
接口(kǒu)方(fāng)向(xiàng)
定(dìng)義
  
clk
  
輸入(rù)
系(xì)統时(shí)鐘(zhōng)
  
rst_n
  
輸入(rù)
低電(diàn)平複位信(xìn)号(hào)
  
din
  
輸入(rù)
1bit串口(kǒu)輸入(rù)數據(jù)
  
dout
  
輸出(chū)
8bit輸出(chū)數據(jù)
  
dout_vld
  
輸出(chū)
輸出(chū)數據(jù)有(yǒu)效指示信(xìn)号(hào)



1.2.2 設計(jì)思(sī)路(lù)
UART异(yì)步串行口(kǒu)簡介
數據(jù)通(tòng)信(xìn)的(de)基本(běn)方(fāng)式可(kě)分(fēn)为(wèi)并行通(tòng)信(xìn)和(hé)串行通(tòng)信(xìn)两(liǎng)種(zhǒng):
并行通(tòng)信(xìn):是(shì)指利用(yòng)多(duō)条(tiáo)數據(jù)線(xiàn)将一(yī)个(gè)資料的(de)各(gè)位同(tóng)时(shí)傳送。特(tè)點(diǎn)是(shì)傳輸速度(dù)快(kuài),适合用(yòng)于(yú)短(duǎn)距離通(tòng)信(xìn),但要(yào)求通(tòng)信(xìn)速率較高(gāo)的(de)應(yìng)用(yòng)场合。
串行通(tòng)信(xìn):是(shì)指利用(yòng)一(yī)条(tiáo)傳輸線(xiàn)将資料一(yī)位位的(de)順序傳送。特(tè)點(diǎn)是(shì)通(tòng)信(xìn)線(xiàn)路(lù)簡單,利用(yòng)簡單的(de)線(xiàn)缆(lǎn)就(jiù)可(kě)以(yǐ)实現(xiàn)通(tòng)信(xìn),減低成(chéng)本(běn),适用(yòng)于(yú)遠(yuǎn)距離通(tòng)信(xìn),但傳輸速度(dù)慢(màn)的(de)應(yìng)用(yòng)场合。
在(zài)FPGA看(kàn)来(lái),串口(kǒu)只(zhī)有(yǒu)两(liǎng)根(gēn)線(xiàn),一(yī)根(gēn)線(xiàn)用(yòng)于(yú)接收(shōu),一(yī)根(gēn)線(xiàn)用(yòng)于(yú)發(fà)送。


Ø  UART异(yì)步串行口(kǒu)的(de)傳輸格式
异(yì)步通(tòng)信(xìn)以(yǐ)一(yī)个(gè)字(zì)符为(wèi)傳輸單位,通(tòng)信(xìn)中(zhōng)两(liǎng)个(gè)字(zì)符間(jiān)的(de)时(shí)間(jiān)間(jiān)隔是(shì)不(bù)固定(dìng)的(de),然而(ér)在(zài)同(tóng)一(yī)个(gè)字(zì)符中(zhōng)的(de)两(liǎng)个(gè)相鄰位代(dài)碼間(jiān)的(de)时(shí)間(jiān)間(jiān)隔是(shì)固定(dìng)的(de)。
通(tòng)信(xìn)協議(通(tòng)信(xìn)規程):是(shì)指通(tòng)信(xìn)双(shuāng)方(fāng)約定(dìng)的(de)一(yī)些規則。在(zài)使用(yòng)异(yì)步串行口(kǒu)傳送一(yī)个(gè)字(zì)符的(de)信(xìn)息时(shí),对(duì)資料格式有(yǒu)如(rú)下(xià)規定(dìng):規定(dìng)有(yǒu)空閑位、起始位、數據(jù)位、奇偶校(xiào)验(yàn)位、停止位。通(tòng)訊时(shí)序图(tú)如(rú)下(xià):




每一(yī)个(gè)數據(jù)位的(de)宽(kuān)度(dù)等于(yú)傳送波(bō)特(tè)率的(de)倒數。微機(jī)异(yì)步串行通(tòng)信(xìn)中(zhōng),常用(yòng)的(de)波(bō)特(tè)率为(wèi)110,150,300,600,1200,2400,4800,9600 ,19200,38400,115200等。代(dài)表(biǎo)每个(gè)碼元(yuán)傳輸的(de)速率。在(zài)二(èr)進(jìn)制數據(jù)傳輸中(zhōng),波(bō)特(tè)率和(hé)比特(tè)率相同(tóng)都是(shì)为(wèi)每个(gè)比特(tè)數據(jù)傳輸的(de)速率,其倒數为(wèi)1bit數據(jù)的(de)宽(kuān)度(dù),也(yě)就(jiù)是(shì)1bit數據(jù)持(chí)續的(de)时(shí)間(jiān)。确定(dìng)这(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ù)傳輸。

Ø  開(kāi)始前(qián),線(xiàn)路(lù)处于(yú)空閑狀态,送出(chū)連(lián)續“1”。傳送開(kāi)始时(shí)首先(xiān)發(fà)一(yī)个(gè)“0”作为(wèi)起始位,然後(hòu)出(chū)現(xiàn)在(zài)通(tòng)信(xìn)線(xiàn)上(shàng)的(de)是(shì)字(zì)符的(de)二(èr)進(jìn)制編碼數據(jù)。
Ø  每个(gè)字(zì)符的(de)數據(jù)位长可(kě)以(yǐ)約定(dìng)为(wèi)5 位、6 位、7 位或(huò)8 位。
Ø  後(hòu)面(miàn)是(shì)奇偶校(xiào)验(yàn)位,顧名思(sī)義,檢验(yàn)位适用(yòng)于(yú)數據(jù)校(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)則需要(yào)保證傳輸數據(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ì)01000011,如(rú)果(guǒ)校(xiào)验(yàn)方(fāng)式是(shì)奇校(xiào)验(yàn),則校(xiào)验(yàn)位为(wèi)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)式。
Ø  最(zuì)後(hòu)是(shì)表(biǎo)示停止位的(de)“1”信(xìn)号(hào),这(zhè)个(gè)停止位可(kě)以(yǐ)約定(dìng)持(chí)續1 位、1.5 位或(huò)2 位的(de)时(shí)間(jiān)宽(kuān)度(dù)。由(yóu)于(yú)每台(tái)設備有(yǒu)其自(zì)己的(de)时(shí)鐘(zhōng),很可(kě)能(néng)再通(tòng)信(xìn)中(zhōng)两(liǎng)台(tái)設備間(jiān)出(chū)現(xiàn)小小的(de)不(bù)同(tóng)步。因(yīn)此(cǐ)停止位不(bù)僅僅是(shì)表(biǎo)示傳輸的(de)結束(shù),并且提(tí)供一(yī)个(gè)校(xiào)正(zhèng)时(shí)鐘(zhōng)同(tóng)步的(de)機(jī)会(huì),讓從機(jī)可(kě)以(yǐ)正(zhèng)确的(de)識别下(xià)一(yī)轮數據(jù)的(de)起始位。停止位的(de)位數越多(duō),不(bù)同(tóng)时(shí)鐘(zhōng)同(tóng)步的(de)容忍程度(dù)就(jiù)越大,但是(shì)數據(jù)傳輸速率也(yě)越慢(màn)。
Ø  至(zhì)此(cǐ)一(yī)个(gè)字(zì)符傳送完畢,線(xiàn)路(lù)又進(jìn)入(rù)空閑,持(chí)續为(wèi)“1”。經(jīng)过(guò)一(yī)段(duàn)随機(jī)的(de)时(shí)間(jiān)後(hòu),下(xià)一(yī)个(gè)字(zì)符開(kāi)始傳送才又發(fà)出(chū)起始位。

Ø  架構設計(jì)
   上(shàng)位機(jī)發(fà)送的(de)數據(jù)会(huì)按照上(shàng)图(tú)所(suǒ)示串口(kǒu)的(de)时(shí)序图(tú)的(de)順序过(guò)来(lái),因(yīn)此(cǐ)我(wǒ)们(men)需要(yào)按照其对(duì)應(yìng)的(de)格式進(jìn)行接收(shōu)。發(fà)送8位數據(jù)data前(qián),串口(kǒu)接收(shōu)數據(jù)線(xiàn)会(huì)先(xiān)變(biàn)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)數據(jù)線(xiàn)会(huì)變(biàn)为(wèi)1并持(chí)續一(yī)段(duàn)时(shí)間(jiān)(結束(shù)位)。至(zhì)此(cǐ),完成(chéng)數據(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ù)。
由(yóu)上(shàng)面(miàn)时(shí)序分(fēn)析可(kě)知,當我(wǒ)们(men)檢测到(dào)數據(jù)線(xiàn)從高(gāo)電(diàn)平(空閑位)變(biàn)为(wèi)低電(diàn)平(起始位)就(jiù)表(biǎo)示開(kāi)始數據(jù)的(de)傳輸了(le),因(yīn)此(cǐ)需要(yào)進(jìn)行下(xià)降沿的(de)檢测,檢测方(fāng)法如(rú)下(xià):




該檢测方(fāng)法主(zhǔ)要(yào)利用(yòng)D觸發(fà)器打(dǎ)拍来(lái)实現(xiàn)。
din:輸入(rù)串口(kǒu)數據(jù)。
din_ff0:輸入(rù)串口(kǒu)數據(jù)經(jīng)过(guò)一(yī)級緩存之後(hòu)的(de)信(xìn)号(hào),目的(de)是(shì)为(wèi)了(le)将异(yì)步信(xìn)号(hào)同(tóng)步化(huà)。
din_ff1:輸入(rù)串口(kǒu)數據(jù)經(jīng)过(guò)二(èr)級緩存之後(hòu)的(de)信(xìn)号(hào),目的(de)是(shì)为(wèi)了(le)減少(shǎo)亞稳态造成(chéng)的(de)影響。
din_ff2:輸入(rù)串口(kǒu)數據(jù)經(jīng)过(guò)三(sān)級緩存之後(hòu)的(de)信(xìn)号(hào),目的(de)是(shì)为(wèi)了(le)檢测信(xìn)号(hào)的(de)下(xià)降沿。
flag_add:接收(shōu)狀态指示信(xìn)号(hào),當在(zài)时(shí)鐘(zhōng)上(shàng)升(shēng)沿檢测到(dào)din_ff1等于(yú)0并且din_ff2等于(yú)1的(de)时(shí)候表(biǎo)示檢测到(dào)了(le)下(xià)降沿,此(cǐ)时(shí)将flag_add信(xìn)号(hào)拉高(gāo),表(biǎo)示進(jìn)入(rù)到(dào)接收(shōu)狀态。
根(gēn)據(jù)串口(kǒu)时(shí)序,可(kě)以(yǐ)提(tí)出(chū)两(liǎng)个(gè)計(jì)數器的(de)架構,如(rú)下(xià)图(tú)所(suǒ)示:



該架構由(yóu)两(liǎng)个(gè)計(jì)數器組成(chéng):时(shí)鐘(zhōng)計(jì)數器cnt和(hé)數據(jù)計(jì)數器data_num。
时(shí)鐘(zhōng)計(jì)數器cnt:用(yòng)于(yú)計(jì)數發(fà)送1bit數據(jù)所(suǒ)需要(yào)的(de)时(shí)間(jiān),加一(yī)条(tiáo)件(jiàn)为(wèi)flag_add,表(biǎo)示進(jìn)入(rù)接收(shōu)狀态时(shí)就(jiù)開(kāi)始計(jì)數;結束(shù)条(tiáo)件(jiàn)为(wèi)數5208个(gè),開(kāi)發(fà)板晶振时(shí)鐘(zhōng)是(shì)50M,对(duì)應(yìng)周期(qī)为(wèi)20ns,每位數據(jù)的(de)持(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ī)。
數據(jù)計(jì)數器data_num:用(yòng)于(yú)对(duì)接收(shōu)的(de)每一(yī)比特(tè)數據(jù)進(jìn)行計(jì)數,加一(yī)条(tiáo)件(jiàn)为(wèi)end_cnt,表(biǎo)示接收(shōu)到(dào)1bit的(de)數據(jù)就(jiù)加一(yī);結束(shù)条(tiáo)件(jiàn)为(wèi)數9个(gè),一(yī)个(gè)起始位加上(shàng)八(bā)个(gè)數據(jù)位,共(gòng)9位,數完就(jiù)清(qīng)零(líng)。

Ø  注意(yì)事(shì)項
1、  串口(kǒu)接收(shōu)模块(kuài)中(zhōng)的(de)數據(jù)計(jì)數器一(yī)定(dìng)不(bù)要(yào)把停止位也(yě)數上(shàng)去(qù),否則在(zài)接受的(de)數據(jù)的(de)时(shí)候会(huì)出(chū)錯。感(gǎn)興趣的(de)同(tóng)学可(kě)以(yǐ)使用(yòng)signaltap抓取(qǔ)信(xìn)号(hào)進(jìn)行分(fēn)析(仿真(zhēn)沒(méi)有(yǒu)用(yòng))。
2、  由(yóu)于(yú)工程中(zhōng)串口(kǒu)的(de)每1bit數據(jù)傳輸所(suǒ)需要(yào)的(de)时(shí)間(jiān)是(shì)近(jìn)似值,也(yě)就(jiù)是(shì)存在(zài)誤差,因(yīn)此(cǐ)串口(kǒu)接收(shōu)在(zài)采集數據(jù)的(de)时(shí)候,需要(yào)在(zài)數據(jù)的(de)中(zhōng)間(jiān)时(shí)刻進(jìn)行采樣(yàng),这(zhè)樣(yàng)才能(néng)保證數據(jù)的(de)正(zhèng)确性(xìng)。

1.2.3參考代(dài)碼
下(xià)面(miàn)是(shì)使用(yòng)明(míng)德揚的(de)計(jì)數器模板等写出(chū)来(lái)的(de)本(běn)模块(kuài)代(dài)碼。

  1. always @ (posedge clk or negedge rst_n) begin
  2.         if(!rst_n) begin
  3.                 din_ff0 <= 1'b1;
  4.         din_ff1 <= 1'b1;
  5.         din_ff2 <= 1'b1;
  6.         end
  7.         else begin
  8.                 din_ff0 <= din;
  9.         din_ff1 <= din_ff0;
  10.         din_ff2 <= din_ff1;
  11.         end
  12. end

  13. always @ (posedge clk or negedge rst_n)begin
  14.         if(!rst_n) begin
  15.                 flag_add <= 1'b0;
  16.         end
  17.         else if(din_ff2 & ~din_ff1) begin               
  18.                 flag_add <= 1'b1;        
  19.         end
  20.         else if(data_num==4'd8&&end_cnt) begin               
  21.                 flag_add <= 1'b0;        
  22.         end
  23. end

  24. always @ (posedge clk or negedge rst_n)begin
  25.     if(!rst_n)begin
  26.         cnt <= 0;
  27.     end
  28.     else if(add_cnt)begin
  29.         if(end_cnt)begin
  30.             cnt <= 0;         
  31.         end
  32.         else begin
  33.             cnt <= cnt+1'b1;
  34.         end
  35.     end
  36.     else begin
  37.         cnt <= 0;
  38.     end
  39. end
  40. assign add_cnt = flag_add;
  41. assign end_cnt = add_cnt && cnt == BPS-1;



  42. always @(posedge clk or negedge rst_n) begin
  43.     if (rst_n==0) begin
  44.         data_num <= 0;
  45.     end
  46.     else if(add_data_num) begin
  47.         if(end_data_num)
  48.             data_num <= 0;
  49.         else
  50.             data_num <= data_num+1 ;
  51.    end
  52. end
  53. assign add_data_num = end_cnt;
  54. assign end_data_num = add_data_num  && data_num == 9-1 ;

  55. always @ (posedge clk or negedge rst_n)begin
  56.         if(!rst_n) begin
  57.                 dout <= 8'd0;
  58.         end
  59.         else if(add_cnt && cnt==BPS_P-1 && data_num!=0) begin               
  60.             dout<={din,{dout[7:1]}};
  61.         end
  62.     else begin
  63.         dout<=dout;
  64.     end
  65. end

  66. always @ (posedge clk or negedge rst_n)begin
  67.         if(!rst_n) begin
  68.                 dout_vld <= 1'b0;
  69.         end
  70.     else if(add_data_num && data_num == 4'd8) begin               
  71.                 dout_vld <= 1'b1;        
  72.         end
  73.         else begin        
  74.         dout_vld <= 1'b0;                        
  75.         end
  76. end
  77. endmodule
複制代(dài)碼



1.3 數據(jù)处理模块(kuài)設計(jì)1.3.1接口(kǒu)信(xìn)号(hào)


  
信(xìn)号(hào)
  
接口(kǒu)方(fāng)向(xiàng)
定(dìng)義
  
clk
  
輸入(rù)
系(xì)統时(shí)鐘(zhōng)
  
rst_n
  
輸入(rù)
低電(diàn)平複位信(xìn)号(hào)
  
din
  
輸入(rù)
輸入(rù)8bit數據(jù)信(xìn)号(hào)
  
din_vld
  
輸入(rù)
輸入(rù)數據(jù)有(yǒu)效指示信(xìn)号(hào)
  
dout
  
輸出(chū)
輸出(chū)8bit數據(jù)信(xìn)号(hào)
  
dout_vld
  
輸出(chū)
輸出(chū)數據(jù)有(yǒu)效指示信(xìn)号(hào)
  
rdy
  
輸入(rù)
下(xià)遊模块(kuài)準備好(hǎo)指示信(xìn)号(hào)



1.3.2 設計(jì)思(sī)路(lù)

FIFO原理簡介
FIFO(first input first output),即先(xiān)進(jìn)先(xiān)出(chū)的(de)數據(jù)緩存器,本(běn)質(zhì)上(shàng)還(huán)是(shì)RAM,與(yǔ)普通(tòng)存儲器的(de)區(qū)别:沒(méi)有(yǒu)外(wài)部(bù)读(dú)写地(dì)址線(xiàn),这(zhè)樣(yàng)使用(yòng)起来(lái)非(fēi)常簡單。特(tè)點(diǎn)就(jiù)是(shì)只(zhī)能(néng)順序写入(rù)數據(jù),順序读(dú)出(chū)數據(jù),其數據(jù)地(dì)址由(yóu)內(nèi)部(bù)读(dú)写指針(zhēn)自(zì)動(dòng)加一(yī)完成(chéng),不(bù)能(néng)像普通(tòng)存儲器那(nà)樣(yàng)可(kě)以(yǐ)由(yóu)地(dì)址線(xiàn)決定(dìng)读(dú)取(qǔ)或(huò)写入(rù)某个(gè)指定(dìng)的(de)地(dì)址。
FIFO根(gēn)據(jù)读(dú)写时(shí)鐘(zhōng)的(de)區(qū)别,分(fēn)为(wèi)同(tóng)步FIFO和(hé)异(yì)步FIFO。同(tóng)步FIFO读(dú)写共(gòng)用(yòng)一(yī)个(gè)相同(tóng)的(de)时(shí)鐘(zhōng);异(yì)步FIFO读(dú)写可(kě)以(yǐ)使用(yòng)不(bù)同(tóng)的(de)时(shí)鐘(zhōng)。由(yóu)于(yú)异(yì)步FIFO內(nèi)部(bù)存在(zài)同(tóng)步化(huà)電(diàn)路(lù),因(yīn)此(cǐ)資源占用(yòng)要(yào)比同(tóng)步FIFO大。
再FPGA中(zhōng),FIFO的(de)使用(yòng)主(zhǔ)要(yào)有(yǒu)两(liǎng)種(zhǒng)场合,應(yìng)用(yòng)于(yú)緩存和(hé)跨时(shí)鐘(zhōng)域处理。FIFO本(běn)身(shēn)就(jiù)是(shì)存儲器,自(zì)然可(kě)以(yǐ)用(yòng)作數據(jù)的(de)緩存,只(zhī)不(bù)过(guò)在(zài)選擇上(shàng)需要(yào)跟普通(tòng)的(de)RAM區(qū)分(fēn)開(kāi)。又由(yóu)于(yú)异(yì)步FIFO的(de)存在(zài),可(kě)以(yǐ)使得其写側和(hé)读(dú)側时(shí)鐘(zhōng)不(bù)同(tóng),因(yīn)此(cǐ)又可(kě)用(yòng)作跨时(shí)鐘(zhōng)域处理。
更(gèng)多(duō)關(guān)于(yú)FIFO的(de)內(nèi)容,可(kě)以(yǐ)關(guān)注明(míng)德揚FIFO專題(tí)課,或(huò)者(zhě)是(shì)明(míng)德揚免費的(de)FIFO課程

&#216;  架構設計(jì)
按照功能(néng)要(yào)求,本(běn)模块(kuài)需要(yào)对(duì)接收(shōu)的(de)數據(jù)進(jìn)行存儲,當存够60个(gè)的(de)时(shí)候開(kāi)始發(fà)送,下(xià)面(miàn)是(shì)本(běn)模块(kuài)的(de)架構图(tú)。

本(běn)模块(kuài)大致(zhì)分(fēn)为(wèi)三(sān)部(bù)分(fēn):FIFO的(de)写控制電(diàn)路(lù)、FIFO、FIFO的(de)读(dú)控制電(diàn)路(lù)。
写控制電(diàn)路(lù):只(zhī)要(yào)輸入(rù)數據(jù)有(yǒu)效,就(jiù)将數據(jù)写進(jìn)FIFO,主(zhǔ)要(yào)信(xìn)号(hào)为(wèi)写數據(jù)data和(hé)写使能(néng)wrreq。
FIFOip核:存儲數據(jù)。
读(dú)控制電(diàn)路(lù):當FIFO內(nèi)部(bù)有(yǒu)60个(gè)數據(jù)、FIFO非(fēi)空并且下(xià)遊模块(kuài)準備好(hǎo)接收(shōu)數據(jù)的(de)时(shí)候,就(jiù)開(kāi)始读(dú)。主(zhǔ)要(yào)信(xìn)号(hào)为(wèi)輸出(chū)數據(jù)q、FIFO有(yǒu)效數據(jù)量(liàng)指示信(xìn)号(hào)usedw、空指示信(xìn)号(hào)empty、读(dú)使能(néng)rdreq。


1.3.3
參考代(dài)碼
  1.     assign   data  = din        ;
  2.     assign   wrreq = din_vld    ;


  3.     my_fifo u_my_fifo (
  4.                       .clock(clk  ),
  5.                       .data (data ),
  6.                       .rdreq(rdreq),
  7.                       .wrreq(wrreq),
  8.                       .empty(empty),
  9.                       .q    (q    ),
  10.                       .usedw(usedw)
  11.               );

  12.   
  13.     always@(*)begin
  14.         if(rd_flag && empty==1'b0 && rdy)
  15.             rdreq = 1'b1;
  16.         else
  17.             rdreq = 1'b0;
  18.     end

  19.     always@(posedge clk or negedge rst_n)begin
  20.         if(rst_n==1'b0)begin
  21.             rd_flag <= 1'b0;
  22.         end
  23.         else if(rd_flag==1'b0 && usedw>=60) begin
  24.             rd_flag <= 1'b1;
  25.         end
  26.         else if(rd_flag==1'b1 && empty)begin
  27.             rd_flag <= 1'b0;
  28.         end
  29.     end

  30.     always  @(posedge clk or negedge rst_n)begin
  31.         if(rst_n==1'b0)begin
  32.             dout <= 0;
  33.         end
  34.         else begin
  35.             dout <= q;
  36.         end
  37.     end

  38.     always  @(posedge clk or negedge rst_n)begin
  39.         if(rst_n==1'b0)begin
  40.             dout_vld <= 1'b0;
  41.         end
  42.         else begin
  43.             dout_vld <= rdreq;
  44.         end
  45.     end


  46. endmodul
複制代(dài)碼


1.4 串口(kǒu)發(fà)送模块(kuài)設計(jì)1.4.1接口(kǒu)信(xìn)号(hào)


  
信(xìn)号(hào)
  
接口(kǒu)方(fāng)向(xiàng)
定(dìng)義
  
clk
  
輸入(rù)
系(xì)統时(shí)鐘(zhōng)
  
rst_n
  
輸入(rù)
低電(diàn)平複位信(xìn)号(hào)
  
din
  
輸入(rù)
8bit輸出(chū)數據(jù)
  
din_vld
  
輸入(rù)
輸入(rù)數據(jù)有(yǒu)效指示信(xìn)号(hào)
  
rdy
  
輸出(chū)
準備好(hǎo)接收(shōu)指示信(xìn)号(hào)
  
dout
  
輸出(chū)
1bit輸出(chū)數據(jù)



1.4.2
設計(jì)思(sī)路(lù)

串口(kǒu)發(fà)送就(jiù)是(shì)要(yào)按照串口(kǒu)的(de)时(shí)序,对(duì)數據(jù)進(jìn)行并串轉(zhuǎn)換,在(zài)介紹架構之前(qián),先(xiān)来(lái)描述一(yī)下(xià)本(běn)模块(kuài)一(yī)些重(zhòng)要(yào)的(de)信(xìn)号(hào)的(de)含義:
工作狀态指示信(xìn)号(hào)tx_flag:初始狀态为(wèi)0,表(biǎo)示处于(yú)空閑狀态,當檢测到(dào)輸入(rù)數據(jù)有(yǒu)效的(de)时(shí)候,該信(xìn)号(hào)變(biàn)为(wèi)1,表(biǎo)示处于(yú)工作狀态,當數據(jù)發(fà)送完之後(hòu),重(zhòng)新拉低,進(jìn)入(rù)空閑狀态,等待下(xià)一(yī)个(gè)數據(jù)的(de)輸入(rù)。
數據(jù)鎖存信(xìn)号(hào)tx_data_tmp:位宽(kuān)为(wèi)8bit,初始狀态为(wèi)0,當模块(kuài)处于(yú)空閑狀态,并且輸入(rù)數據(jù)有(yǒu)效的(de)时(shí)候,就(jiù)接收(shōu)輸入(rù)的(de)數據(jù)進(jìn)行鎖存。由(yóu)于(yú)輸入(rù)數據(jù)在(zài)串口(kǒu)發(fà)送的(de)时(shí)間(jiān)內(nèi)都需要(yào)用(yòng)到(dào),因(yīn)此(cǐ)为(wèi)了(le)防止數據(jù)發(fà)生(shēng)變(biàn)化(huà),導致(zhì)串口(kǒu)發(fà)送出(chū)現(xiàn)問(wèn)題(tí),所(suǒ)以(yǐ)引入(rù)此(cǐ)信(xìn)号(hào)進(jìn)行數據(jù)的(de)鎖存。
準備好(hǎo)接收(shōu)指示信(xìn)号(hào)rdy:當接收(shōu)到(dào)輸入(rù)數據(jù),或(huò)者(zhě)模块(kuài)处于(yú)發(fà)送狀态的(de)时(shí)候,此(cǐ)信(xìn)号(hào)为(wèi)1,表(biǎo)示不(bù)能(néng)接收(shōu)數據(jù),其他(tā)情(qíng)況为(wèi)1,表(biǎo)示準備好(hǎo)接收(shōu)數據(jù)了(le)。由(yóu)于(yú)上(shàng)遊模块(kuài)數據(jù)輸出(chū)速率要(yào)比串口(kǒu)發(fà)送模块(kuài)發(fà)送的(de)速度(dù)快(kuài)得多(duō),所(suǒ)以(yǐ)需要(yào)此(cǐ)信(xìn)号(hào)来(lái)控制上(shàng)遊模块(kuài)的(de)輸出(chū),當串口(kǒu)發(fà)送模块(kuài)收(shōu)到(dào)有(yǒu)效數據(jù)的(de)时(shí)候,需要(yào)立刻把此(cǐ)信(xìn)号(hào)拉高(gāo),所(suǒ)以(yǐ)需要(yào)用(yòng)組合邏輯産生(shēng)。

我(wǒ)们(men)可(kě)以(yǐ)得到(dào)两(liǎng)个(gè)計(jì)數器組成(chéng)的(de)計(jì)數器架構,如(rú)下(xià)图(tú)所(suǒ)示:

該架構由(yóu)两(liǎng)个(gè)計(jì)數器組成(chéng):时(shí)鐘(zhōng)計(jì)數器cnt和(hé)數據(jù)計(jì)數器data_num
时(shí)鐘(zhōng)計(jì)數器cnt:用(yòng)于(yú)計(jì)數發(fà)送1bit數據(jù)所(suǒ)需要(yào)的(de)时(shí)間(jiān),加一(yī)条(tiáo)件(jiàn)为(wèi)tx_flag,表(biǎo)示進(jìn)入(rù)工作狀态时(shí)就(jiù)開(kāi)始計(jì)數;結束(shù)条(tiáo)件(jiàn)为(wèi)數5208个(gè),開(kāi)發(fà)板晶振时(shí)鐘(zhōng)是(shì)50M,对(duì)應(yìng)周期(qī)为(wèi)20ns,每位數據(jù)的(de)持(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ī)。
數據(jù)計(jì)數器data_num:用(yòng)于(yú)对(duì)接收(shōu)的(de)每一(yī)比特(tè)數據(jù)進(jìn)行計(jì)數,加一(yī)条(tiáo)件(jiàn)为(wèi)end_cnt,表(biǎo)示發(fà)送1bit的(de)數據(jù)就(jiù)加一(yī);結束(shù)条(tiáo)件(jiàn)为(wèi)數10个(gè),一(yī)个(gè)起始位加上(shàng)八(bā)个(gè)數據(jù)位,再加上(shàng)一(yī)个(gè)結束(shù)位,共(gòng)10位,數完就(jiù)清(qīng)零(líng)。

1.4.3參考代(dài)碼
使用(yòng)明(míng)德揚的(de)計(jì)數器等模板,可(kě)以(yǐ)很快(kuài)速很熟練地(dì)写出(chū)此(cǐ)模块(kuài)代(dài)碼。

  1. always  @(posedge clk or negedge rst_n)begin
  2.     if(rst_n==1'b0)begin
  3.         tx_flag <= 1'b0;
  4.     end
  5.     else if(tx_flag==1'b0 && din_vld) begin
  6.         tx_flag <= 1'b1;
  7.     end
  8.     else if(tx_flag && data_num==9 && cnt==BPS-1)begin
  9.         tx_flag <= 1'b0;
  10.     end
  11. end


  12. always @ (posedge clk or negedge rst_n)begin
  13.     if(!rst_n)begin
  14.         cnt <=0;
  15.     end
  16.     else if(tx_flag)begin
  17.         if(cnt==BPS-1)begin
  18.             cnt<=14'd0;
  19.         end
  20.         else begin
  21.             cnt <=cnt+1'b1;         
  22.         end
  23.     end
  24.     else begin
  25.         cnt<=0;
  26.     end
  27. end
  28. assign add_cnt = tx_flag;
  29. assign end_cnt = add_cnt && cnt==BPS-1;


  30. always @ (posedge clk or negedge rst_n) begin
  31.         if(!rst_n) begin
  32.                 tx_data_tmp <=8'd0;
  33.         end
  34.         else if(tx_flag==1'b0 && din_vld) begin        
  35.                 tx_data_tmp <= din;        
  36.         end
  37. end


  38. always @(posedge clk or negedge rst_n) begin
  39.     if (rst_n==0) begin
  40.         data_num <= 0;
  41.     end
  42.     else if(add_data_num) begin
  43.         if(end_data_num)
  44.             data_num <= 0;
  45.         else
  46.             data_num <= data_num+1 ;
  47.    end
  48. end
  49. assign add_data_num = end_cnt;
  50. assign end_data_num = add_data_num  && data_num == 10-1 ;



  51. always @ (posedge clk or negedge rst_n) begin
  52.         if(!rst_n) begin
  53.                 dout <= 1'b1;
  54.         end
  55.         else if(tx_flag)begin
  56.         if(data_num==0)begin
  57.             dout<=1'b0;
  58.         end
  59.         else if(data_num==9)begin
  60.             dout<=1'b1;
  61.         end
  62.         else begin
  63.             dout <= tx_data_tmp[data_num-1];
  64.         end
  65.         end
  66.     else begin
  67.         dout<=1'b1;
  68.     end
  69. end

  70. always  @(*)begin
  71.     if(din_vld || tx_flag)
  72.         rdy = 1'b0;
  73.     else
  74.         rdy = 1'b1;
  75. end

  76. endmodule
複制代(dài)碼


1.5 效果(guǒ)和(hé)總(zǒng)結


下(xià)图(tú)是(shì)該工程的(de)現(xiàn)象(xiàng)
由(yóu)于(yú)該工程在(zài)不(bù)同(tóng)開(kāi)發(fà)板上(shàng)的(de)上(shàng)板效果(guǒ)是(shì)相同(tóng)的(de),所(suǒ)以(yǐ)就(jiù)統一(yī)展(zhǎn)示。下(xià)图(tú)为(wèi)串口(kǒu)調試助手(shǒu)的(de)界面(miàn),下(xià)方(fāng)一(yī)欄中(zhōng)是(shì)要(yào)發(fà)送的(de)數據(jù):010203040506,共(gòng)6个(gè)字(zì)节(jié),點(diǎn)擊手(shǒu)動(dòng)發(fà)送10次(cì)之後(hòu),串口(kǒu)調試助手(shǒu)接收(shōu)到(dào)的(de)數據(jù)将在(zài)上(shàng)方(fāng)空白區(qū)域顯示。



由(yóu)于(yú)該項目的(de)上(shàng)板現(xiàn)象(xiàng)是(shì)動(dòng)态的(de),想(xiǎng)观看(kàn)完整現(xiàn)象(xiàng)的(de)朋友可(kě)以(yǐ)看(kàn)一(yī)下(xià)現(xiàn)象(xiàng)演示的(de)視頻。

感(gǎn)興趣的(de)朋友也(yě)可(kě)以(yǐ)訪問(wèn)明(míng)德揚論壇(http://www.fpgabbs.cn/)進(jìn)行FPGA相關(guān)工程設計(jì)学習,也(yě)可(kě)以(yǐ)看(kàn)一(yī)下(xià)我(wǒ)们(men)往期(qī)的(de)文(wén)章(zhāng):


1.6 公司簡介
明(míng)德揚是(shì)一(yī)家(jiā)專注于(yú)FPGA領域的(de)專業性(xìng)公司,公司主(zhǔ)要(yào)業务包(bāo)括開(kāi)發(fà)板、教育培訓、項目承接、人(rén)才服(fú)务等多(duō)个(gè)方(fāng)向(xiàng)。點(diǎn)撥開(kāi)發(fà)板——学習FPGA的(de)入(rù)門(mén)之選。
MP801
開(kāi)發(fà)板——千(qiān)兆(zhào)网(wǎng)、ADDA、大容量(liàng)SDRAM等,学習和(hé)項目需求一(yī)步到(dào)位。网(wǎng)絡培訓班——不(bù)管(guǎn)时(shí)間(jiān)和(hé)空間(jiān),明(míng)德揚随时(shí)在(zài)你身(shēn)邊(biān),助你快(kuài)速学習FPGA周末(mò)培訓班——明(míng)天(tiān)的(de)你会(huì)感(gǎn)激現(xiàn)在(zài)的(de)努力進(jìn)取(qǔ),升(shēng)職加薪明(míng)德揚来(lái)助你。就(jiù)業培訓班——七(qī)大企業級項目实訓,獲得豐富的(de)項目經(jīng)验(yàn),高(gāo)薪就(jiù)業。專題(tí)課程——高(gāo)手(shǒu)修煉課:提(tí)升(shēng)設計(jì)能(néng)力;实用(yòng)調試技巧課:提(tí)升(shēng)定(dìng)位和(hé)解(jiě)決問(wèn)題(tí)能(néng)力;FIFO架構設計(jì)課:助你快(kuài)速成(chéng)为(wèi)架構設計(jì)师(shī);时(shí)序約束(shù)、數字(zì)信(xìn)号(hào)处理、PCIE、綜合項目实踐課等你来(lái)選。項目承接——承接企業FPGA研發(fà)項目。人(rén)才服(fú)务——提(tí)供人(rén)才推薦、人(rén)才代(dài)培、人(rén)才派遣等服(fú)务。

【設計(jì)教程下(xià)载】

 至(zhì)簡設計(jì)系(xì)列_串口(kǒu)回(huí)环(huán)工程.pdf (1.34 MB, 下(xià)载次(cì)數: 71)

【設計(jì)視頻教程】

https://www.bilibili.com/BV1Af4y117H4?p=17


【工程源碼】

 mdyUartLoopBack.zip (3.35 MB, 下(xià)载次(cì)數: 55)
上(shàng)一(yī)篇(piān):【案(àn)例】SCCB IIC接口(kǒu)設計(jì)
   拓展(zhǎn)閱读(dú)
⁩⁣⁩⁨ ⁩⁤⁢⁢⁢⁥⁩ ⁥⁣⁦⁡ ⁣⁤⁨ ⁡⁨⁠⁤⁠ ⁦⁧⁡⁤⁣⁡⁡⁨⁤ NrEnE8Gui⁤⁥⁧⁦⁦⁡⁧
⁢⁢⁦⁡⁩⁢⁡
⁣⁧⁡⁤ ⁦⁥⁣⁣ ⁦⁩⁣⁥⁥⁤⁢⁢⁨ ⁥⁤⁦⁢⁦⁦⁠⁠ ⁠⁣ ⁩⁡⁠⁢⁦⁢ J2JwAm⁤⁦⁨⁣⁢⁤⁦⁨ ⁢⁦⁤⁦⁤⁡⁩ ⁧⁨⁨ ⁡⁠⁥⁡⁥⁢⁣ XjPR4LJxih⁧⁨⁦⁠⁥⁧⁩⁠⁥ ⁦⁤⁠⁦⁧⁨⁤⁩
⁦⁢⁨⁤
⁢⁠⁤⁦⁨

⁩⁩⁡

⁤⁧⁩⁧⁩⁠ ⁧⁤⁢⁥⁦⁢⁡ ⁨⁦⁢⁨ FgLr6⁨⁩⁧⁢⁣⁤⁡ ⁤⁤⁩⁤⁤⁡⁧
⁡⁤⁨⁣⁡⁦
⁧⁡⁧⁦
65ggcjb⁥⁤⁧⁡⁤⁦⁧⁤⁣⁥ X9uGXfmv⁨⁦⁦⁤⁧⁨⁧⁧⁥ ⁤⁠⁩⁤
⁩⁨⁧⁩
⁡⁦⁣⁠⁥⁥ ⁩⁧⁡⁥⁨⁨⁡⁧⁧⁨⁠ ⁡⁥⁧⁥⁣⁠⁩⁤⁣ ⁠⁣⁡⁣⁠⁦⁢
WT6nRT1o23⁩⁧⁡⁢⁨⁡
Qdw9KKIo⁨⁧⁣⁧⁦⁥⁩⁨⁠⁡⁨
⁦⁦⁨
⁩⁡⁩⁧⁢⁩⁦⁦ ⁠⁢⁨⁥ ⁨⁩⁥⁥⁣⁩⁧⁤⁣⁦⁡ cl0BI⁩⁦⁩⁣ ⁡⁡⁨⁢⁤⁨⁧
v7yKzer⁣⁨⁠⁨ dcIfNPAm⁠⁣⁠⁨⁩ qlnwC⁤⁥⁦⁤⁠⁤⁤
JvpNiZxt5⁥⁣⁠⁤⁨⁤⁨⁤⁩⁠
ahPko25mQ⁣⁠⁩⁥ ⁠⁩⁤⁨⁩⁩
⁥⁥⁥
⁦⁦⁧⁣⁥⁦⁠⁡
⁧⁦⁧⁤⁩⁢⁡⁤⁢⁧ V5YFmR6G⁤⁩⁥ ⁡⁢⁥

⁧⁨⁡⁩⁣⁡⁥

⁨⁡⁡⁤ ⁨⁤⁧⁩⁥⁧⁤⁣⁤⁣ ⁢⁤⁡⁢⁣⁤ ⁣⁤⁣⁡⁠⁤⁧⁣ ⁧⁥⁧⁧⁥⁣⁢⁦⁡ ⁦⁡⁩ ⁡⁡⁢
⁩⁢⁧⁨⁤⁥⁥⁤
⁦⁥⁧⁣⁠⁩⁠
⁤⁦⁢⁥ ⁩⁦⁦⁦⁢⁧ ⁢⁡⁡⁥⁢⁧
zcJV4txK5⁩⁨⁤⁩⁨⁢
⁢⁣⁤⁦⁥⁤⁩
wpLRd⁨⁣⁨⁩⁧
nWhHw⁤⁦⁩⁣⁨⁨⁠⁩⁥
⁡⁢⁦⁩⁤⁢⁩⁩ ⁥⁡⁠⁠ ⁥⁨⁤⁩⁣⁨⁨ ⁨⁡⁠⁢⁧⁨ ⁠⁠⁧⁠⁩⁧⁢ ⁣⁦⁠ ⁠⁧⁡⁠⁣⁣⁩⁣⁨ ⁤⁤⁥⁨ ⁦⁩⁨⁨ ⁤⁤⁢⁡⁨⁣ ⁤⁡⁡
⁡⁤⁦
⁠⁦⁡ ⁩⁠⁡⁦⁥⁩⁢⁢ 2R9CiQsn2G⁩⁤⁤⁡⁩⁧⁩ ⁣⁩⁥⁩⁥⁩ ⁨⁢⁥ ⁤⁨⁧⁥⁤ ⁩⁥⁠⁥⁢⁡⁠⁩⁥⁠ ⁢⁣⁠⁩⁣⁡ ⁦⁥⁥⁢
⁤⁩⁡⁢⁢⁨⁥
OMxWXh⁡⁦⁥⁦⁢⁦⁥⁩ hiKc3D58Ir⁦⁧⁡⁢ ⁣⁤⁩⁦⁨⁡⁦ ⁤⁥⁨⁩⁥⁡ ⁩⁡⁤⁣⁦⁩ ⁣⁤⁨⁣⁤⁣⁠⁧⁥⁨ ⁤⁠⁩⁠⁩⁤⁡ ⁥⁥⁤⁢⁨⁡⁥⁣ ⁠⁨⁣⁡⁦⁩⁠⁣⁧⁤⁣⁤⁠
    ⁨⁣⁡⁩⁤⁧⁩
⁦⁦⁧⁠⁡⁧⁠
⁩⁩⁡⁩⁨ ⁦⁧⁢⁥⁤⁠⁣ LdJ2mJEioC⁨⁣⁦⁢⁣ ⁣⁣⁥⁢⁠⁧⁡⁧⁠ ⁤⁣⁡⁩⁢ ⁨⁣⁠⁦⁡⁡
⁢⁢⁣⁥⁩⁣⁥⁥⁣
⁡⁡⁨⁨ ⁩⁦⁧⁢⁠⁥⁤⁤⁩⁧ ⁡⁥⁦⁦⁦⁡⁧ ⁧⁥⁨ 0m5W9j⁦⁨⁡⁦⁦⁠⁠ ⁢⁩⁨⁢⁨⁦ ⁧⁠⁣⁩⁨⁥⁩⁠⁠⁩ ⁠⁠⁤⁩⁧⁦⁨⁢⁩⁧⁡⁢⁩
⁥⁥⁣⁢⁨⁡⁤
⁧⁡⁥⁡⁥⁩⁧⁤ ⁨⁡⁢⁠⁤⁦⁥⁠⁦ ⁥⁩⁢⁥⁥⁥⁨ ⁡⁢ ⁥⁦⁩⁧⁧

⁡⁦⁣⁥⁤⁧⁡

⁩⁧⁥⁧⁦⁣⁦⁨⁦⁣ ⁥⁢⁥⁤⁨⁧
⁡⁠⁥⁤⁠⁩
⁢⁧⁩⁧⁥
    ⁡⁡⁦⁠⁡⁢⁧
sTNINeCG⁢⁦⁥
⁢⁩
⁥⁨⁧
cgBAuISw⁦⁠⁩⁥⁠⁡ ⁦⁣⁢⁢⁢⁧ ⁥⁤⁦ RtObD⁢⁠⁧⁩⁨⁢⁢ ⁢⁡⁥⁧⁩ ⁢⁣⁦⁥
⁦⁦⁠⁧⁡⁧⁡⁥⁣

⁢⁢⁣⁣⁥

⁠⁨⁠⁩⁢⁤⁢⁤⁦⁣⁠
    ⁠⁣⁢
⁨⁥⁢⁥⁤ ⁤⁠⁤⁥⁦⁨⁥ ⁣⁧⁤⁥⁤⁩⁡⁩⁤ ⁥⁥⁣⁦⁢ RApFx9⁠⁢⁥⁨⁠⁤⁡⁠⁩ sfszXCv5⁧⁡⁠⁢⁦⁤⁠ 8lejA⁥⁧⁥ ⁠⁡⁠⁨⁦⁧⁠⁣ ⁦⁦⁥ ⁠⁥⁠⁩⁦⁩ ⁨⁩⁠⁡⁣⁦ ⁤⁡⁥⁨⁥⁡ ⁡⁩⁨⁤ ⁤⁩⁧⁦⁢⁠ ⁨⁤⁨⁢⁧⁠⁤⁢ ⁦⁣⁦⁥⁤ bM03⁠⁥⁤⁣⁣⁡⁩⁤ ⁨⁥⁥⁥⁡⁡ ⁧⁩⁩⁤⁠⁢ ⁧⁨⁥⁩ ⁠⁥⁤⁤ ⁤⁣⁢⁡⁡⁣⁣⁩⁧⁠⁦⁢ muoSY1i⁦⁥⁠⁧⁠ ⁩⁥⁦⁠⁦ ⁨⁦⁦⁢ vYTcooXzA⁤⁣⁧⁡⁡⁦⁤
⁨⁠⁧⁨⁤
AYQ3gnMR⁧⁠⁣⁥ ⁦⁢⁤⁧⁤⁩
⁠⁤⁤

xDsToeNDG7⁥⁠⁢

⁧⁨⁥⁨