99在线精品免费视频九九视-99在线精品视频-99在线精品视频免费观里-99在线精品视频在线观看-99在线免费播放



官方論壇
官方淘寶
官方博客
微信公眾號
點擊聯系吳工 點擊聯系周老師
您的當前位置:主頁 > 高級實訓案例 >

【原創分享】基于FPGA的SDRAM控制器設計——初始化設計

發布時間:2020-02-26   作者:小周 瀏覽量:


本文為明德揚原創及錄用文章,轉載請注明出處

1.1 SDRAM簡介

SDRAM即同步動態隨機存儲器,英文為Synchronous Dynamic Random Access Memory;具有容量大、讀寫速度快、價格相對便宜等優點,但同時控制邏輯比較復雜。

 

1.1.1 SDRAM示意圖

其管腳圖如下所示:

 

1.1.2 信號說明

信號名

信號說明

clk

SDRAM工作時鐘

cke

時鐘使能信號

cs_n

用于屏蔽和使能所有輸入端口,但不包括CLKCKEDQM,低電平有效

cas_n

列地址選通

ras_na

行地址選通

we_n

寫使能,該信號為低時,使能寫操作和預充電

ba

bank地址

a

地址總線

dqm

數據掩碼

dq

數據總線

 

 

1.1.3 SDRAM中心對齊原則

SDRAM的命令與時鐘上升沿是中心對齊的,本設計采用鎖相環生成SDRAM工作時鐘,SDRAM與初始化模塊工作時鐘相差180°。這樣FPGA產生的信號到SDRAM正好中心對齊,如下圖所示:

null

 

 

1.1.4 SDRAM初始化時序

null

SDRAM初始化時序如上圖所示,sdr_cmd命令由sdr_cs_n, sdr_ras_n, sdr_cas_n, sdr_we_n組合而成;復位后要延時最少100us后才能工作;當A10為高時可以對所有bank進行操作;當到達Tp+3時需要將init_done拉高。

 

 

null

其模式寄存器配置如上圖所示,主要參數設置如下:

a.       模式寄存器的配置是確定SDRAM的工作模式

b.       A2A1A0用作設置突發長度,本項目設置為4

c.       A3用作設置突發類型,本項目設置為Sequential順序類型

d.       A6A5A4用作設置列選通潛伏期,本項目設置為3

e.       A8A7設置操作模式,一般為00

f.        A9設置寫突發模式,本項目為0

g.       A12A11A10設置為0

 

1.2 頂層模塊設計

1.2.1 SDRAM頂層模塊管腳圖

null

 

1.2.2 信號說明

 

信號

說明

local_addr

本地地址由行地址列地址bank地址組合而成

local_data

寫入數據

local_q

讀出數據

local_rdreq

讀請求

local_wrreq

寫請求

local_reday

可以進行讀寫信號

local_rdata_valid

讀數據有效信號

init_done

初始化完成信號

clk

輸入時鐘

rst_n

系統復位

sdr_dq

SDRAM數據總線,雙向端口

sdr_clk

SDRAM工作時鐘

sdr_cke

SDRAM時鐘使能

sdr_cs_n

片選信號

sdr_cas_n

列地址選通

sdr_ras_n

行地址選通

sdr_we_n

寫使能,該信號為低時,使能寫操作和預充電

sdr_ba

SDRAM bank地址

sdr_a

SDRAM地址總線

sdr_dqm

數據掩碼

 

1.2.3 參考代碼

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

module sdram_top(

    clk    ,

    sys_rst_n  ,

    //其他信號,舉例dout

    local_addr,

    local_data,

    local_q,

    local_rdreq,

    local_wrreq,

    local_reday,

    local_rdata_vaild,

    init_done,

    sdr_cke,

    sdr_cs_n,

    sdr_ras_n,

    sdr_cas_n,

    sdr_we_n,

    sdr_ba,

    sdr_a,

    sdr_dq,

    sdr_dqm,

    sdr_clk

    );

       

         input clk;

         input sys_rst_n;

         input [24:0] local_addr;

         input [63:0] local_data;

         output [63:0] local_q;

         input local_rdreq;

         input local_wrreq;

         output local_reday;

         output local_rdata_vaild;

         output init_done;

         output sdr_cke;

         output sdr_cs_n;

         output sdr_ras_n;

         output sdr_cas_n;

         output sdr_we_n;

         output [1:0] sdr_ba;

         output [12:0] sdr_a;

         output [15:0] sdr_dq;

         output [1:0] sdr_dqm;

         output sdr_clk;

       

         wire phy_clk;

         wire rst_n;

         wire [19:0] init_bus;

       

         assign {sdr_cke, sdr_cs_n, sdr_ras_n, sdr_cas_n, sdr_we_n, sdr_ba, sdr_a} = init_bus;

         assign sdr_dqm = 2'b00;

                

    sdram_init sdram_init_inst(

        .clk            (phy_clk)       ,

        .rst_n          (rst_n)       ,

        //其他信號,舉例dout

        .init_done      (init_done)       ,

        .init_bus       (init_bus)

    );

       

                 my_pll PLL(

                         .areset             (~sys_rst_n)            ,

                         .inclk0              (clk)                          ,

                         .c0                    (phy_clk)                  ,

                         .c1                    (sdr_clk)                   ,

                         .locked             (rst_n)

                 );

 

    endmodule

 

 

 

1.3 初始化模塊設計

1.3.1 SDRAM出計劃模塊管腳圖

 

null

 

1.3.2 信號說明

 

信號

說明

clk

初始化模塊工作時鐘(100MHz

rst_n

復位

init_done

初始化完成信號

init_bus

SDRAM信號組成

 

 

1.3.3 參考代碼

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

module sdram_init(

    clk    ,

    rst_n  ,

    //其他信號,舉例dout

    init_done,

    init_bus

    );

 

    //參數定義

    parameter      DATA_W    =      20      ;

    parameter      T100us    =      10_000  ;

    parameter      TRP       =      2       ;

    parameter      TRFC      =      7       ;

    parameter      TMRD      =      2       ;

        parameter      NOP       =      4'b0111       ;

        parameter      PRE       =      4'b0010       ;

        parameter      REF       =      4'b0001       ;

        parameter      LMR       =      4'b0000       ;

        parameter      CODE      =      13'b000_000_011_0010       ;

        parameter      CNT_MAX   =      10_021    ;

 

    //輸入信號定義

    input               clk    ;

    input               rst_n  ;

 

    //輸出信號定義

    output              init_done  ;

    output[DATA_W-1:0]  init_bus   ;

 

    //輸出信號reg定義

    reg                 init_done  ;

    wire  [DATA_W-1:0]  init_bus   ;

 

    //中間信號定義

    reg   [20:0]        cnt        ;

    reg                 sdr_cke    ;

    reg   [3:0]         sdr_cmd    ;

    reg   [1:0]         sdr_ba     ;

    reg   [12:0]        sdr_a      ;

       

        wire                                           add_cnt           ;

        wire                                         end_cnt           ;

 

    assign init_bus = {sdr_cke, sdr_cmd, sdr_ba, sdr_a};

 

    always @(posedge clk or negedge rst_n)begin

        if(!rst_n)begin

            cnt <= 0;

        end

        else if(add_cnt)begin

            if(end_cnt)

                cnt <= 0;

            else

                cnt <= cnt + 1;

        end

    end

 

    assign add_cnt = init_done == 0;      

    assign end_cnt = add_cnt && cnt==CNT_MAX - 1 ;

 

        always @(posedge clk or negedge rst_n)begin

                 if(rst_n==1'b0)begin

                         sdr_cke <= 1'b0;

                 end

                 else if(add_cnt&&cnt==10_000-1)begin

                         sdr_cke <= 1'b1;

                 end

                 else

                         sdr_cke <= sdr_cke;

        end

       

        always @(posedge clk or negedge rst_n)begin

                 if(rst_n==1'b0)begin

                         sdr_cmd <= NOP;

                 end

                 else if(add_cnt&&cnt==10_001-1)begin

                         sdr_cmd <= PRE;

                 end

                 else if(add_cnt&&cnt==10_003-1)begin

                         sdr_cmd <= REF;

                 end

                 else if(add_cnt&&cnt==10_012-1)begin

                         sdr_cmd <= REF;

                 end

                 else if(add_cnt&&cnt==10_019-1)begin

                         sdr_cmd <= LMR;

                 end

                 else if(add_cnt&&cnt==10_020-1)begin

                         sdr_cmd <= NOP;

                 end

                 else begin

                         sdr_cmd <= NOP;

                 end

        end

       

        always @(posedge clk or negedge rst_n)begin

                 if(rst_n==1'b0)begin

                         sdr_a <= 13'd0;

                 end

                 else if(add_cnt&&cnt==10_001-1)begin

                         sdr_a[10] <= 1'b1;

                 end

                 else if(add_cnt&&cnt==10_019-1)begin

                         sdr_a <= CODE;

                 end

                 else begin

                         sdr_a <= 13'd0;

                 end

        end

                

        always @(posedge clk or negedge rst_n)begin

                 if(rst_n==1'b0)begin

                         init_done <= 1'b0;

                 end

                 else if(add_cnt&&cnt==10_021-1)begin

                         init_done <= 1'b1;

                 end

                else begin

                         init_done <= init_done;

                 end

        end

       

endmodule

 

 

1.4 PLL設置   

最后對代碼進行仿真,modelsim生成的報告如下所示,說明初始化設置成功。

null

 

null

 

 

以上就是SDRAM控制器初始化設計的思考步驟以及相關代碼,更多FPGA資料可以進入明德揚論壇進行學習交流(http://www.fpgabbs.cn/),明德揚專注FPGA設計研究,對FPGA學習感興趣的朋友快快聯系我們吧!

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  •   
  •   
  •   
  •  
  • FPGA教育領域第一品牌
  • 咨詢熱線:020-39002701
  • 技術交流Q群:544453837
主站蜘蛛池模板: 国产精品视频第一页 | 亚洲精品久久九九精品 | 免费高清欧美一区二区视频 | 国产欧美日韩看片片在线人成 | 国产五月婷婷 | 98pao强力打造高清免费 | 亚洲精品久久久久综合91 | 在线观看欧美亚洲 | 国内精品第一页 | 尤物视频在线观看免费视频 | 美女三级黄 | 国产在线拍揄自揄视频不卡99 | 亚洲经典激情春色另类 | 免费看黄色大片 | 国产在线观看网址你懂得 | 久久99九九精品免费 | 亚洲欧美成人永久第一网站 | 久久三级国产 | 亚洲国产成人在线 | 黄色片在线视频 | 国产成人1024精品免费 | 国产三级在线视频观看 | 黄色自拍 | 成人黄色片网站 | 日韩一级欧美一级在线观看 | 一级黄色片一级片 | 一级一毛片a级毛片欧美 | 国产成人精品视频2021 | 爱色视频 | 性做爰片免费视频毛片中文ilo | 国产亚洲欧美日韩v在线 | 啪啪国产视频 | 国产小视频2023| 国产小视频在线免费 | 亚洲高清美女一区二区三区 | 国自产拍在线视频天天更新 | 亚洲精品456人成在线 | 青草国产在线观看 | 亚洲国产一区二区三区四区五区 | 91成人免费观看网站 | 日韩久久一区二区三区 |