zoukankan      html  css  js  c++  java
  • 【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

  • 相关阅读:
    IE8发送ajax请求无效
    Qt 桌面服务 QDesktopServices
    Qt 排序 QSort
    使用ehcache缓存可变对象时的注意事项
    Golang微服务入门到精通之路-1-Go之初体验
    机械革命 Code01 笔记本激活 Win10 方法
    IM技术分享:万人群聊消息投递方案的思考和实践
    零基础入门:基于开源WebRTC,从0到1实现实时音视频聊天功能
    剑指 Offer 28. 对称的二叉树
    idea使用
  • 原文地址:https://www.cnblogs.com/xiaomagee/p/7520502.html
Copyright © 2011-2022 走看看