基于A(yíng)RM+FPGA的高速數據采集智能控制器設計


由上圖可知主要是配置靜態(tài)存儲控制器SMC_SETUP、SMC_PULSE、SMC_CYCLE、SMC_MODE四個(gè)參數。配置是通過(guò)函數static inline void at91_sys write(unsigned intreg_effset,unsigned long value)實(shí)現,詳細配置如下:
本文引用地址:http://dyxdggzs.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字符設備驅動(dòng)程序初始化最為關(guān)鍵的配置。剩下的是在file operation結構下編寫(xiě)驅動(dòng)函數,結構中的每個(gè)成員除了owner必須指向驅動(dòng)中的函數。其中最為重要的內核態(tài)函數是staticssize_t fpga_arm_read(struct file*filp,char_user*buf,size_tsize,loff_ t*ppos),它對應應用層的函數read。驅動(dòng)程序從FPGA讀取數據使用readw函數,完成從內存映射的I/O空間讀取16位數據。copy_to_user(buf, (void*)(read_mem),size)復制數據從內核空間到用戶(hù)空間。FPGA字符設備驅動(dòng)程序基本實(shí)現了控制和管理FPGA讀取狀態(tài)信息和兩路ADC采集的數據。
3.2 協(xié)處理器FPGA控制程序
協(xié)處理器FPGA控制程序分為三個(gè)部分:控制ADC數據采集模塊、控制讀寫(xiě)SRAM模塊和FPGA與ARM總線(xiàn)通信模塊。其中FPGA與ARM總線(xiàn)通信模塊位于頂層模塊,控制ADC數據采集模塊、控制讀寫(xiě)SRAM模塊的是底層模塊。頂層模塊主要是例化底層模塊,然后進(jìn)行數字信號綜合處理。
控制ADC數據采集模塊,控制并行ADC比較簡(jiǎn)單,正常工作需要時(shí)鐘驅動(dòng)ADC CLK,在編寫(xiě)ADC采樣程序時(shí)最為關(guān)鍵的是注意在A(yíng)DC CLK上升沿讀取采集的數據才是穩定可靠的。FPGA會(huì )對兩路ADC采集的數據進(jìn)行多點(diǎn)求平均的預處理,主要是濾除50Hz的工頻干擾,然后寫(xiě)入SRAM存儲。
控制讀寫(xiě)SRAM模塊,FPGA寫(xiě)SRAM與讀SRAM操作是非常相似的,SRAM型號是CY7C1021DV33,工作時(shí)片選信號CE要拉低。讀操作時(shí)注意OE信號先拉低再拉高,在其上升沿,讀取數據。寫(xiě)操作時(shí)注意WE信號先拉低再拉高,在其上升沿,寫(xiě)入數據。FPGA讀SRAM時(shí)需要關(guān)注sram_cs(片選)、sram_oe(讀控制)、sram_addr(地址線(xiàn))和sram1_data(16bit數據線(xiàn)),將sram_cs、sram_oe同時(shí)拉低,同時(shí)給地址線(xiàn)sram_addr賦值,一個(gè)時(shí)鐘后數據端口sram_data的數據就有效了。
FPGA與ARM通信模塊較為復雜,首先,是ARM向FPGA發(fā)控制命令。ARM寫(xiě)FPGA內部寄存器時(shí)比較重要的信號有:NCS4(片選)、at9260_wr(寫(xiě)信號)、at9260_addr(地址線(xiàn))、at9260_data(數據線(xiàn)),當NCS4=0&&at9260_wr=0時(shí),意味著(zhù)ARM9260正在寫(xiě)FPGA寄存器,具體寫(xiě)哪個(gè)寄存器由地址信號at9260_addr決定,這樣可以將at9260_data寫(xiě)入到相應地址處對應的寄存器。
其次,ARM讀FPGA內部狀態(tài)寄存器,與ARM寫(xiě)FPGA寄存器是非常類(lèi)似的,當NCS4=0 &&at9260_rd=0時(shí),意味著(zhù)ARM9260正在讀FPGA寄存器,這時(shí)我們將寄存器的值賦給at9260_data即可,at9260_data是雙向IO,在不讀時(shí)需要置為高阻態(tài)。
最后,ARM獲取兩片SRAM存儲的預處理后的數據,ARM的控制信號是NCS5、at9260_rd、at9260_addr、A14,FPGA將這些信號轉換為FPGA讀SRAM的信號,然后將FPGA讀到的數據傳給ARM,這里FPGA起到數據中轉的作用。
3.3 主處理器ARM應用程序
主處理器ARM的應用程序是整個(gè)軟件系統的控制核心。應用程序由兩個(gè)線(xiàn)程構成:main主線(xiàn)程和data_recv線(xiàn)程。main主線(xiàn)程主要是創(chuàng )建線(xiàn)程,向FPGA發(fā)送控制命令;data_recv線(xiàn)程接收FPGA狀態(tài)信息和FPGA預處理后ADC采集的數據。應用程序是通過(guò)文件描述符fd_fpga來(lái)控制和管理協(xié)處理器FPGA設備。因為在主處理器ARM移植了操作系統Linux,內核版本為Kernel 2.6.30,所以應用程序的開(kāi)發(fā)是在Linux操作系統Ubuntul2.04 LTS版本下,使用開(kāi)發(fā)軟件是Eclipse C/C++。設置Eclipse使用交叉編譯器arm-none-linux-gnueabi-gcc和Release配置生成二進(jìn)制可執行文件。然后可以通過(guò)Tftp服務(wù)下載到目標板上。

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