【iCore1S 双核心板_ARM】例程十七:FSMC实验——读写FPGA

实验现象:oop

先烧写FPGA程序,再烧写ARM程序,ARM程序烧写完毕后即开始读写RAM测试,测试成功,绿色ARM·LED亮,测试失败,红色ARM·LED闪烁。测试

核心代码:spa

int main(void)
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_FSMC_Init();

  /* USER CODE BEGIN 2 */
    int i;
    unsigned short int fsmc_read_data;
    LED_GREEN_ON;
    
    /*ÂÌÉ«ledÁÁ£¬±íʾ²âÊÔÕý³£
    ºìÉ«ledÁÁ£¬±íʾ²âÊÔʧ°Ü£¬²âÊÔ½áÊø*/

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */
        for(i = 0;i < 512;i++){
         fpga_write(i,i);                  //ÏòFPGAдÈëÊý¾Ý
        }    
        for(i = 0;i < 512;i++){
            fsmc_read_data = fpga_read(i);   //´ÓFPGA¶ÁÊý¾Ý
            if(fsmc_read_data != i){
                LED_GREEN_OFF;
                LED_RED_ON;
                while(1);
            }            
        }

  }
  /* USER CODE END 3 */

}
 module FSMC_Ctrl(
    ab,
    db,
    wrn,
    rdn,
    csn,
    PLL_100M,
    RST_n,
    nadv
     );
    
//-------------------------fsmc ------------------------------//    
    input [24:16]ab;
    inout [15:0]db;
    input wrn;
    input rdn;
    input csn;
    input PLL_100M;
    input RST_n; 
    input nadv;
    
    wire rd;
    wire wr;
    wire [15:0]DB_OUT;
//-------------------------rd_wr ----------------------------//        
    assign rd = (csn | rdn);
    assign wr = (csn | wrn);
            
//-------------------------ab ------------------------------//
    reg [24:0]address;
    always @ (posedge nadv or negedge RST_n)
        begin
            if(!RST_n)
                begin
                    address <= 25'd0;
                end
            else 
                begin
                    address <= {ab,db};
                end
        end 

//-------------------------clk ----------------------------//
    reg wr_clk1,wr_clk2;    
    always @(posedge PLL_100M 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
        
    wire clk = (!wr_clk2 | !rd);
    
//------------------------db_out -------------------------//    
    assign db = !rd ? DB_OUT : 16'hzzzz;

//------------------------ma_ram ------------------------//    
my_ram      u1(                                            //ram块例化
                    .address(address),
                    .clock(clk),
                    .data(db),
                    .wren(!wr),
                    .rden(!rd),
                    .q(DB_OUT),
                    );
                    
//-------------------------endmodule ------------------------------//
endmodule

实验方法及指导书:code

连接:http://pan.baidu.com/s/1pLmMprd 密码:zuethtm