999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于Linux系統(tǒng)的FPGA芯片在線加載的設(shè)計(jì)和實(shí)現(xiàn)

2015-01-16 05:26:50楊鵬
電子設(shè)計(jì)工程 2015年6期
關(guān)鍵詞:程序設(shè)備

楊鵬

(北方民族大學(xué) 寧夏 銀川 750021)

在嵌入式系統(tǒng)設(shè)計(jì)和開發(fā)過程中,基于FPGA(Field-Programmable Gate Array,現(xiàn)場(chǎng)可編程門陣列)的仿真和功能開發(fā)變得不可或缺。FPGA(Field-Programmable Gate Array,現(xiàn)場(chǎng)可編程門陣列)具有豐富的邏輯設(shè)計(jì)資源,可以完成復(fù)雜的數(shù)據(jù)處理任務(wù)以及邏輯控制任務(wù)。FPGA所具有的靜態(tài)可重復(fù)編程和動(dòng)態(tài)系統(tǒng)可重構(gòu)特性,使得硬件的功能可以像軟件一樣可以通過編程來修改,極大地提高了嵌入式系統(tǒng)設(shè)計(jì)的靈活性和通用性,降低了設(shè)計(jì)難度,縮短了研發(fā)周期,必將成為未來的嵌入式開發(fā)的主流趨勢(shì)之一。

基于FPGA的開發(fā),是指利用FPGA芯片實(shí)現(xiàn)用戶設(shè)計(jì)要求的全過程[1]。在嵌入式系統(tǒng)中開發(fā)過程中,如何將FPGA芯片的代碼方便快捷的加載運(yùn)行是要解決的問題。FPGA程序在仿真完成后,上板調(diào)試和驗(yàn)證一般是通過PC機(jī)連接硬件設(shè)備單板的JTAG口完成代碼加載和運(yùn)行。但是考慮到批量生產(chǎn)以及后續(xù)在線升級(jí)時(shí),通過這種下載方式進(jìn)行操作則顯得非常繁瑣,并且如果采用手工下載,無法保證所有設(shè)備的一致性,易用性很差。如果通過CPU自加載FPGA程序的方式,則只需要把FPGA程序文件燒寫到硬件設(shè)備單板的存儲(chǔ)FLASH中,設(shè)備上電啟動(dòng)后,CPU可自行模擬JTAG口時(shí)序,讀取文件數(shù)據(jù)并完成在線加載過程。本文就提出了一種對(duì)Lattice系列FPGA芯片進(jìn)行程序在線加載的設(shè)計(jì)和實(shí)現(xiàn)過程。

1 系統(tǒng)設(shè)計(jì)

1.1 芯片加載過程分析

Lattice系列FPGA芯片片內(nèi)包含SRAM和Flash兩種存儲(chǔ)器。SRAM包含了FPGA的配置信息。Flash為這些配置信息提供了內(nèi)部存儲(chǔ)空間。Lattice系列FPGA的程序加載方式如圖1所示。

圖1 Lattice系列芯片程序加載方式Fig.1 Lattice series chip program loading method

可以看出Flash可以通過JTAG口和slave parallel方式下載。 SRAM 則可以通過 JTAG、slave parallel、master serial、slave serial方式進(jìn)行下載。SRAM中的數(shù)據(jù)是易失的,F(xiàn)lash中的數(shù)據(jù)是非易失的。所以我們最終目的是用CPU模擬JTAG時(shí)序?qū)崿F(xiàn)FPGA程序自加載到flash中。

JTAG時(shí)序模擬部分主要是對(duì) TCK、TMS、TDI、TDO等信號(hào)線進(jìn)行操作,并最終表現(xiàn)為控制TAP控制器的狀態(tài)轉(zhuǎn)換。主要的接口函數(shù)有:設(shè)置TMS、發(fā)送TCK時(shí)鐘脈沖、設(shè)置TDI、讀取TDO數(shù)據(jù)進(jìn)入下一狀態(tài)機(jī)狀態(tài)、讀寫數(shù)據(jù)寄存器、寫指令寄存器、讀目標(biāo)機(jī)CPU設(shè)備ID、選擇掃描鏈、初始化JTAG口等[2]。Lattice公司提供了C語言代碼框架,命名為ispvme。此種方法不占用gpio,下載時(shí)序相對(duì)簡(jiǎn)單。JTAG狀態(tài)機(jī)已經(jīng)在代碼中封裝好,只需改動(dòng)和單板的驅(qū)動(dòng)接口即可。ispvme的流程如圖2所示。

圖2 Ispvme流程圖Fig.2 Ispvme flow chart

從上圖中可以看出,最終下載的文件是vme文件。把vme文件作為源數(shù)據(jù),每次更新版本時(shí),只需要更新vme文件即可[3]。

1.2 軟件設(shè)計(jì)思路

本系統(tǒng)所運(yùn)行的硬件設(shè)備采用Linux作為其操作系統(tǒng)。Linux系統(tǒng)有一個(gè)很好的特性:內(nèi)核提供的特性可以在運(yùn)行時(shí)進(jìn)行擴(kuò)展。這意味著當(dāng)系統(tǒng)啟動(dòng)并運(yùn)行時(shí),我們可以向內(nèi)核添加功能,當(dāng)然也可以在不用時(shí)動(dòng)態(tài)移除該功能。Linux系統(tǒng)支持很多種模塊類型,包括設(shè)備驅(qū)動(dòng)程序。將設(shè)備驅(qū)動(dòng)程序編譯為可動(dòng)態(tài)加載的模塊(.ko文件),當(dāng)系統(tǒng)啟動(dòng)運(yùn)行后使用insmod加載該設(shè)備驅(qū)動(dòng)模塊,上層應(yīng)用軟件可調(diào)用模塊提供的接口對(duì)硬件進(jìn)行操作,當(dāng)操作完成后,可使用rmmod命名卸載該設(shè)備驅(qū)動(dòng)模塊[4]。

根據(jù)本系統(tǒng)運(yùn)行的軟件平臺(tái)(Linux2.6.22),將此功能模塊設(shè)計(jì)由兩層來完成。一是實(shí)現(xiàn)基于Linux的設(shè)備驅(qū)動(dòng)層,主要是完成對(duì)GPIO管腳初始化配置,并進(jìn)行具體的讀寫操作用來產(chǎn)生模擬時(shí)鐘、數(shù)據(jù)和控制等信號(hào)。二是上層應(yīng)用程序,即Lattice公司提供的C語言代碼框架,它調(diào)用底層驅(qū)動(dòng)模塊接口,模擬JTAG時(shí)序?qū)me文件進(jìn)行處理,完成實(shí)際的FPGA代碼自動(dòng)加載功能。整個(gè)模塊的工作原理框圖如圖3所示。

圖3 軟件側(cè)模塊構(gòu)架Fig.3 Software architecture

根據(jù)模塊的設(shè)計(jì)思路,整個(gè)開發(fā)流程分以下3步進(jìn)行:

1)生成xxx.vme文件,生成xxx.vme文件的原理和流程在上文中已講述過。

2)實(shí)現(xiàn)Linux驅(qū)動(dòng)側(cè)代碼,編譯生成動(dòng)態(tài)可加載模塊(ko文件);

3)對(duì)Lattice公司提供的C語言代碼框架中的 hardware.c文件進(jìn)行移植修改,包括讀寫端口、延時(shí)函數(shù)以及時(shí)鐘產(chǎn)生函數(shù)等,編譯生成可執(zhí)行文件。

1.3 軟件實(shí)現(xiàn)過程

1)驅(qū)動(dòng)側(cè)代碼實(shí)現(xiàn)

本驅(qū)動(dòng)模塊的核心功能是對(duì)用來模擬JTAG時(shí)序的四個(gè)GPIO管腳進(jìn)行控制,包括對(duì)管腳工作模式的配置、輸入輸出方向的配置以及電平狀態(tài)的控制 (如果管腳配置為輸出)和管腳狀態(tài)的讀?。ㄈ绻苣_配置位輸入),并提供對(duì)應(yīng)用層的操作接口以供調(diào)用。根據(jù)本設(shè)備所使用的處理器datasheet中GPIO接口寄存器的相關(guān)定義[5],并利用Linux2.6.22內(nèi)核中提供的對(duì)本處理器GPIO管腳進(jìn)行操作的內(nèi)核API函數(shù),完成此驅(qū)動(dòng)模塊開發(fā)。在驅(qū)動(dòng)程序的模塊初始化函數(shù)中首先完成對(duì)管腳的配置,示例代碼如下:

static int onlineloading_init(void)

{

u32 viraddr;

ret=misc_register(&load_miscdev);

if(ret<0)

return ret;

viraddr=ioremap_nocache(XX_CTRL_BASE, 0xff);

/*配置管腳為gpio模式*/

*(u8*)(viraddr+0xF9)=0x03;

*(u8*)(viraddr+0xFA)=0x03;

*(u8*)(viraddr+0xFB)=0x03;

*(u8*)(viraddr+0xFC)=0x03;

iounmap(viraddr);

/*申請(qǐng)gpio管腳*/

request_gpio(5);

set_gpio_direction(5,1);

request_gpio(6);

request_gpio(7);

request_gpio(8);

}

printk("info:load onlineloading module successfully! ")

}

2)在ioctl函數(shù)中實(shí)現(xiàn)向應(yīng)用程序?qū)拥牟僮鹘涌?。示例代碼如下:

static int load_ioctl (struct inode*inode, struct file*file,unsigned int cmd, unsigned long arg)

{

unsigned short port;

unsigned short value;

unsigned char read_value;

unsigned char getparam[2]={0x0,0x0};

switch (cmd) {

case write_port://寫GPIO端口,命令參數(shù)由應(yīng)用層傳入

if(copy_from_user(getparam,arg,2)) {

printk("copy fpga load write_port value error ");

return -EFAULT;

}

port=getparam[0];

value=getparam[1];

set_gpio_direction(port,0); //將管腳配置為輸出模式

set_gpio_dataout(port,value);

break;

case read_port://讀GPIO端口

read_value=get_gpio_datain(g_ucPinTDO);

if(copy_to_user(arg,&read_value,sizeof(unsigned long))

{

printk("copy fpga load read_port value error ");

return -EFAULT;

}

break;

default:printk("load module:No valid command! ");

}

return 0;

}

在ioctl函數(shù)里實(shí)現(xiàn)了具體的對(duì)GPIO管腳操作的過程。cmd參數(shù)用來傳遞讀寫命令,arg參數(shù)用來傳遞端口號(hào)和端口值[6]。

3)應(yīng)用程序中hardware.c文件里的讀寫端口、時(shí)鐘產(chǎn)生函數(shù)以及延時(shí)函數(shù)的修改。示例代碼如下:

①根據(jù)硬件連接對(duì)管腳進(jìn)行定義

const unsigned char g_ucPinTDI=5;/*gpio_5 pin,TDI*/

const unsigned char g_ucPinTCK=6;/*gpio_6 pin,TCK*/

const unsigned char g_ucPinTMS=7;/*gpio_8 pin,TMS*/

const unsigned char g_ucPinTDO=8;/*gpio_9 pin,TDO*/

②寫端口函數(shù)的修改。示例代碼如下:

void writePort (unsigned char a_ucPins,unsigned char a_ucValue)

{

unsigned int write_value=0;

unsigned char param[2]={0x0,0x0};

param[0]=a_ucPins;

param[1]=a_ucValue;

ioctl( fd, write_port, param);//調(diào)用驅(qū)動(dòng)模塊,完成寫端口過程

}

③讀端口函數(shù)的修改。示例代碼如下:

unsigned char readPort()

{

unsigned char ucRet=0;

unsigned long read_value=0;

ioctl( fd, read_port, &read_value); //調(diào)用驅(qū)動(dòng)模塊,完成讀端口過程

ucRet=(unsigned char)read_value;

return (ucRet);

}

④時(shí)鐘產(chǎn)生函數(shù)的修改。示例代碼如下:

void sclock()

{

unsigned short IdleTime=0;//change to>0 if need to slow down TCK

unsigned short usIdleIndex=0;

IdleTime=1;

for(usIdleIndex=0;usIdleIndex

writePort( g_ucPinTCK, 0x01 );

}

for(usIdleIndex=0;usIdleIndex

{

writePort( g_ucPinTCK, 0x00 );

}

}

時(shí)鐘產(chǎn)生函數(shù)中的IdleTime參數(shù),用來控制模擬時(shí)鐘速率的大小,如果要降低模擬時(shí)鐘的速率,則將IdleTime參數(shù)的值變大即可,在實(shí)際應(yīng)用時(shí)應(yīng)視具體情況而定。

⑤延時(shí)函數(shù)的修改

hardware.c中提供的延時(shí)函數(shù)為ispVMDelay,它實(shí)現(xiàn)了比較精確的毫秒級(jí)延時(shí)。其中的g_usCpu_Frequency參數(shù)為處理器的頻率(單位為M),在實(shí)際應(yīng)用時(shí),應(yīng)根據(jù)系統(tǒng)具體采用的處理器特性對(duì)處理器頻率進(jìn)行定義。

修改完 hardware.c后,編寫Makefile文件,對(duì)程序進(jìn)行編譯生成可執(zhí)行文件FPGA_BIN_LOAD。

2 實(shí)驗(yàn)應(yīng)用

當(dāng)完成以上代碼編寫和修改后,編譯生成可執(zhí)行文件,并將這些可執(zhí)行文件以及要加載的程序文件xxx.vme通過網(wǎng)口下載到設(shè)備單板的FLASH上,Linux系統(tǒng)啟動(dòng)后,可在文件系統(tǒng)下看到這些文件。在線加載過程由以下步驟完成:

第一步,加載驅(qū)動(dòng)模塊。當(dāng)系統(tǒng)啟動(dòng)后,采用insmod命令動(dòng)態(tài)加載驅(qū)動(dòng)程序編譯生成的動(dòng)態(tài)加載模塊文件,Linux驅(qū)動(dòng)模塊加載成功。

第二步,運(yùn)行FPGA自動(dòng)加載應(yīng)用程序。將應(yīng)用程序編譯生成的FPGA_BIN_LOAD可執(zhí)行文件和FPGA代碼生成的xxx.vme文件拷貝到同級(jí)目錄下,執(zhí)行FPGA_BIN_LOAD,系統(tǒng)開始處理xxx.vme文件,F(xiàn)PGA代碼加載過程正在進(jìn)行。當(dāng)整個(gè)FPGA代碼加載完成后,程序給出打印信息通知用戶,表明加載成功。

3 結(jié)論

文中提出的通過CPU模擬時(shí)序并結(jié)合Ispvme的在線下載方式,適用于lattice XO XP XP2 3種系列的可編程器件。這3個(gè)系列的器件都是采用內(nèi)部非易失flash存儲(chǔ)程序。這種在線下載方式,尤其適合在開發(fā)的后續(xù)階段對(duì)fpga版本的更新和升級(jí)操作。實(shí)際應(yīng)用表明,該系統(tǒng)具有穩(wěn)定性高、操作便捷、易用性強(qiáng)以及可移植性強(qiáng)等特點(diǎn),達(dá)到了設(shè)計(jì)要求。

參考資料:

[1]竇建華,孫強(qiáng),陸俊鋒.基于JTAG和FPGA的嵌入式SOC驗(yàn)證系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].合肥工業(yè)大學(xué)學(xué)報(bào):自然科學(xué)版,2009(3):126-129.DOU Jian-hua,SUN Qiang,LU Jun-feng.Design of the embedded SOC verification system based on JTAG and FPGA[J].Journal of Hefel University of Technology:Natural Science,2009(3):126-129.

[2]胡貫榮,陳招偉,羅威.一種JTAG驅(qū)動(dòng)實(shí)現(xiàn)技術(shù)研究[J].計(jì)算機(jī)工程與科學(xué),2009(2):64-67.HU Guan-rong,CHEN Zhao-wei,LUO Wei.A study of the JTAG driver implementation[J].Computer Engineering and Science,2009(2):64-67.

[3]LatticeXP Family Handbook.HB1001 Version 02.9[R].Lattice semiconductor,April,2007.

[4]魏永明,耿岳,鐘書毅,等.LINUX設(shè)備驅(qū)動(dòng)程序[M].北京:中國(guó)電力出版社,2005.

[5]Omap 2530 TRM.SWPU090R-June 2005-Revised[R].Texas Instruments,August,2007.

[6]Neil Matthew,Richard Stone著.LINUX程序設(shè)計(jì)[M].陳健,宋健健,譯.北京:人民郵電出版社,2010.

猜你喜歡
程序設(shè)備
諧響應(yīng)分析在設(shè)備減振中的應(yīng)用
試論我國(guó)未決羈押程序的立法完善
基于VB6.0+Access2010開發(fā)的設(shè)備管理信息系統(tǒng)
基于MPU6050簡(jiǎn)單控制設(shè)備
電子制作(2018年11期)2018-08-04 03:26:08
失能的信仰——走向衰亡的民事訴訟程序
“程序猿”的生活什么樣
英國(guó)與歐盟正式啟動(dòng)“離婚”程序程序
500kV輸變電設(shè)備運(yùn)行維護(hù)探討
創(chuàng)衛(wèi)暗訪程序有待改進(jìn)
如何在設(shè)備采購(gòu)中節(jié)省成本
主站蜘蛛池模板: 福利片91| 国产另类视频| 成人在线第一页| 中文字幕久久精品波多野结| 色精品视频| 91无码视频在线观看| 97精品国产高清久久久久蜜芽| 国产一区二区三区在线观看视频 | 亚洲国产清纯| 国产欧美又粗又猛又爽老| 国产日韩精品一区在线不卡| 久操线在视频在线观看| 亚洲中文字幕无码爆乳| a级高清毛片| 亚洲男人的天堂在线观看| 国产喷水视频| 中国美女**毛片录像在线| 日本精品影院| 激情六月丁香婷婷| 国产精品hd在线播放| 欧美国产日韩在线观看| 2021国产精品自拍| 国产精品流白浆在线观看| 国产精品久久久久久久伊一| 日本黄色不卡视频| 手机看片1024久久精品你懂的| 亚洲欧美自拍中文| 久久青青草原亚洲av无码| 日韩欧美91| 亚洲精品制服丝袜二区| 国产毛片高清一级国语| 免费观看亚洲人成网站| 极品私人尤物在线精品首页| 欧美97色| а∨天堂一区中文字幕| 国产91在线|日本| 91亚洲免费| 亚洲免费黄色网| 欧美亚洲日韩中文| 国产欧美亚洲精品第3页在线| 色悠久久综合| 亚洲国产日韩一区| 国产精品国产主播在线观看| 亚洲色图综合在线| 午夜福利视频一区| 亚洲精品你懂的| 亚洲精品国产成人7777| 国产乱肥老妇精品视频| 人妻精品久久无码区| 欧美日韩国产在线人| 四虎永久在线视频| 国产女人18水真多毛片18精品| 91精品国产情侣高潮露脸| 精品成人一区二区三区电影| 国产香蕉在线| 中文成人在线| 国产第一页第二页| 狠狠色噜噜狠狠狠狠色综合久 | 久久婷婷综合色一区二区| 日本欧美视频在线观看| 国产亚洲现在一区二区中文| 毛片免费在线| 97人妻精品专区久久久久| 婷婷亚洲天堂| 亚洲AV电影不卡在线观看| 成年人久久黄色网站| 成人午夜视频免费看欧美| 欧美高清日韩| 欧美精品xx| 天天激情综合| 高清不卡一区二区三区香蕉| 国产视频一区二区在线观看| 片在线无码观看| 欧洲亚洲欧美国产日本高清| 欧美国产成人在线| 美女国产在线| 亚洲动漫h| 婷婷色狠狠干| 亚洲 欧美 中文 AⅤ在线视频| 国产精品美女网站| 亚洲妓女综合网995久久| 伊大人香蕉久久网欧美|