摘要 FPGA適合于大量數據處理的應用,廣泛應用于嵌入式系統。本文設計的FPGA模塊需要對GPS、便攜打印機和串口數據進行處理,將詳細介紹如何設計FPGA和不同外設之間的數據傳輸。同時,在RTL編碼中,編寫使綜合與布局布線效果更佳的代碼。
關鍵詞 FPGA 綜合
引言
????? FPGA(FieldProgrammable Gate Array),即現場可編程門陣列,包括可配置邏輯模塊CLB(Configurable Logic Block)、輸出輸入模塊IOB(Input Output Block)和內部連線(Interconnect)三個主要部分。FPGA最大的優點就是可編程性,不投片也能開發自己的芯片,或者作為ASIC芯片的樣片。FPGA是ASIC電路中設計周期最短、開發費用最低、風險最小的器件之一,在嵌入式系統中廣泛應用,特別是大批量的數據傳輸的應用。本設計采用FPGA實現一個系統中的數據傳輸模塊的控制、采集功能,包括的外設有GPS接收設備、便攜打印機和串口。設計中考慮復用問題,本設計的策略還強調RTL編碼和綜合,使設計出來的數據傳輸模塊邏輯能使綜合與布局布線效果更佳。
1 模塊硬件設計
?????? FPGA數據傳輸模塊硬件是獨立出來的一塊PCB板,包括的器件有Xilinx Spartan FPGA ,兩片XCF01s為FPGA做配置,一片RAM芯片ISC61C1024,電源芯片、串口插座和GPS接收裝置等,FPGA中沒有和上述芯片連接的引腳引出到PCB板兩側,部分和嵌入式處理器連接,剩余引腳提供給系統擴展。FPGA有多種配置模式,本文采用可以采用串行PROM編程FPGA,兩片XCF01s以菊花鏈方式連接。圖1為硬件模塊框圖。
?
?
?
?
?
?
?
?
?
?
?
?
?
2 FPGA總體設計
?????? 本模塊中的FPGA具體功能為:
(1)采集GPS傳輸來的串行數據。因為本系統采集的GPS數據較多,所以通過解碼后存儲到外部RAM中。如果使用的FPGA資源豐富,可以考慮把數據存儲到FPGA內部。
????? (2)采集串口傳輸來的串行數據。根據需求,該串口數據頻率不高,采用一個FPGA內部寄存器就能滿足要求。
(3)輸出數據到便攜打印機。在FPGA中建立一塊64個8位數據的寄存器組,保存將要打印的數據,通過串行編碼,把并行數據轉化為串行數據,輸出到便攜打印機。
FPGA設計分為如下幾個部分:主控邏輯、串行數據解碼、串行數據編碼、RAM讀寫邏輯、打印機寫邏輯和串口接收邏輯,FPGA設計框圖如圖2所示:
? |
? |
?
?
?
?
?
?
?
?
?
?
?
?
3 詳細設計
3.1主控邏輯
FPGA中的主控邏輯控制模塊負責數據切換,把CPU需要接收或傳送的數據送到處理器數據總線上。在本模塊中,處理器需要接收的數據是GPS和串口的數據,需要發送的數據是打印機的數據。微處理器每隔一定時間(現設定為1s)讀取一次RAM中的GPS數據,根據設計,1s內數據不會超過RAM的容量,此時控制邏輯切換GPS數據到總線;串口的數據到來時間不確定也不頻繁,采用中斷的方式,通過中斷處理程序來讀取,此時切換到串口數據;需要給打印機數據的時候,切換到打印機數據。這三種數據根據不同的總線地址來判斷。
3.2 串行數據編碼解碼
????? 本模塊的串行數據幀格式定義為1位起始位、8位數據位和1位停止位,波特率為9600。
解碼模塊中,采樣時鐘是波特率的16倍,為了防止毛刺,采用二次采樣方式,VerilogHDL代碼如下,rxd1和rxd2是兩個串接寄存器,因為串行數據在不傳送字符時保持為1,所以初始化為1。rxd直接與輸入的串行信號相連,不斷地檢測,一旦有檢測到0,則應該準備接收數據了。
always @(posedge clk16x or negedge rst)
if (!rst) begin
???????? rxd1 <=1'b1 ;
???????? rxd2 <=1'b1 ;
end
else begin
???????? rxd1 <=rxd ;
???????? rxd2 <= rxd1 ;
end
解碼中最主要的邏輯是串并轉換,這通過移位寄存器實現,移位寄存器表示為rsr[0] <= rxd2;rsr[7:1] <= rsr[6:0]。同時通過計數器來判斷收到了多少位數據,如果需求中不是8位數據位,那么可以通過更改計數器,來接收不同的數據。
編碼邏輯將并行數據轉換為所定義的串行幀格式編碼,也是通過移位寄存器將串行數據一位一位發送到便攜打印上。
3.3 RAM讀寫
?????? RAM讀寫部分實際上是一個異步FIFO控制邏輯,FIFO是一種先進先出的電路,使用在數據接口部分,用來存儲、緩沖在兩個異步時鐘之間的數據傳輸。RAM寫的時鐘是處理器時鐘,讀的時鐘是編碼器提供的時鐘,這兩個時鐘域是不同的。
FIFO控制邏輯利用狀態機來編寫,分為空閑態、準備讀狀態、讀狀態、讀完成狀態、準備寫狀態、寫狀態和寫完成狀態。邏輯中設置兩個讀寫地址寄存器(如圖3所示),通過地址判斷設置存儲器的空、滿狀態。如果存儲器空,則不能讀,存儲器滿不能寫。判斷的條件是,若rp+1==wp且進入讀狀態,則存儲器為空,停止讀;wp+1==rp且進入寫狀態,則存儲器為滿,停止寫。
? |
? |
?
?
?
?
對于硬件描述語言,不同的書寫風格導致綜合出的網表在面積、速度和效率上的差別都很大。這里的邏輯采用三段式狀態機描述方法,雖然代碼結構復雜了一些,但是消除了組合邏輯輸出的不穩定與毛刺的隱患,而且更利于時序路徑分組,一般來說在FPGA/CPLD等可編程邏輯器件上的綜合與布局布線效果更佳。三段式狀態機的格式如下,三段式并不指三個always模塊,實際上更復雜的設計,always塊大于三個。
always @ (posedge clk or negedge rst_n)?
?if(!rst_n)
?????? current_state <= IDLE;
?else
?? ???? current_state<= next_state;
?
always @ (current_state)??
? begin
??? ?? next_state= x;?
??? ?? case(current_state)
??? S1: if(...)
?????? ???????? next_state = S2;?
??? ...
????endcase
end?
?
always @ (posedge clk or negedge rst_n)
…/*初始化*/
?case(next_state)
S1:out1 <= 1'b1;?
S2:out2 <= 1'b1;
default:...??
endcase
end
3.4 打印機寫邏輯
?????? 打印機寫邏輯中,定義了一塊FPGA內部的寄存器組,也采用FIFO方式。在該模塊中,讀寫時鐘不同,所以也是異步FIFO,亞穩態必定會發生在異步FIFO中,所以對寫地址/讀地址采用格雷碼。同步多個異步輸入信號出現亞穩態的概率遠遠大于同步一個異步信號的概率,對多個觸發器的輸出所組成的寫地址/讀地址可以采用格雷碼。由于格雷碼每次只變化一位,采用格雷碼可以有效地減少亞穩態的產生。本邏輯通過總線地址譯碼,轉換出寄存器地址的格雷碼,地址數據的n與n+1(n=1,2,……,n; n+1位取0)位異或即可得出對應的格雷碼。因為SRAM中地址總數遠遠大于64,所以沒有使用格雷碼,因為譯碼部分會占FPGA面積。如果采用資源較多的FPGA,可以加入這部分。格雷碼的Verilog編碼如下:
module GARY (EN ,ADDR_IN ,ADDR_OUT );
parameter SIZE = 5;
input EN ;
input [SIZE:0] ADDR_IN ;
output [SIZE:0] ADDR_OUT ;
?
assign ADDR_OUT [0] =(ADDR_IN [0] ^ ADDR_IN [1] ) && EN ;
assign ADDR_OUT [1] =(ADDR_IN [1] ^ ADDR_IN [2] ) && EN ;
assign ADDR_OUT [2] =(ADDR_IN [2] ^ ADDR_IN [3] ) && EN ;
…
assign ADDR_OUT [5] = (ADDR_IN[5] ^0) && EN ;
endmodule
3.5 串口接收邏輯
????? 串口接收邏輯相對簡單,串行解碼后的值,存儲到定義的寄存器中,然后向處理器發中斷信號,通過中斷處理程序來讀取該數據。一般中斷信號是邊沿觸發,那么Verilog邏輯產生一個0-1跳變。不同處理器的邊沿觸發不同,0-1或者1-0,要根據實際情況設置。
4 小結
FPGA是一種有效的ASIC開發手段,在嵌入式應用中使用廣泛。本文采用Xilinx FPGA實現了多個外設之間的數據通信,這種方式將數據采集獨立開來,能減輕處理器的負擔。同時,使用FPGA也能增強功能的靈活性和可擴展性。
參考文獻
[1] 夏宇聞,Verilog數字系統設計教程,北京航空航天大學出版社,2003年7月第一版
[2] Westor Wang,How to design FSM,LatticInc.2006
[3] www.xilinx.com