基于ARM+FPGA的高速數據采集智能控制器設計


由上圖可知主要是配置靜態存儲控制器SMC_SETUP、SMC_PULSE、SMC_CYCLE、SMC_MODE四個參數。配置是通過函數static inline void at91_sys write(unsigned intreg_effset,unsigned long value)實現,詳細配置如下:
本文引用地址:http://www.j9360.com/article/249568.htmat91_sys_write(AT91_SMC_SETUP(5),AT91_SMC_NWESETUP(0x02)|AT91_SMC_NCS_WRSETUP_(0x00)|AT91_SMC_NRDSETUP_(0x00)|AT91_SMC
_NCS_RDSETUP_(0X00));
at91_sys_write(AT91_SMC_PULSE(5),AT91_SMC_NWEPULSE_(0x06)|AT91_SMC_NCS_WRPULSE(0x0A)|AT91_SMC_NRDPULSE(0x0A)|AT91_SMC_ NCS_RDPULSE_(0x0A));
at91_sys_write(AT91_SMC_CYCLE(5),AT91_SMC_NWECYCLE_(0X0A)|AT91_SMC_NRDCYCLE_(0X0A));
at91_sys_write(AT91_SMC_MODE(5),AT91_SMC_READMODE|AT91_SMC_WRITEMODE|AT91_SMC_EXNWMODE_DISABLE|AT91_SMC_DBW_16|AT91_ SMC_TDF_(1));
申請I/O內存:
request_mem_region((unsigned long)sram_buf_1,SRAM_BUFSIZE,“fpga_arm”);
request_mem_region((unsigned long)sram_buf_2,SRAM_BUFSIZE,“fpga_arm”);
FPGA寄存器地址映射:
sram_buf_1=(unsigned char*)ioremap(0x60000000,SRAM_BUFSIZE);
sram_buf_2=(unsigned char*)ioremap(0x60004000,SRAM_BUFSIZE);
以上為FPGA字符設備驅動程序初始化最為關鍵的配置。剩下的是在file operation結構下編寫驅動函數,結構中的每個成員除了owner必須指向驅動中的函數。其中最為重要的內核態函數是staticssize_t fpga_arm_read(struct file*filp,char_user*buf,size_tsize,loff_ t*ppos),它對應應用層的函數read。驅動程序從FPGA讀取數據使用readw函數,完成從內存映射的I/O空間讀取16位數據。copy_to_user(buf, (void*)(read_mem),size)復制數據從內核空間到用戶空間。FPGA字符設備驅動程序基本實現了控制和管理FPGA讀取狀態信息和兩路ADC采集的數據。
3.2 協處理器FPGA控制程序
協處理器FPGA控制程序分為三個部分:控制ADC數據采集模塊、控制讀寫SRAM模塊和FPGA與ARM總線通信模塊。其中FPGA與ARM總線通信模塊位于頂層模塊,控制ADC數據采集模塊、控制讀寫SRAM模塊的是底層模塊。頂層模塊主要是例化底層模塊,然后進行數字信號綜合處理。
控制ADC數據采集模塊,控制并行ADC比較簡單,正常工作需要時鐘驅動ADC CLK,在編寫ADC采樣程序時最為關鍵的是注意在ADC CLK上升沿讀取采集的數據才是穩定可靠的。FPGA會對兩路ADC采集的數據進行多點求平均的預處理,主要是濾除50Hz的工頻干擾,然后寫入SRAM存儲。
控制讀寫SRAM模塊,FPGA寫SRAM與讀SRAM操作是非常相似的,SRAM型號是CY7C1021DV33,工作時片選信號CE要拉低。讀操作時注意OE信號先拉低再拉高,在其上升沿,讀取數據。寫操作時注意WE信號先拉低再拉高,在其上升沿,寫入數據。FPGA讀SRAM時需要關注sram_cs(片選)、sram_oe(讀控制)、sram_addr(地址線)和sram1_data(16bit數據線),將sram_cs、sram_oe同時拉低,同時給地址線sram_addr賦值,一個時鐘后數據端口sram_data的數據就有效了。
FPGA與ARM通信模塊較為復雜,首先,是ARM向FPGA發控制命令。ARM寫FPGA內部寄存器時比較重要的信號有:NCS4(片選)、at9260_wr(寫信號)、at9260_addr(地址線)、at9260_data(數據線),當NCS4=0&&at9260_wr=0時,意味著ARM9260正在寫FPGA寄存器,具體寫哪個寄存器由地址信號at9260_addr決定,這樣可以將at9260_data寫入到相應地址處對應的寄存器。
其次,ARM讀FPGA內部狀態寄存器,與ARM寫FPGA寄存器是非常類似的,當NCS4=0 &&at9260_rd=0時,意味著ARM9260正在讀FPGA寄存器,這時我們將寄存器的值賦給at9260_data即可,at9260_data是雙向IO,在不讀時需要置為高阻態。
最后,ARM獲取兩片SRAM存儲的預處理后的數據,ARM的控制信號是NCS5、at9260_rd、at9260_addr、A14,FPGA將這些信號轉換為FPGA讀SRAM的信號,然后將FPGA讀到的數據傳給ARM,這里FPGA起到數據中轉的作用。
3.3 主處理器ARM應用程序
主處理器ARM的應用程序是整個軟件系統的控制核心。應用程序由兩個線程構成:main主線程和data_recv線程。main主線程主要是創建線程,向FPGA發送控制命令;data_recv線程接收FPGA狀態信息和FPGA預處理后ADC采集的數據。應用程序是通過文件描述符fd_fpga來控制和管理協處理器FPGA設備。因為在主處理器ARM移植了操作系統Linux,內核版本為Kernel 2.6.30,所以應用程序的開發是在Linux操作系統Ubuntul2.04 LTS版本下,使用開發軟件是Eclipse C/C++。設置Eclipse使用交叉編譯器arm-none-linux-gnueabi-gcc和Release配置生成二進制可執行文件。然后可以通過Tftp服務下載到目標板上。

4 結束語
本文論述了基于ARM+FPGA體系架構的高速實時數據采集智能控制器的設計與實現。其結合ARM和FPGA兩者的優勢,具有更好的運算處理性能,豐富的外圍標準接口。系統采樣率達10MSPS,滿足高速實時性的要求。具有很高的應用價值。
linux操作系統文章專題:linux操作系統詳解(linux不再難懂)
fpga相關文章:fpga是什么
linux相關文章:linux教程
鎖相環相關文章:鎖相環原理
評論