chinese腹肌校草洗澡小说_中文无码天天av天天爽_飘雪影院免费版在线观看视频_成全视频高清免费观看在线播放_大地资源中文在线观看官网第二页_军人各种做高h尿在里面_亂伦丰满人妻av怡红院_欧美中字狠狠第一页_小收影院 成人a片产无码免费视频奶头

基于外部處理器的FPGA加載應(yīng)用程序的方法研究

share

1、引言

FPGA在系統(tǒng)上電時(shí),需要從外部載入所要運(yùn)行的程序,此過(guò)程被稱為程序加載。多數(shù)情況下,F(xiàn)PGA從外部專用的 EPROM讀入程序。這種方式速度慢,而且只能加載固定的程序。顯然,當(dāng)系統(tǒng)需要容量大而且 FPGA要加載的程序可以根據(jù)需要有選擇的加載時(shí)不能采用這種方法。本文實(shí)現(xiàn)了一種基于外部處理器的加載方法,速度快,而且可以根據(jù)設(shè)置給FPGA加載相應(yīng)的程序。

對(duì)于 Xilinx公司的 FPGA芯片,有五種加載方式:JTAG模式,串行從模式,串行主模式,并行從模式和并行主模式。JTAG模式常用于調(diào)試時(shí),將主機(jī)綜合好的程序加載到FPGA,優(yōu)先級(jí)高于其他幾種模式。其他加載模式取決于 FPGA上加載模式管腳(M0,M1,M2)的設(shè)置。

用外部處理器給 FPGA加載程序時(shí),可以采用串行從模式、并行從模式,甚至于 JTAG模式。本文選擇并行從模式,原因在于更高的配置速率。 2、 FPGA程序數(shù)據(jù)的產(chǎn)生

FGPA的程序加載即是要把綜合好的程序文件按一定的時(shí)序?qū)懭隖PGA。而 Xilinx的開(kāi)發(fā)環(huán)境可以根據(jù)用戶的選擇產(chǎn)生多種文件格式,以不同的后綴名區(qū)分。不同的文件格式包含了不同的信息,有不同的用途。

本文選擇了.bin格式的文件。此文件是只包含有程序數(shù)據(jù)的二進(jìn)制文件。產(chǎn)生此文件,要在bitgen 參數(shù)里增加-g Binary:yes 選項(xiàng)。

此外,需要說(shuō)明的是,通常的微處理器 D0位是最低有效位,而 Xilinx的 FPGA在接收程序數(shù)據(jù)時(shí),D0位是最高有效位。因此,在按字節(jié)讀取.bin格式的文件之后,需要有一個(gè)轉(zhuǎn)換的過(guò)程。如從文件讀到一個(gè)字節(jié),0x7D,即二進(jìn)制的 0111 1101,需轉(zhuǎn)換為:1011 1110。

加載過(guò)程開(kāi)始時(shí),就要從.bin文件中順序按字節(jié)讀出數(shù)據(jù),然后在 CCLK的上升沿寫(xiě)入 FPGA。在.bin文件中的數(shù)據(jù)都被寫(xiě)入 FPGA后,CCLK需要多出四個(gè)時(shí)鐘周期,以使得 FPGA完成啟動(dòng)過(guò)程。 3、硬件設(shè)計(jì)

在FPGA上,與配置有關(guān)的管腳分為兩類:專用管腳,包括PROG_B,HSWAP_EN,TDI, TMS,,TCK,TDO,CCLK,DONE,和M0-M2。還有一類是可復(fù)用管腳,這類管腳在配置階段作為配置管腳,配置結(jié)束后可以配置為通用普通的IO管腳,也可以繼續(xù)作為配置管腳。在并行從模式下,涉及到的配置管腳和功能如下:

CS_B:片選信號(hào),低有效; RDWR_B:寫(xiě)信號(hào),低有效; BUSY:FPGA忙指示,高有效,一般只有在并行加載時(shí)鐘速率大于50M時(shí)才有可能用到;D0-D7:數(shù)據(jù)線; INIT_B:芯片被復(fù)位后,此管腳為輸出信號(hào),輸出低電平指示FPGA正在自行復(fù)位內(nèi)部

寄存器。復(fù)位結(jié)束后,此管腳浮空,處于輸入狀態(tài)。因此需要上拉電阻,指示復(fù)位結(jié)束。內(nèi)部寄存器復(fù)位結(jié)束后,此管腳若被拉低,則會(huì)推遲FPGA的程序加載過(guò)程。在程序加載過(guò)程中,此管腳又變回輸入狀態(tài),對(duì)外輸出低電平指示加載的程序數(shù)據(jù)存在CRC校驗(yàn)錯(cuò)誤。

PROG_B:異步復(fù)位信號(hào),下降沿有效,此信號(hào)為低電平時(shí)復(fù)位FPGA,復(fù)位后,F(xiàn)PGA芯片處于內(nèi)部寄存器自行復(fù)位過(guò)程,INIT_B被FPGA芯片拉低,此過(guò)程結(jié)束后,F(xiàn)PGA不再驅(qū)動(dòng)INIT_B管腳,INIT_B管腳處于浮空狀態(tài),此時(shí),INIT_B有上拉電阻時(shí),INIT_B呈現(xiàn)高電平,依次可以指示FPGA的內(nèi)部寄存器自行復(fù)位結(jié)束。程序加載狀態(tài)。

DONE:加載成功指示。 CCLK:程序加載時(shí),數(shù)據(jù)在此信號(hào)的上升沿被寫(xiě)入FPGA。在本設(shè)計(jì)中,ARM芯片采用的是 SUMSUN公司的S3C2410,與 FPGA配置管腳相連的是

此芯片的通用 IO管腳 D組。硬件連接如圖所示。在 ARM的程序中,ARM管腳在程序加載的各階段的輸入輸出設(shè)置如下:首先,設(shè)置 GPD(與 FPGA的 INIT_B相連)、GPD(與 FPGA的 BUSY相連)為輸入管腳,以監(jiān)視 FPGA內(nèi)部寄存器自行復(fù)位結(jié)束和忙閑狀態(tài)。其次,設(shè)置GPD(與 FPGA的 PROG_B相連)為輸出狀態(tài),并使其輸出低脈沖,使 FPGA復(fù)位。然后依次設(shè)置 GPD(與 FPGA的 CS_B相連)、GPD(與 FPGA的 RDWR_B相連)、GPD(與 FPGA的 CCLK相連)為輸出管腳,并使其輸出低電平,使 FPGA處于被選可接受數(shù)據(jù)狀態(tài);接著設(shè)置D[0..7]為輸出狀態(tài)。至此,ARM中的程序開(kāi)始輪詢GPD的狀態(tài),檢測(cè)到此信號(hào)為高時(shí),有兩種選擇,其一是因?yàn)樾枰七t FPGA的程序加載,可以通過(guò)設(shè)置 GPD為輸出,并使其輸出為低電平直至程序加載開(kāi)始。其二是開(kāi)始給 FPGA加載程序,F(xiàn)PGA在 CCLK的上升沿接收數(shù)據(jù),在給 FPGA加載程序的過(guò)程中,程序需要監(jiān)視GPD管腳的狀態(tài),一旦為低,F(xiàn)PGA指示程序數(shù)據(jù)加載 CRC校驗(yàn)出錯(cuò)。此時(shí)需要復(fù)位FPGA,重新加載。

采用的硬件連接如下圖:

4、嵌入式 Linux的驅(qū)動(dòng)實(shí)現(xiàn)

本文以模塊形式實(shí)現(xiàn)了運(yùn)行于S3C2410上的linux驅(qū)動(dòng)程序,源文件如下(有關(guān)寄存器

的設(shè)置參考S3C2410的數(shù)據(jù)手冊(cè),以下源代碼未包含頭文件):

#define GPIO_va_base 0x0F6000000

//基于S3C2410 上的Linux內(nèi)核IO控制寄存器首地址映射后的虛擬地址

#define ARM_GPDCON PIO_va_base+0x30);

#define ARM_GPDUP PIO_va_base+0x38);

#define ARM_port_wr(addr,value) *(volatile unsigned int*)(addr)=value)

//定義輸出

#define FPGA_CS 8

#define FPGA_RW 9

#define FPGA_PROG 12

#define FPGA_CCLK 14

//定義操作

#define ARM_GPDDAT (*(volaTIle u32 *)(GPIO_va_base+0x34))

#define set_register_bit(x) ARM_GPDDAT=(1《《x)|ARM_GPDDAT

#define clear_register_bit(x) ARM_GPDDAT=(~(1《《x))&ARM_GPDDAT

//定義輸入

#define FPGA_INIT ((ARM_GPDDAT》》10)&1)

#define FPGA_BUSY ((ARM_GPDDAT》》11)&1)

#define FPGA_DONE ((ARM_GPDDAT》》13)&1)

#define FPGA 211

//定義主設(shè)備號(hào),和mknod /dev/fpga c 211 0匹配

typedef char fpga_device_t;

staTIc fpga_device_t fpga_devices[257];

char buf[1000000];

int fpga_open(struct inode *, struct file *);

ssize_t fpga_write(struct file *,const char *,size_t ,loff_t *);

int fpga_release(struct inode*, struct file *);

//初始化ARM的D組通用IO管腳

void init_fpga(void){

ARM_port_wr(GPIO_va_base+0x30,0x55555555);

//FPGA_BUSY FPGA_DONE FPGA_INIT be set input

ARM_port_wr(GPIO_va_base+0x34,0xFFFF);

ARM_port_wr(GPIO_va_base+0x30,0x51055555);

ARM_port_wr(GPIO_va_base+0x38,0);// put up

set_register_bit(FPGA_CCLK);//set GCLK

}

staTIc struct file_operaTIons fpga_ctl_fops= {

open: fpga_open,

write: fpga_write,

release: fpga_release,};

int init_module(void) {

printk(“Hello,word,Now preparing FPGA.。..。.\n”);

printk(“register FPGA.。..。.\n”);

register_chrdev(FPGA, “fpga”, &fpga_ctl_fops);

printk(“Done!\n”);

printk(“Hello,word,success!\n”);

return 0;

}

int fpga_open(struct inode *inode, struct file *filp){

int minor;

minor = MINOR(inode-》i_rdev);

init_fpga();

fpga_devices[minor]++;

printk(“FPGA is ready.\n”);

return 0;

}

ssize_t fpga_write(struct file *flip,const char *buffer,size_t count,loff_t

*ppos){

int i;

if(copy_from_user(buf,buffer,count)){

printk(“error \n”);

return -EFAULT;

}

printk(“%d numbers have been received!\n”,count);

printk(“The number is:%d\n”,count);

for(i=0;i《count;i++){

ARM_GPDDAT=(ARM_GPDDAT&0x3F00)|buf[i];

set_register_bit(FPGA_CCLK);

}

printk(“data write finished\n”);

for(i=0;i《4;i++){

set_register_bit(FPGA_CCLK);

clear_register_bit(FPGA_CCLK);

}

return count;

}

int fpga_release(struct inode *inode, struct file *filp){

int minor;

minor = MINOR(inode-》i_rdev);

if (fpga_devices[minor])

fpga_devices[minor]--;

printk(“Goodbye cruel world\n”);

return 0;

}

void cleanup_module(void){

printk(“Goodbye cruel world\n”);

}

5、結(jié)束語(yǔ)

本文的創(chuàng)新點(diǎn):基于ARM-Linux平臺(tái),實(shí)現(xiàn)了一種FPGA的程序加載模式,加載速度快,靈活高效。

責(zé)任編輯:gt

share