FPGA和M3的FSMC通信(现在能正确读写,但是还不完善)
说明:最近刚开始学习altera系列的FPGA,刚入门的时候有点云里雾里, 不过还好终于入门了。(1)有点动手能力的话,买一个核心板就可以了,剩下自己搭建点外设,没有必要买网上卖的板子,浪费银子。
(2)不过有钱了,一定买个官方的板子,专业,而且不容易出问题。
硬件开发环境:使用的是iCore(STM32F103VET6 + EP4CE6E22C8)
硬件接口:
FSMC采用模式A,读写时序如下:
(1)由于这个项目我只负责调度算法和ARM部分的程序编写,所以学了一段时间XILINX的FPGA就没再搞了。
但是现在的形势似乎有点严峻,所以我也需要搞FPGA,既然打算搞FPGA,自己就用点心。
(2)记得前一段时间FSMC外挂RA8875的时候,老是出问题,最近学了FPGA才知道原因。
FSMC------------>RA8875
FSMC ------------>FPGA 出问题的原因似乎是因为不片选FPGA的时候需要将数据引脚DB设置成
高阻态,关于这个问题,今天看特权同学写的《深入浅出玩转FPGA》也有说明。
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
顶一下这个帖子。 什么都能玩啊。。。这节奏太厉害了。。。。 请问,我有一块207的板和fpga的板,之间想问fsmc通讯,但是发现207往fpga写数据的时候,数据的低八位是通过207的fsmc的d【15:8】传送的,想问下怎么改变到d【7:0】 FPGA+ARM,有没什么应用场合呢
回 632069383 的帖子
632069383:FPGA+ARM,有没什么应用场合呢 (2016-01-21 22:07) images/back.gif用ARM搞不定的地方,需要外接FPGA时,比如高速数据采集。 楼主为何要使用PLL给单片机时钟呢?STM32使用外部的行么?
如果不行的话,FPGA给出的8MHZ应该如何和STM32连接,就是连接到哪个管脚呢?
请指教,谢谢 鬼谷左原 发表于 2016-3-8 01:06
楼主为何要使用PLL给单片机时钟呢?STM32使用外部的行么?
如果不行的话,FPGA给出的8MHZ应该如何和STM32连 ...
可以省去外部晶振 eric2013 发表于 2013-1-13 21:24
ARM部分代码:ARM部分的代码比较简单,初始化一下FSMC,然后读取或写入相应的地址空间就可以。
FPGA部分代 ...
代码里有乱码啊 zerone 发表于 2018-6-29 15:15
代码里有乱码啊
已经修正,之前论坛从PW论坛格式转换到DZ论坛后,部分字符无法正确识别。 大佬真的是什么都涉猎啊~
页:
[1]