2014年8月5日 星期二

RAM example VHDL

Reference : http://www.altera.com/support/examples/vhdl/vhdl.html

下面的例子是在altera的範例中,在xilinx有更多的範例,如下
http://www.xilinx.com/itp/xilinx10/books/docs/xst/xst.pdf

xilinx裡面的例子跟altera有個小地方不一樣
altera第一個例子定義addressstd_logic_vector 在用兩個函式 to_integer unsigned來轉
注意要使用use IEEE.NUMERIC_STD.ALL;
其他例子定義addressnatural 所以不用另外加入library也不用轉換
xilinx的例子中address定義為std_logic_vector , 只使用函式conv_integer

注意要使用use ieee.std_logic_unsigned.all;

RAM (Random-access memory) : 隨機存取記憶體
隨機存取記憶體,或稱隨機訪問存儲器,是一種在電腦中用來暫時保存資料的元件。它可以隨時讀寫,而且速度很快,通常作為作業系統或其他正在運行中的程式之臨時資料存儲媒介。它可以令電腦的容量提升,不同隨機存取記憶體也有不同的容量。

特點
所謂「隨機存取」,指的是當存儲器中的訊息被讀取或寫入時,所需要的時間與這段資訊所在的位置無關。相對的,存取順序存取(Sequential Access)存儲設備中的資訊時,其所需要的時間與位置就會有關係(如磁帶)。
當電源關閉時RAM不能保留資料。如果需要保存資料,就必須把它們寫入一個長期的儲存設備中(例如硬碟)。RAM和ROM相比,兩者的最大區別是RAM在斷電以後保存在上面的資料會自動消失,而ROM不會。

分類RAM記憶體可以進一步分為靜態隨機存取記憶體(SRAM)和動態隨機存取記憶體(DRAM)兩大類。SRAM具有快速存取的優點,但生產成本較為昂貴,一個典型的應用是快取。而DRAM由於具有較低的單位容量價格,所以被大量的採用作為系統的主記憶體。

Single Clock Synchronous RAM
Ram 使用者寫入addressdata,再寫入要讀的位址,讀的位址可以隨機,讀寫使用相同clock

Ram的寬度為資料寬,深度為24次方(0 TO 2**ADDR_WIDTH)




Single Port RAM, 使用者寫入addressdata, 其會及時的被讀出,使用者不需要輸入讀的位址




Dual Clock Synchronous Ram 使用者寫入addressdata,再寫入要讀的位址,讀的位址可以隨機,讀寫使用不同clock




第一種ramaddress也可以改用natural 的方式,這樣就不用在函式裡面再轉integer

True Dual Port Ram with a single clock

兩個Port共用同一個ram,所以注意原本的ram signal要變成shared variable
而且輸入值的方式也不是用non blocking
xilinx isim不支援variable,所以無法看到ram的波形




更正!
上面全部例子的初始化應該要改成
signal ram_block : RAM := (others => (others => '0'));


如果是block ram 可以設定初始值,也就是說可以當ROM來使用,譬如.....
...
type ram_type is array (0 to 63) of std_logic_vector(19 downto 0);
signal RAM : ram_type :=
(
X"0200A", X"00300", X"08101", X"04000", X"08601", X"0233A",
X"00300", X"08602", X"02310", X"0203B", X"08300", X"04002",
X"08201", X"00500", X"04001", X"02500", X"00340", X"00241",
X"04002", X"08300", X"08201", X"00500", X"08101", X"00602",
X"04003", X"0241E", X"00301", X"00102", X"02122", X"02021",
X"00301", X"00102", X"02222", X"04001", X"00342", X"0232B",
X"00900", X"00302", X"00102", X"04002", X"00900", X"08201",
X"02023", X"00303", X"02433", X"00301", X"04004", X"00301",
X"00102", X"02137", X"02036", X"00301", X"00102", X"02237",
X"04004", X"00304", X"04040", X"02500", X"02500", X"02500",
X"0030D", X"02341", X"08201", X"0400D");

...

Xilinxram當中可以分成兩種Block RAM Distributed RAM,在每個系列中可以使用的大小都不一樣

Distributed RAM :
表示這種RAM是均勻散佈在FPGACLB, 通常它們的資料寬度都為1 bit,如果要應用在較大的設計上,就必須把這些分散的ram連起來(形成parallel array),這樣就會產生較大的delay因此Distributed RAM通常用在小的RAM,其對於timing的要求不高的設計當中

Block RAM :
容量較大,通常會在kbits的等級, 速度較快,但是如果只使用到一部分的bram會造成系統資源的浪費,但如果fpgabram全部被用光也會對性能造成影響,需要在PR上多下點功夫

在程式裡面可以利用attribute來指定fpga用哪種ram
attribute ram_style: string;
attribute ram_style of ram : signal is "distributed";
或是
attribute ram_style: string;
attribute ram_style of ram : signal is "block";


下例使用ditributed RAM 



Synthesis report中可以看到,如果沒有加attribute,系統會自動設為BRAM


沒有留言:

張貼留言