MyFPGA Forum

 找回密码
 注册
搜索
查看: 2566|回复: 0
打印 上一主题 下一主题

verilog基础篇RAM IP核的使用

[复制链接]
跳转到指定楼层
1#
发表于 2020-6-28 17:25:54 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式


在该页面中,我们去掉了q output port(去掉输出寄存器),并且添加了一个rden读使能信号,所谓rden读使能信号就是,当该信号为高电平时,我们才可以读取RAM IP核中的数据。
其余的页面我们使用默认设置即可,不要忘记勾选inst初始化模板文件。

//该代码主要实现了先往RAM IP核中的0-31地址写入0-31数据,
//每个地址对应一个数据,比如0地址对应0数据,1地址对应1数据,以此类推
//写完了32个数据之后,我们在将RAM IP核中的0-31地址中的数据读出
//当写数据时,我们需要将写使能信号拉高,当读数据时,我们需要将读使能信号拉高

//该代码主要实现了先往RAM IP核中的0-31地址写入0-31数据,
//每个地址对应一个数据,比如0地址对应0数据,1地址对应1数据,以此类推
//写完了32个数据之后,我们在将RAM IP核中的0-31地址中的数据读出
//当写数据时,我们需要将写使能信号拉高,当读数据时,我们需要将读使能信号拉高
  1. module verilog_ip_RAM
  2. (
  3. input clk_50M,
  4. input   RST_N,
  5. /*RAM端口*/
  6. output reg [4:0] address,  //RAM的地址端口
  7. output reg [7:0] wrdata,   //RAM的写数据端口
  8. output [7:0] rddata,   //RAM的读数据端口
  9. output reg [5:0] time_cnt,  //计数器
  10. output  wren,                                        //RAM的写使能端口
  11. output  rden                                        //RAM的读使能端口
  12. );

  13. //计数器
  14. reg [5:0] time_cnt_n;//time_cnt的下一个状态
  15. //RAM的地址端口
  16. reg [4:0] address_n;  //address的下一个状态
  17. //RAM的写数据端口
  18. reg [7:0] wrdata_n;  //wrdata的下一个状态

  19. //时序逻辑电路,用来给time_cnt寄存器赋值
  20. always @ (posedge clk_50M or negedge RST_N)
  21. begin
  22. if(!RST_N)
  23.         time_cnt<=1'b0;
  24. else
  25.         time_cnt<=time_cnt_n;
  26. end

  27. /*组合电路*/
  28. always @ (*)
  29. begin
  30.         if(time_cnt==6'd63)
  31.                 time_cnt_n=0;
  32.         else
  33.                 time_cnt_n=time_cnt+1;
  34. end

  35. /*时序电路,用来给address寄存器赋值*/
  36. always @ (negedge clk_50M or negedge RST_N)
  37. begin
  38.         if(!RST_N)
  39.                 address<=1'b0;
  40.         else
  41.                 address<=address_n;
  42. end

  43. /*组合电路,用来生成RAM地址*/
  44. always @ (*)
  45. begin
  46.         if(address==5'd31)
  47.                 address_n=1'b0;
  48.         else
  49.                 address_n=address+1'b1;
  50. end

  51. /*组合电路,根据计数器用来生成RAM写使能*/
  52. assign wren = (time_cnt>=1'b0&&time_cnt<=5'd31)?1'b1:1'b0;

  53. /*时序电路,用来给wrdata寄存器赋值*/
  54. always @ (negedge clk_50M or negedge RST_N)
  55. begin
  56.                 if(!RST_N)
  57.                         wrdata<=1'b0;
  58.                 else
  59.                         wrdata<=wrdata_n;       
  60. end

  61. /*组合电路,根据计数器用来生成写入RAM的数据*/
  62. always @ (*)
  63. begin
  64.         if(time_cnt>=1'b0&&time_cnt<=5'd31)
  65.                 wrdata_n=time_cnt;
  66.         else
  67.                 wrdata_n=wrdata;

  68. end

  69. /*组合电路,根据计数器用来生成RAM读使能*/
  70. assign rden =(time_cnt>=6'd32&&time_cnt<=6'd63)?1'b1:1'b0;

  71. /*RAM IP核模块*/

  72. RAM        RAM_inst (
  73.         .address ( address ),  //RAM的地址端口
  74.         .clock ( clk_50M ),  //时钟端口
  75.         .data ( wrdata ),//RAM的写数据端口
  76.         .rden ( rden ),        //RAM的读使能端口
  77.         .wren ( wren ),   //RAM的写使能端口
  78.         .q ( rddata )     //RAM的读数据端口
  79.         );
  80.        
  81. endmodule
复制代码

写数据如上图所示
从图中可以看到写使能信号为高,读使能信号为低时候,该操作就是往RAM IP核里面写数据。
在上升沿,数据生成由time_cnt生成,在下降沿进行写数据,由上图可以看到在地址30的时候,就写入数据30,在地址31的时候,就写入数据31.


读数据如上图所示
读数据由于有一个寄存器的延时,在下降沿的地址递增,在下一个上升沿输出对应地址的数据。
也可以用signal tap II 调试观察



————————————————
版权声明:本文为CSDN博主「ciscomonkey」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ciscomonkey/article/details/84549195

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

本版积分规则

小黑屋|手机版|Archiver|MyFPGA

GMT+8, 2024-4-26 22:18 , Processed in 0.046338 second(s), 18 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

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