MyFPGA Forum

 找回密码
 注册
搜索
查看: 5043|回复: 7
打印 上一主题 下一主题

帮忙看一下这个SSRAM Controller 什么地方出了问题.

[复制链接]
跳转到指定楼层
1#
发表于 2011-7-28 15:01:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这几天写了个SSRAM 的 Controller,modelsim 仿真看波形基本正确,但是放到DE2-70上就是跑不通,把代码贴上来,拜托大家帮忙看看是哪里出了问题。
module sram_control (
        iRST,  
        iCLK,
        iCYC,  
        iADR,  
        iSEL,  
        iWE,  
        iDAT,
        oDAT,
        oACK,
        SRAM_A,
        SRAM_ADSCB,
        SRAM_CS1B,
        SRAM_OEB,
        SRAM_WEB,
        SRAM_DQ,
        SRAM_CS2,
        SRAM_ADVB,
        SRAM_ADSPB,
        SRAM_GWB,
        SRAM_CS2B,
        SRAM_WR_N
);
input   iRST ;
input   iCLK ;
input   iCYC ;
input   [31:0] iADR ;
input   [ 3:0] iSEL ;
input   iWE  ;
input   [31:0] iDAT ;
output  [31:0] oDAT ;
output  oACK ;
//----------------------------------------------------
output  [18:0] SRAM_A;     reg     [18:0] SRAM_A;
output  SRAM_ADSCB; reg     SRAM_ADSCB;
output  SRAM_CS1B;  reg     SRAM_CS1B;
output  SRAM_OEB;   wire    SRAM_OEB;
output  [3:0]  SRAM_WEB;   reg     [3:0]  SRAM_WEB;
output         SRAM_WR_N;
inout   [31:0]         SRAM_DQ;
reg     [31:0] SRAM_D_O; // data to SSRAM
reg     SRAM_D_T;   // 0 for output
output  SRAM_CS2;   wire    SRAM_CS2     =  1'b1;
output  SRAM_ADVB;  wire    SRAM_ADVB    =  1'b1;
output  SRAM_ADSPB; wire    SRAM_ADSPB   =  1'b1;
output  SRAM_GWB;   wire    SRAM_GWB     =  1'b1;
output  SRAM_CS2B;  wire    SRAM_CS2B    =  1'b0;
/*********************************************************/
wire    [19:0] S_A;
wire    S_ADSCB;
wire    S_CS1B;
wire    S_OEB;
wire    [3:0]  S_WEB;
wire    [31:0] S_D_I =  SRAM_DQ;
wire    [31:0] S_D_O;
wire    S_D_T;
reg     S_OEB_REG;
assign  SRAM_OEB =  S_OEB&S_OEB_REG;
always @ (posedge iCLK) begin
        if (iRST==1'b1) begin
                SRAM_A     <= 19'h0;
                SRAM_ADSCB <= 1'b1;
                SRAM_CS1B  <= 1'b1;
                SRAM_WEB   <= 4'hF;
                SRAM_D_O   <= 32'h0;
                SRAM_D_T   <= 1'b1;
                S_OEB_REG  <= 1'b1;
        end else begin
                SRAM_A     <= S_A[18:0]    ;
                SRAM_ADSCB <= S_ADSCB;
                SRAM_CS1B  <= S_CS1B ;
                SRAM_WEB   <= S_WEB  ;
                SRAM_D_O   <= S_D_O  ;
                SRAM_D_T   <= S_D_T  ;
                S_OEB_REG  <= S_OEB;
        end
end
//----------------------------------------------------
sram_core U1 (
                        .iRST                   (iRST  ),
                   .iCLK                   (iCLK  ),
                   .iCYC                  (iCYC  ),
                   .iADR                  (iADR  ),
                   .iSEL                   (iSEL  ),
                   .iWE                   (iWE   ),
                   .iDAT                  (iDAT  ),
                   .oDAT                 (oDAT  ),
                   .oACK                 (oACK  ),
                   .SRAM_A             (S_A      ),
                   .SRAM_ADSCB     (S_ADSCB  ),
                   .SRAM_CS1B       (S_CS1B   ),
                   .SRAM_OEB         (S_OEB    ),
                   .SRAM_WEB        (S_WEB    ),
                   .SRAM_D_O         (S_D_O    ),
                   .SRAM_D_I          (S_D_I    ),
                   .SRAM_D_T         (S_D_T    )
                   );

assign SRAM_DQ = SRAM_D_T ? 32'hzzzzzzzz : SRAM_D_O;
assign SRAM_WR_N = SRAM_D_T;

endmodule

//--------------------------------------------------------------------------

module sram_core (
        iRST,
        iCLK,
        iCYC,
        iADR,
        iSEL,
        iWE,
        iDAT,
        oDAT,
        oACK,
        SRAM_A,
        SRAM_ADSCB,
        SRAM_CS1B,
        SRAM_OEB,
        SRAM_WEB,
        SRAM_D_O,
        SRAM_D_I,
        SRAM_D_T
);
input   iRST ;     
input   iCLK ;     
input   iCYC ;
input   [31:0] iADR ;
input   [ 3:0] iSEL ;
input   iWE  ;
input   [31:0] iDAT ;
output  [31:0] oDAT ;  reg     [31:0] oDAT ;
output  oACK ;
//----------------------------------------------------
output  [19:0] SRAM_A;     reg     [19:0] SRAM_A;
output  SRAM_ADSCB; reg     SRAM_ADSCB;
output  SRAM_CS1B;  reg     SRAM_CS1B;
output  SRAM_OEB;   reg     SRAM_OEB;
output  [3:0]  SRAM_WEB;   reg     [3:0]  SRAM_WEB;
input   [31:0] SRAM_D_I;   wire    [31:0] SRAM_D_I; // data from SSRAM
output  [31:0] SRAM_D_O;   reg     [31:0] SRAM_D_O; // data to SSRAM
output  SRAM_D_T;   reg     SRAM_D_T;   // 0 for output
/*********************************************************/
reg     wb_ack_reg;
reg     SRAM_OEB_0, SRAM_OEB_1, SRAM_OEB_2;
reg     read_on;

assign  oACK =  (iWE) ? iCYC : wb_ack_reg;

always @ (posedge iCLK ) begin
        if (iRST==1'b1) begin
                oDAT       <= 32'h0;
                SRAM_A     <= 20'h0;
                SRAM_ADSCB <= 1'b1;
                SRAM_CS1B  <= 1'b1;
                SRAM_WEB   <= 4'hF;
                SRAM_D_O   <= 32'h0;
                SRAM_D_T   <= 1'b1;
                wb_ack_reg <= 1'b0;
                SRAM_OEB   <= 1'b1;
                SRAM_OEB_0 <= 1'b1;
                SRAM_OEB_1 <= 1'b1;
                read_on    <= 1'b0;
        end else begin
                if (iCYC&~read_on) begin
                        SRAM_A     <= iADR[21:2];
                        SRAM_ADSCB <= 1'b0;
                        SRAM_CS1B  <= 1'b0;
                        SRAM_WEB   <= (iWE) ? ~iSEL : 4'hF;
                        SRAM_D_O   <= iDAT;
                        SRAM_D_T   <= ~iWE;
                        SRAM_OEB_0 <= iWE;
                end else begin
                        SRAM_A     <= 20'h0;
                        SRAM_ADSCB <= 1'b1;
                        SRAM_CS1B  <= 1'b1;
                        SRAM_WEB   <= 4'hF;
                        SRAM_D_O   <= 32'h0;
                        SRAM_D_T   <= 1'b1;
                        SRAM_OEB_0 <= 1'b1;
                end
                SRAM_OEB_1 <= SRAM_OEB_0;
                SRAM_OEB_2 <= SRAM_OEB_1;
                SRAM_OEB   <= SRAM_OEB_2;
                if (SRAM_OEB==1'b0) begin
                        oDAT   <= SRAM_D_I;
                        wb_ack_reg <= 1'b1;
                end else begin
                        wb_ack_reg <= 1'b0;
                end
                if (iCYC&~iWE&~read_on) begin
                        read_on <= 1'b1;
                end else begin
                        if (read_on&oACK) read_on <= 1'b0;
                end
        end
end     
endmodule
2#
发表于 2011-7-28 18:55:08 | 只看该作者
回复 1# zhanxin


    我看到,没有延时。在牛X的存储器也得有个延时吧。看看datasheet。
你几年级啊?:$
3#
 楼主| 发表于 2011-7-28 19:06:27 | 只看该作者
回复 2# tingtang


    本科三年级~
4#
 楼主| 发表于 2011-7-28 19:13:55 | 只看该作者
本帖最后由 zhanxin 于 2011-7-28 19:15 编辑

回复 3# tingtang

不好意思,你是指哪个部分的延时? 写周期周中,地址和数据可以同时送,不需要延时吧;读周期中,
送完地址后打了三拍:
                “SRAM_OEB_1 <= SRAM_OEB_0;
                 SRAM_OEB_2 <= SRAM_OEB_1;
                 SRAM_OEB   <= SRAM_OEB_2; ”

                   应该够了吧? 我理解你的意思了么?
5#
发表于 2011-7-29 10:41:43 | 只看该作者
回复 4# zhanxin


    请问是写不行还是读不行?
你可以先只写一种写操作,然后用control panel读。确定是否写正确。
在用control panel读,显示到数码管,或1602上,确定读是否正确!
6#
 楼主| 发表于 2011-8-3 20:54:05 | 只看该作者
乌龙了.......以上代码是正确的,是test代码有问题~
7#
发表于 2012-9-6 05:46:42 | 只看该作者
本帖最后由 keyway 于 2012-9-6 05:57 编辑
乌龙了.......以上代码是正确的,是test代码有问题~
zhanxin 发表于 2011-8-3 20:54


請問你的 ssram 是否使用相位差的方式,不知道你的 ssram clk 是都少?
sram_core U1 (...) 是否有?是否有完整的測試程序?
8#
发表于 2012-9-7 10:34:11 | 只看该作者
SRAM_ADVB  =  1'b1; ;              
SRAM_ADSPB=  1'b1;;            
永遠為 "1" 可以嗎?地址有確定嗎?....

確定不能用
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|MyFPGA

GMT+8, 2024-5-7 19:11 , Processed in 0.037913 second(s), 15 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

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