劉 杰,臧 煒,梁曉鵬,李軍武
(1.貴州航天凱山石油儀器有限公司,貴陽 550000; 2.中國石油渤海裝備公司第一機械廠,河北 青縣 062650; 3.長慶油田第六采油廠,陜西 榆林 718600; 4.長慶油田第七采油廠,甘肅 環(huán)縣 745700)
一種新型的FPGA實現(xiàn)RS422串口通信方法
劉 杰1,臧 煒2,梁曉鵬3,李軍武4
(1.貴州航天凱山石油儀器有限公司,貴陽 550000; 2.中國石油渤海裝備公司第一機械廠,河北 青縣 062650; 3.長慶油田第六采油廠,陜西 榆林 718600; 4.長慶油田第七采油廠,甘肅 環(huán)縣 745700)
在FPGA實現(xiàn)RS422串口通信的常用方法中經(jīng)常遇到諸多問題,如FIFO深度讀取不正確、FIFO寫數(shù)據(jù)端口與讀數(shù)據(jù)端口時序競爭、多個模塊間信號延時導致FPGA亞穩(wěn)態(tài)等問題,因此設(shè)計了一種新型的RS422串口通信實現(xiàn)方法;該方法通過利用寄存器數(shù)組作為循環(huán)緩存代替FIFO,利用計數(shù)器代替?zhèn)鹘y(tǒng)的波特率產(chǎn)生模塊,把常用方法中的多個模塊整合成一個模塊,只采用一個主時鐘,所有寄存器的時鐘輸入端共享一個時鐘,對FPGA邏輯與時序進行了有效約束,避免了FPGA中亞穩(wěn)態(tài)產(chǎn)生;試驗結(jié)果表明該方法實現(xiàn)的RS422串口通信高速、可靠、穩(wěn)定,并且利用FPGA實現(xiàn)RS422串口通信,可使整個系統(tǒng)更為靈活、緊湊,減小整個電路的體積,提高系統(tǒng)的可靠性和穩(wěn)定性。
RS422;FPGA;DSP;Verilog HDL
目前,嵌入式電子系統(tǒng)設(shè)計多采用DSP+FPGA架構(gòu),因為其兼顧了DSP和FPGA的優(yōu)點。DSP的優(yōu)點是能夠?qū)崿F(xiàn)復(fù)雜的算法結(jié)構(gòu),運算速度高、尋址方式靈活等,適合于運算能力和存儲容量有較高要求的應(yīng)用場合[1]。FPGA的優(yōu)點是基于可編程邏輯器件進行數(shù)字邏輯設(shè)計,性能穩(wěn)定、易于維護、性價比高、產(chǎn)品體積小、信號間干擾小、研制周期短等,并發(fā)處理能力強,可以作為DSP的各種外圍電路的控制器。因此,采用DSP和FPGA數(shù)字信號處理系統(tǒng)可以把兩者的優(yōu)點結(jié)合起來,兼顧速度和靈活性,優(yōu)勢互補,符合當前軟硬件融合協(xié)調(diào)工作的趨勢。
RS422 串口通信在航空航天及工業(yè)控制領(lǐng)域有著廣泛的應(yīng)用,其特點是點對點通信、傳輸距離長、抗干擾能力強、傳輸速率高等方面。利用FPGA實現(xiàn)RS422串口通信,可使整個系統(tǒng)更為靈活、緊湊,減小整個電路的體積,提高系統(tǒng)的可靠性和穩(wěn)定性。
本文首先介紹了一種FPGA實現(xiàn)RS422串口通信的常用方法,然后設(shè)計并實現(xiàn)了一種改進方法,在改進方法中采用寄存器數(shù)組作為循環(huán)緩存代替FIFO,利用計數(shù)器代替波特率產(chǎn)生模塊,把常用方法中的四個模塊進行整合,采用同步時鐘代替異步時鐘,對FPGA邏輯與時序進行了有效約束,避免了FPGA中亞穩(wěn)態(tài)產(chǎn)生,提高了RS422串口通信的可靠性、穩(wěn)定性。
RS422串口通信的幀格式如圖1所示。
圖1 RS422串口通信幀格式
一幀數(shù)據(jù)包括起始位、數(shù)據(jù)位、校驗位和停止位。線路空閑時,傳輸線路保持高電平。當發(fā)送數(shù)據(jù)時,發(fā)送節(jié)點要先發(fā)一個低電平的起始位,表示一幀數(shù)據(jù)的開始,然后發(fā)送有效數(shù)據(jù)位,通常為8個比特,然后發(fā)送奇偶校驗位,最后發(fā)送停止位,停止位為高電平,表示一幀數(shù)據(jù)發(fā)送結(jié)束。
串口通信結(jié)構(gòu)框圖如圖2所示。
圖2 串口通信結(jié)構(gòu)框圖
DSP與FPGA之間的通信方式采用DSP的EMIF方式,即地址總線、數(shù)據(jù)總線和控制總線。FPGA內(nèi)部實現(xiàn)RS422通信功能,主要包括接收模塊、發(fā)送模塊、波特率產(chǎn)生模塊、DSP接口控制模塊等4個部分。RS422串口通信外設(shè)一般是指RS422收發(fā)芯片,如MAX3087,完成TLL電平和RS422差分電平之間的轉(zhuǎn)換,通常與FPGA相連時要經(jīng)過數(shù)字隔離器,進行地線隔離。
串口接收模塊的功能為:FPGA首先檢測數(shù)據(jù)的起始位,然后獲得有效數(shù)據(jù)位的信息,并且對有效數(shù)據(jù)位進行奇偶校驗后,進行串/并轉(zhuǎn)換,存入串口接收FIFO中,等待DSP進行查詢讀取,當DSP讀串口接收FIFO地址時,F(xiàn)PGA把串口接收FIFO中的數(shù)據(jù)放到數(shù)據(jù)總線上。
串口發(fā)送模塊的功能為:首先DSP通過EMIF接口向FPGA的串口發(fā)送FIFO寫數(shù)據(jù),F(xiàn)PGA把數(shù)據(jù)存入串口發(fā)送FIFO中,進行并/串轉(zhuǎn)換,將串行數(shù)據(jù)從輸出端口按照約定的波特率輸出。
波特率產(chǎn)生模塊的功能:一般通過FPGA內(nèi)部的PLL鎖相環(huán)以及分頻模塊,獲得串口發(fā)送模塊波特率時鐘驅(qū)動串口發(fā)送模塊,獲得串口接收模塊16倍頻波特率時鐘驅(qū)動串口接收模塊。
DSP接口控制模塊具體功能為:根據(jù)DSP接口的讀信號、寫信號、片選信號以及地址信號產(chǎn)生相應(yīng)的接收FIFO讀信號、發(fā)送FIFO寫信號、以及讀取接收FIFO深度等功能。
在常用方法中,數(shù)據(jù)緩存操作通常采用FPGA生產(chǎn)商免費提供的FIFO軟核,是一種采用環(huán)形存儲結(jié)構(gòu)的先進先出存儲器[2]。FIFO結(jié)構(gòu)如圖3所示。
圖3 異步FIFO結(jié)構(gòu)圖
圖3中,F(xiàn)IFO的存儲介質(zhì)為一個雙端口RAM,可以同時進行讀寫操作。左側(cè)為一個寫時鐘域,由寫地址邏輯產(chǎn)生寫控制信號和寫地址,可以把數(shù)據(jù)寫入RAM;右側(cè)為一個讀時鐘域,由讀地址邏輯產(chǎn)生讀控制信號和讀地址,可以讀出RAM中的數(shù)據(jù)。另外,由空/滿標志位產(chǎn)生邏輯對讀寫地址相互比較產(chǎn)生空、滿標志位以及動態(tài)刷新FIFO的深度,該模塊需要和讀時鐘域、寫時鐘域進行交互,存在跨時鐘域的問題。
綜上所述,常用方法是基于FPGA內(nèi)部FIFO建立串口通信模塊,在工程應(yīng)用中,經(jīng)常遇到諸多問題,如FIFO深度讀取不正確、FIFO寫數(shù)據(jù)端口與讀數(shù)據(jù)端口時序競爭、多個模塊間信號延時導致FPGA亞穩(wěn)態(tài)等問題。究其原因是由于FIFO軟核由廠家封裝后,對用戶開發(fā)是一個“黑盒子”,其內(nèi)部設(shè)計無法被用戶優(yōu)化[3]。因此在改進方法中,設(shè)計循環(huán)緩存代替了FIFO,利用計數(shù)器代替了波特率產(chǎn)生模塊,可以把串口發(fā)送模塊整合成一個模塊,把串口接收模塊整合成一個模塊,并且兩個模塊只采用一個主時鐘,采用同步時序電路設(shè)計的FPGA,所有寄存器的時鐘輸入端共享一個時鐘,可以有效地消除亞穩(wěn)態(tài)。
2.1 利用寄存器數(shù)組作為循環(huán)緩存代替FIFO
定義一個寄存器數(shù)組[4]:reg[7:0] data_HC[511:0],數(shù)據(jù)寬度為8位,長度為512。
定義一個讀指針計數(shù)器:reg[8:0] REcount = 9’h000,計數(shù)范圍為[0~511]。
定義一個寫指針計數(shù)器:reg[8:0] WEcount = 9’h000,計數(shù)范圍為[0~511]。
如圖4所示,采用一個主時鐘對循環(huán)緩存data_HC進行讀、寫操作,當向循環(huán)緩存data_HC寫入數(shù)據(jù)后,寫指針WEcount加1;當從循環(huán)緩存data_HC讀出數(shù)據(jù)后,讀指針REcount加1。當讀、寫指針遞增到511后,再加1則自動為0,依次循環(huán)。循環(huán)緩存還需要建立3個關(guān)鍵的變量。
圖4 循環(huán)緩存data_HC示意圖
循環(huán)緩存的深度:wire [8:0] cnt;
循環(huán)緩存的滿標志:wire FULL;
循環(huán)緩存的空標志:wire EMPTY;
深度cnt即循環(huán)緩存data_HC中數(shù)據(jù)的個數(shù),利用寫指針WEcount與讀指針Recount比較,當WEcount >= Recount時,cnt = WEcount -Recount。當WEcount < Recount時,cnt = WEcount +512 -Recount。利用邏輯電路表達式為:
assign cnt = (WEcount >= Recount)?( WEcount -Recount):( WEcount +512 -Recount)。
空、滿標志產(chǎn)生的原則是:寫滿而不溢出,讀空而不多讀。即在滿信號有效時若繼續(xù)向FIFO寫數(shù)據(jù),應(yīng)根據(jù)設(shè)計的要求對數(shù)據(jù)作保持或拋棄重發(fā)處理,空標志的產(chǎn)生也是如此。
當深度cnt=0時,設(shè)置空標志EMPTY=1。當深度cnt=256時,設(shè)置滿標志FULL=1。當然,滿標志FULL的深度cnt數(shù)值可以靈活設(shè)置。利用邏輯電路表達式為[3]:
assign EMPTY = (cnt === 9’d0)?1:0;
assign FULL = (cnt ===9’d256)?1:0;
當向循環(huán)緩存data_HC寫入數(shù)據(jù)時,代碼示例如下:
if(~FULL)
begin
data_HC[WEcount] <= data_in;
WEcount <= WEcount + 1;
end
當從循環(huán)緩存data_HC讀出數(shù)據(jù)時,代碼示例如下:
if(~EMPTY)
begin
data_out <= data_HC[REcount];
REcount <= Recount + 1;
end
2.2 利用計數(shù)器代替波特率產(chǎn)生模塊
串口發(fā)送模塊的時鐘一般和串口發(fā)送波特率一致,當發(fā)送數(shù)據(jù)時,只需要按照時鐘把循環(huán)緩存中的數(shù)據(jù)并/串轉(zhuǎn)換后,按幀格式發(fā)送。
串口接收模塊的時鐘一般是串口接收波特率的16倍頻。當接收數(shù)據(jù)時,由于接收節(jié)點和發(fā)送節(jié)點的時鐘異步,所以需要對數(shù)據(jù)位進行多次采樣,采樣次數(shù)越多,采樣點就可以越靠近數(shù)據(jù)位中點,降低采樣錯誤的概率。但是,采樣次數(shù)越多,其系統(tǒng)開銷就越大。因此,設(shè)計串口接收模塊的時鐘是串口接收波特率的16倍頻,每個數(shù)據(jù)位可以采樣16次,并且只取靠近中間的3個采樣點,如第7、8、9次,并且對3次的采樣點值,通過3判2進行裁決,進一步降低采樣誤碼概率。
上述方法中,需要通過FPGA的主時鐘經(jīng)過PLL鎖相環(huán)和分頻模塊產(chǎn)生串口發(fā)送時鐘和串口接收時鐘,分別驅(qū)動串口發(fā)送模塊和串口接收模塊。利用計數(shù)器完全可以替代波特率產(chǎn)生模塊,其優(yōu)點是只需要FPGA的主時鐘,而不進行分頻,其時鐘相位、延時都不會由于分頻而產(chǎn)生變化。
例如,RS422串口全雙工通信,收、發(fā)波特率都為38400bpt/s,F(xiàn)PGA中模塊主時鐘用14.745 6 MHz。在串口發(fā)送模塊,以14.745 6 MHz時鐘的上升沿為觸發(fā)模式進行計數(shù),當計數(shù)到384時,進入圖5串口發(fā)送模塊狀態(tài)機,根據(jù)狀態(tài)機執(zhí)行相應(yīng)的動作,并且計數(shù)重新置1,主時鐘下一個上升沿來時,繼續(xù)進行計數(shù)動作。在串口接收模塊,以14.745 6 MHz時鐘的上升沿為觸發(fā)模式進行計數(shù),當計數(shù)到24時,進入圖6串口接收模塊狀態(tài)機,根據(jù)狀態(tài)機執(zhí)行相應(yīng)的動作,并且計數(shù)重新置1,主時鐘下一個上升沿來時,繼續(xù)進行計數(shù)動作。
2.3 發(fā)送模塊設(shè)計
DSP向數(shù)據(jù)緩存data_HC寫數(shù)據(jù),F(xiàn)PGA檢測到DSP的串口寫信號有效,并且數(shù)據(jù)緩存未滿,把DSP數(shù)據(jù)總線上的數(shù)據(jù)裝入數(shù)據(jù)緩存data_HC[WEcount],并且WEcount寫指針加1。FPGA中串口發(fā)送模塊,以主時鐘上升沿進行計數(shù),當計數(shù)到分頻時鐘的值(BAND=主時鐘頻率/發(fā)送數(shù)據(jù)波特率)時,進行狀態(tài)機判斷和跳轉(zhuǎn),并且計數(shù)值重新置1,過程如圖5所示。
發(fā)送模塊狀態(tài)機設(shè)計如下:狀態(tài)1檢測循環(huán)緩存data_HC是否為空,如果循環(huán)緩存data_HC非空,讀取data_HC[REcount]值(1個字節(jié)),REcount讀指針加1,跳轉(zhuǎn)到狀態(tài)2,然后依次從狀態(tài)2~狀態(tài)12跳轉(zhuǎn),其狀態(tài)為發(fā)送起始位、數(shù)據(jù)位0~數(shù)據(jù)位7,奇偶校驗位、停止位。
圖5 發(fā)送模塊設(shè)計示意圖
2.4 接收模塊設(shè)計
FPGA中串口接收模塊,以主時鐘上升沿進行計數(shù),當計數(shù)到分頻時鐘的值(BAND=主時鐘頻率/(接收數(shù)據(jù)波特率*16倍頻))時,進行狀態(tài)機判斷和跳轉(zhuǎn),并且計數(shù)值重新置1,過程如圖6所示。
圖6 接收模塊設(shè)計示意圖
接收模塊狀態(tài)機設(shè)計如下:狀態(tài)1檢測數(shù)據(jù)線是否有起始位,如果檢測到起始位,跳轉(zhuǎn)到狀態(tài)2,狀態(tài)2為檢測到起始位的中間位置,然后依次從狀態(tài)3~狀態(tài)11跳轉(zhuǎn),其狀態(tài)為數(shù)據(jù)位0~數(shù)據(jù)位7,奇偶校驗位的中間位置采樣,最后跳轉(zhuǎn)到狀態(tài)12,停止位的中間位置,對數(shù)據(jù)進行奇偶校驗,以及判斷data_HC是否滿,如果未滿,把數(shù)據(jù)寫入數(shù)據(jù)緩存data_HC[WEcount],并且WEcount寫指針加1。
DSP可以讀取與FPGA約定的兩個地址,一個為數(shù)據(jù)緩存深度地址[4],如addr_data_count,另一個為數(shù)據(jù)緩存中數(shù)據(jù)地址,如addr_data。當DSP讀取數(shù)據(jù)緩存深度地址時,F(xiàn)PGA可以把數(shù)據(jù)緩存深度cnt鎖存后放到DSP數(shù)據(jù)線上。當DSP讀取數(shù)據(jù)緩存中數(shù)據(jù)地址時,F(xiàn)PGA判斷數(shù)據(jù)緩存data_HC非空后,把data_HC[REcount]鎖存后放到數(shù)據(jù)線上,并且讀指針REcount加1。
在XXX組合導航系統(tǒng)中,F(xiàn)PGA硬件采用A3P1000,DSP采用TI公司的TMS320C6713B,產(chǎn)品包含與陀螺、上位機、轉(zhuǎn)位機構(gòu)、北斗系統(tǒng)等進行RS422串口通信的11個接收、發(fā)送模塊。采用改進方法后,在測試過程中,常溫條件下,產(chǎn)品連續(xù)工作100多個小時,未出現(xiàn)串口通信錯誤。在高溫、低溫條件下,分別進行1小時測試,未出現(xiàn)任何通信異?,F(xiàn)象,也沒有出現(xiàn)誤碼現(xiàn)象。
在常用方法中,如圖2所示,多個模塊間需要傳遞時鐘、數(shù)據(jù)、FIFO控制信號等,系統(tǒng)很容易產(chǎn)生亞穩(wěn)態(tài)。亞穩(wěn)態(tài)就是觸發(fā)器工作在一種不確定的狀態(tài),這種不確定的狀態(tài)將會影響到下一級觸發(fā)器,最終導致連鎖反應(yīng),從而使整個系統(tǒng)功能失常。當信號在異步電路中或多個時鐘域之間傳輸時,容易產(chǎn)生亞穩(wěn)態(tài)現(xiàn)象。在改進方法中,通過模塊整合,只采用一個主時鐘,所有寄存器時鐘輸入端共享一個時鐘,有效避免了系統(tǒng)亞穩(wěn)態(tài)的產(chǎn)生。
本文首先介紹了一種FPGA實現(xiàn)RS422串口通信的常用方法,包括波特率產(chǎn)生、串口發(fā)送、串口接收、FPGA的FIFO軟核等模塊,然后設(shè)計并實現(xiàn)了一種改進方法。在改進方法中由于設(shè)計了循環(huán)緩存代替了FIFO,利用計數(shù)器代替了波特率產(chǎn)生模塊,因此,可以把串口發(fā)送模塊整合成一個模塊,把串口接收模塊整合成一個模塊,并且串口發(fā)送模塊、串口接收模塊只采用一個主時鐘,采用同步時序電路設(shè)計的FPGA,所有寄存器的時鐘輸入端共享一個時鐘,可以有效地消除亞穩(wěn)態(tài),提高了RS422串口通信的可靠性、穩(wěn)定性,具有較高的應(yīng)用推廣價值。
[1] 三恒星科技. TMS320C6713 DSP原理與應(yīng)用實例[M] .北京:電子工業(yè)出版社,2012.
[2] ProASIC 3 Flash Family FPGAs 使用手冊[Z]. 北京:ACTEL公司,2013.
[3] 夏宇聞. Verilog數(shù)字系統(tǒng)設(shè)計教程[M] . 北京:北京航空航天大學出版社,2013.
[4] FT-C6713J/250軍用DSP產(chǎn)品使用手冊[Z]. 北京:國防科學技術(shù)大學,2012.
A New Method of RS422 Serial Port Communication Based on FPGA
Liu Jie1,Zang Wei2,Liang Xiaopeng3,Li Junwu4
(1.Guizhou Aerospace Kai Shan Petroleum Instrument Co., Ltd.,Guiyang 550000, China;2.1STMachinery Works of CNPC BOHAI Equipment Manufacturing Co., Ltd., Qingxian 062650, China;3.6STOil Production Plant of Changqing Oilfield, Yulin 718600, China;4.7STOil Production Plant of Changqing Oilfield, Huanxian 745700, China)
The common method of RS422 serial port communication realized by FPGA often encounter many problems, such as FIFO depth is incorrect, the timing of writing FIFO data port and reading FIFO data port are compete, and signal delay between multiple modules leads to FPGA metastable state, so a new method of RS422 serial port communication is proposed. This method replaces the traditional FIFO by using register array as a cyclic queue, uses the counter instead of the baud rate generation module, integrate multiple modules into one module, only one master clock, all registers share one clock with the clock input, and constraints FPGA logic and timing to avoid the FPGA metastable state. The experimental results show that the method is fast, reliable and stable. It can make the whole system more flexible and compact, reduce the whole circuit volume and improve the reliability and stability of the system.
RS422;FPGA;DSP;Verilog HDL
2016-12-12;
2017-02-06。
劉 杰(1984-),女,山東單縣人,碩士研究生,工程師,主要從事電路、軟件方向的研究。
1671-4598(2017)03-0191-04
10.16526/j.cnki.11-4762/tp.2017.03.052
TP3
A