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第一個例子定義address為std_logic_vector
在用兩個函式
to_integer 與
unsigned來轉注意要使用use IEEE.NUMERIC_STD.ALL;
其他例子定義address為natural 所以不用另外加入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
使用者寫入address與data後,再寫入要讀的位址,讀的位址可以隨機,讀寫使用相同clock
Ram的寬度為資料寬,深度為2的4次方(0
TO 2**ADDR_WIDTH)
Single
Port RAM, 使用者寫入address與data,
其會及時的被讀出,使用者不需要輸入讀的位址
Dual
Clock Synchronous Ram
使用者寫入address與data後,再寫入要讀的位址,讀的位址可以隨機,讀寫使用不同clock
第一種ram的address也可以改用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");
...
在Xilinx的ram當中可以分成兩種Block
RAM 與
Distributed
RAM,在每個系列中可以使用的大小都不一樣
Distributed
RAM :
表示這種RAM是均勻散佈在FPGA的CLB中,
通常它們的資料寬度都為1
bit,如果要應用在較大的設計上,就必須把這些分散的ram連起來(形成parallel
array),這樣就會產生較大的delay因此Distributed
RAM通常用在小的RAM,其對於timing的要求不高的設計當中
Block
RAM :
容量較大,通常會在kbits的等級,
速度較快,但是如果只使用到一部分的bram會造成系統資源的浪費,但如果fpga的bram全部被用光也會對性能造成影響,需要在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
沒有留言:
張貼留言