專用異步串口通信電路的FPGA實(shí)現(xiàn)
引言
隨著FPGA在電子產(chǎn)品中的廣泛應(yīng)用,多片F(xiàn)P- GA芯片中的數(shù)據(jù)傳輸也應(yīng)用的非常廣泛。就傳輸數(shù)據(jù)而言,串口通信是通信系統(tǒng)和控制系統(tǒng)應(yīng)用中較為廣泛的一種。串口通信分為異步和同步兩種方式。本文釆用RS 232異步通信協(xié)議來設(shè)計(jì)兩片F(xiàn)PGA的之間的數(shù)據(jù)傳輸電路,同時(shí),為了保證傳輸?shù)臏?zhǔn)確性,還在數(shù)據(jù)的收發(fā)端加入了CRC校驗(yàn)。
1 專用異步串口通信接口電路設(shè)計(jì)
本設(shè)計(jì)的目的是實(shí)現(xiàn)兩塊基帶板之間的數(shù)據(jù)傳輸,其通信電路的結(jié)構(gòu)框圖如圖1所示。在每塊基帶板上均有一片Xilinx公司的XC4VSX55型FPGA芯片,兩塊基帶板之間通過柔板相連接。為了節(jié)約兩片F(xiàn)PGA相互通信的I/O 口,設(shè)計(jì)采用RS 232異步串行通信協(xié)議和RS 422接口電平,其傳輸速率為115 200 bps。異步串行通信協(xié)議是基于FPGA來實(shí)現(xiàn)的,并選用MAX3077作為RS 422電平轉(zhuǎn)換芯片。兩片F(xiàn)PGA的全局時(shí)鐘GLOBAL _ CLK均由100 MHz的晶振產(chǎn)生。
本設(shè)計(jì)將整個(gè)電路分為接收基帶板與發(fā)送基帶板兩部分接口電路。其中接收基帶板接口電路包括數(shù)據(jù)乒乓讀取模塊、數(shù)據(jù)組幀模塊、CRC編碼模塊、串口發(fā)送模塊;而發(fā)送基帶板接口電路則包括串口接 收模塊、CRC校驗(yàn)?zāi)K。在接收基帶板上,先將無線接收下來的數(shù)據(jù)進(jìn)行乒乓存儲(chǔ)與讀取,再組成發(fā)送端 所需的幀結(jié)構(gòu),并在組幀的同時(shí)進(jìn)行CRC編碼,最后將組成幀的數(shù)據(jù)進(jìn)行串行發(fā)送。在發(fā)送基帶板上,也可通過串口接收數(shù)據(jù),并進(jìn)行CRC校驗(yàn)。當(dāng)CRC校驗(yàn)通過后,可直接送給后級(jí)的數(shù)據(jù)調(diào)制模塊進(jìn)行數(shù)據(jù) 的調(diào)制與發(fā)送。
1.1 數(shù)據(jù)乒乓讀取模塊
本模塊是前端程序與接口電路的隔離模塊。前端基帶解調(diào)模塊先將接收到的基帶數(shù)據(jù)按一定的速率寫入RAM,接下來被組幀模塊按一定的速率讀出并送到串口發(fā)送模塊發(fā)送。因此,兩者有著各自的數(shù)據(jù)線、地址線和控制線。介于此,雙端□RAM可以很好的滿足要求,為了保證數(shù)據(jù)讀取速率與讀取的準(zhǔn) 確性,將雙端口 RAM設(shè)計(jì)成為乒乓模式,這樣,讀取RAM的速率就不受寫入RAM速率的約束,只要檢測到寫滿標(biāo)志為1,就可以以較快的速率讀取,而無需擔(dān)心讀空。設(shè)計(jì)時(shí),可將雙端口RAM的大小設(shè)置為2塊128X8 b。
1.2 串口發(fā)送模塊
串口發(fā)送模塊的主要目的是將需要發(fā)送的數(shù)據(jù)按字節(jié)發(fā)送到FPGA芯片外的串口電平轉(zhuǎn)換芯片MAX3077上,由其轉(zhuǎn)換成差分RS 422電平后,再將數(shù)據(jù)送到柔板上進(jìn)行傳輸。本接口電路采用的是異步傳輸方式。為了每個(gè)字節(jié)的同步需要,在每個(gè)發(fā)送字節(jié)前先發(fā)一個(gè)0比特作為字節(jié)同步。
該模塊中主要有分頻計(jì)數(shù)器、發(fā)送計(jì)數(shù)器和移位寄存器。分頻計(jì)數(shù)器可將系統(tǒng)時(shí)鐘分成所需的波特率,當(dāng)分頻計(jì)數(shù)器計(jì)到一個(gè)特定值(將該特定值設(shè)為 參數(shù))時(shí)將釆樣使能置1,其余時(shí)刻均保持0狀態(tài)。當(dāng)該模塊的發(fā)送數(shù)據(jù)請求管腳收到一個(gè)高脈沖的時(shí)候,即可將需要發(fā)送的字節(jié)讀取進(jìn)來送入移位寄存器,同時(shí)按照采樣使能的頻率發(fā)送一個(gè)同步比特0, 然后比特輸出計(jì)數(shù)器加1,當(dāng)使能的下一個(gè)上升沿到來時(shí),將移位寄存器中待發(fā)送數(shù)據(jù)的最高位發(fā)送出去,同時(shí)將移位寄存器循環(huán)右移一位,發(fā)送計(jì)數(shù)器加1,當(dāng)發(fā)送計(jì)數(shù)器加到8時(shí),表明一個(gè)字節(jié)已經(jīng)發(fā)送完畢,此時(shí)將發(fā)送完畢的信號(hào)送一個(gè)高脈沖出去,并通 知前級(jí)可以再填入需要發(fā)送的字節(jié)數(shù)據(jù)。
1.3 CRC編碼與校驗(yàn)?zāi)K
釆用CRC編碼模塊是因?yàn)槠洳粌H能夠加強(qiáng)傳輸過程中檢測錯(cuò)誤的能力,而且其實(shí)現(xiàn)電路比較簡單。本項(xiàng)目中的CRC不僅能夠檢測收發(fā)基帶板之間串口傳輸時(shí)出現(xiàn)的錯(cuò)誤,而且能夠檢測基帶發(fā)送板與接收發(fā)射信號(hào)的終端之間無線鏈路傳輸過程中出現(xiàn)的錯(cuò)誤。
最基本的CRC校驗(yàn)碼編碼方法是用待發(fā)送的二進(jìn)制數(shù)據(jù)M(工)除以生成多項(xiàng)式g(z),然后將最后的余數(shù)作為CRC校驗(yàn)碼。從CRC的編碼規(guī)則可以看出,CRC編碼實(shí)際上是將待發(fā)送的"位二進(jìn)制多項(xiàng)式M(Q轉(zhuǎn)換成可以被g(x)除盡的兒+艮位二進(jìn)制 多項(xiàng)式T(z),所以,解碼時(shí)可以用接收到的數(shù)據(jù)去除g(x),如果余數(shù)為零,則表示傳輸過程沒有錯(cuò)誤,否則表示存在錯(cuò)誤。
本項(xiàng)目中需要對124個(gè)字節(jié)進(jìn)行校驗(yàn),故釆用CRC16的編碼方式,生成的多項(xiàng)式采用g(a:) = rclf,+劉'+ / + 1。由于CRC編碼的過程本質(zhì)上是一個(gè)循環(huán)移位的模2運(yùn)算。故可設(shè)置一個(gè)2字節(jié)移位寄存器(CRC),在需要做CRC校驗(yàn)的每一幀數(shù)據(jù)到來前將該移位寄存器全部設(shè)置為1。需要校驗(yàn)的數(shù)據(jù)按字節(jié)送入該CRC校驗(yàn)?zāi)K,當(dāng)數(shù)據(jù)到來時(shí)把數(shù)據(jù)的最高位和移位寄存器的最高位進(jìn)行異或并作為反饋值,然后將其存入移位寄存器中的第0b位。移位寄存器的第5 b、15 b分別存儲(chǔ)反饋值與移位寄存器的第4 b、第14 b的異或值,其余移位寄存器的每一位都存儲(chǔ)低一位的值,然后參與校驗(yàn)的每一位數(shù)據(jù)在時(shí)鐘的驅(qū)動(dòng)下,再在移位寄存器中右移存儲(chǔ),移完一個(gè) 字節(jié)后,移位寄存器中的兩個(gè)字節(jié)就是CRC的校驗(yàn)結(jié)果。在CRC的編碼端將所需要進(jìn)行CRC校驗(yàn)的數(shù)據(jù)依次送入該模塊進(jìn)行CRC編碼,并將編碼結(jié)果緊跟編碼數(shù)據(jù)一起通過串口發(fā)送。在CRC的校驗(yàn)端,可將CRC編碼端參與編碼的數(shù)據(jù)以及收到的編碼結(jié)果依次送入同一個(gè)CRC校驗(yàn)?zāi)K進(jìn)行校驗(yàn),如果校驗(yàn)結(jié)果為0,證明傳輸過程中沒有錯(cuò)誤,反之則表示傳輸存在錯(cuò)誤,數(shù)據(jù)不能用。
1.4 組幀模塊設(shè)計(jì)
本模塊是基帶接收板接口電路的核心模塊,該模塊控制數(shù)據(jù)乒乓讀取模塊、CRC編碼模塊以及串口發(fā)送模塊。組幀模塊所組的幀為每幀127 B的定長幀,該模塊包含一個(gè)幀頭和幀尾數(shù)據(jù)發(fā)送計(jì)數(shù)器、讀RAM地址計(jì)數(shù)器、CRC編碼數(shù)據(jù)發(fā)送計(jì)數(shù)器。當(dāng)檢測到數(shù)據(jù)存儲(chǔ)乒乓RAM的一塊寫滿信號(hào)為1時(shí),即啟動(dòng)幀頭幀尾發(fā)送計(jì)數(shù)器,將幀頭EB91按字節(jié)送入串口發(fā)送模塊,同時(shí)將EB91送入CRC編碼模塊編碼。發(fā)送完EB91,可將讀RAM的使能信號(hào)置高,以進(jìn)入讀RAM狀態(tài)。如果讀RAM的讀地址計(jì)數(shù)器小于121,同時(shí)檢測到串口發(fā)送模塊字節(jié)發(fā)送完畢信號(hào)為1時(shí),地址計(jì)數(shù)器加1,這樣就可以不斷將RAM 中的數(shù)據(jù)按字節(jié)送入串口發(fā)送模塊,同時(shí)將從RAM 中讀出的數(shù)據(jù)送入CRC編碼模塊編碼。當(dāng)讀地址計(jì)數(shù)器加到121時(shí),若檢測到第121個(gè)字節(jié)發(fā)送完畢信號(hào)為1,則將讀RAM的讀使能信號(hào)拉低,同時(shí)將CRC的輸出信號(hào)送入串口發(fā)送模塊,當(dāng)檢測到串口發(fā)送模塊發(fā)送完CRC編碼的第二個(gè)字節(jié)發(fā)送完畢時(shí),即可將狀態(tài)跳回幀頭幀尾發(fā)送狀態(tài),以將幀尾4E送入串口發(fā)送模塊,同時(shí)將幀頭幀尾數(shù)據(jù)發(fā)送計(jì)數(shù)器加1。當(dāng)該字節(jié)發(fā)送完畢后,再將所有寄存器清零,同時(shí)將狀態(tài)機(jī)置為初始狀態(tài)。
1. 5 串口接收模塊
串口接收模塊可將基帶接收板上發(fā)出的異步串行數(shù)據(jù)接收下來存在雙口RAM中,在接收數(shù)據(jù)的同時(shí)將數(shù)據(jù)按字節(jié)送入CRC校驗(yàn)?zāi)K,再校驗(yàn)接收下來的幀是否為有效幀。通過CRC校驗(yàn)時(shí)則將數(shù)據(jù)整幀讀走進(jìn)行調(diào)制發(fā)送,否則丟棄。
為了能夠準(zhǔn)確地從串口線上接收數(shù)據(jù),解決兩個(gè)基帶板上的全局時(shí)鐘同頻不同相的問題,避免釆樣時(shí)鐘采集到串行數(shù)據(jù)的跳變邊沿,通常需要在數(shù)據(jù)的中 間進(jìn)行采樣,以保證采到的數(shù)據(jù)值是唯一的。
通過本模塊分頻計(jì)數(shù)器可將時(shí)鐘分成傳輸波特率的八倍,并給出相應(yīng)的采樣使能,再用該采樣使能去檢測傳輸數(shù)據(jù)的邊沿。因?yàn)槊總€(gè)字節(jié)前都加入了同步比特0,所以,當(dāng)采樣使能檢測到下降沿時(shí),立即起動(dòng)一個(gè)采樣計(jì)數(shù)器。當(dāng)采樣使能為1時(shí),采樣計(jì)數(shù)器加1。當(dāng)釆樣計(jì)數(shù)器計(jì)到3時(shí),正好是同步0比特的中間,此時(shí)可將釆樣計(jì)數(shù)器清零,此后,在沒有接收 完一個(gè)字節(jié)時(shí),采樣計(jì)數(shù)器都是計(jì)到7再清零。而每次串行數(shù)據(jù)都是在采樣計(jì)數(shù)器計(jì)到7時(shí)循環(huán)移入一個(gè)8 b移位寄存器。
這樣,每次移入的串行數(shù)據(jù)都是在數(shù)據(jù)的中間采 樣的,從而保證了數(shù)據(jù)傳輸?shù)臏?zhǔn)確。此外,還需要設(shè) 置一個(gè)比特接收計(jì)數(shù)器對接收到的每比特?cái)?shù)據(jù)進(jìn)行 計(jì)數(shù),每次采樣計(jì)數(shù)器計(jì)到7時(shí),比特接收計(jì)數(shù)器加1,當(dāng)比特接收計(jì)數(shù)器加到7時(shí),表示一個(gè)字節(jié)的數(shù)據(jù) 已經(jīng)接收完畢,此時(shí)便可以將數(shù)據(jù)存到雙端口 RAM中了。數(shù)據(jù)的存儲(chǔ)過程也是采用乒乓存儲(chǔ)的方式,這里不再贅述。
2 接口電路的仿真驗(yàn)證
將串口發(fā)送端口和串口接收端口連接在一起進(jìn)行時(shí)序模擬仿真的仿真結(jié)果如圖2所示。該仿真結(jié)果表明,本設(shè)計(jì)電路能夠?qū)崿F(xiàn)基帶接收板雙端口RAM中數(shù)據(jù)的乒乓讀取,之后可再進(jìn)行組幀、CRC 編碼、串口發(fā)送接收、CRC校驗(yàn)及乒乓存儲(chǔ)等功能。同時(shí)還可以將程序下載到FPGA中運(yùn)行。此外,運(yùn)行結(jié)果還表明,該電路工作穩(wěn)定,而且具有較高的實(shí)用價(jià)值。
3 結(jié)語
本設(shè)計(jì)電路采用FPGA芯片較好的實(shí)現(xiàn)了兩片F(xiàn)PGA中數(shù)據(jù)互相傳輸?shù)膯栴},并可對所傳輸?shù)臄?shù)據(jù) 進(jìn)行一定的數(shù)據(jù)處理,(如CRC校驗(yàn)以及數(shù)據(jù)組幀), 因而從一定程度上簡化了兩塊基帶板之間的數(shù)據(jù)傳輸問題。另外,由于FPGA的可編程特性及程序的可移植性,因此,采用參數(shù)化的程序設(shè)計(jì),還可以對本設(shè)計(jì)電路進(jìn)行功能擴(kuò)展,以滿足更高的要求。