eric2013 发表于 2013-1-13 20:54:35

FPGA和M3的FSMC通信(现在能正确读写,但是还不完善)

说明:最近刚开始学习altera系列的FPGA,刚入门的时候有点云里雾里, 不过还好终于入门了。
         (1)有点动手能力的话,买一个核心板就可以了,剩下自己搭建点外设,没有必要买网上卖的板子,浪费银子。
         (2)不过有钱了,一定买个官方的板子,专业,而且不容易出问题。
硬件开发环境:使用的是iCore(STM32F103VET6 + EP4CE6E22C8)
硬件接口:

FSMC采用模式A,读写时序如下:

eric2013 发表于 2013-1-13 21:15:16

(1)由于这个项目我只负责调度算法和ARM部分的程序编写,所以学了一段时间XILINX的FPGA就没再搞了。
         但是现在的形势似乎有点严峻,所以我也需要搞FPGA,既然打算搞FPGA,自己就用点心。
(2)记得前一段时间FSMC外挂RA8875的时候,老是出问题,最近学了FPGA才知道原因。
         FSMC------------>RA8875
         FSMC ------------>FPGA   出问题的原因似乎是因为不片选FPGA的时候需要将数据引脚DB设置成
         高阻态,关于这个问题,今天看特权同学写的《深入浅出玩转FPGA》也有说明。

      

eric2013 发表于 2013-1-13 21:24:49

ARM部分代码:ARM部分的代码比较简单,初始化一下FSMC,然后读取或写入相应的地址空间就可以。
FPGA部分代码:(1)这部分的代码要控制好时序,主要还是判断好CS,RD,WR这三个引脚就可以成功了。
                        (2)使用前需要例化一个PLL,用于给STM32提供时钟,这里将PLL配置成8MHz
                        (3)初学FPGA,代码还有不规范的地方。

module verilog_prj(
                clk,
                arm_clk,
                led0,
                ab,       //address
                db,      //data
                wrn,      //wr
                rdn,      //rd
                csn      //cs
            );

input clk;            //25MHz

output led0;
output arm_clk;

wire clk_8m;      //输入时钟的4倍频,100MHz   
wire locked;      //PLL输出有效标志位,高有效

input    ab;
inout db;

input wrn;
input rdn;
input csn;

reg outa;
reg outb;
reg outc;
reg outd;
reg oute;
reg outf;
reg outg;
reg outh;
reg out;

//reg ina;
//reg inb;
//reg inc;
//reg ind;
//reg ine;
//reg inf;
//reg ing;
//reg inh;

//wire rd;
//wire wr;

reg indata;

//assign rd = !(csn & rdn); //get rd pulse____|~~~~|______
//assign wr = !(csn & wrn); //get wr pulse____|~~~~|______

assign db = !rdn ? indata:16'hzzzz;
//assign db = indata ;
/*
****************************************************************
*
*      PLL例化
*
****************************************************************
*/
PLL_ctrl    PLL_ctrl_inst (
                .inclk0(clk),      //PLL输入时钟
                .c0(clk_8m),      //8MHz to ARM                  
                .locked(locked)    //PLL输出有效标志位,高有效
            );


/*
****************************************************************
*
*      LED0闪烁
*
****************************************************************
*/            
reg cnt1;
always @ (posedge clk) begin
    if(cnt1 == 25'd25_000_000)
    begin
      cnt1 <= 25'd0;
      out <= out+1'b1;
    end
    else
   begin
         cnt1 <= cnt1+1'b1;

   end
end


assign led0 = cnt1;
assign arm_clk = clk_8m;

/*
****************************************************************
*
*               FSMC读写
*
****************************************************************
*/
//write data, 根据地址线选择八个空间写入,每个空间16位
    always @(negedge wrn)
   begin
       if(csn == 0)
      begin
            case (ab)            
                3'b000:outa <= db;
                3'b001:outb <= db;
                3'b010:outc <= db;
                3'b011:outd <= db;
                3'b100:oute <= db;
                3'b101:outf <= db;
                3'b110:outg <= db;
                3'b111:outh <= db;
                default:;
            endcase
      end
    end

    //red data 根据地址线选择8个空间读取,每个空间 16位
    always @( rdn )
    begin
      if(csn == 0)
      begin
            case (ab)
                3'b000:indata <= out;
                3'b001:indata <= outb;
                3'b010:indata <= outc;
                3'b011:indata <= outd;
                3'b100:indata <= oute;
                3'b101:indata <= outf;
                3'b110:indata <= outg;
                3'b111:indata <= outh;
                default:;
            endcase
      end
    end
endmodule   

eric2013 发表于 2014-12-10 15:26:21

顶一下这个帖子。

caicaptain2 发表于 2015-1-2 09:53:28

什么都能玩啊。。。这节奏太厉害了。。。。

lintianda 发表于 2015-3-31 10:29:40

请问,我有一块207的板和fpga的板,之间想问fsmc通讯,但是发现207往fpga写数据的时候,数据的低八位是通过207的fsmc的d【15:8】传送的,想问下怎么改变到d【7:0】

632069383 发表于 2016-1-21 22:07:01

FPGA+ARM,有没什么应用场合呢

eric2013 发表于 2016-1-29 10:55:45

回 632069383 的帖子

632069383:FPGA+ARM,有没什么应用场合呢 (2016-01-21 22:07) images/back.gif

用ARM搞不定的地方,需要外接FPGA时,比如高速数据采集。

鬼谷左原 发表于 2016-3-8 01:06:16

楼主为何要使用PLL给单片机时钟呢?STM32使用外部的行么?
如果不行的话,FPGA给出的8MHZ应该如何和STM32连接,就是连接到哪个管脚呢?
请指教,谢谢

zerone 发表于 2018-6-29 15:14:59

鬼谷左原 发表于 2016-3-8 01:06
楼主为何要使用PLL给单片机时钟呢?STM32使用外部的行么?
如果不行的话,FPGA给出的8MHZ应该如何和STM32连 ...

可以省去外部晶振

zerone 发表于 2018-6-29 15:15:30

eric2013 发表于 2013-1-13 21:24
ARM部分代码:ARM部分的代码比较简单,初始化一下FSMC,然后读取或写入相应的地址空间就可以。
FPGA部分代 ...

代码里有乱码啊

eric2013 发表于 2018-6-29 15:32:05

zerone 发表于 2018-6-29 15:15
代码里有乱码啊

已经修正,之前论坛从PW论坛格式转换到DZ论坛后,部分字符无法正确识别。

mioc_hust 发表于 2022-2-15 16:31:33

大佬真的是什么都涉猎啊~
页: [1]
查看完整版本: FPGA和M3的FSMC通信(现在能正确读写,但是还不完善)