Verilog中的二維數組
Verilog中提供了兩維數組來幫助我們建立內存的行為模型。具體來說,就是可以將內存宣稱為一個reg類型的數組,這個數組中的任何一個單元都可以通過一個下標去訪問。這樣的數組的定義方式如下:
reg [wordsize : 0] array_name [0 : arraysize];
例如:
reg [7:0] my_memory [0:255];
其中 [7:0] 是內存的寬度,而[0:255]則是內存的深度(也就是有多少存儲單元),其中寬度為8位,深度為256。地址0對應著數組中的0存儲單元。
如果要存儲一個值到某個單元中去,可以這樣做:
my_memory [address] = data_in;
而如果要從某個單元讀出值,可以這么做:
data_out = my_memory [address];
但要是只需要讀一位或者多個位,就要麻煩一點,因為Verilog不允許讀/寫一個位。這時,就需要使用一個變量轉換一下:(wolf點評:菜鳥易犯的錯誤,注意!)
例如:
data_out = my_memory[address];
data_out_it_0 = data_out[0];
這里首先從一個單元里面讀出數據,然后再取出讀出的數據的某一位的值。
初始化內存
初始化內存有多種方式,這里介紹的是使用readmemb和readmemb和readmemh系統任務來將保存在文件中的數據填充到內存單元中去。readmemb和readmemb和readmemh是類似的,只不過readmemb用于內存的二進制表示,而readmemb用于內存的二進制表示,而readmemh則用于內存內容的16進制表示。這里 以$readmemh系統任務來介紹。
語法
$readmemh(“file_name”, mem_array, start_addr, stop_addr);
注意的是:
file_name是包含數據的文本文件名,mem_array是要初始化的內存單元數組名,start_addr 和 stop_addr是可選的,指示要初始化單元的起始地址和結束地址。
下面是一個簡單的例子:
module memory ();
reg [7:0] my_memory [0:255];
initial begin
$readmemh(“memory.list”, my_memory);
end
endmodule
這里使用內存文件memory.list來初始化my_memory數組。
而下面就是一個內存文件的例子。
// Comments are allowed (wolf點評:段注釋也可以,空行空格不影響!)
CC // This is first address i.e 8‘h00
AA // This is second address i.e 8’h01
@55 // Jump to new address 8‘h55
5A // This is address 8’h55
69 // This is address 8‘h56
對于內存文件,要注意的是下列幾點:
a、注釋標記//在內存文件中是被允許的;
b、使用@符號將跳到新的目標地址,沒有@符號就表示地址將順序遞增。
關于這個系統任務,有下列常見的用法:
1、順序初始化所有的數組單元;
這種情況下,可以使用@符號來指示地址,也可以不使用它,而只在每一行存放要存放的數據。
這樣數據將順序按地址遞增存放,從0地址開始。
2、只初始化部分的數組單元;
這種情況下,可以使用@符號來指示下一個要初始化的地址,然后對該地址單元進行初始化。例
如下列的內存文件就只初始化8’h00,8‘h01,8’h55和8‘h564個內存地址單元。
// Comments are allowed
CC // This is first address i.e 8’h00
AA // This is second address i.e 8‘h01
@55 // Jump to new address 8’h55
5A // This is address 8‘h55
69 // This is address 8’h56
3、只初始化數組的地址區間的一部分單元。
這個時候,還可以使用$readmemh任務的start_addr 和 stop_addr選項來指定初始化的范圍。
例如,只初始化100到104這5個單元,就可以這么做:
內存文件memory.list定義為:
CC
AA
55
5A
69
-
Verilog
+關注
關注
28文章
1351瀏覽量
110391 -
數組
+關注
關注
1文章
417瀏覽量
26028
原文標題:Verilog中的二維數組及其初始化
文章出處:【微信號:gh_9d70b445f494,微信公眾號:FPGA設計論壇】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
二維周期光柵結構(菱形)光波導的應用
二維掃碼頭有效掃描距離是多少,影響二維掃描頭掃碼的因素有哪些
![<b class='flag-5'>二維</b>掃碼頭有效掃描距離是多少,影響<b class='flag-5'>二維</b>掃描頭掃碼的因素有哪些](https://file1.elecfans.com/web3/M00/06/22/wKgZO2eHcO-AYC7xAAA34zSQjf4282.png)
一維/二維條碼識讀器可以應用于哪些行業?
![一<b class='flag-5'>維</b>/<b class='flag-5'>二維</b>條碼識讀器可以應用于哪些行業?](https://file1.elecfans.com/web3/M00/05/70/wKgZO2d_f2uAUBD6AACUsEpOSL8989.png)
RS232接口的二維影像掃描引擎,廣泛用在醫療設備上掃一維二維碼
![RS232接口的<b class='flag-5'>二維</b>影像掃描引擎,廣泛用在醫療設備上掃一<b class='flag-5'>維</b><b class='flag-5'>二維</b>碼](https://file1.elecfans.com/web3/M00/03/7D/wKgZO2dpGNeAS83xAAAwjNU-FX4369.png)
二維內嵌掃碼模組用于自助儲物柜,快速掃描各種一維二維條碼
![<b class='flag-5'>二維</b>內嵌掃碼模組用于自助儲物柜,快速掃描各種一<b class='flag-5'>維</b><b class='flag-5'>二維</b>條碼](https://file1.elecfans.com/web3/M00/01/07/wKgZPGdQCyCAQVnKAABZdApkdJs371.png)
指針數組和二維數組有沒有區別
工業二維碼讀碼器在電子制造業中的應用
![工業<b class='flag-5'>二維</b>碼讀碼器在電子制造業<b class='flag-5'>中</b>的應用](https://file1.elecfans.com/web1/M00/F4/FD/wKgaoWc0YNaALXezAADNGUSAo34714.png)
二維碼識讀設備有哪些類型
![<b class='flag-5'>二維</b>碼識讀設備有哪些類型](https://file1.elecfans.com/web2/M00/0A/5B/wKgZomcfMLaAeSZiAACWA45m3go735.png)
labview按行讀取二維數組之后再按讀取順序重新組成二維數組如何實現?
請問labview是否無法向matlab傳遞3維數組
FPC軟板二維碼標識功能?簡直是黑科技!
二維碼掃碼器/二維碼讀取設備嵌入園區閘機系統中的應用
![<b class='flag-5'>二維</b>碼掃碼器/<b class='flag-5'>二維</b>碼讀取設備嵌入園區閘機系統<b class='flag-5'>中</b>的應用](https://file1.elecfans.com/web2/M00/EC/C3/wKgaomZgCbyAOIjAAACxDkz0OQk688.png)
技術|二維PDOA平面定位方案
![技術|<b class='flag-5'>二維</b>PDOA平面定位方案](https://file1.elecfans.com/web2/M00/EC/7B/wKgaomZeuc6AZ8ZjAACBaHn6et8796.png)
評論