当前位置:   article > 正文

Vivado IP核之RAM Block Memery Generator_vivado block memory generator

vivado block memory generator

Vivado IP核之RAM Block Memery Generator


前言

        本次介绍vivado中RAM(Block Memery Generator)IP核的使用,希望对大家有所帮助。


提示:以下是本篇文章正文内容,均为作者本人原创,写文章实属不易,希望各位在转载时附上本文链接。

一、配置步骤

        在vivado中搜索Block Memery Generator,找到该IP核后即可按照以下操作完成相应的配置。本次配置为单端口模式

        1.首先配置Basic界面,如图1所示。

        

图1 Basic界面的配置

         2.其次配置Port A Options界面,如图2所示。

图2 Port A Options界面的配置

         3.然后配置Other Options界面,如图3所示。这里可以添加初始化文件,即coe文件,用来初始化存储数据。

图3 Other Options界面的配置

         4.最后就是一个Summary界面,如图4所示,不需要我们配置,一个简介页面而已。

图4 Summary界面

         以上4个界面都配置完成后即可点击右下角OK按钮生成IP核。

二、仿真

1.顶层代码

建立一个顶层模块,命名为ram_read,用来例化刚才生成的IP核。

代码如下:

  1. `timescale 1ns / 1ps
  2. //
  3. // Company: cq university
  4. // Engineer: clg
  5. // Create Date: 2022/07/27 16:43:07
  6. // Design Name:
  7. // Module Name: ram_read
  8. // Project Name:
  9. // Target Devices:
  10. // Tool Versions: 2017.4
  11. // Description:
  12. // Dependencies:
  13. // Revision:1.0
  14. // Revision 0.01 - File Created
  15. // Additional Comments:
  16. //
  17. //虽然是ram,本次将ram当rom使用
  18. module ram_read(
  19. input clk, //输入时钟信号
  20. input rst_n, //输入复位信号
  21. input start, //输入开始读信号
  22. input [10 : 0] addr, //输入读地址
  23. input [31 : 0] din, //本次用不到
  24. output reg over, //输出读的数据有效信号
  25. output reg [31 : 0] dout //输出读到的数据
  26. );
  27. //reg define
  28. reg en; //读使能信号
  29. reg we; //读写选择
  30. reg [1:0] cnt; //计数器
  31. //wire define
  32. wire [31:0] data; //读的数据
  33. always @(negedge clk or negedge rst_n)
  34. begin
  35. if(!rst_n)
  36. cnt<=0;
  37. else if( (start==1)&(cnt<3))
  38. cnt<=cnt+1;
  39. else
  40. cnt<=0;
  41. end
  42. always @(negedge clk or negedge rst_n) //下降沿设定使能
  43. begin
  44. if(!rst_n)
  45. begin en<=0;we<=0;end
  46. else if(0<cnt<3)
  47. begin en<=1;we<=0;end
  48. else
  49. begin en<=0;we<=0;end
  50. end
  51. always @(posedge clk or negedge rst_n) //上升沿读取稳定数据
  52. begin
  53. if(!rst_n)
  54. begin over<=0;dout<=0;end
  55. else if(cnt==3)
  56. begin over<=1;dout<=data;end
  57. else
  58. begin over<=0;dout<=0;end
  59. end
  60. ram_sam_re_ip u1_ram_sam_re_ip ( //例化ram
  61. .clka(clk), // input wire clka
  62. .ena(en), // input wire ena
  63. .wea(we), // input wire [0 : 0] wea
  64. .addra(addr), // input wire [10 : 0] addra
  65. .dina(din), // input wire [31 : 0] dina
  66. .douta(data) // output wire [31 : 0] douta
  67. );
  68. endmodule

2.仿真代码

建立一个仿真模块,命名为ram_read_tb,用来仿真刚才顶层模块例化的IP核。

代码如下:

  1. `timescale 1ns / 1ps
  2. //
  3. // Company: cq university
  4. // Engineer: clg
  5. // Create Date: 2022/07/27 16:52:23
  6. // Design Name:
  7. // Module Name: ram_read_tb
  8. // Project Name:
  9. // Target Devices:
  10. // Tool Versions: 2017.4
  11. // Description:
  12. // Dependencies:
  13. // Revision:1.0
  14. // Revision 0.01 - File Created
  15. // Additional Comments:
  16. //
  17. module ram_read_tb();
  18. reg clk;
  19. reg rst_n;
  20. reg start;
  21. reg [10 : 0] addr;
  22. reg [31 : 0] din;
  23. wire over;
  24. wire [31 : 0] dout;
  25. ram_read u1_ram_read(
  26. .clk(clk),
  27. .rst_n(rst_n),
  28. .start(start),
  29. .over(over),
  30. .addr(addr),
  31. .din(din),
  32. .dout(dout)
  33. );
  34. always #5 clk=~clk;
  35. initial begin
  36. clk=1'b0;rst_n=1'b1;
  37. #5; rst_n=1'b0;
  38. #15; rst_n=1'b1;
  39. start=1'b1;
  40. addr=11'd0;
  41. #30 start=1'b0;
  42. end
  43. endmodule

三、仿真分析

        部分初始存储数据如图5所示, 仿真结果如图6所示,可见仿真结果正确,成功读出了地址为0的数据,由于输出缓冲,所以会有延迟。

图5 部分初始存储数据
图6 仿真结果

 


总结

本次介绍就到这里,简单介绍了 vivado 中RAM IP 核的使用

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/658888
推荐阅读
相关标签
  

闽ICP备14008679号