劉 杰,臧 煒,梁曉鵬,李軍武
(1.貴州航天凱山石油儀器有限公司,貴陽 550000; 2.中國石油渤海裝備公司第一機械廠,河北 青縣 062650; 3.長慶油田第六采油廠,陜西 榆林 718600; 4.長慶油田第七采油廠,甘肅 環縣 745700)
一種新型的FPGA實現RS422串口通信方法
劉 杰1,臧 煒2,梁曉鵬3,李軍武4
(1.貴州航天凱山石油儀器有限公司,貴陽 550000; 2.中國石油渤海裝備公司第一機械廠,河北 青縣 062650; 3.長慶油田第六采油廠,陜西 榆林 718600; 4.長慶油田第七采油廠,甘肅 環縣 745700)
在FPGA實現RS422串口通信的常用方法中經常遇到諸多問題,如FIFO深度讀取不正確、FIFO寫數據端口與讀數據端口時序競爭、多個模塊間信號延時導致FPGA亞穩態等問題,因此設計了一種新型的RS422串口通信實現方法;該方法通過利用寄存器數組作為循環緩存代替FIFO,利用計數器代替傳統的波特率產生模塊,把常用方法中的多個模塊整合成一個模塊,只采用一個主時鐘,所有寄存器的時鐘輸入端共享一個時鐘,對FPGA邏輯與時序進行了有效約束,避免了FPGA中亞穩態產生;試驗結果表明該方法實現的RS422串口通信高速、可靠、穩定,并且利用FPGA實現RS422串口通信,可使整個系統更為靈活、緊湊,減小整個電路的體積,提高系統的可靠性和穩定性。
RS422;FPGA;DSP;Verilog HDL
目前,嵌入式電子系統設計多采用DSP+FPGA架構,因為其兼顧了DSP和FPGA的優點。DSP的優點是能夠實現復雜的算法結構,運算速度高、尋址方式靈活等,適合于運算能力和存儲容量有較高要求的應用場合[1]。FPGA的優點是基于可編程邏輯器件進行數字邏輯設計,性能穩定、易于維護、性價比高、產品體積小、信號間干擾小、研制周期短等,并發處理能力強,可以作為DSP的各種外圍電路的控制器。因此,采用DSP和FPGA數字信號處理系統可以把兩者的優點結合起來,兼顧速度和靈活性,優勢互補,符合當前軟硬件融合協調工作的趨勢。
RS422 串口通信在航空航天及工業控制領域有著廣泛的應用,其特點是點對點通信、傳輸距離長、抗干擾能力強、傳輸速率高等方面。利用FPGA實現RS422串口通信,可使整個系統更為靈活、緊湊,減小整個電路的體積,提高系統的可靠性和穩定性。
本文首先介紹了一種FPGA實現RS422串口通信的常用方法,然后設計并實現了一種改進方法,在改進方法中采用寄存器數組作為循環緩存代替FIFO,利用計數器代替波特率產生模塊,把常用方法中的四個模塊進行整合,采用同步時鐘代替異步時鐘,對FPGA邏輯與時序進行了有效約束,避免了FPGA中亞穩態產生,提高了RS422串口通信的可靠性、穩定性。
RS422串口通信的幀格式如圖1所示。

圖1 RS422串口通信幀格式
一幀數據包括起始位、數據位、校驗位和停止位。線路空閑時,傳輸線路保持高電平。當發送數據時,發送節點要先發一個低電平的起始位,表示一幀數據的開始,然后發送有效數據位,通常為8個比特,然后發送奇偶校驗位,最后發送停止位,停止位為高電平,表示一幀數據發送結束。
串口通信結構框圖如圖2所示。

圖2 串口通信結構框圖
DSP與FPGA之間的通信方式采用DSP的EMIF方式,即地址總線、數據總線和控制總線。FPGA內部實現RS422通信功能,主要包括接收模塊、發送模塊、波特率產生模塊、DSP接口控制模塊等4個部分。RS422串口通信外設一般是指RS422收發芯片,如MAX3087,完成TLL電平和RS422差分電平之間的轉換,通常與FPGA相連時要經過數字隔離器,進行地線隔離。
串口接收模塊的功能為:FPGA首先檢測數據的起始位,然后獲得有效數據位的信息,并且對有效數據位進行奇偶校驗后,進行串/并轉換,存入串口接收FIFO中,等待DSP進行查詢讀取,當DSP讀串口接收FIFO地址時,FPGA把串口接收FIFO中的數據放到數據總線上。
串口發送模塊的功能為:首先DSP通過EMIF接口向FPGA的串口發送FIFO寫數據,FPGA把數據存入串口發送FIFO中,進行并/串轉換,將串行數據從輸出端口按照約定的波特率輸出。
波特率產生模塊的功能:一般通過FPGA內部的PLL鎖相環以及分頻模塊,獲得串口發送模塊波特率時鐘驅動串口發送模塊,獲得串口接收模塊16倍頻波特率時鐘驅動串口接收模塊。
DSP接口控制模塊具體功能為:根據DSP接口的讀信號、寫信號、片選信號以及地址信號產生相應的接收FIFO讀信號、發送FIFO寫信號、以及讀取接收FIFO深度等功能。
在常用方法中,數據緩存操作通常采用FPGA生產商免費提供的FIFO軟核,是一種采用環形存儲結構的先進先出存儲器[2]。FIFO結構如圖3所示。

圖3 異步FIFO結構圖
圖3中,FIFO的存儲介質為一個雙端口RAM,可以同時進行讀寫操作。左側為一個寫時鐘域,由寫地址邏輯產生寫控制信號和寫地址,可以把數據寫入RAM;右側為一個讀時鐘域,由讀地址邏輯產生讀控制信號和讀地址,可以讀出RAM中的數據。另外,由空/滿標志位產生邏輯對讀寫地址相互比較產生空、滿標志位以及動態刷新FIFO的深度,該模塊需要和讀時鐘域、寫時鐘域進行交互,存在跨時鐘域的問題。
綜上所述,常用方法是基于FPGA內部FIFO建立串口通信模塊,在工程應用中,經常遇到諸多問題,如FIFO深度讀取不正確、FIFO寫數據端口與讀數據端口時序競爭、多個模塊間信號延時導致FPGA亞穩態等問題。究其原因是由于FIFO軟核由廠家封裝后,對用戶開發是一個“黑盒子”,其內部設計無法被用戶優化[3]。因此在改進方法中,設計循環緩存代替了FIFO,利用計數器代替了波特率產生模塊,可以把串口發送模塊整合成一個模塊,把串口接收模塊整合成一個模塊,并且兩個模塊只采用一個主時鐘,采用同步時序電路設計的FPGA,所有寄存器的時鐘輸入端共享一個時鐘,可以有效地消除亞穩態。
2.1 利用寄存器數組作為循環緩存代替FIFO
定義一個寄存器數組[4]:reg[7:0] data_HC[511:0],數據寬度為8位,長度為512。
定義一個讀指針計數器:reg[8:0] REcount = 9’h000,計數范圍為[0~511]。
定義一個寫指針計數器:reg[8:0] WEcount = 9’h000,計數范圍為[0~511]。
如圖4所示,采用一個主時鐘對循環緩存data_HC進行讀、寫操作,當向循環緩存data_HC寫入數據后,寫指針WEcount加1;當從循環緩存data_HC讀出數據后,讀指針REcount加1。當讀、寫指針遞增到511后,再加1則自動為0,依次循環。循環緩存還需要建立3個關鍵的變量。

圖4 循環緩存data_HC示意圖
循環緩存的深度:wire [8:0] cnt;
循環緩存的滿標志:wire FULL;
循環緩存的空標志:wire EMPTY;
深度cnt即循環緩存data_HC中數據的個數,利用寫指針WEcount與讀指針Recount比較,當WEcount >= Recount時,cnt = WEcount -Recount。當WEcount < Recount時,cnt = WEcount +512 -Recount。利用邏輯電路表達式為:
assign cnt = (WEcount >= Recount)?( WEcount -Recount):( WEcount +512 -Recount)。
空、滿標志產生的原則是:寫滿而不溢出,讀空而不多讀。即在滿信號有效時若繼續向FIFO寫數據,應根據設計的要求對數據作保持或拋棄重發處理,空標志的產生也是如此。
當深度cnt=0時,設置空標志EMPTY=1。當深度cnt=256時,設置滿標志FULL=1。當然,滿標志FULL的深度cnt數值可以靈活設置。利用邏輯電路表達式為[3]:
assign EMPTY = (cnt === 9’d0)?1:0;
assign FULL = (cnt ===9’d256)?1:0;
當向循環緩存data_HC寫入數據時,代碼示例如下:
if(~FULL)
begin
data_HC[WEcount] <= data_in;
WEcount <= WEcount + 1;
end
當從循環緩存data_HC讀出數據時,代碼示例如下:
if(~EMPTY)
begin
data_out <= data_HC[REcount];
REcount <= Recount + 1;
end
2.2 利用計數器代替波特率產生模塊
串口發送模塊的時鐘一般和串口發送波特率一致,當發送數據時,只需要按照時鐘把循環緩存中的數據并/串轉換后,按幀格式發送。
串口接收模塊的時鐘一般是串口接收波特率的16倍頻。當接收數據時,由于接收節點和發送節點的時鐘異步,所以需要對數據位進行多次采樣,采樣次數越多,采樣點就可以越靠近數據位中點,降低采樣錯誤的概率。但是,采樣次數越多,其系統開銷就越大。因此,設計串口接收模塊的時鐘是串口接收波特率的16倍頻,每個數據位可以采樣16次,并且只取靠近中間的3個采樣點,如第7、8、9次,并且對3次的采樣點值,通過3判2進行裁決,進一步降低采樣誤碼概率。
上述方法中,需要通過FPGA的主時鐘經過PLL鎖相環和分頻模塊產生串口發送時鐘和串口接收時鐘,分別驅動串口發送模塊和串口接收模塊。利用計數器完全可以替代波特率產生模塊,其優點是只需要FPGA的主時鐘,而不進行分頻,其時鐘相位、延時都不會由于分頻而產生變化。
例如,RS422串口全雙工通信,收、發波特率都為38400bpt/s,FPGA中模塊主時鐘用14.745 6 MHz。在串口發送模塊,以14.745 6 MHz時鐘的上升沿為觸發模式進行計數,當計數到384時,進入圖5串口發送模塊狀態機,根據狀態機執行相應的動作,并且計數重新置1,主時鐘下一個上升沿來時,繼續進行計數動作。在串口接收模塊,以14.745 6 MHz時鐘的上升沿為觸發模式進行計數,當計數到24時,進入圖6串口接收模塊狀態機,根據狀態機執行相應的動作,并且計數重新置1,主時鐘下一個上升沿來時,繼續進行計數動作。
2.3 發送模塊設計
DSP向數據緩存data_HC寫數據,FPGA檢測到DSP的串口寫信號有效,并且數據緩存未滿,把DSP數據總線上的數據裝入數據緩存data_HC[WEcount],并且WEcount寫指針加1。FPGA中串口發送模塊,以主時鐘上升沿進行計數,當計數到分頻時鐘的值(BAND=主時鐘頻率/發送數據波特率)時,進行狀態機判斷和跳轉,并且計數值重新置1,過程如圖5所示。
發送模塊狀態機設計如下:狀態1檢測循環緩存data_HC是否為空,如果循環緩存data_HC非空,讀取data_HC[REcount]值(1個字節),REcount讀指針加1,跳轉到狀態2,然后依次從狀態2~狀態12跳轉,其狀態為發送起始位、數據位0~數據位7,奇偶校驗位、停止位。

圖5 發送模塊設計示意圖
2.4 接收模塊設計
FPGA中串口接收模塊,以主時鐘上升沿進行計數,當計數到分頻時鐘的值(BAND=主時鐘頻率/(接收數據波特率*16倍頻))時,進行狀態機判斷和跳轉,并且計數值重新置1,過程如圖6所示。

圖6 接收模塊設計示意圖
接收模塊狀態機設計如下:狀態1檢測數據線是否有起始位,如果檢測到起始位,跳轉到狀態2,狀態2為檢測到起始位的中間位置,然后依次從狀態3~狀態11跳轉,其狀態為數據位0~數據位7,奇偶校驗位的中間位置采樣,最后跳轉到狀態12,停止位的中間位置,對數據進行奇偶校驗,以及判斷data_HC是否滿,如果未滿,把數據寫入數據緩存data_HC[WEcount],并且WEcount寫指針加1。
DSP可以讀取與FPGA約定的兩個地址,一個為數據緩存深度地址[4],如addr_data_count,另一個為數據緩存中數據地址,如addr_data。當DSP讀取數據緩存深度地址時,FPGA可以把數據緩存深度cnt鎖存后放到DSP數據線上。當DSP讀取數據緩存中數據地址時,FPGA判斷數據緩存data_HC非空后,把data_HC[REcount]鎖存后放到數據線上,并且讀指針REcount加1。
在XXX組合導航系統中,FPGA硬件采用A3P1000,DSP采用TI公司的TMS320C6713B,產品包含與陀螺、上位機、轉位機構、北斗系統等進行RS422串口通信的11個接收、發送模塊。采用改進方法后,在測試過程中,常溫條件下,產品連續工作100多個小時,未出現串口通信錯誤。在高溫、低溫條件下,分別進行1小時測試,未出現任何通信異常現象,也沒有出現誤碼現象。
在常用方法中,如圖2所示,多個模塊間需要傳遞時鐘、數據、FIFO控制信號等,系統很容易產生亞穩態。亞穩態就是觸發器工作在一種不確定的狀態,這種不確定的狀態將會影響到下一級觸發器,最終導致連鎖反應,從而使整個系統功能失常。當信號在異步電路中或多個時鐘域之間傳輸時,容易產生亞穩態現象。在改進方法中,通過模塊整合,只采用一個主時鐘,所有寄存器時鐘輸入端共享一個時鐘,有效避免了系統亞穩態的產生。
本文首先介紹了一種FPGA實現RS422串口通信的常用方法,包括波特率產生、串口發送、串口接收、FPGA的FIFO軟核等模塊,然后設計并實現了一種改進方法。在改進方法中由于設計了循環緩存代替了FIFO,利用計數器代替了波特率產生模塊,因此,可以把串口發送模塊整合成一個模塊,把串口接收模塊整合成一個模塊,并且串口發送模塊、串口接收模塊只采用一個主時鐘,采用同步時序電路設計的FPGA,所有寄存器的時鐘輸入端共享一個時鐘,可以有效地消除亞穩態,提高了RS422串口通信的可靠性、穩定性,具有較高的應用推廣價值。
[1] 三恒星科技. TMS320C6713 DSP原理與應用實例[M] .北京:電子工業出版社,2012.
[2] ProASIC 3 Flash Family FPGAs 使用手冊[Z]. 北京:ACTEL公司,2013.
[3] 夏宇聞. Verilog數字系統設計教程[M] . 北京:北京航空航天大學出版社,2013.
[4] FT-C6713J/250軍用DSP產品使用手冊[Z]. 北京:國防科學技術大學,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