【教程】Verilog中數(shù)組的表示
FPGA中的二維數(shù)組其實不是真正意義上的數(shù)組,而是由多個寄存器組成的ROM或RAM。
具體來說,就是可以將內(nèi)存宣稱為一個reg類型的數(shù)組,這個數(shù)組中的任何一個單元都可以通過一個下標(biāo)去訪問。
這樣的數(shù)組定義方式如下:
reg [wordsize : 0]??memory_name [0 : memorysize];
其中[wordsize : 0]是內(nèi)存的寬度,而 [0 : memorysize]則是內(nèi)存的深度(也就是有多少存儲單元)。
如果要存儲一個值到某個單元中去,可以這樣做:
memory_name [address] = data_in;
如果要讀取每個單元的值,可以這么做:
data_out = memory_name [address];
由于Verilog不允許讀/寫一個位,所以需要讀寫一位或者多個位時的操作要麻煩點:
data_out = memory_name [address];
data_out_0 = data_out [0];
這里首先從一個單元讀出數(shù)據(jù),然后再取出數(shù)據(jù)的某一位的值。
初始化內(nèi)存
初始化內(nèi)存有多種方式,這里介紹的是使用$readmemb和$readmemh系統(tǒng)任務(wù)來講保存在文件中得數(shù)據(jù)填充到內(nèi)存單元中去。
$readmemb和$readmemh是類似得,只不過$readmemb用于內(nèi)存得二進制表示,
$readmemh用于內(nèi)存內(nèi)容得十六進制表示。這里以$readmemh系統(tǒng)任務(wù)來介紹
語法:$readmemh("file_name", mem_array, start_addr, stop_addr);
注意的是:file_name是包含數(shù)據(jù)的文本文件名,mem_array是要初始化的內(nèi)存單元數(shù)組名,
start_addr 和 stop_addr是可選的,指示要初始化單元的起始地址和結(jié)束地址。
如果對寄存器組進行在復(fù)位得時候進行置0,可以參考如何往寄存器組中寫入數(shù)據(jù)