實驗原理:
STM32F103上自帶FMC控制器,本實驗將通過FMC匯流排的地址獨立模式實現STM32與FPGA
之間通訊,FPGA內部建立RAM塊,FPGA橋接STM32和RAM塊,本實驗通過FSMC匯流排從STM32向
RAM塊中寫入資料,然後讀取RAM出來的資料進行驗證。
核心程式碼:
int main(void) { int i; unsigned short int fsmc_read_data; HAL_Init(); system_clock.initialize(); led.initialize(); fsmc.initialize(); LED_GREEN_ON; while(1) { for(i=0;i<512;i++) { fpga_write(i,i); //дÊý¾Ý } for(i=0;i<512;i++) { fsmc_read_data=fpga_read(i); //¶ÁÊý¾Ý if(fsmc_read_data!=i) //±È½ÏÊý¾Ý { LED_GREEN_OFF; LED_RED_ON; while(1); } } } }
module FSMC_Ctrl( input [8:0]ab, inout [15:0]db, input wrn, input rdn, input csn, input PLL_48M, input RST_n ); //------------------------wr_rd-----------------------------// wire wr; wire rd; assign wr = (csn | wrn); //提取寫訊號 assign rd = (csn | rdn); //提取讀訊號 //-------------------------clk------------------------------// reg wr_clk1,wr_clk2; wire clk; always@(posedge PLL_48M or negedge RST_n) begin if(!RST_n) begin wr_clk1 <= 1'd1; wr_clk2 <= 1'd1; end else {wr_clk2,wr_clk1} <= {wr_clk1,wr}; end assign clk = (!wr_clk2 | !rd); //將讀寫訊號轉換為時鐘訊號 //-------------------------DB_OUT---------------------------// wire [15:0]DB_OUT; assign db = !rd ? DB_OUT : 16'hzzzz; //--------------------------ram-----------------------------// //例項化ram my_ram u1( .address(ab), .clock(PLL_48M), .data(db), .rden(!rd), .wren(!wr), .q(DB_OUT) ); //----------------------emdmodule---------------------------// endmodule
實驗方法及指導書:
連結:http://pan.baidu.com/s/1bpq7qyV 密碼:kib5