DDR2(2):Quartus DDR2 IP 官方例程仿真


  DDR2,全稱 Double Data Rate 2 SDRAM,即第二代雙倍數據速率同步動態隨機存取存儲器。它屬於 SDRAM 家族的存儲器產品,提供了相較於 DDR SDRAM 更高的運行效能與更低的電壓,是 DDR SDRAM 的后繼者,雖然 DDR2 和 DDR 都采用了在時鍾的.上升沿和下降沿同時進行數據傳輸的基本方式,但是 DDR2 擁有兩倍於 DDR 的預讀取系統命令數據的能力(DDR2 4bit預讀,DDR 2bit預讀)。也就是說,在同樣100MHz 的工作頻率下,DDR 的實際頻率為 200MHz,而 DDR2 則可以達到 400MHz。

  DDR2 難度比 SDRAM 復雜,直接用 IP 核比較靠譜。本篇博客記錄一下 QuartusII 13.0 軟件下的 DDR2 IP 核的官方例程仿真。

 

注意事項

1、關閉 Windows 的防火牆和電腦里的各種電腦管家。

2、以“管理員身份”打開 Quartus II 13.0。

3、所建工程要和 Quartus II 13.0 的安裝盤符不同。

4、DDR2 IP 創建於工程目錄下或其子文件,否則仿真出錯。

5、如果無論如何都失敗,打開任務管理器,將下面這個鬼東西關閉即可。

 

一、建工程

  建立文件夾 DDR2_test,管理員身份打開 Quartus II,創建工程 DDR2_test,不引入任何 .v 文件。

 

二、IP調用

  打開 IP 創建界面:Tools ---> MegaWizard Plug-in Menager。找到 DDR2 IP 並命名。

1、Memory Settings

  若 IP 核界面顯示不完整,可查看文檔《小梅哥DDR2簡明教程》尋找解決辦法。先設置第 1 個界面:Memory Seting。

(1)General Settings

  即頁面左上角,這部分主要是配置驅動 DDR2 存儲器的通用設置。

  • Device family:設備家族,也就是我們用的是哪個系列的 FPGA 芯片,像我們常用的以 EP4CE 開頭都是 CycloneIV E 系列。
  • Speed grade:FPGA 芯片的速度等級,在芯片的型號名稱中可以看到,比如 “EP4CE30F23C8”, 最后一位 8 指的就是速度等級。
  • PLL reference clock frequency: PLL 參考時鍾頻率,由於 DDR2 IP 核內部包含了 PLL 模塊,因此我們需要給它提供參考時鍾,一般由外部晶振或外部 PLL 輸出提供。
  • Memory clock frequency:存儲器時鍾頻率,指的就是 DDR2 存儲器的工作頻率。
  • Controller datarate:控制器數據速率,這里有兩種選擇,一種是Full (全速率),另一種是Half(半速率)。全速率控制器提供的接口時鍾頻率就是存儲器工作時鍾頻率,半速率控制器提供的接口時鍾頻率是存儲器工作時鍾頻率的一半。
  • Local interface clock frequency:本地接口時鍾頻率,指的是 DDR2 IP 核給用戶提供的接口(也就是控制器接口)時鍾頻率,由存儲器時鍾頻率和控制器數據速率決定。
  • Local interface width:本地接口寬度,指的是 DDR2 IP 核給用戶提供的接口(也就是控制器接口)數據寬度,由存儲器數據寬度和控制器數據速率決定。如果控制器速率選擇的是 Full,那么本地接口寬度是存儲器數據寬度的兩倍( DDR2內部在時鍾上升沿和下降沿都能吞吐數據)。如果控制器速率選擇的是 Half,那么本地接口寬度是存儲器數據寬度的4倍,這是由於控制器接口時鍾頻率降低了一半。

(2)Memory Presets

  即頁面右下角,這部分主要是選擇 DDR2 存儲器芯片型號和設置相關參數。如果加載列表中沒有我們想要的芯片型號,那么可以點擊【Load Preset】選項,通過選擇對應的 .xml 文件就能把定制的芯片參數加載到列表中。選好芯片型號后,在右邊有個按鈕【Modify parameters】,點進去可以設置所選芯片的參數集,如下所示:

  整個參數設置分 3 組,分別是 Memory Attributes、Memory Initialization Options 和 Memory Timing Parameters,其中灰色部分代表的是和存儲器直接相關的參數,修改這些參數會導致生成一個新的芯片型號參數集。

① Memory Attributes

  • Memoryvendor:存儲器生廠商,有Micron、 Samsung、 Hynix, 以及 JEDEC 等。
  • Memory format:存儲器格式,有 Discrete Device (分散設備),Unbuffered DIMM (無緩存DIMM) 和 Registered DIMM (寄存器的DIMM )。
  • Maximum memory frequency:設置存儲器支持的最大頻率。
  • Column address width:定義存儲器列地址寬度。
  • Row address width:定義存儲器行地址寬度。
  • Bank address width:定義存儲器 bank 地址寬度。
  • Output clock pairs from FPGA:指定從 FPGA 驅動到存儲器的差分時鍾對。當接口有多個設備時,時鍾對越多,每個輸出的負載就越小。
  • Chip selects per DIMM:定義接口中每個 DIMM 的片選數。
  • Total Memory chip selects:設置存儲器接口中片選信號數,存儲深度決定該參數。可以限制顯示本地端二進制編碼片選地址的范圍。如果范圍不能滿足設計要求,則可以選擇下一個較高的值。但是 ALTMEMPHY 的最高位地址空間不會映射到真正的存儲器地址。ALTMEMPHY 使用多個片選信號並用 mem_cs_n 信號校准片選信號。
  • Precharge address bit:選擇用於預充電的地址寬度。
  • Drive DM pins from FPGA:指定是否用 DM 引腳進行寫操作。
  • Maximum memory frequency for CAS latency (3.0、4.0、 5.0、6.0):每個給定 CAS 延時情況下存儲器的最大頻率限制,如果輸入的值超出了范圍則會生成警告信息。

② Memory Initialization Options

  • Memory burst length:設置每次傳輸的讀或寫數據字的個數。這是IP核內,不是外部的 local_size,full rate下只能是 4,half rate下只能 8 。
  • Memory burst ordering:控制向寫操作期間存儲器和 FPGA 之間數據傳輸的順序。
  • Enable the DLL in the memory devices:指定是否在存儲器設備中使能DLL,最好選擇是,否則 ALMEMPHY 不能確保在關閉在 DLL 時能正常工作。
  • Memory drive strength setting:控制存儲器芯片輸出緩存的驅動強度。
  • Memory on-die termination (ODT) setting:設置存儲器 ODT 的值。
  • Memory CAS latency setting:設置從讀命令到從存儲器中輸出第 1 個數據之間的延時時鍾周期數。
  • Memory Additive CAS latency setting:附加 CAS 延遲設置。

③ Memory Timing Parameters

  • Memory initialization time at power- -up (tINIT):最小存儲器初始化時間。
  • Load mode register command period (tMRD):最小加載模式寄存器命令周期。
  • Active to precharge time (tRAS):激活到預充電的最小時間。
  • Active to read/write time (tRCD):激活到讀-寫的最小時間。
  • Precharge command peniod (tRP):最小預充電命令周期。
  • Refresh command interval (tREFI):刷新命令之間的最大間隔。
  • Auto-refresh command interval (tRFC):最小自刷新命令周期。
  • Write recovery time (tWR):最小寫恢復時間。
  • Write to read period (tWTR):最小寫到讀命令延時。
  • DQ output access time from CK/CK# (tAC):從 CK/CK# 信號到 DQ 輸出訪問時間。
  • DQS output access time from CK/CK# (tDQSCK):從 CK/CK# 信號到 DQS 輸出訪問時間。
  • DQS-DQ skew for DQS and associated DQ signals (tDQSQ):DQS 到DQ 的最大時間差。
  • First latching edge of DQS to associated clock edge,+or- (tDQSS):正的 DQS 鎖存沿到相應時鍾沿的時間。
  • DQ and DM input hold time relative to DQS (tDH):DQ 和 DM 關於 DQS 的輸入保持時間。
  • DQ and DM input setup time relative to DQS (tDS):DQ 和 DM 關於 DQS 的建立時間。
  • DQS flling edge hold time from CK (tDSH):從 CK 開始 DQS 下降沿保持時間。
  • DQS flling edge to CK setup time (tDSS):DQS 下降沿到 CK 建立的時間。
  • Address and command input hold time (tlH):地址和控制輸入保持時間。
  • Address and command input setup time (tIS):地址和控制輸入建立時間。
  • DQ hold skew factor (tQHS):最大數據保持時間差因子。
  • Four active window time (tFAW):每個芯片的 4 個活動窗時間。
  • RAS to RAS delay time (tRRD):每個芯片的激活時間。
  • Read to precharge time(tRTP):讀到預充電的時間。

2、PHY Settings

  這個標簽我們一般不用改動。可以看出,這里設置的是 ALTEMEMPHY 有關的參數。對於 cyclone IV E 系列芯片,在 PHY Settings 頁面下只有兩項可以修改:

  • Address/Command Clock Settings:設置的是時鍾相位,調整地址和命令相位可以改進存儲器芯片中地址和命令的建立和保持延時,以補償不同加載帶來的傳輸延時。可以根據 phy_clk 和 write_clk 時鍾信號的上升沿和下降沿選擇0°、90°、 180° 和 270° 相位偏移。
  • Auto-Calibration Simulation Options:設置的是自動校准仿真選項,在 Full Calibration(全校准) Quick Calibration (快速校准) 和 Skip Calibration (跳過校准)之間進行選擇,僅用於仿真,選擇 Full Calibration 時仿真時間較長。

3、Board Settings

  這個標簽我們一般不用改動。可以看出,這里主要是設置一些板級參數來消除對時序的影響。

  • Number of Slots/Discrete Devices:需要設置芯片數,可以選擇單級或多級配置。
  • CKCK# slew rate ( Differential):設置 CK/CK# 信號的差分壓擺率。
  • Addr/Command slew rate:設置地址/命令信號的壓擺率。
  • DQS/DQS# slew rate ( Differential ):設置 DQS/DQS# 信號的差分壓擺率。
  • DQ slew rate:設置 DQ 信號的壓擺率。
  • tIS、tH、tDS、tDH:這 4 個量是控制信號和數據總線的建立和保持時間,這意味着建立和保持時間是通過設置壓擺率來實現的,當然這 4 個量也可以手動輸入更改。
  • Addr/Commmand eye reduction ( setup ):設置地址和命令信號上由於 ISI 導致的建立過程的眼圖縮減。
  • Addr/Commmand eye reduction ( hold ):設置地址和命令信號.上由於 ISI 導致的保持過程的眼圖縮減。
  • DQ eyereduction:設置 DQ 信號上由於 ISI 導致的眼圖縮減。
  • Delta DQS:設置由於 ISI 導致 DQS 信號到達時間范圍的增量。
  • Max skew within DQS group:設置 DQS 組中 DQ 管腳之間的最大偏移,此值在所有配置(單級或多級,DIMM或器件)中影響 DDR2 接口的讀捕捉和寫裕量。
  • Max skew between DQS groups:設置不同 DQS 組中 DQS 信號之間的最大偏移,此值在單級或多級配置中都會影響 DDR2 接口的再同步裕量。
  • Addr/command to CK skew:設置 CK 信號與地址和命令信號之間的偏移或傳輸延遲,正值代表長於 CK 信號的地址和命令信號,負值代表短於 CK 信號的地址和命令信號,Quartus II 使用該偏移值來優化地址和命令延遲,從而為 DDR2 接口獲得合適的建立和保持裕量。

4、Controller Settings

  這個標簽我們一般不用改動。可以看出,這里設置的是控制器的參數。我們一般默認選擇的是:High Performance Controller II,第二代,性能更好。

  • Enable Self-Refresh Controls:使能控制器允許用戶控制何時讓外部存儲器工作在自刷新模式。
  • Enable Auto Power Down:使能控制器在觀測到特定數量的空閑時鍾周期后自動將外部存儲器置於 power-down 模式,如果勾選了該項,在其后的 Auto Power Down Cycles 一欄可以設置空閑時鍾的數量。
  • Enable User Auto-Refresh Controls:使能控制器允許用戶發出單一刷新。
  • Enable Auto-Precharge Control:在控制器頂層使能自動預充電控制,用戶可以在讀或寫突發期間置位 auto-precharge 控制信號來指定控制器在讀或寫突發末尾是否關閉(也就是auto-precharge )當前打開頁。
  • Enable Reordering:使能控制器重排序命令和數據來達到更高效率。
  • Starvation limit for each command:指定執行一個等待命令之前能夠執行的命令數量,該值的合法范圍是1~63。
  • Local-to-Memory Address Mapping:允許用戶控制Avalon接口的地址位與存儲器接口的 chip、row、 bank、 column 位的映射方式,如果用戶應用程序發出了大於存儲器列大小的突發操作,選擇 Chip-Row-Bank-Column 可以利用 look-ahead bank management 特性在突發到達列尾時隱藏改變當前打開頁所產生的影響。另外一種情況是,如果用戶應用程序有幾個主機並且用到的是存儲器的不同區域,那么選擇 Chip-Bank-Row-Column 可以通過高位地址給每個主機分配相應的物理bank,這樣就避免了當控制器必須在同一 bank 打開和關閉行的情況下不同主機訪問同一bank可能造成的效率下降。
  • Command Queue Look- Ahead Depth:指定命令隊列 look-ahead 深度值來控制 look- ahead bank management 邏輯檢驗的讀或寫請求數。
  • Local Maximum Burst Count:指定突發數來配置控制器從端口能接收的最大 Avalon 突發數,選擇 4(100),則外部 local_size 位寬為3。
  • Enable Configuratio and Status Register Interface:使能控制器的運行時刻配置和狀態檢索,這樣可以添加一個額外的 Avalon-MM 從端口到存儲控制器頂層,從而實現存儲器時序參數、存儲器地址大小和模式寄存器設置以及控制器功能,如果 Eror Detection and Correction Logic 選項被使能,那么該從端口允許用戶控制和檢索該邏輯的狀態。
  • Enable Error Detection and CorrectionLogic:使能錯誤檢測和糾正(ECC )功能用於單比特和雙比特錯誤糾正。Enable Auto Error Correction 開啟此選項后,當 ECC 邏輯檢測到單比特錯誤時,允許控制器執行自動糾錯,如果關閉此選項,意味着在特定的時間進行糾錯,以實現更高的系統效率。

 5、EDA

 

   從該頁面中可以看出,如果我們想要仿真 DDR2 IP 核,那么就需要用到 altera_mf 、220model 和 sgate 這三個仿真庫。Generate simulation model 選項可以選擇是否要生成這3個文件,Generate netlist 選項可以選擇是否生成網表文件,如果用戶想用第三方EDA綜合工具來綜合設計的文件,Quartus可以為該綜合工具提供網表文件,用來評估時序和資源利用率。這里需要注意的是,並不是所有的第三方EDA工具都支持。我們需要仿真,因此勾選。

 6、Summary

  總結頁面,不用管。

  點擊 Finish,等待 1 分鍾,生成 IP 完畢。如果等了 3 分鍾還未生成,表明生成 IP 失敗,請刪除工程,檢查注意事項后重新操作。

 

三、添加例程

1、點擊 Quartus II 界面的 File,將例程添加進來。

(1)DDR2_example_top.v

(2)DDR2_example_driver.v

2、將 DDR2_example_top 右鍵設為頂層模塊。

3、代碼解釋

  例程可以幫我們理解 DDR2 IP 的使用,具體的解釋可以查看設計文檔《emi_ddr_ug.pdf》》。生成的代碼有些亂,注釋很少,我稍微整理了一下:

  1 //**************************************************************************
  2 // *** 名稱 : DDR2_example_top.v
  3 // *** 作者 : xianyu_FPGA
  4 // *** 博客 : https://www.cnblogs.com/xianyufpga/
  5 // *** 日期 : 2020-6-9
  6 // *** 工具 : Quartus 13.0
  7 // *** 芯片 : Cyclone IV E
  8 // *** 型號 : EP4CE30F23C6
  9 // *** 描述 : DDR2_IP官方仿真例程的頂層模塊
 10 //**************************************************************************
 11 
 12 module DDR2_example_top
 13 //========================< 端口 >==========================================
 14 (
 15 //system --------------------------------------------
 16 input   wire                clock_source            , //時鍾
 17 input   wire                global_reset_n          , //復位
 18 //DDR2 ----------------------------------------------
 19 output  wire    [ 15: 0]    mem_addr                , //DDR2地址總線
 20 output  wire    [  2: 0]    mem_ba                  , //DDR2組地址總線
 21 output  wire                mem_cas_n               , //DDR2列地址選擇
 22 output  wire                mem_cke                 , //DDR2時鍾使能
 23 inout   wire                mem_clk                 , //DDR2時鍾
 24 inout   wire                mem_clk_n               , //DDR2時鍾反相
 25 output  wire                mem_cs_n                , //DDR2片選
 26 output  wire    [  1: 0]    mem_dm                  , //DDR2掩碼
 27 inout   wire    [ 15: 0]    mem_dq                  , //DDR2數據總線
 28 inout   wire    [  1: 0]    mem_dqs                 , //DDR2數據源同步
 29 output  wire                mem_odt                 , //DDR2片內終止控制
 30 output  wire                mem_ras_n               , //DDR2行地址選擇
 31 output  wire                mem_we_n                , //DDR2寫使能
 32 //DDR2_test -----------------------------------------
 33 output  wire                pnf                     , //數據正確指示(pass not fail)
 34 output  wire    [  3: 0]    pnf_per_byte            , //數據正確指示(字節)
 35 output  wire                test_complete           , //DDR2測試完成指示
 36 output  wire    [  7: 0]    test_status               //DDR2測試狀態
 37 );
 38 //========================< 連線 >==========================================
 39 wire                        cs_n                    ;
 40 wire                        local_burstbegin_sig    ;
 41 wire                        mem_aux_full_rate_clk   ;
 42 wire                        mem_aux_half_rate_clk   ;
 43 wire    [ 27: 0]            mem_local_addr          ;
 44 wire    [  3: 0]            mem_local_be            ;
 45 wire    [  9: 0]            mem_local_col_addr      ;
 46 wire                        mem_local_cs_addr       ;
 47 wire    [ 31: 0]            mem_local_rdata         ;
 48 wire                        mem_local_rdata_valid   ;
 49 wire                        mem_local_read_req      ;
 50 wire                        mem_local_ready         ;
 51 wire    [  2: 0]            mem_local_size          ;
 52 wire    [ 31: 0]            mem_local_wdata         ;
 53 wire                        mem_local_write_req     ;
 54 wire                        phy_clk                 ;
 55 wire                        reset_phy_clk_n         ;
 56 wire                        tie_high                ;
 57 wire                        tie_low                 ;
 58 //==========================================================================
 59 //==                        code
 60 //==========================================================================
 61 assign mem_cs_n = cs_n; //多次一舉,直接連線mem_cs_n即可
 62 assign tie_high = 1'b1; //拉高
 63 assign tie_low  = 1'b0; //拉低
 64 //==========================================================================
 65 //==                        DDR2 IP
 66 //==========================================================================
 67 DDR2 DDR2_inst
 68 (
 69     .aux_full_rate_clk      (mem_aux_full_rate_clk  ), //全速率時鍾
 70     .aux_half_rate_clk      (mem_aux_half_rate_clk  ), //半速率時鍾
 71     .global_reset_n         (global_reset_n         ), //全局異步復位
 72     //-----------------------------------------------
 73     .local_address          (mem_local_addr         ), //用戶_地址總線
 74     .local_be               (mem_local_be           ), //用戶_字節使能標志
 75     .local_burstbegin       (local_burstbegin_sig   ), //用戶_突發起始
 76     .local_init_done        (                       ), //用戶_初始化完成
 77     .local_rdata            (mem_local_rdata        ), //用戶_讀數據總線
 78     .local_rdata_valid      (mem_local_rdata_valid  ), //用戶_讀數據有效
 79     .local_read_req         (mem_local_read_req     ), //用戶_讀數據請求
 80     .local_ready            (mem_local_ready        ), //用戶_讀寫請求被接收指示
 81     .local_refresh_ack      (                       ), //用戶_刷新請求
 82     .local_size             (mem_local_size         ), //用戶_突發大小
 83     .local_wdata            (mem_local_wdata        ), //用戶_寫數據總線
 84     .local_write_req        (mem_local_write_req    ), //用戶_寫數據請求
 85     //-----------------------------------------------
 86     .mem_addr               (mem_addr[15 : 0]       ), //DDR2地址總線
 87     .mem_ba                 (mem_ba                 ), //DDR2組地址總線
 88     .mem_cas_n              (mem_cas_n              ), //DDR2列地址選擇
 89     .mem_cke                (mem_cke                ), //DDR2時鍾使能
 90     .mem_clk                (mem_clk                ), //DDR2時鍾
 91     .mem_clk_n              (mem_clk_n              ), //DDR2時鍾反相
 92     .mem_cs_n               (cs_n                   ), //DDR2片選
 93     .mem_dm                 (mem_dm[1 : 0]          ), //DDR2掩碼
 94     .mem_dq                 (mem_dq                 ), //DDR2數據總線
 95     .mem_dqs                (mem_dqs[1 : 0]         ), //DDR2數據源同步
 96     .mem_odt                (mem_odt                ), //DDR2片內終止控制
 97     .mem_ras_n              (mem_ras_n              ), //DDR2行地址選擇
 98     .mem_we_n               (mem_we_n               ), //DDR2寫使能
 99     //-----------------------------------------------
100     .phy_clk                (phy_clk                ), //DDR2工作時鍾
101     .pll_ref_clk            (clock_source           ), //IP核中的PLL輸入時鍾
102     .reset_phy_clk_n        (reset_phy_clk_n        ), //IP核提供的復位
103     .reset_request_n        (                       ), //IP核中的PLL鎖定
104     .soft_reset_n           (tie_high               )  //全局異步復位信號(不復位PLL)
105 );
106 //==========================================================================
107 //==    連接列地址位,因為2:1的數據速率,從示例驅動程序輸出中刪除1位
108 //==========================================================================
109 assign mem_local_addr[8 : 0] = mem_local_col_addr[9 : 1];
110 //==========================================================================
111 //==                    DDR2 控制器
112 //==========================================================================
113 DDR2_example_driver driver
114 (
115     .clk                    (phy_clk                ), //DDR2工作時鍾
116     .local_bank_addr        (mem_local_addr[27 : 25]), //用戶_地址總線
117     .local_be               (mem_local_be           ), //用戶_字節使能標志
118     .local_burstbegin       (local_burstbegin_sig   ), //用戶_突發起始
119     .local_col_addr         (mem_local_col_addr     ), //用戶_地址總線
120     .local_cs_addr          (mem_local_cs_addr      ), //未用到
121     .local_rdata            (mem_local_rdata        ), //用戶_讀數據總線
122     .local_rdata_valid      (mem_local_rdata_valid  ), //用戶_讀數據有效
123     .local_read_req         (mem_local_read_req     ), //用戶_讀數據請求
124     .local_ready            (mem_local_ready        ), //用戶_讀寫請求被接收指示
125     .local_row_addr         (mem_local_addr[24 : 9] ), //用戶_地址總線
126     .local_size             (mem_local_size         ), //用戶_突發大小
127     .local_wdata            (mem_local_wdata        ), //用戶_寫數據總線
128     .local_write_req        (mem_local_write_req    ), //用戶_寫數據請求
129     .pnf_per_byte           (pnf_per_byte[3 : 0]    ), //數據正確指示(字節)
130     .pnf_persist            (pnf                    ), //數據正確指示
131     .reset_n                (reset_phy_clk_n        ), //IP核提供的復位
132     .test_complete          (test_complete          ), //DDR2測試完成指示
133     .test_status            (test_status            )  //DDR2測試的運行狀態
134 );
135 
136 
137 endmodule

 

四、仿真搭建

1、Modelsim 軟件的路徑設置。打開Quartus ii,點擊Tools --- Options --- EDA Tool Optinons,將modelsim的安裝路徑填寫進去。我這用的是QuestaSim,和Modelsim是完全沒有區別的。為了防止遺漏,我把下面三個位置都填上:

2、Quartus ii 關聯 Modelsim,一開始建立工程時就可以設置,如果忘記了或者設置錯了也可以再次更改。點擊Assignments --- Setings --- Eda Tool Setings,將仿真工具選擇好即可。(我的是QuastaSim,就填的QuastaSim)

3、點擊Assignments --- Setings --- EDA Tool Setings下的simulation,將 Tool name 選擇好,然后點擊 Compile testbench,之后點擊Test Benches。

4、填寫 New Test Bench Settings,添加仿真文件。

(1)DDR2_mem_model.v,DDR2 仿真模型;

(2)DDR2_example_top_tb,DDR2 仿真文件;

5、回到 Quartus II 界面,綜合編譯后點擊 RTL Simulation 執行仿真。

  經過一小段時間的等待,波形就出來了。

 

五、上板看波形

  上面只是仿真,要上板則增加幾點注意事項。

1、選擇自己板卡 DDR2 相符的型號

  上面仿真時是看着小梅哥《小梅哥DDR2簡明教程》做的,但是要上板時發現自己的 DDR2 型號和他的不一致,而且是兩片 DDR2 一起用。選擇自己的 DDR2 型號,點擊 Modify parameter 對 DQ 和 Bank 參數進行修改一下,其他選項都一樣,如下所示:

2、添加 tcl 電平標准文件

  FPGA板卡是 3.3V,而 DDR2 是 1.8v,還有一些別的東西,都可以通過添加 tcl 文件實現。點擊菜單欄 Tools --- Tcl Scripts,選擇 DDR2_pin_assignments.tcl,Run

3、添加網表約束文件

  點擊菜單欄 Assignments --- Settings --- TimeQuest Timing Analyzer,照下圖添加即可。

4、添加引腳約束文件

  找到開發板原理圖,將引腳位置填上去,大多開發板都會提供寫好的引腳文件,復制到 qsf 文件中即可。

5、添加 SignalTapII ,編譯,查看波形

波形出來了,說明我們操作成功!

 

六、補充說明

  如果使用的 Quartus II 是13.0 以上的版本,在執行仿真這一步會報錯:
  “仿真需要調用一個叫 cycloneiii_ver 的庫,結果找不到這個庫,為啥找不到呢?可能這個 IP 核的工程模型是基於 cycloneiii 器件設計的,仿真的時候默認還是調用 cyclone iii 的器件模型,但是從 Quartus II 13.0 以后,Quartus II 軟件已經不再支持 cyclone iii 軟件,里面也不再提供 cyclone iii 的器件模型,因此仿真時候無法找到這個模型,當然無法開始仿真了。”
——小梅哥
  小梅哥沒有給出解決辦法,但是看到一篇博客記錄了 QuartusII 15.0 仿真 DDR2 官方例程的全過程,原文鏈接如下: https://blog.csdn.net/linker00/article/details/98034776
 

參考資料:

1、小梅哥《DDR2簡明教程》

2、鋯石科技FPGA教程

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM