【FPGA】单端口RAM的设计(异步读、异步写)

举报
李锐博恩 发表于 2021/07/15 03:21:20 2021/07/15
【摘要】 前面有博文写了同步读写和异步读、同步写的单端口RAM设计: 【FPGA】单端口RAM的设计(同步读、同步写) 【FPGA】单端口RAM的设计(异步读、同步写) 这篇博文讲异步读写: 在博文:【FPGA】单端口RAM的设计(异步读、同步写)中已经对异步读与同步读进行了比较,这篇博文要对同步写和异步写做一个比较: 首先是代码上的区别:易知,所谓异步写,也就是不依赖于时...

前面有博文写了同步读写和异步读、同步写的单端口RAM设计:

【FPGA】单端口RAM的设计(同步读、同步写)

【FPGA】单端口RAM的设计(异步读、同步写)


这篇博文讲异步读写:

在博文:【FPGA】单端口RAM的设计(异步读、同步写)中已经对异步读与同步读进行了比较,这篇博文要对同步写和异步写做一个比较:

首先是代码上的区别:易知,所谓异步写,也就是不依赖于时钟的写,只要给一个地址,且写使能有效(当然片选也得有效)就可以写一个数据:

// Memory Write Block 
// Write Operation : When we = 1, cs = 1
always @ (address or data or cs or we)
begin : MEM_WRITE
   if ( cs && we ) begin
       mem[address] = data;
   end
end

异步读自然也是如此:

// Memory Read Block 
// Read Operation : When we = 0, oe = 1, cs = 1
always @ (address or cs or we or oe)
begin : MEM_READ
    if (cs && !we && oe)  begin
         data_out = mem[address];
    end
end


话不多说,给出Verilog描述:


  
  1. `timescale 1ns / 1ps
  2. //
  3. // Create Date: 2019/05/28 20:10:21
  4. // Design Name:
  5. // Module Name: ram_sp_ar_aw
  6. //
  7. module ram_sp_ar_aw (
  8. address , // Address Input
  9. data , // Data bi-directional
  10. cs , // Chip Select
  11. we , // Write Enable/Read Enable
  12. oe // Output Enable
  13. );
  14. parameter DATA_WIDTH = 8 ;
  15. parameter ADDR_WIDTH = 8 ;
  16. parameter RAM_DEPTH = 1 << ADDR_WIDTH;
  17. //--------------Input Ports-----------------------
  18. input [ADDR_WIDTH-1:0] address ;
  19. input cs ;
  20. input we ;
  21. input oe ;
  22. //--------------Inout Ports-----------------------
  23. inout [DATA_WIDTH-1:0] data ;
  24. //--------------Internal variables----------------
  25. reg [DATA_WIDTH-1:0] data_out ;
  26. reg [DATA_WIDTH-1:0] mem [0:RAM_DEPTH-1];
  27. //initialization
  28. // synopsys_translate_off
  29. integer i;
  30. initial begin
  31. for(i=0; i < RAM_DEPTH; i = i + 1) begin
  32. mem[i] = 8'h00;
  33. end
  34. end
  35. // synopsys_translate_on
  36. //--------------Code Starts Here------------------
  37. // Tri-State Buffer control
  38. // output : When we = 0, oe = 1, cs = 1
  39. assign data = (cs && oe && !we) ? data_out : 8'bz;
  40. // Memory Write Block
  41. // Write Operation : When we = 1, cs = 1
  42. always @ (address or data or cs or we)
  43. begin : MEM_WRITE
  44. if ( cs && we ) begin
  45. mem[address] = data;
  46. end
  47. end
  48. // Memory Read Block
  49. // Read Operation : When we = 0, oe = 1, cs = 1
  50. always @ (address or cs or we or oe)
  51. begin : MEM_READ
  52. if (cs && !we && oe) begin
  53. data_out = mem[address];
  54. end
  55. end
  56. endmodule // End of Module ram_sp_ar_aw

从Verilog描述中可以看出,由于是异步读写,所以根本就没有用到时钟,所以,测试文件中也不存在时钟,给地址就读写完事了。

给出测试文件:


  
  1. `timescale 1ns / 1ps
  2. //
  3. // Create Date: 2019/05/21 16:00:12
  4. // Design Name:
  5. // Module Name: ram_sp_ar_sw_tb
  6. //
  7. module ram_sp_ar_aw_tb(
  8. );
  9. reg [7 : 0] address; // address Input
  10. wire [7 : 0] data; // Data bi-directional
  11. reg cs; // Chip Select
  12. reg we; // Write Enable/Read Enable
  13. reg oe; // Output Enable
  14. reg [7 : 0] data_in;
  15. assign data = (cs && we && !oe) ? data_in : 8'dz;
  16. integer i;
  17. initial begin
  18. cs = 1'b0;
  19. we = 1'b0;
  20. oe = 1'b0;
  21. address = 8'd0;
  22. data_in = 8'h00;
  23. #20
  24. #4 begin//read
  25. cs = 1'b1;
  26. oe = 1'b1;
  27. end
  28. for (i = 0; i < 256; i = i + 1) begin
  29. #4
  30. address = i;
  31. end
  32. #4 begin//write
  33. we = 1'b1;
  34. oe = 1'b0;
  35. end
  36. for (i = 0; i < 256; i = i + 1) begin
  37. #4 begin
  38. address = i;
  39. data_in = data_in + 1;
  40. end
  41. end
  42. #4 begin//read
  43. we = 1'b0;
  44. oe = 1'b1;
  45. end
  46. for (i = 0; i < 256; i = i + 1) begin
  47. #4
  48. address = i;
  49. end
  50. #4
  51. cs = 1'b0;
  52. //#100 $finish;
  53. #100 $stop;
  54. end
  55. ram_sp_ar_aw u_ram(
  56. .address(address) , // address Input
  57. .data(data) , // Data bi-directional
  58. .cs(cs) , // Chip Select
  59. .we(we) , // Write Enable/Read Enable
  60. .oe(oe) // Output Enable
  61. );
  62. endmodule

读初始值:

写数据:

把写进去的数据读出来:

 

参考文献:

前面已经给出几篇

Single Port RAM Asynchronous Read/Write

 

文章来源: reborn.blog.csdn.net,作者:李锐博恩,版权归原作者所有,如需转载,请联系作者。

原文链接:reborn.blog.csdn.net/article/details/90646285

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。