FPGA數據傳輸模塊設計

摘要 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


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/451449.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/451449.shtml
英文地址,請注明出處:http://en.pswp.cn/news/451449.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java獲取當前時間戳的方法

獲取當前時間戳 //方法 一 System.currentTimeMillis(); //方法 二 Calendar.getInstance().getTimeInMillis(); //方法 三 new Date().getTime(); 獲取當前時間 SimpleDateFormat df new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//設置日期格式 String date df.…

解決Linux 忘記root 密碼的辦法

今天突然遇到一個問題&#xff0c;那別人的 linux 系統發現root 密碼竟然不知道&#xff0c;這就尷尬了。經過一番百度&#xff0c;記錄下 如何修改root 密碼 1&#xff1a;開機linxu 按E 鍵 2&#xff1a;繼續按E 鍵 3:選擇 kernel..... 按E 4&#xff1a;在rhgb quiet 后面加…

tomcat的class加載的優先順序

來源&#xff1a;https://bbs.csdn.net/topics/80459833Tomcat的class加載的優先順序一覽 最先是$JAVA_HOME/jre/lib/ext/下的jar文件。環境變量CLASSPATH中的jar和class文件。\$CATALINA_HOME/common/classes下的class文件。\$CATALINA_HOME/commons/endorsed下的jar文件。\$C…

簡單理解Hadoop(Hadoop是什么、如何工作)

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 一、Hadoop主要的任務部署分為3個部分&#xff0c;分別是&#xff1a;Client機器&#xff0c;主節點和從節點。主節點主要負責Hadoop兩個…

JPA @Id 和 @GeneratedValue 注解詳解

Id&#xff1a; Id 標注用于聲明一個實體類的屬性映射為數據庫的主鍵列。該屬性通常置于屬性聲明語句之前&#xff0c;可與聲明語句同行&#xff0c;也可寫在單獨行上。 Id標注也可置于屬性的getter方法之前。 GeneratedValue&#xff1a; GeneratedValue 用于標注主鍵的生…

Factorials 階乘

Description N的階乘寫作N!表示小于等于N的所有正整數的乘積。階乘會很快的變大&#xff0c;如13!就必須用32位整數類型來存儲&#xff0c;70&#xff01;即使用浮點數也存不下了。你的任務是找到階乘最后面的非零位。舉個例子,5!1*2*3*4*5120所以5!的最后面的非零位是2&#x…

硬件模塊設計思想

硬件模塊設計">模塊設計,顧名思義就是將各個不同的功能做成獨立的模塊。然后將各個模塊組合成不同的產品。 對于一個公司硬件模塊化設計,從設計之初,調試,到樣機及產品生產的過程應該是這樣&#xff1a; 1.     了解產品需求 2.     根據需求,選擇合適的處理…

java中的lastIndexOf( )函數是什么意思

int x a.lastIndexOf(b),表示b字符串在a字符串中最后出現的位置。如 a "abcdabcd";b"d";那么x的值為7.

2 分鐘讀懂大數據框架 Hadoop 和 Spark 的異同

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 談到大數據&#xff0c;相信大家對Hadoop和Apache Spark這兩個名字并不陌生。但我們往往對它們的理解只是提留在字面上&#xff0c;并沒有…

操作系統文件編程知識

文件的創建和讀寫 當我們需要打開一個文件進行讀寫操作的時候&#xff0c;我們可以使用系統調用函數open。使用完成以后我們調用另外一個close函數進行關閉操作。 該函數使用的頭文件如下&#xff1a; #include <fcntl.h> #include <unistd.h> #include <sys/ty…

論述HTML5平臺的若干重要特性

開發者已憑借網頁技術制作出創收豐厚的游戲作品許多年&#xff1a;《部落戰爭》憑借靜態網頁頁面大獲成功&#xff0c;《Farmville》憑借Flash開拓出新的疆域。但如今越來越多人覺得&#xff0c;未來HTML5將變成游戲的主要平臺。為什么HTML5如此頗具趣味&#xff0c;它是否真的…

多GPU使用詳解

目錄&#xff1a; 介紹 記錄設備狀態 手動分配狀態 允許GPU內存增長 在多GPU系統是使用單個GPU 使用多個 GPU 一、介紹 在一個典型的系統中&#xff0c;有多個計算設備。在 TensorFlow 中支持的設備類型包括 CPU 和 GPU。他們用字符串來表達&#xff0c;例如&#xff1a; “/cp…

圖片上傳的兩種方式

總的說圖片上傳有兩種方式&#xff0c;一種是把圖片文件寫到數據庫中&#xff0c;另一種是存到服務器文件目錄中。寫到數據庫中的圖片文件需要轉換成二進制流的格式&#xff0c;占用數據庫空間比較多&#xff0c;適合少量圖片的存儲&#xff0c;比如說&#xff0c;系統中某些小…

最好理解的: spring ioc原理講解,強烈推薦!

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 IOC&#xff08;DI&#xff09;&#xff1a;java程序中的每個業務邏輯至少需要兩個或以上的對象來協作完成。通常&#xff0c;每個對象在…

微信小程序 - 回到自己位置(map)

演示效果&#xff1a; 圖片資源 index.js 1 /** 2 * 回到自己位置&#xff0c;在cover-image上綁定點擊事件即可. 3 */ 4 clickcontrol(e) { 5 let mpCtx wx.createMapContext("map"); 6 mpCtx.moveToLocation(); 7 }, 轉載于:https://www.cnbl…

uwsgi搭配nginx

uwsgi搭配nginx可以做域名解析和負載均衡uWSGI&#xff0c;既不用wsgi協議也不用fcgi協議&#xff0c;而是自創了一個uwsgi的協議&#xff0c;據說該協議大約是fcgi協議的10倍那么快。uWSGI的主要特點如下&#xff1a;◆超快的性能。◆低內存占用&#xff08;實測為apache2的mo…

如何讓tomcat服務器運行在80端口,并且無需輸入項目名即可訪問項目()

這個問題最開始遇到的時候是半年前,自己買了個服務器玩,但是域名解析的時候出了問題,我查了查資料才知道騰訊云是默認解析到80端口,而且還改不了. 首先是修改tomcat運行端口號,默認是8080,但是我們可以通過修改配置文件更改, 打開conf/server.xml文件找到這個地方,: 將8080改為…

tailf、tail -f、tail -F三者區別

tail -f 等同于--followdescriptor&#xff0c;根據文件描述符進行追蹤&#xff0c;當文件改名或被刪除&#xff0c;追蹤停止 tail -F 等同于--followname --retry&#xff0c;根據文件名進行追蹤&#xff0c;并保持重試&#xff0c;即該文件被刪除或改名后&#xff…

使用圖形芯片加速電子自動化設計應用程序

以往EDA應用性能瓶頸主要受兩方面因素制約&#xff0c;首先大多數應用都是單線程的&#xff0c;而CPU和GPU架構擁有幾十到數千的并行內核&#xff0c;其次是應用程序內存延遲問題。目前EDA應用已經部署到傳統的常規處理器上。最重要的是這些應用促使人們設計出并行或向量處理器…

自我介紹的四個套路

四套路內容&#xff1a; 1、我是誰&#xff0c;叫什么名字&#xff0c;我從哪里來。 2、我因為什么機緣出現這個場合。 3、我能給大家帶來什么價值。 4、我希望能夠得到大家的什么幫助。 示例&#xff1a; 大家好&#xff0c;我叫XXX&#xff0c; 聽說今天會有幾個高人在場&…