集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 8095|回复: 11

关于FPGA片内RAM的使用

[复制链接]
wangxia6112 发表于 2011-5-27 09:49:32 | 显示全部楼层 |阅读模式
最近在写一个东西,发现占用资源非常严重,所以有人建议我用片内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 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2025-6-23 12:56 , Processed in 0.096538 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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