数字ic基础-FPGA中的memory and block ram-FPGA常见问题社区-FPGA CPLD-ChipDebug

数字ic基础-FPGA中的memory and block ram

 

ram:random access memory

FPGA中存储数据的几种方式

1.DFF 也就是D触发器,但只保存1bit,数据大了浪费资源

2.利用look up table进行分布式存储(distributed RAM)

3.block ram(主要)

4.on ship memory(片上存储)

对于block ram(分为单端口双端口),可以从总线读取,甚至可以使用单独的始终进行读取写入操作以确保不会使用掩码和时钟线

一个简单的双端口memory例子

图片[1]-数字ic基础-FPGA中的memory and block ram-FPGA常见问题社区-FPGA CPLD-ChipDebug

w_addr:应该是记录每个元素的地址,一共16个元素,所以w_addr是四位的。

w_data:因为每个元素8bit,所以写入数据的总线需要8位。

tip:

1.这个即使只申请了这么一点内存,但是也会占用掉FPGA中的一整块block ram。

2.这个例子中,掩码与读写时钟使能线没写。

3.看pcf文件,并没有写block ram的约束,所以目前猜不需要申请,只要verilog中写了reg,会自动给你申请一个block ram?

来到testbench环节

1.#5,代表延迟周期。这里不是5个周期,这里应该要根据FPGA的晶振频率算,具体怎么算待更新。clk = ~clk,这样就模拟时钟了。

2.如果没有写入数据,直接读取,读出来的是0或者是其它乱七八糟的。

3.每次对读地址总线,读数值总线,写地址总线,写数值总线赋值以后,都要把他们重置为0。

图片[2]-数字ic基础-FPGA中的memory and block ram-FPGA常见问题社区-FPGA CPLD-ChipDebug

这里2*41.67应该就是延迟一个周期,41.67如何算出待看上一个视频学习。

5.如何在初始化的时候设置ram block的值防止读取出来的是垃圾数据呢?创建一个如下的文件,可以用空格,逗号,回车间隔数据

图片[3]-数字ic基础-FPGA中的memory and block ram-FPGA常见问题社区-FPGA CPLD-ChipDebug

在你的.v文件最后写个这个,告诉FPGA你打算在初始化(实例化)的时候就给ram block赋值好。INIT_FILE是前文的这个.txt文件

图片[4]-数字ic基础-FPGA中的memory and block ram-FPGA常见问题社区-FPGA CPLD-ChipDebug

图片[5]-数字ic基础-FPGA中的memory and block ram-FPGA常见问题社区-FPGA CPLD-ChipDebug

这么写的话,在testbench中实例化的时候顺便实例一下这个参数,如下。

图片[6]-数字ic基础-FPGA中的memory and block ram-FPGA常见问题社区-FPGA CPLD-ChipDebug

(创建只读内存的一种方式)

请登录后发表评论

    没有回复内容