集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 1092|回复: 1

SDRAM页读状态机设计程序——仅供参考

[复制链接]
fpga_feixiang 发表于 2019-11-26 17:53:15 | 显示全部楼层 |阅读模式
/*------------------------------------
        ??????? ?? SDRAM?????
        ?????? ?????��???????????1????????????��?��????bank???
                                                                                 2??????tRCD???????????��?????��?????????a[10]?????????
                                                                                 3?????????????????????????
        --2015-10-08                                                                         
-------------------------------------*/
`include "sdram_head.v"

module sdr_read(capture_clk, sys_clk, rd_rst_n, int_addr, rd_data, rd_done, rd_bus, sdr_dq, valid);

        input sys_clk;
        input capture_clk;
        input rd_rst_n;
        input [24:0] int_addr;
        input [15:0] sdr_dq;
        output reg rd_done;
        output reg [15:0] rd_data;
        output reg [19:0] rd_bus;
        output reg valid;
       
        localparam s0 = 3'b000;
        localparam s1 = 3'b001;
        localparam s2 = 3'b010;
        localparam s3 = 3'b011;
        localparam s4 = 3'b100;
        localparam s5 = 3'b101;
       
        reg [2:0] state;
        reg [9:0] count;
        // reg load_h;
        // reg load_l;
        reg [15:0] cap_dq;
        reg [15:0] sys_dq;
        reg [15:0] sys_dq_int;


        always @ (posedge capture_clk)
        begin : capture_reg
                if (!rd_rst_n)
                        cap_dq <= 16'd0;
                else
                        cap_dq <= sdr_dq;
        end

        always @ (posedge sys_clk)
        begin : sync_reg
                if (!rd_rst_n)
                        begin
                                sys_dq <= 16'd0;
                                sys_dq_int <= 16'd0;
                        end
                else
                        begin
                                sys_dq_int <= cap_dq;
                                sys_dq <= sys_dq_int;
                        end
        end
       
        always @ (posedge sys_clk)
        begin : read_fsm_1s
                if (!rd_rst_n)
                        begin
                                rd_bus[19:16] <= `NOP;
                                rd_bus[15] <= 1;
                                rd_bus[14:0] <= 0;
                                count <= 0;
                                rd_done <=0;
                                state <= s0;
                                rd_data <= 0;
                                valid <= 0;
                        end
                else
                        case (state)
                        s0 :        begin
                                                rd_bus[19:16] <= `ACT;  //???????????
                                                rd_bus[15] <= 1;
                                                rd_bus[14:13] <= int_addr[24:23]; //????bank???
                                                rd_bus[12:0] <= int_addr[22:10];  //?????&#65533;&#65533;??
                                                state <= s1;
                                        end
                                       
                        s1 :  if (count < `tRCD-1)
                                                begin
                                                        rd_bus[19:16] <= `NOP;
                                                        count <= count + 1'b1;
                                                end
                                        else
                                                begin
                                                        rd_bus[19:16] <= `RD;
                                                        rd_bus[14:13] <= int_addr[24:23];  //Bank???
                                                        rd_bus[10] <= 1;    //a10=1?????????????????????????????????  
                                                        rd_bus[9:0] <= int_addr[9:0];      //?&#65533;&#65533;??
                                                        count <= 0;
                                                        state <= s2;
                                                end
                                               
                        s2 :        if (count < 3)
                                                begin
                                                        rd_bus[19:16] <= `NOP;
                                                        count <= count + 1'b1;
                                                end
                                        else
                                                begin
                                                        count <= 0;
                                                        state <= s3;
                                                end
                               
                        s3 : if (count == 0)   
                                        begin
                                                valid <= 1;
                                                rd_data <= sys_dq;
                                                count <= count + 1'b1;
                                        end
                                  else if (count > 0 && count < `RD_SIZE)
                                                begin
                                                        valid <= 1;
                                                        rd_data <= sys_dq;
                                                        count <= count + 1'b1;
                                                end                       
                                 else
                                        begin
                                                rd_bus[19:16] <= `BT; //????????????????????????
                                                count <= 0;
                                                valid <= 1;
                                                rd_data <= sys_dq;
                                                state <= s4;
                                        end
       
//                        s3 : if (count < `RD_SIZE)   
//                                        begin
//                                                valid <= 1;
//                                                rd_data <= sys_dq;
//                                                count <= count + 1;
//                                        end                       
//                                 else
//                                        begin
//                                                rd_bus[19:16] <= `BT; //????????????????????????
//                                                count <= 0;
//                                                valid <= 1;
//                                                rd_data <= sys_dq;
//                                                state <= s4;
//                                        end
       
                        s4 : begin                                                        ////???????????????5????&#65533;&#65533;??????4
                                        if (count < `RD_DATA_LY)  //????3?????????sdram??????????&#65533;o?????????????
                                                begin
                                                        count <= count + 1'b1;
                                                        valid <= 1;
                                                        rd_data <= sys_dq;
                                                        rd_bus[19:16] <= `NOP;        
                                                end
                                        else
                                                begin
                                                        count <= 0;
                                                        valid <= 0;
                                                        rd_bus[19:16] <= `PRECHANGE;
                                                        state <= s5;       
                                                end
                                  end
                                  
                        s5 : begin
                                        rd_bus[19:16] <= `NOP;
                                        rd_data <= 0;
                                        rd_done <= 1;
                                 end
                                 
                        default : rd_bus[19:16] <= `NOP;
                        endcase
        end
       
endmodule
zhangyukun 发表于 2019-11-26 19:35:52 | 显示全部楼层
SDRAM页读状态机设计程序——仅供参考
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

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

GMT+8, 2025-4-30 12:44 , Processed in 0.057475 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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