【iCore4 双核心板_ARM】例程二十八:FSMC实验——读写FPGA

实验现象:

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

2、测试成功,ARM通过映射寄存器来控制FPGA三色LED循环点亮。

核心代码:

int main(void)
{

  /* USER CODE BEGIN 1 */
    int i;
    
  /* 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_FMC_Init();

  /* USER CODE BEGIN 2 */
    for(i = 0;i < 512;i ++){
        fpga_write(i, 2 * i);    
    }
    for(i = 0;i < 512;i ++){
        if(fpga_read(i) != 2*i){
            while(1){
                LED_RED_ON;
                HAL_Delay(500);
                LED_RED_OFF;
                HAL_Delay(500);
            }
        }
    }
    LED_GREEN_ON;
  /* USER CODE END 2 */
    
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */
        FPGA_LED_RED_ON;
        FPGA_LED_GREEN_OFF;
        FPGA_LED_BLUE_OFF;
        HAL_Delay(500);
        
        FPGA_LED_RED_OFF;
        FPGA_LED_GREEN_ON;
        FPGA_LED_BLUE_OFF;
        HAL_Delay(500);
        
        FPGA_LED_RED_OFF;
        FPGA_LED_GREEN_OFF;
        FPGA_LED_BLUE_ON;
        HAL_Delay(500);
  }
  /* USER CODE END 3 */

}
//-----------------------Module fsmc_ctrl-----------------------//
module fsmc_ctrl(
    input clk_100m,
    input rst_n,
    input [23:16]ab,
    inout [15:0]db,
    input wr_n,
    input rd_n,
    input cs0,
    input nadv,
    output led_red,
    output led_green,
    output led_blue
);

wire wr,rd;
wire [15:0]out_data;
//-------------------------wr & rd-----------------------------//
assign wr = cs0 | wr_n;
assign rd = cs0 | rd_n;

//-------------------------address-----------------------------//
reg [23:0]address;
always@(posedge nadv or negedge rst_n)
    if(!rst_n)
        address <= 24'd0;
    else
        address <= {ab,db};       //锁存地址
        
        
//----------------------------clk------------------------------//
reg wr_clk1,wr_clk2;
always@(posedge clk_100m or negedge rst_n)
    if(!rst_n)
        begin
            wr_clk1 <= 1'd1;
            wr_clk2 <= 1'd2;
        end
    else
        {wr_clk2,wr_clk1} <= {wr_clk1,wr};
        
wire clk = (!wr_clk2 | !rd);

assign db = !rd ? out_data:16'hzzzz;

//----------------------------ram------------------------------//
ram u1(
    .address(address),
    .clock(clk),
    .data(db),
    .wren(!wr),
    .rden(!rd),
    .q(out_data)
);

//----------------------------led_ctrl-------------------------//
reg led[2:0];
always@(posedge wr or negedge rst_n)
    if(!rst_n)
        begin 
            led[0] <= 1'd1;
            led[1] <= 1'd0;
            led[2] <= 1'd1;
        end 
    else 
        begin
            case(address)     //映射寄存器地址
                24'd10:led[0] <= db;
                24'd11:led[1] <= db;
                24'd12:led[2] <= db;
            endcase            
        end

assign led_red =     led[0];
assign led_green = led[1];
assign led_blue = led[2];
    
endmodule

源代码下载链接:

链接:http://pan.baidu.com/s/1nvkhPWl 密码:7x76

iCore4链接:

原文地址:https://www.cnblogs.com/xiaomagee/p/7613690.html