内部RAM生成异步SRAM 新手求助
用的是ALTERA公司的CycloneII系列的FPGA,需要生成一个异步SRAM挂到ARM上进行通讯有几点问题想要请教各位大虾
1、内部RAM是否可以生成异步SRAM?
2、如果可以,data_in和data_out是否可以用一个inout类型的data来实现?
3、内部的RAM是同步的,时钟信号怎么解决?实际的SRAM是没有信号线的。 你用时钟来打外面来的WR RD换成同步信号 NJ8888 发表于 2012-5-28 17:01 static/image/common/back.gif
你用时钟来打外面来的WR RD换成同步信号
就是时钟是来控制WR RD,读写还是异步的? 求助啊{:cry:} simpleh 发表于 2012-5-28 17:10 static/image/common/back.gif
就是时钟是来控制WR RD,读写还是异步的?
外面看是异步的,FPGA处理WR RD内部用时钟去同步它 NJ8888 发表于 2012-5-28 20:20 static/image/common/back.gif
外面看是异步的,FPGA处理WR RD内部用时钟去同步它
是不是只能实现双口RAM啊SRAM的data_in和data_out是一根线的 如果地址比较少的话 直接用逻辑(寄存器)来做,除非特别多,有几百上千个 simpleh 发表于 2012-5-29 09:18 static/image/common/back.gif
是不是只能实现双口RAM啊SRAM的data_in和data_out是一根线的
是的,双口,你需要在外面加个控制器的套子,使之对外表现(MCU看来)是个异步SRAM wangshaosh123 发表于 2012-5-29 09:57 static/image/common/back.gif
如果地址比较少的话 直接用逻辑(寄存器)来做,除非特别多,有几百上千个 ...
不用内部的RAM么? 不需要用寄存器就可以了 wangshaosh123 发表于 2012-5-29 12:43 static/image/common/back.gif
不需要用寄存器就可以了
有例子可以参考么? NJ8888 发表于 2012-5-29 10:07 static/image/common/back.gif
是的,双口,你需要在外面加个控制器的套子,使之对外表现(MCU看来)是个异步SRAM ...
有点不知道从哪里下手?有没有什么资料可以推荐的,感激不尽! 没写过写成的,因为都不这样用,连接脚太多了 wangshaosh123 发表于 2012-5-29 12:43 static/image/common/back.gif
不需要用寄存器就可以了
module SRAM(clk,en,rw,data,addr);
input en, rw,clk;
input addr;
inout data;
wire en; //enable signle
wire rw; //rw=1 read enable, rw=0 write enable
wire data;
wire addr;
wire read_sig, write_sig;
wire data_in;
reg data_temp;
reg 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
这样写对么? wangshaosh123 发表于 2012-5-29 12:43 static/image/common/back.gif
不需要用寄存器就可以了
如果要实现1K大小的,这么写就不现实了啊 本帖最后由 wangshaosh123 于 2012-5-30 15:41 编辑
写法有很多种 。。。。。
原理就是检测读写控制信号,当有读写操作时,去操作数据线和地址线
一般跟ARM连接都是用的16位总线接口32位用的引脚太多了 SRAM的时序仿真怎么实现啊 想继续问下,模型仿真程序的问题,附程序
这个程序看它的RTL VIEWER
bank0 和 bank1的RTL VIEWER怎么是这样啊,自动生成了一个ASYNC_RAM,如附件图所示// IS61LV25616 Asynchronous SRAM, 256K x 16 = 4M; speed: 10ns.
// Note; 1) Please include "+define+ OEb" in running script if you want to check
// timing in the case of OE_ being set.
// 2) Please specify access time by defining tAC_10 or tAC_12.
// `define OEb
`define tAC_10
`timescale 1ns/10ps
module IS61LV25616 (A, IO, CE_, OE_, WE_, LB_, UB_);
parameter dqbits = 16;
parameter memdepth = 262143;
parameter addbits = 18;
parameter Toha= 2;
parameter Tsa = 2;
`ifdef tAC_10
parameter Taa = 10,
Thzce = 3,
Thzwe = 5;
`endif
`ifdef tAC_12
parameter Taa = 12,
Thzce = 5,
Thzwe = 6;
`endif
input CE_, OE_, WE_, LB_, UB_;
input [(addbits - 1) : 0] A;
inout [(dqbits - 1) : 0] IO;
wire [(dqbits - 1) : 0] dout;
reg[(dqbits/2 - 1) : 0] bank0 ;
reg[(dqbits/2 - 1) : 0] bank1 ;
// wire [(dqbits - 1) : 0] memprobe = {bank1, bank0};
wire r_en = WE_ & (~CE_) & (~OE_);
wire w_en = (~WE_) & (~CE_) & ((~LB_) | (~UB_));
assign #(r_en ? Taa : Thzce) IO = r_en ? dout : 16'bz;
initial
$timeformat (-9, 0.1, " ns", 10);
assign dout [(dqbits/2 - 1) : 0] = LB_ ? 8'bz : bank0;
assign dout [(dqbits - 1) : (dqbits/2)] = UB_ ? 8'bz : bank1;
always @(A or w_en)
begin
#Tsa
if (w_en)
#Thzwe
begin
bank0 = LB_ ? bank0 : IO [(dqbits/2 - 1) : 0];
bank1 = UB_ ? bank1 : IO [(dqbits - 1) : (dqbits/2)];
end
end
// Timing Check
`ifdef tAC_10
specify
specparam
tSA = 0,
tAW = 8,
tSCE= 8,
tSD = 6,
tPWE2 = 10,
tPWE1 = 8,
tPBW= 8;
`else
`ifdef tAC_10
specify
specparam
tSA = 0,
tAW = 8,
tSCE= 8,
tSD = 6,
tPWE2 = 12,
tPWE1 = 8,
tPBW= 8;
`endif
`endif
$setup (A, negedge CE_, tSA);
$setup (A, posedge CE_, tAW);
$setup (IO, posedge CE_, tSD);
$setup (A, negedge WE_, tSA);
$setup (IO, posedge WE_, tSD);
$setup (A, negedge LB_, tSA);
$setup (A, negedge UB_, tSA);
$width (negedge CE_, tSCE);
$width (negedge LB_, tPBW);
$width (negedge UB_, tPBW);
`ifdef OEb
$width (negedge WE_, tPWE1);
`else
$width (negedge WE_, tPWE2);
`endif
endspecify
endmodule
simpleh 发表于 2012-6-6 09:10 static/image/common/back.gif
想继续问下,模型仿真程序的问题,附程序
这个程序看它的RTL VIEWER
bank0 和 bank1的RTL VIEWER怎么是这样 ...
我懂了
这个是定义的存储器
基础东西都记不住,⊙﹏⊙b汗! simpleh 发表于 2012-6-7 12:00 static/image/common/back.gif
我懂了
这个是定义的存储器
基础东西都记不住,⊙﹏⊙b汗!
你好,的那个ARM和FPGA的通信的问题解决了吗,能不能加我QQ849816909
页:
[1]