硬汉嵌入式论坛

 找回密码
 立即注册
查看: 15629|回复: 12
收起左侧

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

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106833
QQ
发表于 2013-1-13 20:54:35 | 显示全部楼层 |阅读模式
说明:最近刚开始学习altera系列的FPGA,  刚入门的时候有点云里雾里, 不过还好终于入门了。
           (1)有点动手能力的话,买一个核心板就可以了,剩下自己搭建点外设,没有必要买网上卖的板子,浪费银子。
           (2)不过有钱了,一定买个官方的板子,专业,而且不容易出问题。
硬件开发环境:使用的是iCore(STM32F103VET6 + EP4CE6E22C8)
硬件接口:
QQ截图20130113204642.jpg
FSMC采用模式A,读写时序如下:
1.jpg
2.jpg
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

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


         3.jpg
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

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

  1. module verilog_prj(
  2.                 clk,
  3.                 arm_clk,
  4.                 led0,
  5.                 ab,       //address
  6.                 db,        //data
  7.                 wrn,        //wr
  8.                 rdn,        //rd
  9.                 csn        //cs
  10.             );

  11. input clk;            //25MHz

  12. output led0;
  13. output arm_clk;

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

  16. input[2:0]    ab;
  17. inout[15:0] db;

  18. input wrn;
  19. input rdn;
  20. input csn;

  21. reg [15:0] outa;
  22. reg [15:0] outb;
  23. reg [15:0] outc;
  24. reg [15:0] outd;
  25. reg [15:0] oute;
  26. reg [15:0] outf;
  27. reg [15:0] outg;
  28. reg [15:0] outh;
  29. reg [15:0] out;

  30. //reg [15:0] ina;
  31. //reg [15:0] inb;
  32. //reg [15:0] inc;
  33. //reg [15:0] ind;
  34. //reg [15:0] ine;
  35. //reg [15:0] inf;
  36. //reg [15:0] ing;
  37. //reg [15:0] inh;

  38. //wire rd;
  39. //wire wr;

  40. reg [15:0] indata;

  41. //assign rd = !(csn & rdn); //get rd pulse  ____|~~~~|______
  42. //assign wr = !(csn & wrn); //get wr pulse  ____|~~~~|______

  43. assign db = !rdn ? indata:16'hzzzz;
  44. //  assign db = indata ;
  45. /*
  46. ****************************************************************
  47. *
  48. *      PLL例化
  49. *
  50. ****************************************************************
  51. */
  52. PLL_ctrl    PLL_ctrl_inst (
  53.                 .inclk0(clk),        //PLL输入时钟
  54.                 .c0(clk_8m),        //8MHz to ARM                    
  55.                 .locked(locked)    //PLL输出有效标志位,高有效
  56.             );


  57. /*
  58. ****************************************************************
  59. *
  60. *      LED0闪烁
  61. *
  62. ****************************************************************
  63. */            
  64. reg[24:0] cnt1;
  65. always @ (posedge clk) begin
  66.     if(cnt1 == 25'd25_000_000)
  67.     begin
  68.         cnt1 <= 25'd0;
  69.         out <= out+1'b1;
  70.     end
  71.     else
  72.      begin
  73.          cnt1 <= cnt1+1'b1;

  74.      end
  75. end


  76. assign led0 = cnt1[24];
  77. assign arm_clk = clk_8m;

  78. /*
  79. ****************************************************************
  80. *
  81. *                 FSMC读写  
  82. *
  83. ****************************************************************
  84. */
  85. //write data, 根据地址线选择八个空间写入,每个空间16位
  86.     always @(negedge wrn)
  87.      begin
  88.        if(csn == 0)
  89.         begin
  90.             case (ab)            
  91.                 3'b000:outa <= db;
  92.                 3'b001:outb <= db;
  93.                 3'b010:outc <= db;
  94.                 3'b011:outd <= db;
  95.                 3'b100:oute <= db;
  96.                 3'b101:outf <= db;
  97.                 3'b110:outg <= db;
  98.                 3'b111:outh <= db;
  99.                 default:;
  100.             endcase
  101.         end
  102.     end

  103.     //red data 根据地址线选择8个空间读取,每个空间 16位
  104.     always @( rdn )
  105.     begin
  106.         if(csn == 0)
  107.         begin
  108.             case (ab)
  109.                 3'b000:indata <= out;
  110.                 3'b001:indata <= outb;
  111.                 3'b010:indata <= outc;
  112.                 3'b011:indata <= outd;
  113.                 3'b100:indata <= oute;
  114.                 3'b101:indata <= outf;
  115.                 3'b110:indata <= outg;
  116.                 3'b111:indata <= outh;
  117.                 default:;
  118.             endcase
  119.         end
  120.     end
  121. endmodule   
复制代码
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106833
QQ
 楼主| 发表于 2014-12-10 15:26:21 | 显示全部楼层
顶一下这个帖子。
回复

使用道具 举报

334

主题

2033

回帖

3040

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3040
发表于 2015-1-2 09:53:28 | 显示全部楼层
什么都能玩啊。。。这节奏太厉害了。。。。
回复

使用道具 举报

0

主题

1

回帖

0

积分

新手上路

积分
0
发表于 2015-3-31 10:29:40 | 显示全部楼层
请问,我有一块207的板和fpga的板,之间想问fsmc通讯,但是发现207往fpga写数据的时候,数据的低八位是通过207的fsmc的d【15:8】传送的,想问下怎么改变到d【7:0】
回复

使用道具 举报

1

主题

10

回帖

13

积分

新手上路

积分
13
发表于 2016-1-21 22:07:01 | 显示全部楼层
FPGA+ARM,有没什么应用场合呢
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106833
QQ
 楼主| 发表于 2016-1-29 10:55:45 | 显示全部楼层

回 632069383 的帖子

632069383:FPGA+ARM,有没什么应用场合呢&#160;(2016-01-21 22:07)&#160;
用ARM搞不定的地方,需要外接FPGA时,比如高速数据采集。
回复

使用道具 举报

8

主题

11

回帖

8

积分

新手上路

积分
8
发表于 2016-3-8 01:06:16 | 显示全部楼层
楼主为何要使用PLL给单片机时钟呢?STM32使用外部的行么?
如果不行的话,FPGA给出的8MHZ应该如何和STM32连接,就是连接到哪个管脚呢?
请指教,谢谢[s:142]
知行合一
回复

使用道具 举报

100

主题

275

回帖

575

积分

金牌会员

积分
575
发表于 2018-6-29 15:14:59 | 显示全部楼层
鬼谷左原 发表于 2016-3-8 01:06
楼主为何要使用PLL给单片机时钟呢?STM32使用外部的行么?
如果不行的话,FPGA给出的8MHZ应该如何和STM32连 ...

可以省去外部晶振
回复

使用道具 举报

100

主题

275

回帖

575

积分

金牌会员

积分
575
发表于 2018-6-29 15:15:30 | 显示全部楼层
eric2013 发表于 2013-1-13 21:24
ARM部分代码:ARM部分的代码比较简单,初始化一下FSMC,然后读取或写入相应的地址空间就可以。
FPGA部分代 ...

代码里有乱码啊
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106833
QQ
 楼主| 发表于 2018-6-29 15:32:05 | 显示全部楼层
zerone 发表于 2018-6-29 15:15
代码里有乱码啊

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

使用道具 举报

28

主题

178

回帖

262

积分

高级会员

积分
262
发表于 2022-2-15 16:31:33 | 显示全部楼层
大佬真的是什么都涉猎啊~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-6 21:00 , Processed in 0.268121 second(s), 34 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表