目录
为何使用BRAM实现延时
在一些设计中需要对数据进行多个周期的延时。延时方法有多种,比如使用SLICEM生成移位寄存器,或者使用FF。但是对于大位宽、深延时的数据,使用上述方法会消耗过多资源,功耗也较大。此时使用BRAM进行延时将是更优的选择。
实现与仿真
下面是简单的实现和仿真代码。其中DELAY_LEV是需要的延时周期数,READ_LATENCY是RAM的读延时,WRITE_LATENCY是RAM写入延时(在本例中是指top文件中对输入din进行的同步处理)。需要注意的是需要将RAM的工作模式设置为Read First,这样可以保证从当前地址读出的数据是之前存储的数据,而不是写入数据。当延时模块开始工作时,在addr第一次累加并归零之前,从RAM读出的都是RAM中的初始数据。只有从第二轮地址累加开始后,从RAM读出的才是需要延时的数据。所以通过控制addr在何处归零,即可实现不同的延时级数。
由于本例中的RAM通过调用XPM库实现,所以可以进一步增加parameter参数,使延时功能参数化程度进一步提高。
`timescale 1ns / 1ps
//
// Company:
// Engineer:
// Yinye
// Create Date: 2020/02/26 22:04:12
// Design Name:
// Module Name: top
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module top
#( parameter DELAY_LEV = 10,
parameter READ_LATENCY = 1,
parameter WRITE_LATENCY = 1)
(
input clk,
input [31: 0] din,
output [31: 0] dout
);
reg [31: 0] din_r=32'h0;
reg [ 5: 0] addr=6'h0;
wire [31: 0]