发 帖  
原厂入驻New
[资料] 【雨的FPGA笔记】基础实践-------IP核中RAM的使用
2020-1-23 15:28:06  1026 FPGA 笔记 基础
分享
内容:
       使用IP核中的RAM进行读写,数据位宽为32位
RAM读写模块输出给RAM模块的有{写使能、写数据、地址、读使能},RAM输入给RAM读写模块的信号有读数据。在写使能拉高的时候写入数据,在读使能拉高的时候读出数据。

      RAM也叫随机存取存储器、它可以随时把数据写入任意一个指定地址的存储单元,也可以随时从任意一个指定地址中读出数据。ROM是只读存储器,只能读出数据不能写入数据。
      RAM也包括DRAM和SRAM、SRAM的存储速度快操作简单,但成本很高体积很难做大,而DRAM则成本低,但存储速度慢操作时序复杂,这里复杂也相对SRAM来说。
      RAM有单端口RAM和双端口RAM,前者读写一根线,后者读写地址分开。
嵌入式内存结构由M9K存储器模块组成,通过这些M9K存储器模块进行配置,可以实现各种存储器功能,RAM、移位寄存器、ROM、以及FIFO缓存区。

下面是使用IP核中RAM配置过程
首先在IP核中搜索RAM,找到单端口RAM,双端口的配置和单端口配置类似。
ELKY`D_YPQ{N$MMJM_G31UX.png %HNM_[P))IPA)Q]CZD`NRMF.png
然后就出现配置界面,这里选择32位
H0$LP4~$[P$}G@M~53MMBOY.png [)%A0))~RV3(74MUAQX1D$E.png
然后下一步
R]BKE2)4@L2GGQP3{HK64QG.png 6WAVPGSI93RMX(_1_4Q(HG4.png C3KNS_3TE@0S7}VY]Z)})~W.png Q@XNY0[GLYIQ7L3_7[[{B`2.png
配置完后添加到工程里
YSJ%I~USRDUKZP`XCX@HCS2.png
然后进行RAM读写模块的代码
顶层模块
  1. module ip_ram(
  2.     input           sys_clk,
  3.     input           sys_rst
  4.     );
  5.    
  6. //wire          define
  7. wire   [7:0]    ram_read;
  8. wire   [7:0]    ram_write;
  9. wire            ram_rd_en;
  10. wire            ram_we_en;
  11. wire   [4:0]    ram_addr;

  12. //reg           define
  13. ram_rw  u_ram_rw(
  14.     .sys_clk        (sys_clk),
  15.     .sys_rst        (sys_rst),
  16.     .ram_read       (ram_read),
  17.     .ram_write      (ram_write),
  18.     .ram_rd_en      (ram_rd_en),
  19.     .ram_we_en      (ram_we_en),
  20.     .ram_addr       (ram_addr)
  21.     );
  22.    
  23. ram_1port        u_ram_1port (
  24.         .address        (ram_addr),
  25.         .clock          (sys_clk),
  26.         .data           (ram_write),
  27.         .rden           (ram_rd_en),
  28.         .wren           (ram_we_en),
  29.         .q              (ram_read)
  30.         );

  31. endmodule
复制代码
读写模块
  1. module ram_rw(
  2.     input               sys_clk,
  3.     input               sys_rst,
  4.    
  5.     input       [7:0]   ram_read,
  6.     output  reg [7:0]   ram_write,
  7.     output              ram_rd_en,
  8.     output              ram_we_en,
  9.     output  reg [4:0]   ram_addr   
  10.     );
  11.    
  12. //parameter     define
  13. //wire          define
  14. //reg           define
  15. reg   [5:0]     clk_cnt;      
  16. //assign        define
  17. assign          ram_we_en = ((clk_cnt >= 0) && (clk_cnt <= 31)) ? 1 : 0;
  18. assign          ram_rd_en = ((clk_cnt >= 32) && (clk_cnt < 64)) ? 1 : 0;

  19. //计数0~63
  20. always @(posedge sys_clk or negedge sys_rst)
  21. begin
  22.     if(!sys_rst)
  23.         clk_cnt <= 0;
  24.     else if(clk_cnt == 63)
  25.         clk_cnt <= 0;
  26.     else
  27.         clk_cnt <= clk_cnt + 1;
  28. end

  29. //读写地址信号
  30. always @(posedge sys_clk or negedge sys_rst)
  31. begin
  32.     if(!sys_rst)
  33.         ram_addr <= 0;
  34.     else if(ram_addr == 31)
  35.         ram_addr <= 0;
  36.     else
  37.         ram_addr <= ram_addr + 1;
  38. end

  39. //0~31 产生写使能信号和写数据信号
  40. always @(posedge sys_clk or negedge sys_rst)
  41. begin
  42.     if(!sys_rst)
  43.        ram_write <= 0;
  44.     else if((clk_cnt >= 0) && (clk_cnt < 31))
  45.        ram_write <= ram_write + 1;  
  46.     else
  47.        ram_write <= 0;  
  48. end

  49. endmodule
复制代码
SignalTap采集数据的到的结果
[BNZ8@J3WTV1B$GX9F98ML7.png

4

ip_ram.zip

下载积分: 积分 -1 分

6.94 MB, 下载次数: 5, 下载积分: 积分 -1 分

评分

参与人数 1积分 +5 收起 理由
Elecfans管家 + 5 您的帖子很精彩,期待您分享的下一个帖子!

查看全部评分

分享淘帖 显示全部楼层
最近下载过的用户(3)
· 2020-1-23 22:08:52
看来英语不行就是不太适宜学习软件知识
· 2020-3-24 08:56:53
好东西,支持一下!!!!

评论

高级模式
您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
发资料
关闭

站长推荐 上一条 /8 下一条

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