搜索
bottom↓
回复: 5

请各位看看,我这段代码能否正确读写SSRAM

[复制链接]

出0入0汤圆

发表于 2011-5-20 17:06:56 | 显示全部楼层 |阅读模式
问题如题。
//----------芯片使能-始终选中--------------------------//
assign  oSRAM_CE1_N = 1'b0;
assign  oSRAM_CE2   = 1'b1;
assign  oSRAM_CE3_N = 1'b0;
//---------------OK------------------------------------//

//----------芯片的读写使能-----------------------------//
always@(iSW[2]) begin
        if (!iSW[2]) begin     //read;
                oSRAM_GW_N <= 1'b1;
                oSRAM_OE_N <= 1'b0;
                oSRAM_WE_N <= 1'b1;
        end
        else begin            //write;
                oSRAM_GW_N <= 1'b0;
                oSRAM_OE_N <= 1'b1;
                oSRAM_WE_N <= 1'b0;
        end
end
//----------------OK-----------------------------------//

//-----------SSRAM的读写控制---------------------------//
reg   [15:0] adr_w;
always@(posedge oCLK_40 or negedge iKEY) begin
        if (!iKEY)  
                adr_w <= 16'b0;
        else if (adr_w < 65535)
                adr_w <=adr_w+16'b0000_0000_0000_0001;
        else
                adr_w <= adr_w;
end

reg   [7:0] reg_2;
always@(posedge oCLK_40 or negedge iKEY) begin
        if (!iKEY) begin
                ;
        end
        else begin
                if (iSW[2]) begin     //write;
                        oSRAM_A  <= adr_w;    //写地址信号
                        SRAM_DQ  <= wire_2;   //数据信号
                end
                else if(iSW[2]==1'b0)begin
                        if (flag) begin   //read;
                                oSRAM_A  <= adr;      //读地址信号
                                reg_2    <= SRAM_DQ;  //数据信号
                        end
                        else begin
                                ;
                        end
                end
        end
end
//----------------------OK-----------------------------//
读出数据的地址是adr,因为我读出的数据是要通过VGA在屏幕上显示出来的,所以读写不用同一个地址信号。
VGA那一块我测试过没有错误。
还请高手帮帮忙!

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2011-5-20 17:11:37 | 显示全部楼层
回复【楼主位】lslong 大龙
-----------------------------------------------------------------------

鉴于上面的可读性差,我把图片贴上了

(原文件名:QQ截图未命名.jpg)

出0入0汤圆

发表于 2011-5-20 17:33:45 | 显示全部楼层
看程序是一个地址一个数,比较简单的操作,没用到burst。对照datasheet控制信号给对就可以了,另外注意读操作可能不是马上出数据,出数据要延迟几个clk

出0入0汤圆

发表于 2011-5-20 21:13:30 | 显示全部楼层
有没有 IS61VPS102418A 或 IS61LPS102418A 控制方式?

出0入0汤圆

 楼主| 发表于 2011-5-22 10:24:36 | 显示全部楼层
回复【3楼】d-link
-----------------------------------------------------------------------

您是指ADV  ADSC  ADSP这几个管脚吗?我没有用突发的方式。

出0入0汤圆

发表于 2012-9-7 11:35:39 | 显示全部楼层
这段代码是否能用?好像寫入有問題
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
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 09:31

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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