纯Verilog实现FIFO用于3X3卷积行缓存

`timescale 1ns/1ps
module fifo#(
    parameter DATA_WIDTH = 8,
    parameter DATA_DEPTH = 1920
)
(
    input  wire                         i_clk,
    input  wire                         i_rstn,

    input  wire                         wr_en,
    input  wire [DATA_WIDTH - 1 : 0]    wr_data,
    output wire                         wr_full,

    input  wire                         rd_en,

    output wire                         rd_empty,
    output reg [DATA_WIDTH - 1 : 0]    rd_data
);

//define ram
(*ram_style = "block" *) reg [DATA_WIDTH - 1 : 0] fifo_buffer [DATA_DEPTH - 1 : 0];

integer i;

initial begin
    for(i=0;i<DATA_WIDTH;i=i+1) begin
        fifo_buffer[i] <= 0;
    end
end

reg     [$clog2(DATA_DEPTH) - 1 : 0]    wr_pointer = 0;//form end to read data
reg     [$clog2(DATA_DEPTH) - 1 : 0]    rd_pointer = 0;
reg    [DATA_WIDTH - 1 : 0]            rd_data_out;

always @(posedge i_clk or negedge i_rstn) begin
    if(!i_rstn) begin
        wr_pointer <= 0;
    end
    else begin
        if(wr_en) begin
            if(wr_pointer == DATA_DEPTH - 1) begin
                wr_pointer <= 0;
            end
            else begin
                wr_pointer <= wr_pointer + 1'd1;
            end
        end
        else begin
            wr_pointer <= 0;
        end
    end
end

always @(posedge i_clk or negedge i_rstn) begin
    if(!i_rstn) begin
        rd_pointer <= 0;
    end
    else begin
        if(rd_en) begin
            if(rd_pointer == DATA_DEPTH - 1) begin
                rd_pointer <= 0;
            end
            else begin
                rd_pointer <= rd_pointer + 1'd1;
            end
        end
        else begin
            rd_pointer <= 0;
        end
    end
end

always @(posedge i_clk or negedge i_rstn) begin
    if(!i_rstn) begin
        fifo_buffer[wr_pointer] <= 0;
    end
    else begin
        if(wr_en) begin
            fifo_buffer[wr_pointer] <= wr_data;
        end
        else begin
            fifo_buffer[wr_pointer] <= fifo_buffer[wr_pointer];
        end
    end
end

always @(posedge i_clk or negedge i_rstn) begin
    if(!i_rstn) begin
        rd_data_out <= 0;
    end
    else begin
        if(rd_en) begin
            rd_data_out <= fifo_buffer[wr_pointer];
        end
        else begin
            rd_data_out <= 0;
        end
    end
end

always @(posedge i_clk or negedge i_rstn) begin
    if(!i_rstn) begin
        rd_data <= 0;
    end
    else begin
        rd_data <= rd_data_out;
    end
end
endmodule

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是使用Verilog语言实现3x3矩阵的FIFO队列的代码示例: ```verilog module fifo_3x3_matrix ( input clk, // 时钟信号 input rst_n, // 复位信号,低电平有效 input wr_en, // 写使能信号 input [7:0] din, // 写入数据 input rd_en, // 读使能信号 output [7:0] dout // 读出数据 ); parameter WIDTH = 8; // 数据位宽 parameter SIZE = 9; // FIFO队列大小,即3x3矩阵元素个数 reg [WIDTH-1:0] fifo [SIZE-1:0]; // FIFO队列 reg wr_ptr, rd_ptr; // 写指针和读指针 // 写操作 always @(posedge clk) begin if (rst_n == 1'b0) begin wr_ptr <= 0; end else if (wr_en == 1'b1) begin fifo[wr_ptr] <= din; wr_ptr <= (wr_ptr == SIZE-1) ? 0 : wr_ptr+1; end end // 读操作 always @(posedge clk) begin if (rst_n == 1'b0) begin rd_ptr <= 0; end else if (rd_en == 1'b1) begin dout <= fifo[rd_ptr]; rd_ptr <= (rd_ptr == SIZE-1) ? 0 : rd_ptr+1; end end endmodule ``` 以上代码实现了一个带有读写指针的FIFO队列,可以存储8位宽的数据。在这个FIFO队列中,可以将9个元素按优先顺序写入队列中,并逐个读取出来填充到3x3矩阵中。 下面是使用Verilog语言实现3x3矩阵的代码示例: ```verilog module matrix_3x3 ( input clk, // 时钟信号 input rst_n, // 复位信号,低电平有效 input [7:0] din, // 写入数据 input wr_en, // 写使能信号 input rd_en, // 读使能信号 output [7:0] dout // 读出数据 ); parameter WIDTH = 8; // 数据位宽 parameter SIZE = 9; // FIFO队列大小,即3x3矩阵元素个数 wire rd_en_fifo = (wr_en == 1'b1) ? 1'b1 : rd_en; // FIFO读使能信号 wire wr_en_fifo = (rd_en == 1'b1) ? 1'b1 : wr_en; // FIFO写使能信号 fifo_3x3_matrix fifo ( .clk(clk), .rst_n(rst_n), .din(din), .wr_en(wr_en_fifo), .rd_en(rd_en_fifo), .dout(dout) ); reg [WIDTH-1:0] matrix [2:0][2:0]; // 3x3矩阵 // 写操作 always @(posedge clk) begin if (rst_n == 1'b0) begin matrix[0][0] <= 8'h00; matrix[0][1] <= 8'h00; matrix[0][2] <= 8'h00; matrix[1][0] <= 8'h00; matrix[1][1] <= 8'h00; matrix[1][2] <= 8'h00; matrix[2][0] <= 8'h00; matrix[2][1] <= 8'h00; matrix[2][2] <= 8'h00; end else if (wr_en == 1'b1) begin case (fifo.rd_ptr) 0: matrix[0][0] <= din; 1: matrix[0][1] <= din; 2: matrix[0][2] <= din; 3: matrix[1][0] <= din; 4: matrix[1][1] <= din; 5: matrix[1][2] <= din; 6: matrix[2][0] <= din; 7: matrix[2][1] <= din; 8: matrix[2][2] <= din; endcase end end // 读操作 always @(posedge clk) begin if (rst_n == 1'b0) begin dout <= 8'h00; end else if (rd_en == 1'b1) begin case ({fifo.wr_ptr, fifo.rd_ptr}) 9'b000000000: dout <= matrix[0][0]; 9'b000000001: dout <= matrix[0][1]; 9'b000000010: dout <= matrix[0][2]; 9'b000000011: dout <= matrix[1][0]; 9'b000000100: dout <= matrix[1][1]; 9'b000000101: dout <= matrix[1][2]; 9'b000000110: dout <= matrix[2][0]; 9'b000000111: dout <= matrix[2][1]; 9'b000001000: dout <= matrix[2][2]; default: dout <= 8'h00; endcase end end endmodule ``` 以上代码实现了一个可以存储3x3矩阵的模块,其中使用了上面实现FIFO队列。在这个模块中,可以将9个元素按优先顺序写入FIFO队列中,并逐个读取出来填充到3x3矩阵中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值