一、引言
手写了一个ROM,用于ADC或者DAC的寄存器配置。DAC出来的波形总是有两个对称的小肩膀,找不到原因。时序没有报错,但是有延迟。之前听同事说他们也遇到过这样的问题,是时序问题。所以,我也想试一下,或许是手写的IP核造成了隐藏的时序问题,从而产生小肩膀。
vivado中提示的时序延迟如下图所示:
DAC出来的波形,两边的小肩膀如下图所示:
二、手写ROM改IP核
1. ROM IP核简介
ROM是只读存储器(Read-Only Memory)的简称,是一种只能读出事先所存数据的固态半导体存储器。其特性是一旦储存资料就无法再将之改变或删除,且资料不会因为电源关闭而消失。
用IP核生成的ROM、RAM都存在于FPGA内部的RAM中,掉电都会丢失。而用IP核生成的ROM只是提前添加了数据文件。在FPGA运行的时候,通过添加数据文件给ROM进行初始化,才使得IP核生成的ROM模块像一个非遗失性储存器。通过修改给ROM的数据文件,就能修改ROM里面的内容。
在Vivado中,ROM的IP核生成需要初始化文件,这个初始化的文件就是.coe文件(在Altera产品中这个初始化文件好像是.mif)。当coe文件中的数值少时可以手动编写,当需要的数据量大时,可以借助Matlab生成。这里我们原来已经有数据了,也不是很多,所以手写.ceo文件。
2. 准备好coe文件
把配好的寄存器地址和寄存器值写成coe文件,格式如下图所示。
memory_initialization_radix = 16; //16进制
memory_initialization_vector = //初始化数据
0800100001,
0800100000,
0C000000C1,
0C00103200,
0800100004
3. 生成IP核并导入coe文件
废话不多说,直接上图操作:
选择IP核
选择Single Port Rom
根据coe文件选择位宽和深度,深度在这里其实就是指向量的个数,也就是数据的个数,再具体到我这个例子就是指我要配置的寄存器的个数。
加载coe文件
最后点击右下角的OK,生成IP核。
3. 进行例化使用
最后, 在需要用到的地方进行例化使用。