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