chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

關(guān)于MIG IP核控制DDR3讀寫測(cè)試案例解析

454398 ? 來源:博客園 ? 作者:沒落騎士 ? 2020-10-29 14:44 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

本文設(shè)計(jì)思想采用明德?lián)P至簡設(shè)計(jì)法。在高速信號(hào)處理場(chǎng)合下,很短時(shí)間內(nèi)就要緩存大量的數(shù)據(jù),這時(shí)片內(nèi)存儲(chǔ)資源已經(jīng)遠(yuǎn)遠(yuǎn)不夠了。DDR SDRAM因其極高的性價(jià)比幾乎是每一款中高檔FPGA開發(fā)板的首選外部存儲(chǔ)芯片。DDR操作時(shí)序非常復(fù)雜,之所以在FPGA開發(fā)中用途如此廣泛,都要得意于MIG IP核。網(wǎng)上關(guān)于MIG控制DDR的資料很多,因此本文只講述個(gè)人認(rèn)為較重要的內(nèi)容。由于MIG IP核用戶接口時(shí)序較復(fù)雜,這里給出擴(kuò)展接口模塊用于進(jìn)一步簡化接口時(shí)序。

先來看看MIG IP核的架構(gòu):

了解下存儲(chǔ)芯片側(cè)重要接口:

ddr_addr DDR3的行列地址

ddr_ba DDR3的bank地址

ddr_cas_n ddr_ras_n ddr_we_n 命令控制

ddr_ck ddr_ck_n 差分時(shí)鐘

ddr_dm 數(shù)據(jù)輸入屏蔽

ddr_o_dt片上終端使能,用于使能和禁止片內(nèi)終端電阻

ddr_reset_n DDR3復(fù)位

ddr_dqs ddr_dqs_n 數(shù)據(jù)同步信號(hào)

ddr_dq 傳輸數(shù)據(jù)

之后我們從IP核配置開始說起。Controller Options這頁最為重要,其中包括時(shí)鐘策略和外部DDR芯片參數(shù)配置。首先時(shí)鐘周期選擇為400MHz,此時(shí)PHY to Controller Clock Ratio只能是4:1,也就是說MIG用戶側(cè)時(shí)鐘為100MHz。下半部分是選擇合適的DDR芯片型號(hào)和參數(shù),要再三確認(rèn)無誤。

Memory Options這頁輸入時(shí)鐘周期選擇為200MHz,根據(jù)Controller Options頁的選項(xiàng),該時(shí)鐘經(jīng)過PLL分頻和倍頻后的時(shí)鐘分別作為用戶側(cè)時(shí)鐘100MHz和DDR接口時(shí)鐘400MHz。

這里有個(gè)參考時(shí)鐘選項(xiàng),如果Memory Options頁P(yáng)LL輸入時(shí)鐘頻率選為200MHz,此處可以直接選擇Use System Clock,從而簡化接口。

以上是MIG IP核配置過程中較為重要的部分,實(shí)際上上述配置也可通過修改工程代碼中參數(shù)來重定義。IP核配置完成,打開example design工程頂層文件,我們來重點(diǎn)關(guān)注下用戶側(cè)接口功能和時(shí)序。

這是本人寫的注釋,更具體清晰的說明還是要查看官方文檔UG586.接下來看看寫數(shù)據(jù)和讀數(shù)據(jù)的接口時(shí)序圖(時(shí)鐘比例4:1,burst length = 8為例):

指令通道:

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

從時(shí)序圖可以看出,指令地址和數(shù)據(jù)使用兩套時(shí)序,彼此相互獨(dú)立。為了便于設(shè)計(jì),直接將兩套時(shí)序嚴(yán)格對(duì)齊(情況1)也可以正常工作。

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

為什么說“時(shí)鐘比例4:1,burst length = 8為例”?這一點(diǎn)特別關(guān)鍵。此時(shí)用戶時(shí)鐘周期是DDR接口時(shí)鐘周期的4倍,也就是一個(gè)用戶時(shí)鐘信號(hào)上升沿對(duì)應(yīng)8個(gè)DDR時(shí)鐘邊沿。burst length可以理解為MIG連續(xù)操作DDR地址的個(gè)數(shù),故在4:1時(shí)鐘比例下,一個(gè)用戶時(shí)鐘周期正好對(duì)8個(gè)地址進(jìn)行了讀/寫操作,256bit數(shù)據(jù)分8次(32bit)寫入DDR中。由此分析,在寫數(shù)據(jù)時(shí)讓app_wdf_end = app_wdf_wren即可,并且讀/寫操作時(shí)地址遞增步長為8.

雖然MIG IP核提供了用戶接口,但讀寫指令通道復(fù)用且需要實(shí)時(shí)關(guān)注兩個(gè)rdy信號(hào)造成了時(shí)序操作上的不方便。為此我們需要對(duì)接口進(jìn)一步封裝,保證寫操作時(shí)只關(guān)注:寫使能user_wdata_en 寫地址user_waddr 寫數(shù)據(jù)user_wdata和寫準(zhǔn)備就緒信號(hào)user_wdata_rdy,讀操作時(shí)只關(guān)注:讀使能user_rdata_en 讀地址user_raddr 讀數(shù)據(jù)user_rdata 讀數(shù)據(jù)有效user_rdata_vld和讀操作準(zhǔn)備就緒user_rdata_rdy。

利用擴(kuò)展接口模塊,將讀通道和寫通道接口分離,并分別例化一個(gè)FIFO緩存地址和數(shù)據(jù)。當(dāng)讀/寫指令同時(shí)有效時(shí),通過MIG側(cè)的優(yōu)先級(jí)輪換邏輯輪流讀取其中一個(gè)FIFO,每次選一個(gè)FIFO讀取直至FIFO為空再重新選擇。其工程結(jié)構(gòu)和核心代碼如下:

讀側(cè)邏輯核心代碼:

 1 //讀側(cè)--------------------------------------------------------------
 2 
 3 always @(posedge clk or negedge rst_n )begin 
 4     if(rst_n==0) begin
 5         rd_flag <= (0)  ;
 6     end
 7     else if(rd_flag == 0 && mig_rdy && mig_wdf_rdy && !rdempty1 && (rdempty0 || (!rdempty0 && priority == 0)))begin
 8         rd_flag <= (2'b01)  ;//讀取 寫指令FIFO
 9     end 
10     else if(rd_flag == 0 && mig_rdy && !rdempty0 && (rdempty1 || (!rdempty1 && priority == 1)))begin
11         rd_flag <= (2'b10)  ;//讀取 讀指令FIFO
12     end 
13     else if((rd_flag == 2'b01 && rdempty1)||(rd_flag == 2'b10 && rdempty0))
14         rd_flag <= 0;
15 end
16 
17 //同時(shí)非空時(shí)輪換優(yōu)先級(jí)
18 always @(posedge clk or negedge rst_n )begin 
19     if(rst_n==0) begin
20         priority <= (0)  ;
21     end
22     else if(rd_flag == 0 && !rdempty0 && !rdempty1)begin
23         priority <= (!priority)  ;
24     end 
25 end

為了方便測(cè)試,設(shè)計(jì)樣式生成模塊與擴(kuò)展接口模塊用戶側(cè)連接,不斷向一段地址寫入固定數(shù)據(jù)序列并在一段時(shí)間后讀回。

  1 `timescale 1ns / 1ps
  2 /*
  3 該模塊功能:
  4 周期性向一段地址執(zhí)行讀寫操作 產(chǎn)生固定樣式待寫入數(shù)據(jù)用戶測(cè)試目的
  5 測(cè)試完畢后刪除該模塊,開發(fā)用戶接口
  6 
  7 具體為:
  8 1 寫從0開始之后的10個(gè)用戶地址(80個(gè)DDR地址):0~9遞增序列
  9 2 等待20個(gè)時(shí)鐘周期
 10 3 讀取寫入的10個(gè)用戶地址
 11 4 等待20個(gè)時(shí)鐘周期
 12 5 重復(fù)上述步驟
 13 
 14 說明:
 15 1 每個(gè)步驟之間有一個(gè)時(shí)鐘周期空閑
 16 2 由于burst_len = 8 4:1時(shí)鐘模式下一個(gè)用戶時(shí)鐘周期寫入數(shù)據(jù)對(duì)應(yīng)同樣時(shí)間內(nèi)8個(gè)DDR時(shí)鐘邊沿寫入數(shù)據(jù),
 17 因此地址遞增步長為8
 18 */
 19 module traffic_gen
 20 #(parameter DATA_WIDTH = 32,
 21             ADDR_WIDTH = 29)
 22 (
 23     input                           clk   ,
 24     input                           rst_n ,
 25 
 26     output reg                      gen_wdata_en ,
 27     output reg [ ADDR_WIDTH-1:0]    gen_waddr    ,
 28     output reg [ DATA_WIDTH-1:0]    gen_wdata ,
 29     input                           gen_wdata_rdy ,//寫指令和數(shù)據(jù)通道準(zhǔn)備就緒
 30 
 31     output reg                      gen_rdata_en ,
 32     output reg [ ADDR_WIDTH-1:0]    gen_raddr    ,
 33     input      [ DATA_WIDTH-1:0]    gen_rdata     ,
 34     input                           gen_rdata_vld ,
 35     input                           gen_rdata_rdy //讀指令通道準(zhǔn)備就緒
 36 );
 37 
 38    
 39 reg [ (8-1):0]  cnt0     ;
 40 wire        add_cnt0 ;
 41 wire        end_cnt0 ;
 42 reg [ (2-1):0]  cnt1     ;
 43 wire        add_cnt1 ;
 44 wire        end_cnt1 ;
 45 
 46 reg [ DATA_WIDTH-1:0]  gen_rdata_r     ;
 47 reg   gen_rdata_vld_r     ;
 48 reg    com_flag     ;
 49 
 50 wire wri_state;
 51 wire rd_state;
 52 wire com_change_t;
 53 
 54 //操作周期計(jì)數(shù)器,計(jì)數(shù)值為欲操作用戶地址段長度+1(需要一個(gè)時(shí)鐘周期空閑)
 55 always @(posedge clk or negedge rst_n) begin 
 56     if (rst_n==0) begin
 57         cnt0 <= 0; 
 58     end
 59     else if(add_cnt0) begin
 60         if(end_cnt0)
 61             cnt0 <= 0; 
 62         else
 63             cnt0 <= cnt0+1 ;
 64    end
 65 end
 66 assign add_cnt0 = (com_flag == 0 && gen_wdata_rdy) || (com_flag == 1 && gen_rdata_rdy);
 67 assign end_cnt0 = add_cnt0  && cnt0 == (30)-1 ;
 68 
 69 //指令標(biāo)志位 先是0--寫 再是1--讀
 70 always @(posedge clk or negedge rst_n )begin 
 71     if(rst_n==0) begin
 72         com_flag <= (0)  ;
 73     end
 74     else if(com_change_t)begin
 75         com_flag <= (!com_flag)  ;
 76     end 
 77 end
 78 
 79 assign com_change_t = add_cnt0 && cnt0 == 10 - 1;
 80 
 81 //寫操作---------------------------------------------
 82 always @(posedge clk or negedge rst_n )begin 
 83     if(rst_n==0) begin
 84         gen_wdata_en <= (0)  ;
 85     end
 86     else if(wri_state)begin
 87         gen_wdata_en <= (1'b1)  ;
 88     end 
 89     else begin
 90         gen_wdata_en <= (0)  ;
 91     end 
 92 end
 93 
 94 assign wri_state = add_cnt0 && cnt0 <= 10-1 && com_flag == 0;
 95 assign rd_state  = add_cnt0 && cnt0 <= 10-1 && com_flag == 1;
 96 
 97 always @(posedge clk or negedge rst_n )begin 
 98     if(rst_n==0) begin
 99         gen_wdata <= (0)  ;
100     end
101     else begin
102         gen_wdata <= (cnt0)  ;
103     end 
104 end
105 
106 always@(posedge clk or negedge rst_n)begin
107     if(rst_n == 0)
108         gen_waddr <= 0;
109     else if(wri_state)
110         gen_waddr <= gen_waddr + 29'd8;
111     else 
112         gen_waddr <= 0;
113 end
114 //讀操作----------------------------------------------
115 
116 always @(posedge clk or negedge rst_n )begin 
117     if(rst_n==0) begin
118         gen_rdata_en <= (0)  ;
119     end
120     else if(rd_state)begin
121         gen_rdata_en <= (1'b1)  ;
122     end 
123     else begin
124         gen_rdata_en <= (0)  ;
125     end 
126 end
127 
128 always@(posedge clk or negedge rst_n)begin
129     if(rst_n == 0)
130         gen_raddr <= 0;
131     else if(rd_state)
132         gen_raddr <= gen_raddr + 29'd8;
133     else 
134         gen_raddr <= 0;
135 end
136 
137 always @(posedge clk or negedge rst_n )begin 
138     if(rst_n==0) begin
139         gen_rdata_r <= (0)  ;
140     end
141     else begin
142         gen_rdata_r <= (gen_rdata)  ;
143     end 
144 end
145 
146 always @(posedge clk or negedge rst_n )begin 
147     if(rst_n==0) begin
148         gen_rdata_vld_r <= (0)  ;
149     end
150     else if(gen_rdata_vld)begin
151         gen_rdata_vld_r <= (1'b1)  ;
152     end 
153     else begin
154         gen_rdata_vld_r <= (0)  ;
155     end 
156 end
157 
158 endmodule

將traffic_gen和extend_interface模塊例化在MIG的example design中,利用ILA抓取MIG IP核用戶接口信號(hào)。

向地址8~80寫入數(shù)據(jù)0~9,再從此段地址中讀回?cái)?shù)據(jù),0~9被正確讀出,MIG IP核控制DDR3讀寫測(cè)試完畢。
編輯:hfy

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1650

    文章

    22204

    瀏覽量

    626729
  • DDR3
    +關(guān)注

    關(guān)注

    2

    文章

    285

    瀏覽量

    43688
  • 信號(hào)處理
    +關(guān)注

    關(guān)注

    49

    文章

    1076

    瀏覽量

    104620
  • 存儲(chǔ)芯片
    +關(guān)注

    關(guān)注

    11

    文章

    967

    瀏覽量

    44554
  • MIG
    MIG
    +關(guān)注

    關(guān)注

    0

    文章

    13

    瀏覽量

    11232
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    基于Arty Artix-35T FPGA開發(fā)板的DDR3mig介紹

    講解xilinx FPGA 使用mig IP對(duì)DDR3讀寫控制,旨在讓大家更快的學(xué)習(xí)和應(yīng)用DDR3
    的頭像 發(fā)表于 01-01 10:09 ?5011次閱讀
    基于Arty Artix-35T FPGA開發(fā)板的<b class='flag-5'>DDR3</b>和<b class='flag-5'>mig</b>介紹

    mig生成的DDRIP的問題

    請(qǐng)教各位大神,小弟剛學(xué)FPGA,現(xiàn)在在用spartan-3E的板子,想用上面的DDR SDRAM進(jìn)行簡單的讀寫,用MIG生成DDR
    發(fā)表于 06-20 20:43

    cyclone V控制DDR3讀寫,quartusII配置DDR3 ip后,如何調(diào)用實(shí)現(xiàn)DDR3讀寫呢,謝謝

    DDR3IP核配置完畢后,產(chǎn)生了好多文件,請(qǐng)問如何調(diào)用這些文件實(shí)現(xiàn)DDR3讀寫呢?看了一些文章,說是要等到local_init_done為高電平后,才能進(jìn)行
    發(fā)表于 01-14 18:15

    MIG IP管腳分配問題

    求助大神?。。PGA對(duì)于DDR3讀寫,F(xiàn)PGA是virtex6系列配置MIG IP 時(shí),需要管腳分配1.原理圖上dm是直接接地,管腳分配
    發(fā)表于 03-16 18:45

    基于FPGA的DDR3 SDRAM控制器的設(shè)計(jì)與優(yōu)化

    不同使用情形下DDR3的帶寬利用率來尋求具有較高效率的讀寫控制方式。本測(cè)試計(jì)算帶寬效率的方式是,向IP
    發(fā)表于 08-02 09:34

    Xilinx:K7 DDR3 IP核配置教程

    ”。13.點(diǎn)擊“Generate”生成MIG控制器。四、生成文檔點(diǎn)擊“Generate”,生成MIG控制器相關(guān)的設(shè)計(jì)文檔。以上就是基于Xilinx 的K7
    發(fā)表于 12-19 14:36

    完成DDR3校準(zhǔn)的MIG IP失敗的原因?

    大家好 我的問題是DDR3校準(zhǔn)完成失敗。調(diào)試結(jié)果:dbg_wrcal_err = 1,通過波形,我們可以看到寫入模式不匹配。 我的問題是MIG IP Core配置中是否有任何參數(shù)可以調(diào)整它?或者我
    發(fā)表于 07-23 10:09

    ddr3讀寫分離方法有哪些?

    DDR3是目前DDR的主流產(chǎn)品,DDR3讀寫分離作為DDR最基本也是最常用的部分,本文主要闡述DDR3
    的頭像 發(fā)表于 11-06 13:44 ?9269次閱讀
    <b class='flag-5'>ddr3</b>的<b class='flag-5'>讀寫</b>分離方法有哪些?

    對(duì)DDR3讀寫狀態(tài)機(jī)進(jìn)行設(shè)計(jì)與優(yōu)化并對(duì)DDR3利用率進(jìn)行了測(cè)試與分析

    為解決超高速采集系統(tǒng)中的數(shù)據(jù)緩存問題,文中基于Xilinx Kintex-7 FPGA MIG_v1.9 IP進(jìn)行了DDR3 SDRAM控制
    發(fā)表于 11-16 14:36 ?2.5w次閱讀
    對(duì)<b class='flag-5'>DDR3</b><b class='flag-5'>讀寫</b>狀態(tài)機(jī)進(jìn)行設(shè)計(jì)與優(yōu)化并對(duì)<b class='flag-5'>DDR3</b>利用率進(jìn)行了<b class='flag-5'>測(cè)試</b>與分析

    基于FPGA的DDR3多端口讀寫存儲(chǔ)管理的設(shè)計(jì)與實(shí)現(xiàn)

    為了解決視頻圖形顯示系統(tǒng)中多個(gè)端口訪問DDR3的數(shù)據(jù)存儲(chǔ)沖突,設(shè)計(jì)并實(shí)現(xiàn)了基于FPGA的DDR3存儲(chǔ)管理系統(tǒng)。DDR3存儲(chǔ)器控制模塊使用MIG
    發(fā)表于 11-18 18:51 ?7857次閱讀
    基于FPGA的<b class='flag-5'>DDR3</b>多端口<b class='flag-5'>讀寫</b>存儲(chǔ)管理的設(shè)計(jì)與實(shí)現(xiàn)

    mig接口的讀寫時(shí)序

    對(duì)于migDDR3/DDR2 SDRAM的讀寫時(shí)序我們不需要了解太多,交給mig就可以了。
    發(fā)表于 03-03 11:11 ?6773次閱讀
    <b class='flag-5'>mig</b>接口的<b class='flag-5'>讀寫</b>時(shí)序

    關(guān)于Virtex7上DDR3測(cè)試例程詳解

    這篇文章我們講一下Virtex7上DDR3測(cè)試例程,Vivado也提供了一個(gè)DDR的example,但卻是純Verilog代碼,比較復(fù)雜,這里我們把DDR3
    的頭像 發(fā)表于 05-02 09:05 ?4026次閱讀
    <b class='flag-5'>關(guān)于</b>Virtex7上<b class='flag-5'>DDR3</b>的<b class='flag-5'>測(cè)試</b>例程詳解

    Virtex7上DDR3測(cè)試例程

    ??這篇文章我們講一下Virtex7上DDR3測(cè)試例程,Vivado也提供了一個(gè)DDR的example,但卻是純Verilog代碼,比較復(fù)雜,這里我們把DDR3
    的頭像 發(fā)表于 08-16 10:28 ?2826次閱讀

    基于AXI總線的DDR3讀寫測(cè)試

    本文開源一個(gè)FPGA項(xiàng)目:基于AXI總線的DDR3讀寫。之前的一篇文章介紹了DDR3簡單用戶接口的讀寫方式:《DDR3
    的頭像 發(fā)表于 09-01 16:20 ?6771次閱讀
    基于AXI總線的<b class='flag-5'>DDR3</b><b class='flag-5'>讀寫</b><b class='flag-5'>測(cè)試</b>

    基于FPGA的DDR3讀寫測(cè)試

    本文介紹一個(gè)FPGA開源項(xiàng)目:DDR3讀寫。該工程基于MIG控制IP核對(duì)FPGA DDR3實(shí)現(xiàn)
    的頭像 發(fā)表于 09-01 16:23 ?2956次閱讀
    基于FPGA的<b class='flag-5'>DDR3</b><b class='flag-5'>讀寫</b><b class='flag-5'>測(cè)試</b>