实验原理:
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