<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 牛人業(yè)話(huà) > 零基礎學(xué)FPGA(九)牛刀小試——串行口通信電路設計

零基礎學(xué)FPGA(九)牛刀小試——串行口通信電路設計

—— 零基礎學(xué)FPGA(十)淺談狀態(tài)機
作者: 時(shí)間:2015-01-21 來(lái)源:網(wǎng)絡(luò ) 收藏

  以前在學(xué)單片機的時(shí)候,覺(jué)得串口通信其實(shí)很簡(jiǎn)單,只要一個(gè)指令數據就能輕易的接收或者發(fā)送。前幾天試著(zhù)用實(shí)現,發(fā)現里面的學(xué)問(wèn)還不少,并沒(méi)有想象的那么簡(jiǎn)單。當然代碼肯定是參考別人的,不過(guò)我還是認真研究了整段代碼的,下面的程序就是我在看懂了別人代碼后自己敲的,花了也不少時(shí)間,理解的也差不多,下面我就在這里給那些和我一樣的初學(xué)者介紹一下吧,解釋的不對的地方還望各位大神指正,大家好一起學(xué)習~

本文引用地址:http://dyxdggzs.com/article/268453.htm

  1、頂層模塊

  寫(xiě)程序都一樣,不能多有的程序都寫(xiě)在一個(gè)模塊里,那樣看起來(lái)很麻煩,出了錯誤也不好維護,對于一些小的程序我們可以寫(xiě)在一個(gè)模塊里,但程序一旦復雜起來(lái)還是要懂得模塊化編程的,對于頂層模塊,最好是只寫(xiě)接口就好了,例如:

  

360桌面截圖20140611024920.jpg

 

  這段代碼中,rx_232是我們的底層模塊名,后面跟著(zhù)的那個(gè)rx呢是我們自己取的名字,是任意的。后面的一大串呢就是接口,為了直觀(guān)呢,建議大家采用我的這種寫(xiě)法,看上去比較清楚明白,括號里面的接口是我們頂層文件的接口,括號外面的是我們調用底層模塊的接口,這些接口要一一對應正確才能保證數據之間的傳輸。

  在頂層模塊中,我們只定義了數據輸入接口,用來(lái)接收數據,數據輸出接口,用于發(fā)送數據,時(shí)鐘接口,和復位接口。這四個(gè)接口是有輸入輸出關(guān)系的,對于其他的接口,是屬于我們整個(gè)模塊內部的接口,是模塊與模塊之間的接口,既非輸入,也非輸出,相當于一根導線(xiàn)一樣,所以我們把他們定義成wire型變量

  

360桌面截圖20140611025725.jpg

 

  2、波特率選擇模塊

  單片機或者計算機在串口通信時(shí)的傳輸速率用波特率表示,9600bps表示的就是每秒鐘傳送9600位的數據

  這里之所以計數到5027,在這里算一下。

  1秒傳送9600位,那么傳送一位的時(shí)間就可以算出,即1s=1000_000_000ns,所以傳送一位數據需要1000_000_000/9600=

  104166ns,而我們的時(shí)鐘周期為20ns,因此需要計數到104166/20=5028個(gè)時(shí)鐘周期

  下面是串口通信時(shí)序圖

  

360桌面截圖20140611025958.jpg

 

  我再來(lái)解釋一下這個(gè)圖吧,我當時(shí)學(xué)單片機的時(shí)候還真是沒(méi)怎么重視這張圖,只知道只要一個(gè)指令就可以發(fā)送,沒(méi)有真正搞清楚是怎么發(fā)送和接受的,那就在這里復習一下吧

  計算機和單片機之間進(jìn)行通信,這里用的是rs232通信方式,即通信之前,計算機和單片機之前要設定好相同的波特率,只有波特率相同了才能進(jìn)行通信。

  其次,計算機發(fā)送數據時(shí)要先發(fā)送一個(gè)起始位,一般是低電平,后面跟著(zhù)的是8位數據位,奇偶校驗位,停止位等,當起始位低電平信號傳送到我們的接收端口時(shí),在接收模塊中會(huì )發(fā)送一個(gè)命令給波特率時(shí)鐘計數器,開(kāi)始計時(shí),計時(shí)到一半的時(shí)候會(huì )產(chǎn)生一個(gè)采樣高脈沖信號,當接收模塊檢測到這個(gè)高脈沖之后就會(huì )將數據存到寄存器中,當檢測到第11個(gè)脈沖信號時(shí),也就是代表一幀的數據接收完畢,發(fā)送模塊就給波特率選擇模塊發(fā)送一個(gè)停止信號告訴它停止計時(shí)。同時(shí),當數據接收完畢之后也會(huì )產(chǎn)生一個(gè)信號告訴發(fā)送模塊,信號已經(jīng)接收完畢,準備發(fā)送,這個(gè)時(shí)候發(fā)送模塊再給波特率計時(shí)模塊發(fā)送一個(gè)信號開(kāi)始計時(shí),計數到某一位的中間時(shí)產(chǎn)生一個(gè)采樣信號,當發(fā)送模塊檢測到采樣信號之后就將寄存器里的數據送到發(fā)送端,每次只送一位,這樣就實(shí)現了數據的接收與發(fā)送。

  下面是波特率計時(shí)模塊的主要程序部分

  

360桌面截圖20140611031456.jpg

 

  3、數據接收模塊

  在接收模塊中,為了準確的檢測計算機發(fā)送來(lái)的數據起始位的那個(gè)低電平信號,用到了邊沿脈沖檢測法,可以有效的避免毛刺現象帶來(lái)的問(wèn)題

  

360桌面截圖20140611031721.jpg

 

  下面是發(fā)送部分的主要程序段

  

360桌面截圖20140611031941.jpg

 

  4、數據發(fā)送模塊

  發(fā)送模塊原理上和接受模塊是一樣的,不同點(diǎn)就是接收模塊通過(guò)邊沿檢測法檢測起始位低電平信號來(lái)啟動(dòng)接收數據,而發(fā)送模塊是通過(guò)檢測數據發(fā)送完畢后,我們認為的置一個(gè)低電平信號,發(fā)送模塊通過(guò)檢測這個(gè)低電平信號來(lái)啟動(dòng)發(fā)送。見(jiàn)下圖

  

360桌面截圖20140611032357.jpg

 

  下面是生成的RTL視圖

  

360桌面截圖20140611032513.jpg

 

  下面是測試結果

  

360桌面截圖20140611032629.jpg

通信相關(guān)文章:通信原理


塵埃粒子計數器相關(guān)文章:塵埃粒子計數器原理


關(guān)鍵詞: FPGA 狀態(tài)機

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>