【iCore1S 双核心板_FPGA】例程十三:FSMC总线通信实验——复用地址模式
实验原理:
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