實驗原理:
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(); fsmc.initialize(); led.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 [24:16]ab, inout [15:0]db, input wrn, input rdn, input csn, input PLL_48M, input RST_n, input nadv ); //-----------------------rd_wr------------------------------// wire wr; wire rd; assign wr = (csn | wrn); //提取寫訊號 assign rd = (csn | rdn); //提取讀訊號 //-------------------------address-------------------------// //地址為複用模式,即地址線和資料線為同一組線,分時使用。 reg [24:0]address; always@(posedge nadv or negedge RST_n) begin if(!RST_n) begin address = 25'd0; end else address <= {ab,db}; end //---------------------------clk----------------------------// reg wr_clk1,wr_clk2; always@(posedge PLL_48M or negedge RST_n) begin if(!RST_n) begin wr_clk1 <= 1'd1; wr_clk2 <= 1'd1; end else begin {wr_clk2,wr_clk1} <= {wr_clk1,wr}; end end wire clk = (!wr_clk2|!rd); //將讀寫訊號轉換為時鐘訊號 //--------------------------db_out--------------------------// wire [15:0]DB_OUT; assign db = !rd ? DB_OUT : 16'hzzzz; //---------------------------ram----------------------------// //例項化ram my_ram u1( .address(address), .clock(clk), .data(db), .wren(!wr), .rden(!rd), .q(DB_OUT) ); //------------------------endmodule-------------------------// endmodule
實驗方法及指導書:
連結:http://pan.baidu.com/s/1kUYFKiF 密碼:pgx2