Verilog——Function的具体实例:内部RAM读写操作

Function注意事项

  • function只能对组合逻辑进行设计,综合得到是组合逻辑单元;
  • function只有一个输出变量,其定义由function名称默认给出;
  • function的名称可以包含位宽,如果没有位宽则输出变量位宽为1bit;
  • function可以有多个输入变量,定义方式与模块(module)的输入变量定义类似;
  • function内部逻辑操作在begin和end之间进行;
  • function可以进行迭代操作;
  • 其他文件的function也可以调用,调用方法见Verilog function 函数

一个Function实例

  • 主要功能:
    使用Function实现了对内部RAM寄存器的读写操作。
`timescale 1ns/1ps

module ram(
    input                   clk50M          ,
    input                   rst_n           ,
    input           [3:0]   address         ,//地址
    input                   wr_en           ,//写使能
    input           [7:0]   wr_data         ,//写数据
    input                   rd_en           ,//读使能
    output  reg     [7:0]   rd_data          //读数据
);

reg     [7:0]       reg0, reg1, reg2, reg3  ;
reg     [7:0]       rd_data_nex             ;

//FUNCTION, reg_nex
function [7:0] reg_nex(
    input   [3:0]   address         ,
    input   [3:0]   reg_offset      ,
    input           wr_en           ,
    input   [7:0]   wr_data         ,
    input   [7:0]   dev_reg
);
    assign reg_nex = ((address == reg_offset) && wr_en) ? wr_data : dev_reg;
endfunction

//reg0, reg1, reg2, reg3, 
always @(posedge clk50M or negedge rst_n) begin
    if(~rst_n) begin
        reg0 <= 'd0;
        reg1 <= 'd0;
        reg2 <= 'd0;
        reg3 <= 'd0;
        rd_data <= 'd0;
    end
    else begin
        reg0 <= reg_nex(address, 4'b0000, wr_en, wr_data, reg0);
        reg1 <= reg_nex(address, 4'b0001, wr_en, wr_data, reg1);
        reg2 <= reg_nex(address, 4'b0010, wr_en, wr_data, reg2);
        reg3 <= reg_nex(address, 4'b0011, wr_en, wr_data, reg3);
        rd_data <= rd_data_nex;
    end
end

//rd_data_nex
always @(*) begin
    rd_data_nex = rd_data;
    if(rd_en) begin
        case(1'b1)
            (address == 4'b0000): rd_data_nex = reg0;
            (address == 4'b0001): rd_data_nex = reg1;
            (address == 4'b0010): rd_data_nex = reg2;
            (address == 4'b0011): rd_data_nex = reg3;
        endcase
    end
end

endmodule
posted @ 2022-04-19 14:41  fxz_abc  阅读(331)  评论(0编辑  收藏  举报