FPGA中的二维数组其实不是真正意义上的数组,而是由多个寄存器组成的ROM或RAM。 具体来说,就是可以将内存宣称为一个reg类型的数组,这个数组中的任何一个单元都可以通过一个下标去访问。 这样的数组定义方式如下: reg [wordsize : 0] memory_name [0 : memorysize]; 其中[wordsize : 0]是内存的宽度,而 [0 : memorysize]则是内存的深度(也就是有多少存储单元)。 如果要存储一个值到某个单元中去,可以这样做: memory_name [address] = data_in; 如果要读取每个单元的值,可以这么做: data_out = memory_name [address]; 由于Verilog不允许读/写一个位,所以需要读写一位或者多个位时的操作要麻烦点: data_out = memory_name [address]; data_out_0 = data_out [0]; 这里首先从一个单元读出数据,然后再取出数据的某一位的值。 初始化内存 初始化内存有多种方式,这里介绍的是使用$readmemb和$readmemh系统任务来讲保存在文件中得数据填充到内存单元中去。 $readmemb和$readmemh是类似得,只不过$readmemb用于内存得二进制表示, $readmemh用于内存内容得十六进制表示。这里以$readmemh系统任务来介绍
语法:
$readmemh("file_name", mem_array, start_addr, stop_addr);
注意的是:file_name是包含数据的文本文件名,mem_array是要初始化的内存单元数组名,
start_addr 和 stop_addr是可选的,指示要初始化单元的起始地址和结束地址。 |