微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > xinlinx 片上RAM的读写

xinlinx 片上RAM的读写

时间:10-02 整理:3721RD 点击:
由IP核生成的RAM模块为eeram(addr,clk,din,dout,we);
其中,地址和数据都是8bit。
现在的问题是,我已经把32byte的数据分别写入该RAM的0-31地址中。
我想连续读出对应地址处的数据,可是总也读的不对。
但是,读单个地址处的数据没有问题。
请各位大侠指点一下。
单个地址处的数据我是这么读的。
always @(posedge clk40m)
begin
    if(!rstn)
    begin
    czl<=0;
    addr<=0;
    s<=s0;
    end
    else
    begin
    case(s)
    s0:
        begin
            addr<=0;
            s<=s1;
        end
    s1:
        begin
            addr<=addr;
            czl<=dout;
            s<=s1;
        end
    endcase
    end
end

以你的設計, 當rstn = 1之後
s會馬上由s0變成s1, 之後停留在s1不動
addr則永遠都是0, addr不動, 當然就沒辦法連續讀



    你好,这个程序不是连续读的程序,是只读其中一个地址的程序。

以下程序是我连续读的程序。但是读到的czl和czh都是0。
always @(posedge clk40m)
begin
    if(!rstn)
    begin
    czl<=0;
    addr<=0;
    s<=s0;
    end
    else
    begin
    case(s)
    s0:
        begin
            addr<=0;
            s<=s1;
        end
    s1:
        begin
            addr<=addr;
            czl<=dout;
            s<=s2;
        end
    s2:
        begin
            addr<=addr+1;
            czl<=czl;
            s<=s3;
        end
     s3:
        begin
            addr<=addr;
            czh<=dout;
            s<=s4;
        end
     s4:
        begin
            addr<=addr;
            czl<=czl;
            czh<=czh;
            s<=s4;
        end
    endcase
    end
end

可能是写错了,写时序和读时序都要符合data sheet的规定



    谢谢。不过我可以保证我的写没有错误。
因为我用IO写地址,然后读出对应地址的数据,这个是没有问题的。连续读也没有问题。
现在是要实现硬件连续读。

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

问题终于解决了,感谢各位的帮忙。

有一个新的问题,想请教高手。
问一下,xilinx ise 10.1中能不能添加两个分布式RAM,然后在主模块中调用。
我添加了两个分布式RAM后,出现了一个错误,说是找不到第二个RAM模块。



只要不超过FPGA的资源,添加几个ram都是可以的,看下例化名称什么的是否正确

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top