关于FPGA片内RAM的使用
最近在写一个东西,发现占用资源非常严重,所以有人建议我用片内RAM来实现。但是我从来没用过这个,不知道如何下手,希望各位能给点建议。 竟然没有一个人会,悲哀 由IP核生成的RAM模块为eeram(addr,clk,din,dout,we);其中,地址和数据都是8bit。
现在的问题是,我已经把32byte的数据分别写入该RAM的0-31地址中。
我想连续读出对应地址处的数据,可是总也读的不对。
但是,读单个地址处的数据没有问题。
请各位大侠指点一下。 读写冲突你注意到了吗。还有,一般写入的数据要2个时钟沿后才能读出。 回复 4# 最是那低头温柔
谢谢楼上的。
不过不太清楚你说的什么读写冲突。
我现在是只读,因为RAM里面已经写进去数据了。
这是我读1个地址的数据的程序。
always @(posedge clk40m)
begin
if(!rstn)
begin
czl<=0;
czh<=0;
rradr<=0;
s<=s0;
end
else
begin
case(s)
s0:
begin
rradr<=0;
s<=s1;
end
s1:
begin
rradr<=rradr;
czl<=dout;
s<=s2;
end
s2:
begin
rradr<=rradr+1;
czl<=czl;
s<=s3;
end
s3:
begin
rradr<=rradr;
czl<=czl;
s<=s3;
end
endcase
end
end
当我只执行到s1的时候读出的数据没有问题,可是按照以上程序读的时候读到的数就总是0。 你让S1,S3状态多持续几个时钟周期看看。若还不能输出数据,就说明RAM的其他设置没注意好,比如读使能信号什么的 回复 6# 最是那低头温柔
谢谢,我再试试。 always @(posedge clk40m or posedge rram)
begin
if(rram)
begin
cz0<=0;
cz1<=0;
rradr<=0;
s<=s0;
end
else
begin
case(s)
s0:
begin
rradr<=0;
s<=s1;
end
s1:
begin
rradr<=rradr;
cz0<=dout;
s<=s2;
end
s2:
begin
cz0<=cz0;
s<=s3;
end
s3:
begin
rradr<=rradr+1;
s<=s4;
end
s4:
begin
rradr<=rradr;
cz1<=dout;
s<=s4;
end
s5:
begin
cz1<=cz1;
s<=s5;
end
endcase
end
end
这个是连续读两个地址处的数据,发现,程序执行到S4时,cz0和cz1的输出均没有问题。但是,将s=s4改为s=s5时,cz1的值就不对了,而且这个值和cz0的值一样了。
求助。 这个RAM读的时候,WE为0,然后在时钟的触发下,只要赋给相应的地址,就可以读出对应地址处的数据。 我也挺费解,s定义的是几位的呢?还有就是default最好加上,曾经因为这个出现过问题
页:
[1]
2
