搜索
bottom↓
回复: 19

内部RAM生成异步SRAM 新手求助

[复制链接]

出0入0汤圆

发表于 2012-5-28 16:59:49 | 显示全部楼层 |阅读模式
用的是ALTERA公司的CycloneII系列的FPGA,需要生成一个异步SRAM挂到ARM上进行通讯
有几点问题想要请教各位大虾

1、内部RAM是否可以生成异步SRAM?
2、如果可以,data_in和data_out是否可以用一个inout类型的data来实现?
3、内部的RAM是同步的,时钟信号怎么解决?实际的SRAM是没有信号线的。

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-5-28 17:01:17 | 显示全部楼层
你用时钟来打外面来的WR RD换成同步信号

出0入0汤圆

 楼主| 发表于 2012-5-28 17:10:52 | 显示全部楼层
NJ8888 发表于 2012-5-28 17:01
你用时钟来打外面来的WR RD换成同步信号

就是时钟是来控制WR RD,读写还是异步的?

出0入0汤圆

 楼主| 发表于 2012-5-28 20:00:38 | 显示全部楼层
求助啊

出0入0汤圆

发表于 2012-5-28 20:20:51 | 显示全部楼层
simpleh 发表于 2012-5-28 17:10
就是时钟是来控制WR RD,读写还是异步的?

外面看是异步的,FPGA处理WR RD内部用时钟去同步它

出0入0汤圆

 楼主| 发表于 2012-5-29 09:18:39 | 显示全部楼层
NJ8888 发表于 2012-5-28 20:20
外面看是异步的,FPGA处理WR RD内部用时钟去同步它

是不是只能实现双口RAM啊  SRAM的data_in和data_out是一根线的

出0入0汤圆

发表于 2012-5-29 09:57:06 | 显示全部楼层
如果地址比较少的话 直接用逻辑(寄存器)来做,除非特别多,有几百上千个

出0入0汤圆

发表于 2012-5-29 10:07:08 | 显示全部楼层
simpleh 发表于 2012-5-29 09:18
是不是只能实现双口RAM啊  SRAM的data_in和data_out是一根线的

是的,双口,你需要在外面加个控制器的套子,使之对外表现(MCU看来)是个异步SRAM

出0入0汤圆

 楼主| 发表于 2012-5-29 10:35:47 | 显示全部楼层
wangshaosh123 发表于 2012-5-29 09:57
如果地址比较少的话 直接用逻辑(寄存器)来做,除非特别多,有几百上千个 ...

不用内部的RAM么?

出0入0汤圆

发表于 2012-5-29 12:43:03 | 显示全部楼层
不需要用  寄存器就可以了

出0入0汤圆

 楼主| 发表于 2012-5-29 16:33:33 | 显示全部楼层
wangshaosh123 发表于 2012-5-29 12:43
不需要用  寄存器就可以了

有例子可以参考么?

出0入0汤圆

 楼主| 发表于 2012-5-29 16:39:16 | 显示全部楼层
NJ8888 发表于 2012-5-29 10:07
是的,双口,你需要在外面加个控制器的套子,使之对外表现(MCU看来)是个异步SRAM ...

有点不知道从哪里下手?有没有什么资料可以推荐的,感激不尽!

出0入0汤圆

发表于 2012-5-29 16:44:55 | 显示全部楼层
没写过写成的,因为都不这样用,连接脚太多了

出0入0汤圆

 楼主| 发表于 2012-5-30 10:34:35 | 显示全部楼层
wangshaosh123 发表于 2012-5-29 12:43
不需要用  寄存器就可以了

module SRAM(clk,en,rw,data,addr);
    input en, rw,clk;
    input [3:0] addr;
    inout [3:0] data;
    wire en; //enable signle
    wire rw; //rw=1 read enable, rw=0 write enable
    wire [3:0] data;
    wire [3:0] addr;
    wire read_sig, write_sig;
    wire [3:0] data_in;
   
    reg [3:0] data_temp;
    reg [3:0] d0,d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12,d13,d14,d15;
   
    assign read_sig=(rw&&en)?1:0; //read signle
    assign write_sig=((!rw)&&en)?1:0; //read signle
    assign data=(read_sig)?data_temp:4'bz;
    assign data_in=(write_sig)?data:4'bz;
   
    always@(posedge clk)
    begin
        if (read_sig)
        case (addr)
        4'b0000: data_temp<=d0;
        4'b0001: data_temp<=d1;
        4'b0010: data_temp<=d2;
        4'b0011: data_temp<=d3;
        4'b0100: data_temp<=d4;
        4'b0101: data_temp<=d5;
        4'b0110: data_temp<=d6;
        4'b0111: data_temp<=d7;
        4'b1000: data_temp<=d8;
        4'b1001: data_temp<=d9;
        4'b1010: data_temp<=d10;
        4'b1011: data_temp<=d11;
        4'b1100: data_temp<=d12;
        4'b1101: data_temp<=d13;
        4'b1110: data_temp<=d14;
        4'b1111: data_temp<=d15;
        default: data_temp<=4'b0000;
endcase
else if (write_sig)
case (addr)
        4'b0000: d0<=data_in;
        4'b0001: d1<=data_in;
        4'b0010: d2<=data_in;
        4'b0011: d3<=data_in;
        4'b0100: d4<=data_in;
        4'b0101: d5<=data_in;
        4'b0110: d6<=data_in;
        4'b0111: d7<=data_in;
        4'b1000: d8<=data_in;
        4'b1001: d9<=data_in;
        4'b1010: d10<=data_in;
        4'b1011: d11<=data_in;
        4'b1100: d12<=data_in;
        4'b1101: d13<=data_in;
        4'b1110: d14<=data_in;
        4'b1111: d15<=data_in;
endcase  
    end
endmodule

这样写对么?

出0入0汤圆

 楼主| 发表于 2012-5-30 10:52:03 | 显示全部楼层
wangshaosh123 发表于 2012-5-29 12:43
不需要用  寄存器就可以了

如果要实现1K大小的,这么写就不现实了啊

出0入0汤圆

发表于 2012-5-30 15:39:59 | 显示全部楼层
本帖最后由 wangshaosh123 于 2012-5-30 15:41 编辑

写法有很多种 。。。。。
原理就是检测读写控制信号,当有读写操作时,去操作数据线和地址线

一般跟ARM连接都是用的16位总线接口  32位用的引脚太多了

出0入0汤圆

 楼主| 发表于 2012-5-31 10:55:35 | 显示全部楼层
SRAM的时序仿真怎么实现啊

出0入0汤圆

 楼主| 发表于 2012-6-6 09:10:21 | 显示全部楼层
想继续问下,模型仿真程序的问题,附程序
这个程序看它的RTL VIEWER
bank0 和 bank1的RTL VIEWER怎么是这样啊,自动生成了一个ASYNC_RAM,如附件图所示
  1. // IS61LV25616 Asynchronous SRAM, 256K x 16 = 4M; speed: 10ns.
  2. // Note; 1) Please include "+define+ OEb" in running script if you want to check
  3. //          timing in the case of OE_ being set.
  4. //       2) Please specify access time by defining tAC_10 or tAC_12.

  5. // `define OEb
  6. `define tAC_10
  7. `timescale 1ns/10ps

  8. module IS61LV25616 (A, IO, CE_, OE_, WE_, LB_, UB_);

  9. parameter dqbits = 16;
  10. parameter memdepth = 262143;
  11. parameter addbits = 18;
  12. parameter Toha  = 2;

  13. parameter Tsa   = 2;

  14. `ifdef tAC_10
  15.   parameter Taa   = 10,
  16.             Thzce = 3,
  17.             Thzwe = 5;
  18. `endif

  19. `ifdef tAC_12
  20.   parameter Taa   = 12,
  21.             Thzce = 5,
  22.             Thzwe = 6;
  23. `endif

  24. input CE_, OE_, WE_, LB_, UB_;
  25. input [(addbits - 1) : 0] A;
  26. inout [(dqbits - 1) : 0] IO;

  27. wire [(dqbits - 1) : 0] dout;
  28. reg  [(dqbits/2 - 1) : 0] bank0 [0 : memdepth];
  29. reg  [(dqbits/2 - 1) : 0] bank1 [0 : memdepth];
  30. // wire [(dqbits - 1) : 0] memprobe = {bank1[A], bank0[A]};

  31. wire r_en = WE_ & (~CE_) & (~OE_);
  32. wire w_en = (~WE_) & (~CE_) & ((~LB_) | (~UB_));
  33. assign #(r_en ? Taa : Thzce) IO = r_en ? dout : 16'bz;   

  34. initial
  35.   $timeformat (-9, 0.1, " ns", 10);

  36. assign dout [(dqbits/2 - 1) : 0]        = LB_ ? 8'bz : bank0[A];
  37. assign dout [(dqbits - 1) : (dqbits/2)] = UB_ ? 8'bz : bank1[A];

  38. always @(A or w_en)
  39.   begin
  40.     #Tsa
  41.     if (w_en)
  42.       #Thzwe
  43.       begin
  44.         bank0[A] = LB_ ? bank0[A] : IO [(dqbits/2 - 1) : 0];
  45.         bank1[A] = UB_ ? bank1[A] : IO [(dqbits - 1)   : (dqbits/2)];
  46.       end
  47.   end

  48. // Timing Check
  49. `ifdef tAC_10
  50.   specify
  51.     specparam
  52.       tSA   = 0,
  53.       tAW   = 8,
  54.       tSCE  = 8,
  55.       tSD   = 6,
  56.       tPWE2 = 10,
  57.       tPWE1 = 8,
  58.       tPBW  = 8;
  59. `else

  60. `ifdef tAC_10
  61.   specify
  62.     specparam
  63.       tSA   = 0,
  64.       tAW   = 8,
  65.       tSCE  = 8,
  66.       tSD   = 6,
  67.       tPWE2 = 12,
  68.       tPWE1 = 8,
  69.       tPBW  = 8;
  70. `endif
  71. `endif

  72.     $setup (A, negedge CE_, tSA);
  73.     $setup (A, posedge CE_, tAW);
  74.     $setup (IO, posedge CE_, tSD);
  75.     $setup (A, negedge WE_, tSA);
  76.     $setup (IO, posedge WE_, tSD);
  77.     $setup (A, negedge LB_, tSA);
  78.     $setup (A, negedge UB_, tSA);

  79.     $width (negedge CE_, tSCE);
  80.     $width (negedge LB_, tPBW);
  81.     $width (negedge UB_, tPBW);
  82.     `ifdef OEb
  83.     $width (negedge WE_, tPWE1);
  84.     `else
  85.     $width (negedge WE_, tPWE2);
  86.     `endif

  87.   endspecify

  88. endmodule

复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2012-6-7 12:00:50 | 显示全部楼层
simpleh 发表于 2012-6-6 09:10
想继续问下,模型仿真程序的问题,附程序
这个程序看它的RTL VIEWER
bank0 和 bank1的RTL VIEWER怎么是这样 ...

我懂了
这个是定义的存储器
基础东西都记不住,⊙﹏⊙b汗!

出0入0汤圆

发表于 2012-7-28 15:32:13 | 显示全部楼层
simpleh 发表于 2012-6-7 12:00
我懂了
这个是定义的存储器
基础东西都记不住,⊙﹏⊙b汗!

你好,的那个ARM和FPGA的通信的问题解决了吗,能不能加我QQ849816909
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 09:33

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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