女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

【經驗分享】玩轉FPGA串口通信:從“幻覺調試”到代碼解析

電子發燒友論壇 ? 2025-06-05 08:05 ? 次閱讀

原文地址:?https://bbs.elecfans.com/jishu_2489801_1_1.html?

作者:@王釗

引言:FPGA開發,思路先行!

玩FPGA板子,讀代碼是基本功!尤其對從C語言轉戰FPGA的“寶貝們”來說,適應流水線(pipeline)編程可能需要點時間。

上篇點燈代碼解讀了基礎,而如果能親手寫出串口通訊代碼,恭喜你,FPGA的大門算是真正踏入了!

本文旨在幫初學者梳理FPGA開發的核心思維流程——思路對了,后面的路才順暢,這可是重中之重!

一:感性認知 - 燒錄 & 看效果

廢話不多說,先燒程序,眼見為實!

cf60add0-41a0-11f0-986f-92fbcf53809c.png

在Ubuntu下,等程序燒錄完成后,打開gtkterm,通過USB轉串口設備節點與板子通訊。

本次燒錄的實例實現的是“回顯”(Echo):你鍵盤輸入什么,板子就原樣發回什么。

cf7a3764-41a0-11f0-986f-92fbcf53809c.png

這種時候我們可能會以為出現了幻覺(這效果對嗎?)

好辦!在回顯代碼里“加個1”,把接收到的數據+1再發送

cf8f5c16-41a0-11f0-986f-92fbcf53809c.png

再次燒錄以后,測試發現,按鍵輸入123變成了234。果然不是幻覺,我們可以繼續看代碼了。

經驗上講以上步驟還是必要的,這證明代碼是對的,以免被坑。


二:硬件連接 - 原理圖 & 管腳對一對

回到代碼,Top頂層模塊走起!

d04dc444-41a0-11f0-986f-92fbcf53809c.png

輸入腳有個25m的時鐘,輸出有個燈,這跟點燈程序一樣。然后串口有收發兩個腳。然后我去對一下原理圖。

d068e788-41a0-11f0-986f-92fbcf53809c.png

找到原理圖第三頁,底板的原理圖,供電的Type-C口其實連到了CH340 USB轉串口芯片(單片機玩家老朋友了?。?/p>

這個原理圖其實看著有點暈,反正大致意思就是串口發送接收接到了H10和H11這兩個腳上。

d08d11ee-41a0-11f0-986f-92fbcf53809c.png

管腳配置瞧一瞧:外部時鐘腳和led的腳跟之前點燈的程序一樣,下面就是多了H10和H11兩個腳,分別對于串口的RX和TX。

然后它們的電平是3.3V的。如果這里看著難受的話可以把它改到其他腳上,然后接一個自己的USB轉串口的板子上,自己的串口板只需要多接個GND地線,無需接3.3V電源,加上RX和TX一共3根線,注意RX和TX可能需要反一下。


三:協議基礎 - 磨刀不誤砍柴工

到這里又要啰嗦一下,FPGA調一個接口,首先就是我們需要清楚的知道接口有個的數據定義,協議等知識。不能上來就研究代碼,否則可能會迷糊。

d0a2f9aa-41a0-11f0-986f-92fbcf53809c.png

(圖片來源:https://zhuanlan.zhihu.com/p/689643287)

這里是我搜索出來知乎的帖子,講串口協議的,有需要的話可以補充一下底層知識。

當然相信沒幾個人不知道串口的,但FPGA開發它還是蠻多套路的,比如接收一幀數據該如何接收。

大致的思路是這樣的,我們需要用一個比串口波特率更高的采樣信號去采集,串口的RX上什么時候出現起始位,然后接收每個數據位,最后延時一個停止位,再循環檢測起始位,接收下一幀數據。


四:代碼解析 - 接收模塊的奧秘

然后代碼我就不再講倍頻和reset邏輯了,點燈程序已經講過了。

d0c1c9c0-41a0-11f0-986f-92fbcf53809c.png

直接看接收的代碼:這里看到模塊的調用,可以想象成我們在板子上焊了一塊芯片,它有一個clk腳rst_n腳;然后連到了top頂層的UART的RX上;收到數據后會返回一個接收完成的標志,8位的接收到的數據;最后還需要一個比波特率大的,這里是大16倍的采樣時鐘。

d0d6a4e4-41a0-11f0-986f-92fbcf53809c.png

進入接收模塊的代碼里,我們看看芯片內部是怎樣實現的。這里作者用ASCCII碼畫了一個時序圖,這個太有用了,看代碼的時候需要反復的看這個圖。

簡單說一下這個時序圖,IDLE的時候是檢測起始位的狀態,起始位start是bit0,這里看著它是低電平的;然后到接收數據的狀態,也就是bit1到bit8這8位;最后是end停止位,回到IDLE。

所以程序的思路就有了,我們需要在16倍波特率的采樣周期上,不停的檢測RX腳上的電平,完成串口通訊一幀數據的接收。

d0f47ac8-41a0-11f0-986f-92fbcf53809c.png

接著看代碼,作者大神首先把RX腳做了個同步,這個套路不看代碼是學不到的,久了看見這種代碼腦袋里面會浮現出一個時序圖,大概就能看到clk和rx信號的時序,然后理解到為什么要同步。

注意這個模塊有兩個時鐘,一個是系統時鐘,一個是16倍的波特率的時鐘,它這同步的是系統時鐘。咱們先別暈在這里,繼續往下看。

d10b7890-41a0-11f0-986f-92fbcf53809c.png

后面的代碼是個狀態機,這代碼還有點多,我抓屏一爪還抓不完。大家可以打開代碼自己對著看,反正行號可以看出是講到哪里了。狀態機跟作者的時序圖是一致的,就是那些IDLE,start,end之類的狀態。

這里還有個特別玄乎的套路,本人也不是大神,所以也沒看明白。就是這個狀態機是用系統時鐘來檢測的,那個16倍波特率的采樣時鐘是在下面用個if來判斷的,就是采樣信號為高的時候去檢測數據信號的高低。本寶認為,為什么不直接把采樣信號放在always語句上面用呢。手賤的同學可以改一下試試,看看串口會不會丟數據,試完記得告訴我結論。

d126e0a8-41a0-11f0-986f-92fbcf53809c.png

IDLE狀態沒什么看頭,我們看看start狀態。它這里有個采樣的計數,一個bit采樣16次。這里首先是從IDLE進入START狀態需要rx管腳為低電平,并且在16次采樣的中間那會不變成低電平,才認為起始信號有效。(為什么不判斷全部為高?或者前半段為高?)

反正最重要的是數到16個采樣就切到下一個狀態,不能快也不能慢,保證時序要求。

這里還有一個套路是我們會看到那些a=a,b=b的語句,其實我感覺是可以刪掉的,不知道是不是作者年級比較大,或許以前古時候的綜合器不寫else后面的東西,它會亂綜合一些東西出來。好奇寶寶們可以寫個測試程序,看看RTL電路有什么區別,同樣,測試出結論以后記得告訴我……

d13b559c-41a0-11f0-986f-92fbcf53809c.png

采樣狀態的邏輯看了半天,也沒真正做采樣的事情,只是輸出了一個變量rxd_cnt,這個變量表示采樣的是第幾個bit,還要注意的是這個變量在什么時候被鎖存改變的,我們注意到是在采樣計數為最后一個的時候鎖存的。

d151f46e-41a0-11f0-986f-92fbcf53809c.png

停止狀態啥也沒干,只是保證延時一個波特率的時間而已。

d1688fd0-41a0-11f0-986f-92fbcf53809c.png

接著看代碼,上面采樣狀態輸出了一個變量rxd_cnt,然后這里才進行真正的采樣操作,它同時判斷了采樣計數器cmp_cnt,保證是在波形中部進行采樣??赡苓@么做是增加魯棒性。相信看到這里有些人會表示不服,我們可以把串口線接長一點,中間再加點電磁干擾,這樣比較一下如果不在中間采樣會不會導致丟數據的比率變高。同樣,如果有人測試了,記得把結論告訴我!??!

d1833704-41a0-11f0-986f-92fbcf53809c.png

最后一段代碼是輸出一幀率數據接收完成的標志,可以看到它的鎖存邏輯是在停止位發送完畢的時候持續了一個采樣時鐘的高電平。同時鎖存輸出數據。

d1967c38-41a0-11f0-986f-92fbcf53809c.png

五:發送模塊 - 相對簡單

再往下就是看發送邏輯了,這塊邏輯跟接收邏輯幾乎一樣。其實發送邏輯大可不必這么精細,因為接收才需要高頻率的采樣,發送只要保證時序就可以了。如果實在看不懂接收邏輯,我建議大家還是直接寫一下發送邏輯,比如就按作者畫的時序圖,先用pll生成一個波特率的時鐘,再按照時鐘調整TX管腳的高低電平即可。最后用上面講的接長串口線的方法測試一下數據傳輸的效率。

d1ab59f0-41a0-11f0-986f-92fbcf53809c.png

大半夜的不知道誰拍了我一下,我就突然看到這塊代碼有點不對……這個case里面的語句的等于符號前面居然沒有小于符號了。這種情況奶奶沒教過啊,而且它always語句里面是個*號。其實verilog我也是只學了三天,所以不太確定這是不是就是個組合邏輯電路。哎,這個迷哪位好心人回帖告訴我一聲好不好。

d1bf31be-41a0-11f0-986f-92fbcf53809c.png

萬一有人整篇文章都看不懂,這里有個好玩的東西,test_io這個腳是接到燈上的,它這里的邏輯是TX和RX上只要有數據變化,燈就會閃爍,實測我一直往串口輸入字符a,這個燈是可以看到閃爍的,閃的比較暗,大家可以關燈看看。

終極總結:FPGA接口開發心法

總結一下,關于接口的實現,無論接口多復雜,其實也是邏輯電平的控制,但前提是需要對協議非常的熟悉,再就是一下FPGA代碼的套路了,這些套路都是一點一點看眾大神的代碼悟出來的。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • FPGA
    +關注

    關注

    1643

    文章

    21967

    瀏覽量

    614185
  • 串口通信
    +關注

    關注

    34

    文章

    1636

    瀏覽量

    56549
  • 開發板
    +關注

    關注

    25

    文章

    5531

    瀏覽量

    102374
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    fpga時序分析案例 調試FPGA經驗總結

    今天跟大家分享的內容很重要,也是調試FPGA經驗的總結。隨著FPGA對時序和性能的要求越來越高,高頻率、大位寬的設計越來越多。在調試這些
    的頭像 發表于 08-01 09:18 ?2362次閱讀
    <b class='flag-5'>fpga</b>時序分析案例 <b class='flag-5'>調試</b><b class='flag-5'>FPGA</b><b class='flag-5'>經驗</b>總結

    基于FPGA的USB串口通信設計

    用altera de2進行FPGA的USB串口通信,實現電腦和USB連接,電腦可傳輸信息(數字和字母)FPGA上并用lcd顯示。求
    發表于 05-19 16:59

    【技術經典下載】《深入淺出玩轉FPGA》-珍貴的學習經驗和筆記

    `簡介:《深入淺出玩轉FPGA》收集整理了作者在FPGA學習和實踐中的經驗點滴。書中既有日常的學習筆記,對一些常用設計技巧和方法進行深入探討;也有很多生動的實例分析,這些實例大都是以特
    發表于 06-15 17:46

    特權同學新書《勇敢的芯伴你玩轉Altera FPGA》電子版 下載 (FPGA初學者首選)

    串口芯片驅動安裝4.6.1驅動安裝4.6.2設備識別第5章Verilog語法概述5.1語法學習的經驗之談5.2可綜合的語法子集5.3代碼風格與書寫規范勇敢的芯伴你玩轉Altera
    發表于 10-11 20:59

    賽靈思FPGA初學者 必備圖書 特權同學新書《勇敢的芯伴你玩轉賽靈思 FPGA

    調試7.8SRAM讀寫測試7.8.1SRAM讀寫時序解讀7.8.2功能簡介7.8.3代碼解析7.8.4Xilinx庫設置7.8.5功能仿真7.8.6FPGA在線配置7.8.7觸發采樣波
    發表于 11-27 12:23

    串口通信調試(PC與PC串口通信

    【LabVIEW入門精通】4.1.6 串口通信調試(PC與PC串口
    發表于 01-08 15:43 ?0次下載

    串口通信調試(PC與智能儀器串口通信

    【LabVIEW入門精通】4.1.6 串口通信調試(PC與智能儀器串口
    發表于 01-08 15:42 ?0次下載

    最詳盡的——解析串口通信數據

    最詳盡的——解析串口通信數據
    發表于 12-05 14:56 ?3次下載

    串口通信調試軟件的功能與使用方法

    本文主要介紹了串口通信原理、串口通信結構、串口通信調試
    發表于 12-27 15:02 ?1.8w次閱讀
    <b class='flag-5'>串口</b><b class='flag-5'>通信</b><b class='flag-5'>調試</b>軟件的功能與使用方法

    MATLAB串口調試助手應用程序和基于MATLAB開發USB的串口通信源代碼

    本文檔的主要內容詳細介紹的是MATLAB串口調試助手應用程序和基于MATLAB開發USB的串口通信源代碼。
    發表于 11-05 08:00 ?98次下載
    MATLAB<b class='flag-5'>串口</b><b class='flag-5'>調試</b>助手應用程序和基于MATLAB開發USB的<b class='flag-5'>串口</b><b class='flag-5'>通信源代碼</b>

    PID算法原理_調試經驗以及代碼總結

    PID算法原理_調試經驗以及代碼總結分享。
    發表于 05-25 15:59 ?16次下載

    單片機——串口通信串口接收多位數據保存到數組,發送多位數據串口

    單片機串口通信中,接收多位數據數組,發送多位數據的代碼// 下面的代碼用于:單片機的串口何上位
    發表于 11-17 11:06 ?45次下載
    單片機——<b class='flag-5'>串口</b><b class='flag-5'>通信</b>(<b class='flag-5'>從</b><b class='flag-5'>串口</b>接收多位數據保存到數組,發送多位數據<b class='flag-5'>到</b><b class='flag-5'>串口</b>)

    PID算法原理、調試經驗以及代碼資料

    PID算法原理、調試經驗以及代碼資料
    發表于 11-21 10:25 ?15次下載

    單片機UART串口通信(代碼親自調試成功)

    單片機UART串口通信單片機的串口通信,一般指的就是UART串口通信(TXD,RXD)。本文實現
    發表于 11-23 17:36 ?18次下載
    單片機UART<b class='flag-5'>串口</b><b class='flag-5'>通信</b>(<b class='flag-5'>代碼</b>親自<b class='flag-5'>調試</b>成功)

    玩轉ZMP110x創新串口屏的虛擬串口屏開發模式

    ZMP110x創新串口屏應用開發如何脫離硬件,僅在PC上就完成全部的UI開發和通信調試工作?下面就跟隨小編步伐,一起玩轉虛擬串口屏開發模式吧
    的頭像 發表于 02-02 14:18 ?2047次閱讀
    <b class='flag-5'>玩轉</b>ZMP110x創新<b class='flag-5'>串口</b>屏的虛擬<b class='flag-5'>串口</b>屏開發模式