日本在线www-日本在线播放一区-日本在线不卡免费视频一区-日本在线不卡视频-成人影院久久久久久影院-成人影院一区二区三区

最新廣告
關注中國自動化產業發展的先行者!
工業智能邊緣計算2025年會
CAIAC 2025
2025工業安全大會
OICT公益講堂
當前位置:首頁 >> 案例 >> 案例首頁

案例頻道

基于ARM的FPGA加載配置實現
  • 企業:控制網    
  • 點擊數:1904     發布時間:2006-08-06 11:46:25
  • 分享到:
本文討論了使用ARM對ALTERA公司Cycloe系列FPGA可編程邏輯器件的配置一種新方法,介紹了配置原理和常見配置的方式,給出詳細的硬件軟件設計。
0引言
       基于SRAM工藝FPGA在每次上電后需要進行配置,通常情況下FPGA的配置文件由片外專用的EPROM來加載。這種傳統配置方式是在FPGA的功能相對穩定的情況下采用的。在系統設計要求配置速度高、容量大、以及遠程升級時,這種方法就顯得很不實際也不方便。本文介紹了通過ARM對可編程器件進行配置的的設計和實現。
1 配置原理與方式
1.1配置原理
       在FPGA正常工作時,配置數據存儲在SRAM單元中,這個SRAM單元也被稱為配置存儲器(Configuration RAM)。由于SRAM是易失性的存儲器,因此FPGA在上電之后,外部電路需要將配置數據重新載入到片內的配置RAM中。在芯片配置完成后,內部的寄存器以及I/O管腳必須進行初始化。等初始化完成以后,芯片才會按照用戶設計的功能正常工作。 
1.2配置方式
       根據FPGA在配置電路中的角色,其配置數據可以使用3種方式載入到目標器件中:
?FPGA主動(Active)方式;
?FPGA 被動(passive)方式;
?JTAG 方式;
       在FPGA 主動方式下,由目標FPGA來主動輸出控制和同步信號(包括配置時鐘)給專用的一種串行配置芯片,在配置芯片收到命令后,就把配置數據發到FPGA,完成配置過程。在被動方式下,由系統中的其他設備發起并控制配置過程,FPGA只輸出一些狀態信號來配合配置過程。被動方式包括被動串行PS (Passive serial )、快速被動并行FPP(Fast Passive Parallel)、被動并行同步PPS(Passive Parallel Serial)、被動并行異步PPA (Passive Parallel Asynchronous)、以及被動串行異步PSA(Passive Serial Asynchronous)。JTAG是IEEE 1149.1邊界掃描測試的標準接口。從JTAG接口進行配置可以使用Altera的下載電纜,通過Quartus工具下載,也可以采用微處理器來模擬JTAG時序進行配置。
2硬件電路設計
       AT91ARM9200對EP1C12配置的硬件電路示意圖如圖1所示。


圖 1  ARM配置FPGA電路原理圖
  在配置FPGA時,首先需要將年nCONFIG拉低(至少40us), 然后拉高。當nCONFIG被拉高后,FPGA的nSTATUS也將變高,表示這時已經可以開始配置,外部電路就可以用DCLK的時鐘上升沿一位一位地將配置數據寫進FPGA中。當最后一個比特數據寫入以后,CONFIG_DONE管腳被FPGA釋放,被外部的上拉電阻拉高,FPGA隨即進入初始化狀態。
3軟件設計
       本文在設計時使用Linux系統,軟件編寫和調試是在ADS 下。主要程序如下:
# include <stdio.h>
# include <sys/types.h>
# include <sys/stat.h>
# include <sys/mman.h>
# include <fcntl.h>
# include <unistd.h>
# include "cyclone.h"
 
static AT91PS_PIO pioc;
inline void pioc_out_0 (int mask)
{
    pioc->PIO_CODR = mask;
}
inline void pioc_out_1 (int mask)
{
    pioc->PIO_SODR = mask;
}
inline int pioc_in (int mask)
{
    return pioc->PIO_PDSR & mask;
}
inline void xmit_byte (char c)
{
    int i;
    for (i = 0; i < 8; i++)
    {
        if (c & 1)
            pioc_out_1 (DATA0);
        else
            pioc_out_0 (DATA0);
            pioc_out_0 (DCLK);
            pioc_out_1 (DCLK);
        c >>= 1;
    }
}
 
void pioc_setup ()
{
    pioc->PIO_PER    =DATA0 | nCONFIG | DCLK | nSTATUS | CONF_DONE;
    pioc->PIO_OER    =DATA0 | nCONFIG | DCLK;
    pioc->PIO_ODR    =nSTATUS | CONF_DONE;
    pioc->PIO_IFER    =nSTATUS | CONF_DONE;
    pioc->PIO_CODR    =DATA0 | nCONFIG | DCLK;
    pioc->PIO_IDR    =DATA0 | nCONFIG | DCLK | nSTATUS | CONF_DONE;
    pioc->PIO_MDDR    =DATA0 | nCONFIG | DCLK;
    pioc->PIO_PPUDR    =DATA0 | nCONFIG | DCLK | nSTATUS | CONF_DONE;
    pioc->PIO_OWDR    =DATA0 | nCONFIG | DCLK | nSTATUS | CONF_DONE;
}
int pioc_map ()
{
        int fd;
    off_t addr = 0xFFFFF800;    // PIO controller C
    static void *base;
        if ((fd = open ("/dev/mem", O_RDWR | O_SYNC)) == -1)
        {
                printf ("Cannot open /dev/mem.\n");
                return 0;
        }
        printf ("/dev/mem opened.\n");
    base = mmap (0, MAP_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, addr & ~MAP_MASK);
        if (base == (void *) -1)
        {
         printf ("Cannot mmap.\n");
                return 0;
        }
        printf ("Memory mapped at address %p.\n", base);
    pioc = base + (addr & MAP_MASK);
    return 1;
}
int main (int argc, char **argv)
{
    FILE *file;
    char data[16];
   int nbytes, i;
   
    if (argc != 2)
    {
        printf ("%s <filename>\n", argv[0]);
        return -1;
    }
    file = fopen (argv[1], "r");
    if (!file)
    {
        printf ("File %s not found.\n", argv[1]);
        return -1;
    }
    if (!pioc_map ())
        return -1;
    pioc_setup ();
    pioc_out_0 (nCONFIG);
    for (i = 0; i < 10000 && pioc_in (nSTATUS); i++) { }
    if (i == 10000)
    {
        printf ("nSTATUS = 1 before attempting configuration.\n");
        return -1;
    }
    pioc_out_1 (nCONFIG);
    for (i = 0; i < 10000 && !pioc_in (nSTATUS); i++) { }
    if (i == 10000)
    {
        printf ("Timeout waiting for nSTATUS = 1.\n");
        return -1;
    }
    while ((nbytes = fread (data, sizeof (char), sizeof (data), file)) > 0)
    {
        if (pioc_in (CONF_DONE))
        {
            printf ("CONF_DONE = 1 while transmitting data.\n");
            return -1;
        }
        if (!pioc_in (nSTATUS))
        {
            printf ("nSTATUS = 0 while transmitting data.\n");
            return -1;
        }
        for (i = 0; i < nbytes; i++)
            xmit_byte (data[i]);
    }
    for (i = 0; i < 10000 && !pioc_in (CONF_DONE); i++)
    {
        if (!pioc_in (nSTATUS))
        {
            printf ("nSTATUS = 0 while transmitting data.\n");
            return -1;
        }
        pioc_out_0 (DATA0);
        pioc_out_0 (DCLK);
        pioc_out_1 (DCLK);
    }
    if (i == 10000)
    {
        printf ("Timeout waiting for CONF_DONE = 1.\n");
        return -1;
    }
        return 0;
}
4 結論
       本文給出了基于ARM的FPGA加載配置軟件實現。這種方法充分利用了ARM的速度快、靈活的特點,節省了開發成本,又滿足了一些特殊的系統設計要求。本方法也適用于其它的微處理器。
參考文獻
       [1]王誠,吳繼華,范麗珍,薛寧,薛小寧.Altera FPGA/CPLD設計(基礎篇) 人民郵電出版社 2005.7  PP187~190
作者簡介:
葛立明 (1977-),男,吉林四平人,碩士研究生,主要研究方向:智能控制系統

熱點新聞

推薦產品

x
  • 在線反饋
1.我有以下需求:



2.詳細的需求:
姓名:
單位:
電話:
郵件:
主站蜘蛛池模板: aaak7美国发布站-a v 在线视频 亚洲免费-99综合色-99在线这精品视频-国产成人综合洲欧美在线-国产成人综合在线观看网站 | 日本v片免费一区二区三区-日本v片-日本vs欧美一区二区三区-日本va视频-国产精品路线1路线2路线-国产精品看片 | 91噜噜噜在线观看-91露脸对白-91麻豆福利-91麻豆高清国产在线播放-91麻豆国产-91麻豆国产福利精品 | 青青青青青青草-青青青青青青-青青青青青国产免费手机看视频-青青青青青国产免费观看-青青青青青草原-青青青青青草 | 欧美成人tv在线观看免费-欧美成人tv-欧美成人h版影院在线播放-欧美成人h版影片在线观看-欧美成人h版白雪公主-欧美成人h版 | 夜夜操狠狠操,99在线观看精品免费99,亲爱的妈妈2,色婷婷亚洲十月十月色天,精品福利一区二区在线观看,久久国产精品99精品国产 | 国产精品福利久久2020-国产精品分类视频分类一区-国产精品反差婊在线观看-国产精品二区在线-色播99-色y情视频免费看 | 欧美人与性动交a欧美精品-欧美人与物另类-欧美人与牲动交a欧美精品-欧美人与禽片免播放-国产福利在线观看永久免费-国产福利在线播放 | 极品白丝-激性欧美激情在线播放16页-激情综合五月天丁香婷婷-激情伊人网-亚洲天堂久久精品成人-亚洲天堂久久精品 | 制服师生一区二区三区在线-制服师生av在线-制服 丝袜 亚洲 中文 综合-直接看毛片-欧美视频在线观看视频-欧美视频在线观看免费最新 | 午夜黄色福利视频-午夜激情爱爱-午夜激情婷婷-午夜家庭影院-午夜精品A片久久慈禧-午夜精品A片久久软件 | 久久re这里视频只有精品首页-久久re这里视频只精品首页-久久re这里视频精品8-久久re这里视频精品15-一本道色综合手机久久-一本道色播 | 二区乱码综合无码一区二区三-二区女人观看chinese中国真实乱-二区欧美三-二区欧美无遮挡中文字幕人成人-二区啪视频-二区日本成人动漫电影 | 成人a毛片手机免费播放-成人a毛片在线看免费全部播放-成人a视频高清在线观看-成人a视频片在线观看免费-欧美三级中文字幕hd-欧美三极 | 国产成人精品一区二区视频免费-国产成人精品一区二区视频-国产成人精品一区二区三在线观看-国产成人精品一区二区三在-国产成人精品一区二区三区小说-国产成人精品一区二区三区无码 | 国产成人无码影视-国产成人无码专区-国产成人无码综合-国产成人无码综合亚洲日韩-国产成人无码综合亚洲日韩榴莲-国产成人无套精品在线观看 | 一个人看的在线www高清视频-一个人看的小说在线阅读-一个人看的手机视频www-一个人看的视频在线观看免费播放动漫-久久99精品久久久久久秒播放器-久久99精品久久久久久秒播 | 综合色网站-综合色图-综合色婷婷-综合色天天-乱淫视频-乱淫片 | 国产韩国精品一区二区三区久久-国产国语一级毛片在线视频-国产国语高清在线视频二区-国产国拍亚洲精品午夜不卡17-日韩在线欧美高清一区-日韩在线免费视频观看 | 竹菊影视一区二区三区-竹菊一区二区-竹菊一区-重口味调教-另类小说h-另类小说 成 人 色综合 | 国产 在线 | 日韩,精品一区二区三区的国产在线观看,亚洲国产精品日韩在线,国产视频在,青青国产成人久久91网站站,国内精品视频免费观看 | 美女三级毛片-美女牲交视频一级毛片无遮挡-美女视频大全视频a免费九-美女视频黄a视频全免费网站色窝-美女视频黄的全是免费-美女视频秀色福利视频 | 伊人色综合久久大香-伊人色综合久久-伊人色综合97-伊人色在线-免费永久在线观看黄网-免费永久国产在线视频 | 国产精品福利在线观看入口-国产精品福利在线观看秒播-国产精品福利在线观看免费不卡-国产精品福利一区二区亚瑟-四虎免费入口-四虎免费看片 | 在线观看黄色网-在线观看黄色片网站-在线观看黄色片-在线观看黄色的网站-久久精品影视-久久精品一区二区 | 国产精品视频你懂的-国产精品视频网-国产精品视频一区二区猎奇-国产精品视频一区二区三区-国产精品视频一区二区三区不-国产精品视频一区二区三区不卡 | 日韩专区第一页-日韩中文字幕在线亚洲一区-日韩中文字幕在线观看视频-日韩中文字幕在线播放-日韩中文字幕一区二区不卡-日韩中文字幕一区 | 欧美综合亚洲,欧美激情91,亚洲 欧美 成人日韩,国产亚洲精品成人婷婷久久小说,国内精品久久久久影院不卡,曰韩在线 | 婷婷五色,五月天激情婷婷大综合,亚洲综合久久久久久中文字幕,国产ww久久久久久久久久,婷婷综合缴情亚洲五月伊,欧美日韩不卡在线 九九香蕉-九九线精品视频-九九五月天-九九天天影视-天天干b-天天干2018 | 精品在线视频播放-精品在线免费播放-精品在线观看一区-精品在线观看国产-亚洲 男人 天堂-亚州视频一区二区 | 伊人色综合久久大香-伊人色综合久久-伊人色综合97-伊人色在线-免费永久在线观看黄网-免费永久国产在线视频 | 18禁欧美猛交XXXXX无码-18禁无遮挡爽爽爽无码视频-18禁止观看免费私人影院-1区2区3区高清视频-日本在线网-日本在线视频一区二区 在线观看日本视频-在线观看日本免费-在线观看日本www-在线观看日本-久久亚洲精品成人-久久亚洲精品tv | 日皮影院,一区二区三区高清不卡,国产日韩欧美中文字幕,日韩亚洲欧美一区二区三区,国产三级91,国产精品hd免费观看 | 91精品久久久久久久久无码变态-91精品久久久久久久久中文字幕-91精品久久久久久久蜜臀-91精品久久久久久久青草-91精品久久久久久中文字幕-91精品久久久久久综合五月天 | 久久99国产亚洲高清-久久99国产亚洲高清观看首页-久久99国产亚洲精品观看-久久99国产一区二区-久久99国产一区二区三区-久久99国产综合精品 | jjzz日本女人-jjzz网站-jjzz亚洲亚洲女人-jjzz在线观看-jlzzjizz-jlzzjlzz亚洲日本 | 日本a天堂,亚洲精品乱码久久久久久,欧美精品一区二区三区在线播放,国产亚洲视频在线观看,国产丰满眼镜女在线观看,亚洲日韩欧美综合 | 国产免费区-国产免费久久精品-国产免费久久-国产免费福利-鸥美性生交xxxxx久久久-欧洲黄色毛片 | 日本最新中文字幕-日本最新在线-日本最新伦中文字幕-日本综合在线-国产 日韩 欧美 高清-国产 欧美日韩 在线播放 | 国产精品va在线播放我和闺蜜-国产精品va在线观看无码不卡-国产精品V日韩精品V在线观看-国产精品V无码A片在线看-国产精品wwwcom976con-国产精品XXXXX免费A片 | 精品久久久久久蜜臂a∨-精品久久久久久蜜臀-精品久久久久久免费看-精品久久久久久免费影院-精品久久久久久清纯-精品久久久久久日韩字幕无 |