wangxia6112 发表于 2011-5-27 09:49:32

关于FPGA片内RAM的使用

最近在写一个东西,发现占用资源非常严重,所以有人建议我用片内RAM来实现。但是我从来没用过这个,不知道如何下手,希望各位能给点建议。

wangxia6112 发表于 2011-6-3 16:39:57

竟然没有一个人会,悲哀

wangxia6112 发表于 2011-6-10 11:18:22

由IP核生成的RAM模块为eeram(addr,clk,din,dout,we);

其中,地址和数据都是8bit。

现在的问题是,我已经把32byte的数据分别写入该RAM的0-31地址中。

我想连续读出对应地址处的数据,可是总也读的不对。

但是,读单个地址处的数据没有问题。

请各位大侠指点一下。

最是那低头温柔 发表于 2011-6-10 12:47:41

读写冲突你注意到了吗。还有,一般写入的数据要2个时钟沿后才能读出。

wangxia6112 发表于 2011-6-10 13:46:27

回复 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。

最是那低头温柔 发表于 2011-6-11 08:24:09

你让S1,S3状态多持续几个时钟周期看看。若还不能输出数据,就说明RAM的其他设置没注意好,比如读使能信号什么的

wangxia6112 发表于 2011-6-13 11:18:22

回复 6# 最是那低头温柔


    谢谢,我再试试。

wangxia6112 发表于 2011-6-14 16:09:28

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的值一样了。

求助。

wangxia6112 发表于 2011-6-14 16:23:52

这个RAM读的时候,WE为0,然后在时钟的触发下,只要赋给相应的地址,就可以读出对应地址处的数据。

ppc68 发表于 2011-6-14 16:58:09

我也挺费解,s定义的是几位的呢?还有就是default最好加上,曾经因为这个出现过问题
页: [1] 2
查看完整版本: 关于FPGA片内RAM的使用