本文版權歸 XiaomaGee所有,轉載請注明出處。
_____________________________________
深入交流QQ群:
A: 204255896(500人超級群,滿員) B: 165201798(500人超級群,滿員)
C: 215053598(200人高級群,滿員) D: 215054675(200人高級群)
E: 215055211(200人高級群) F: 78538605 (500人高級群)
G:158560047(500人高級群,滿員)
YY 群:7182393
YY頻道:80518139(不定期語音群課)
博客: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 程序介紹
圖示為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控制的發光二極管滅。
軟件包及 PDF 文檔下載:
http://files.cnblogs.com/xiaomagee/iboard_fsmc_pub.zip