zoukankan      html  css  js  c++  java
  • (转)avm_m1_writedata[15:0] 與 avm_m1_writedata[31:0]配合avm_m1_byteenable = 4'b0011意義是否一樣?

    全文地址:http://www.cnblogs.com/oomusou/archive/2008/11/20/sopc_byteenable.html

    Abstract
    開發mater ip時,我們可以自行定義data bus的寬度,也可以透過byteenable定義哪些byte有效,但這兩個方式意義是否相同呢?

    Introduction
    首先來談談為什麼會有這個需求?

    因為Nios II CPU是32 bit,所以若一切ip也是32 bit,那天下太平,一切的一切,只因為在DE2/DE2-70的SDRAM的data bus是16 bit,雖然Avalon bus提供Dynamic Bus Sizing機制,儘管master與slave的data bus寬度不一樣,SOPC Builder會自動幫我們處理,無須我們操心,但Avalon Bus在Spec也講得很清楚,當32 bit master傳到16 bit slave時,需要2個clk傳輸。也就是說,若我們的ip的data bus是32 bit,寫入SDRAM需要2個clk才能完成。

    因為DE2只有一顆SDRAM,所以也沒什麼好解決方法,但因為DE2-70有兩顆16 bit SDRAM後,狀況就不一樣了,也就是說,我們可以將兩顆SDRAM虛擬成一顆32 bit SDRAM,這樣32 bit寫入資料就僅需1個clk就可以完成!!

    要達成32 bit資料在1個clk寫入SDRAM,利用硬體的concurrency,我們可以寫2個master,同時將32 bit資料的低16 bit寫入第1顆SDRAM,將高16 bit寫入第2顆SDRAM

    但這就出現兩種寫法:
    1.master ip的data bus改成16 bit,也就是avm_m1_writedata[15:0]。
    2.master ip的data bus一樣是32 bit,但更改avm_m1_byteenable,也就是avm_m1_writedata[31:0]配合avm_m1_byteenable = 4'b0011。

    若以結果論,這兩個結果完全一樣,但問題就在,哪一個才是真的在1個clk將32 bit資料寫入SDRAM。

    第1種寫法不用懷疑,master與slave都是16 bit,不會啟動Dynamic Bus Sizing機制,1個clk完成。

    問題比較爭議的是第2種使用byteenable寫法,可能出現2種想法:
    1.在master寫入Avalon bus前就啟動byteenable,所以master只有16 bit寫入bus,slave當然只要1個clk就夠了
    2.在master寫入Avalon bus前就啟動byteenable,所以master一樣32 bit寫入bus,只是byteenable為0的byte就寫入0而以,由於仍是32 bit,所以slave還是需要2個clk

    下圖是實際用SignalTap II觀察:

    byteenable00

    在master ip中實際的code如下:

    assign avm_m1_byteenable = 4'b0011;
    assign avm_m1_writedata  = {16'h0F0F, fifo_rdq1};


    avm_m1_writedata的高16 bit,我故意填16'h0F0F,但在SignalTap中,可以發現avm_m1_writedata的高16bit都是0000,顯然byateenable奏效了,不過重點是:master寫入bus一樣是32 bit,且SDRAM的az_data讀取時,一樣需要兩個clk,也就是第二種想法,才是Avalon bus實際的運作。

    Conclusion
    由SignalTap II觀察得知,儘管結果一樣,avm_m1_writedata[15:0] 與 avm_m1_writedata[31:0]配合avm_m1_byteenable = 4'b0011在Avalon bus實際的運作,還是有些差異,要真的在1個clk將32 bit資料送進2顆SDRAM,還是得用avm_m1_writedata[15:0]配合兩個master才行,不能靠byteenable

    See Also
    (原創) 如何以32 bit的方式存取SDRAM? (SOC) (Nios II) (SOPC Builder) (DE2-70)

  • 相关阅读:
    每天写点shell——read的用法
    串口编程(一) :理论基础
    常用算法3
    Linux man C++ 库函数
    网络爬虫(一):配置selenium、pycharm(windows平台)
    C/C++ 类型内存占用详解
    git常用命令总结
    常用算法2
    本地git关联远程github
    python实现float/double的0x转化
  • 原文地址:https://www.cnblogs.com/god_like_donkey/p/1589804.html
Copyright © 2011-2022 走看看