【iBoard 電子學堂教程】【STM32通過 FSMC 讀寫 FPGA示例】


本文版權歸 XiaomaGee所有,轉載請注明出處。

_____________________________________

深入交流QQ群:

A: 204255896500人超級群,滿員) B: 165201798500人超級群,滿員)
C: 215053598
200人高級群,滿員) D: 215054675200人高級群)

E: 215055211200人高級群) F: 78538605 500人高級群)

G:158560047500人高級群,滿員)

YY 7182393

YY頻道80518139(不定期語音群課)

論壇:http://www.heijin.org

店鋪:http://i-board.taobao.com

博客:http://XiaomaGee.cnblogs.com

提示:請關注論壇和博客,以便瀏覽本文檔最新版本

_____________________________________

 

一、 ARM 程序介紹

1. 寫函數

1 #define fpga_write(offset, data) *((volatile unsigned short int*)(CS0_BASE + (offset << 17))) = data

其中:

  • offset為空間偏移量,范圍為 0~7(8個空間);
  • data 為數據,16位整數,范圍為 0~65535;
  • CS0_BASE 為ARM連接FPGA cs0的基地址,具體內容詳見原理圖。

若向空間2寫入1234,則調用方法為:

1 fpga_write(2,1234);

2. 讀函數

1 #define fpga_read(offset) *((volatile unsigned short int*)(CS0_BASE + (offset << 17)))

其中:

  • offset 為空間偏移量,范圍為0~7(共8個空間);
  • 范圍值為16位證書,范圍為0~65535;
  • CS0_BASE 為ARM連接FPGAcs0的基地址,具體內容詳見原理圖。

若讀取空間2的值,則調用方法為:

1 unsigned short int read_data;
2 
3 read_data = fpga_read(2);

 

二、 FPGA 程序介紹

image

圖示為FSMC 代碼生成的頂層模塊連接示意圖,其中:

  • DB[15..0] AB[18..16] WR RD CS0 連接到 ARM上;
  • LED_FPGA 使用outg[0] 控制其亮和滅(可以通過面板控制);
  • ina[15..0] ~ inh[15..0] 為讀取數據輸入,共包含8個空間,每個空間16位;
  • outa[15..0]~outh[15..0]為寫入空間寄存器,共8個空間,每個空間16位;

具體實現原理請參考 fsmc.v 程序。 

//fsmc read / write ep4ce6 demo

module fsmc(
    ab,   //address
    db,    //data
    wrn,    //wr
    rdn,    //rd
    resetn,    //resetn
    csn,    //cs
    ina,    //input data a
    inb,    //input data b
    inc,    //input data c
    ind,    //input data d
    ine,    //input data e
    inf,    //input data f
    ing,    //input data g
    inh,    //input data h
    outa,    //output data a
    outb,    //output data a
    outc,    //output data a
    outd,    //output data a
    oute,    //output data a
    outf,    //output data a
    outg,    //output data a
    outh    //output data a
    );
    
    input[2:0]    ab;
    inout[15:0] db;
    input wrn;
    input rdn;
    input resetn;
    input csn;
    input [15:0] ina;
    input [15:0] inb;
    input [15:0] inc;
    input [15:0] ind;
    input [15:0] ine;
    input [15:0] inf;
    input [15:0] ing;
    input [15:0] inh;
    
    output reg [15:0] outa;
    output reg [15:0] outb;
    output reg [15:0] outc;
    output reg [15:0] outd;
    output reg [15:0] oute;
    output reg [15:0] outf;
    output reg [15:0] outg;
    output reg [15:0] outh;
    
    wire rd;
    wire wr;
    
    reg [15:0] indata;
    
    assign rd = !(csn & rdn); //get rd pulse  ____|~~~~|______
    assign wr = !(csn & wrn); //get wr pulse  ____|~~~~|______
    
    assign db = rd ? indata:16'hzzzz;
    
    
    //write data, 根據地址線選擇八個空間寫入,每個空間16位
    always @(negedge wr or negedge resetn)
    begin
        if(!resetn)begin
            outa <= 16'h0000;
            outb <= 16'h0000;
            outc <= 16'h0000;
            outd <= 16'h0000;
            oute <= 16'h0000;
            outf <= 16'h0000;
            outg <= 16'h0000;
            outh <= 16'h0000;
        end    else  begin
        case (ab)            
            3'b000:outa <= db;
            3'b001:outb <= db;
            3'b010:outc <= db;
            3'b011:outd <= db;
            3'b100:oute <= db;
            3'b101:outf <= db;
            3'b110:outg <= db;
            3'b111:outh <= db;
            default:;
        endcase
        end
    end
    
            
    //read data 根據地址線選擇8個空間讀取,每個空間 16位
    always @(rd or !resetn)
    begin
        if(!resetn)indata <= 16'h0000;
        else  begin
        case (ab)
            3'b000:indata <= ina;
            3'b001:indata <= inb;
            3'b010:indata <= inc;
            3'b011:indata <= ind;
            3'b100:indata <= ine;
            3'b101:indata <= inf;
            3'b110:indata <= ing;
            3'b111:indata <= inh;
            default:;
        endcase
        end
    end
    
endmodule
  

 

三、 功能測試

 

如上圖所示,FPGA 內把outh[15..0] 輸出的數據,取非后連接到 ina[15..0],ARM程序會寫入空間7(也就是outh[15..0]),然后讀取空間0(也就是ina[15..0]),然后做數據取非校驗,判斷成功與否。每輪測試 65536次,共進行300輪測試。核心代碼如下:

for (i = 0; i < 65536; i++) {

fpga_write(7, i);

dat = fpga_read(0);

if ((dat + i) != 65535) {

errors++;

}else success++;

}

 

四、 軟件界面

界面包含四個按鍵,按下【開始測試】則進行讀寫測試,測試中,按下【停止測試】則停止測試,按下【發光管亮】則FPGA 控制的發光二極管亮,【發光管滅】則FPGA控制的發光二極管滅。

 

image

 

 

image

 

 

image

  

 

image

 

 

軟件包及 PDF 文檔下載:

http://files.cnblogs.com/xiaomagee/iboard_fsmc_pub.zip

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM