实现3x3卷积的手写FIFO

例子来自米联科例程,

因为不同平台之间调IP会变麻烦,重新阅读手册太花时间了(虽然我觉得fifo这种常用IP尽量掌握为好),使用手写的FIFO可以节约开发的流程。

通过这个例子也可以优化自己所使用的手写FIFO。

cpp 复制代码
//  by CrazyBird
module Line_Shift_RAM_8Bit
#(
    parameter DATA_WIDTH = 8    ,
    parameter ADDR_WIDTH = 11   ,
    parameter DATA_DEPTH = 1280 ,
    parameter DELAY_NUM  = 0
)(
    input  wire                     clk     ,
    input  wire                     rst_n   ,
    input  wire                     clken   ,
    input  wire [DATA_WIDTH-1:0]    din     ,   
    output wire [DATA_WIDTH-1:0]    dout    
);
//----------------------------------------------------------------------
localparam BRAM_DEPTH = DATA_DEPTH + 1;
localparam INIT_ADDR  = DATA_DEPTH - DELAY_NUM;

//----------------------------------------------------------------------
reg             [ADDR_WIDTH-1:0]    bram_waddr;
reg             [ADDR_WIDTH-1:0]    bram_raddr;

always @(posedge clk or negedge rst_n)
begin
    if(rst_n == 1'b0)
    begin
        bram_waddr <= INIT_ADDR;
        bram_raddr <= 0;
    end
    else
    begin
        if(clken == 1'b1)
        begin
            if(bram_waddr < DATA_DEPTH)
                bram_waddr <= bram_waddr + 1'b1;
            else
                bram_waddr <= 0;
            if(bram_raddr < DATA_DEPTH)
                bram_raddr <= bram_raddr + 1'b1;
            else
                bram_raddr <= 0;
        end
        else
        begin
            bram_waddr <= bram_waddr;
            bram_raddr <= bram_raddr;
        end
    end
end




//----------------------------------------------------------------------
wire            [DATA_WIDTH-1:0]    bram_wdata;
wire                                bram_wenb;
reg            [DATA_WIDTH-1:0]    bram_rdata;

assign bram_wdata = din;
assign bram_wenb  = clken;


localparam ADDR_MSB = 2 ** ADDR_WIDTH - 1; 
reg 	[DATA_WIDTH-1:0] 	r_ram[ADDR_MSB:0]; 

always @(posedge clk) begin
	if(bram_wenb) begin
		r_ram[bram_waddr] <= bram_wdata; 
	end else begin
	end
end
always @(posedge clk) begin
	bram_rdata <= r_ram[bram_raddr]; 
end


assign dout = bram_rdata;

endmodule
相关推荐
尤老师FPGA18 分钟前
HDMI数据的接收发送实验(十四)
fpga开发
Szime10 小时前
全球首创10位40GSPS超宽带ADC选型参考:国产超高速ADC深智微科技选型支持
科技·单片机·嵌入式硬件·fpga开发
Szime15 小时前
AD9653、AD9253、AD9694国产替代怎么评估?深智微科技整理ADI高速ADC选型思路
科技·fpga开发
FPGA小徐16 小时前
Xilinx zynq-7000系列FPGA移植Linux操作系统详细教程
fpga开发·架构
Zebros18 小时前
LC无线无源传感器读取方案设计研究综述
fpga开发·信息与通信·射频工程
国科安芯19 小时前
商业航天通信载荷数字处理单元供电架构研究——基于ASP7A84AS的高精度低压差线性稳压器技术分析
前端·单片机·嵌入式硬件·fpga开发·架构·安全性测试
Szime21 小时前
AD9653 国产替代怎么选?四通道 16 位 125MSPS ADC 选型参考
嵌入式硬件·fpga开发
cjie22121 小时前
常用视频缩放架构
fpga开发·架构
尤老师FPGA1 天前
LVDS系列51:Xilinx Ultrascale系 ADC LVDS接口参考方法(十三)
fpga开发
Eloudy1 天前
NVIDIA Holoscan Sensor Bridge 简介
fpga开发·量子计算