FPGA|CPLD|ASIC论坛
直播中

小菜鸡

6年用户 49经验值
擅长:可编程逻辑 嵌入式技术 控制/MCU
私信 关注
[资料]

【雨的FPGA笔记】基础实践-------IP核中RAM的使用

`内容:
       使用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
配置完后添加到工程里

然后进行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

`
ip_ram.zip (6.94 MB)
(下载次数: 7, 2020-1-23 15:28 上传)
YSJ%I~USRDUKZP`XCX@HCS2.png

回帖(2)

王栋春

2020-1-23 22:08:52
看来英语不行就是不太适宜学习软件知识
2 举报

2020-3-24 08:56:53
好东西,支持一下!!!!
举报

更多回帖

发帖
×
20
完善资料,
赚取积分