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



官方論壇
官方淘寶
官方博客
微信公眾號(hào)
點(diǎn)擊聯(lián)系吳工 點(diǎn)擊聯(lián)系周老師
您的當(dāng)前位置:主頁(yè) > 高級(jí)實(shí)訓(xùn)案例 >

【原創(chuàng)分享】基于FPGA的SDRAM控制器設(shè)計(jì)——初始化設(shè)計(jì)

發(fā)布時(shí)間:2020-02-26   作者:小周 瀏覽量:


本文為明德?lián)P原創(chuàng)及錄用文章,轉(zhuǎn)載請(qǐng)注明出處

1.1 SDRAM簡(jiǎn)介

SDRAM即同步動(dòng)態(tài)隨機(jī)存儲(chǔ)器,英文為Synchronous Dynamic Random Access Memory;具有容量大、讀寫速度快、價(jià)格相對(duì)便宜等優(yōu)點(diǎn),但同時(shí)控制邏輯比較復(fù)雜。

 

1.1.1 SDRAM示意圖

其管腳圖如下所示:

 

1.1.2 信號(hào)說(shuō)明

信號(hào)名

信號(hào)說(shuō)明

clk

SDRAM工作時(shí)鐘

cke

時(shí)鐘使能信號(hào)

cs_n

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

cas_n

列地址選通

ras_na

行地址選通

we_n

寫使能,該信號(hào)為低時(shí),使能寫操作和預(yù)充電

ba

bank地址

a

地址總線

dqm

數(shù)據(jù)掩碼

dq

數(shù)據(jù)總線

 

 

1.1.3 SDRAM中心對(duì)齊原則

SDRAM的命令與時(shí)鐘上升沿是中心對(duì)齊的,本設(shè)計(jì)采用鎖相環(huán)生成SDRAM工作時(shí)鐘,SDRAM與初始化模塊工作時(shí)鐘相差180°。這樣FPGA產(chǎn)生的信號(hào)到SDRAM正好中心對(duì)齊,如下圖所示:

null

 

 

1.1.4 SDRAM初始化時(shí)序

null

SDRAM初始化時(shí)序如上圖所示,sdr_cmd命令由sdr_cs_n, sdr_ras_n, sdr_cas_n, sdr_we_n組合而成;復(fù)位后要延時(shí)最少100us后才能工作;當(dāng)A10為高時(shí)可以對(duì)所有bank進(jìn)行操作;當(dāng)?shù)竭_(dá)Tp+3時(shí)需要將init_done拉高。

 

 

null

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

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

b.       A2A1A0用作設(shè)置突發(fā)長(zhǎng)度,本項(xiàng)目設(shè)置為4

c.       A3用作設(shè)置突發(fā)類型,本項(xiàng)目設(shè)置為Sequential順序類型

d.       A6A5A4用作設(shè)置列選通潛伏期,本項(xiàng)目設(shè)置為3

e.       A8A7設(shè)置操作模式,一般為00

f.        A9設(shè)置寫突發(fā)模式,本項(xiàng)目為0

g.       A12A11A10設(shè)置為0

 

1.2 頂層模塊設(shè)計(jì)

1.2.1 SDRAM頂層模塊管腳圖

null

 

1.2.2 信號(hào)說(shuō)明

 

信號(hào)

說(shuō)明

local_addr

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

local_data

寫入數(shù)據(jù)

local_q

讀出數(shù)據(jù)

local_rdreq

讀請(qǐng)求

local_wrreq

寫請(qǐng)求

local_reday

可以進(jìn)行讀寫信號(hào)

local_rdata_valid

讀數(shù)據(jù)有效信號(hào)

init_done

初始化完成信號(hào)

clk

輸入時(shí)鐘

rst_n

系統(tǒng)復(fù)位

sdr_dq

SDRAM數(shù)據(jù)總線,雙向端口

sdr_clk

SDRAM工作時(shí)鐘

sdr_cke

SDRAM時(shí)鐘使能

sdr_cs_n

片選信號(hào)

sdr_cas_n

列地址選通

sdr_ras_n

行地址選通

sdr_we_n

寫使能,該信號(hào)為低時(shí),使能寫操作和預(yù)充電

sdr_ba

SDRAM bank地址

sdr_a

SDRAM地址總線

sdr_dqm

數(shù)據(jù)掩碼

 

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  ,

    //其他信號(hào),舉例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)       ,

        //其他信號(hào),舉例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 初始化模塊設(shè)計(jì)

1.3.1 SDRAM出計(jì)劃模塊管腳圖

 

null

 

1.3.2 信號(hào)說(shuō)明

 

信號(hào)

說(shuō)明

clk

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

rst_n

復(fù)位

init_done

初始化完成信號(hào)

init_bus

SDRAM信號(hào)組成

 

 

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  ,

    //其他信號(hào),舉例dout

    init_done,

    init_bus

    );

 

    //參數(shù)定義

    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    ;

 

    //輸入信號(hào)定義

    input               clk    ;

    input               rst_n  ;

 

    //輸出信號(hào)定義

    output              init_done  ;

    output[DATA_W-1:0]  init_bus   ;

 

    //輸出信號(hào)reg定義

    reg                 init_done  ;

    wire  [DATA_W-1:0]  init_bus   ;

 

    //中間信號(hào)定義

    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設(shè)置   

最后對(duì)代碼進(jìn)行仿真,modelsim生成的報(bào)告如下所示,說(shuō)明初始化設(shè)置成功。

null

 

null

 

 

以上就是SDRAM控制器初始化設(shè)計(jì)的思考步驟以及相關(guān)代碼,更多FPGA資料可以進(jìn)入明德?lián)P論壇進(jìn)行學(xué)習(xí)交流(http://www.fpgabbs.cn/),明德?lián)P專注FPGA設(shè)計(jì)研究,對(duì)FPGA學(xué)習(xí)感興趣的朋友快快聯(lián)系我們吧!

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  •   
  •   
  •   
  •  
  • FPGA教育領(lǐng)域第一品牌
  • 咨詢熱線:020-39002701
  • 技術(shù)交流Q群:544453837
主站蜘蛛池模板: 青青青久在线视频免费观看 | 大香萑75久久精品免费 | 免费三级网址 | 国产精品永久免费自在线观看 | 久草免费在线播放 | 婷婷99精品国产97久久综合 | 免费观看黄色一级片 | 亚洲精品午夜在线观看 | 99视频精品免视3 | 国产成人精品免费视频软件 | 国产老妇女| 国产美女久久久亚洲 | 日韩免费观看一级毛片看看 | 色婷婷影院在线视频免费播放 | 真人实干一级毛片aa免费 | 黄页成人免费网站 | 久久99国产精品久久99果冻传媒 | 日本精品视频在线观看 | 一级特黄aaa大片在线观看 | 99re最新地址精品视频 | 亚洲激情中文字幕 | 国产女人精品性视频 | 精品高清写真视频在线 | a级在线观看 | 久久精品免看国产 | 激情久久婷婷 | 国产精品第一页爽爽影院 | 免费黄色看片网站 | 一级毛片私人影院 | 亚洲福利一区二区三区 | 香蕉网站狼人久久五月亭亭 | 清纯唯美亚洲综合五月天 | 国产色网址 | 九九精品视频在线观看九九 | 久在线 | 深夜做爰性大片很黄很色视频 | 欧美日韩一区二区在线观看视频 | 国产日本特黄特色大片免费视频 | 国产福利微拍精品一区二区 | 亚洲精品一区vv国产 | 国产在线91精品入口首页 |