|
FPGA中(zhōng)的(de)二(èr)維數組其实不(bù)是(shì)真(zhēn)正(zhèng)意(yì)義上(shàng)的(de)數組,而(ér)是(shì)由(yóu)多(duō)个(gè)寄存器組成(chéng)的(de)ROM或(huò)RAM。 具體(tǐ)来(lái)说(shuō),就(jiù)是(shì)可(kě)以(yǐ)将內(nèi)存宣稱为(wèi)一(yī)个(gè)reg類(lèi)型的(de)數組,这(zhè)个(gè)數組中(zhōng)的(de)任何一(yī)个(gè)單元(yuán)都可(kě)以(yǐ)通(tòng)过(guò)一(yī)个(gè)下(xià)标(biāo)去(qù)訪問(wèn)。 这(zhè)樣(yàng)的(de)數組定(dìng)義方(fāng)式如(rú)下(xià): reg [wordsize : 0] memory_name [0 : memorysize]; 其中(zhōng)[wordsize : 0]是(shì)內(nèi)存的(de)宽(kuān)度(dù),而(ér) [0 : memorysize]則是(shì)內(nèi)存的(de)深度(dù)(也(yě)就(jiù)是(shì)有(yǒu)多(duō)少(shǎo)存儲單元(yuán))。 如(rú)果(guǒ)要(yào)存儲一(yī)个(gè)值到(dào)某个(gè)單元(yuán)中(zhōng)去(qù),可(kě)以(yǐ)这(zhè)樣(yàng)做: memory_name [address] = data_in; 如(rú)果(guǒ)要(yào)读(dú)取(qǔ)每个(gè)單元(yuán)的(de)值,可(kě)以(yǐ)这(zhè)麼(me)做: data_out = memory_name [address]; 由(yóu)于(yú)Verilog不(bù)允许读(dú)/写一(yī)个(gè)位,所(suǒ)以(yǐ)需要(yào)读(dú)写一(yī)位或(huò)者(zhě)多(duō)个(gè)位时(shí)的(de)操作要(yào)麻(má)煩點(diǎn): data_out = memory_name [address]; data_out_0 = data_out [0]; 这(zhè)里(lǐ)首先(xiān)從一(yī)个(gè)單元(yuán)读(dú)出(chū)數據(jù),然後(hòu)再取(qǔ)出(chū)數據(jù)的(de)某一(yī)位的(de)值。 初始化(huà)內(nèi)存 初始化(huà)內(nèi)存有(yǒu)多(duō)種(zhǒng)方(fāng)式,这(zhè)里(lǐ)介紹的(de)是(shì)使用(yòng)$readmemb和(hé)$readmemh系(xì)統任务来(lái)講保存在(zài)文(wén)件(jiàn)中(zhōng)得數據(jù)填充到(dào)內(nèi)存單元(yuán)中(zhōng)去(qù)。 $readmemb和(hé)$readmemh是(shì)類(lèi)似得,只(zhī)不(bù)过(guò)$readmemb用(yòng)于(yú)內(nèi)存得二(èr)進(jìn)制表(biǎo)示, $readmemh用(yòng)于(yú)內(nèi)存內(nèi)容得十(shí)六(liù)進(jìn)制表(biǎo)示。这(zhè)里(lǐ)以(yǐ)$readmemh系(xì)統任务来(lái)介紹
語(yǔ)法:
$readmemh("file_name", mem_array, start_addr, stop_addr);
注意(yì)的(de)是(shì):file_name是(shì)包(bāo)含數據(jù)的(de)文(wén)本(běn)文(wén)件(jiàn)名,mem_array是(shì)要(yào)初始化(huà)的(de)內(nèi)存單元(yuán)數組名,
start_addr 和(hé) stop_addr是(shì)可(kě)選的(de),指示要(yào)初始化(huà)單元(yuán)的(de)起始地(dì)址和(hé)結束(shù)地(dì)址。
|








