列表

详情


VL53. 单端口RAM

描述

题目描述:    

设计一个单端口RAM,它有: 写接口,读接口,地址接口,时钟接口和复位;存储宽度是4位,深度128。

注意rst低电平复位

信号示意图:


输入描述

输入信号   enb, clk, rst  addr  w_data
类型 wire
在testbench中,clk为周期5ns的时钟,rst为低电平复位

输出描述

输出信号   r_data        
类型  wire

原站题解

Verilog 解法, 执行用时: 0ms, 内存消耗: 0KB, 提交时间: 2022-08-06

`timescale 1ns/1ns

module RAM_1port(
    input clk,
    input rst,
    input enb,
    input [6:0]addr,
    input  [3:0]w_data,
    output wire [3:0]r_data
);
//*************code***********//
    reg [3:0] mem[127:0];
    integer i;
    always@(posedge clk or negedge rst)begin
        if(!rst)begin
        for(i=0;i<127;i=i+1)
            mem[i]<=0;
        end
        else if(enb)begin
            mem[addr]<=w_data;
    end
    end
    assign r_data = (!enb)?mem[addr]:4'd0;
    

//*************code***********//
endmodule

Verilog 解法, 执行用时: 0ms, 内存消耗: 0KB, 提交时间: 2022-08-06

`timescale 1ns/1ns

module RAM_1port(
    input clk,
    input rst,
    input enb,
    input [6:0]addr,
    input [3:0]w_data,
    output wire [3:0]r_data
);
//*************code***********//
    reg [3:0] MEM [0:127];
    assign r_data = enb ? 0
                    :MEM[addr];
    //write
    integer i;
    always@(posedge clk,negedge rst)begin
        if(~rst)begin
            for(i=0;i<127;i=i+1)begin
                MEM[i] <= 0;
            end
        end
        else if(enb)begin
            MEM[addr] <= w_data;
        end
    end
            

//*************code***********//
endmodule

Verilog 解法, 执行用时: 0ms, 内存消耗: 0KB, 提交时间: 2022-08-06

`timescale 1ns/1ns

module RAM_1port(
    input clk,
    input rst,
    input enb,
    input [6:0]addr,
    input [3:0]w_data,
    output wire [3:0]r_data
);
//*************code***********//

    reg    [3:0]    data[127:0];
    reg    [3:0]    rdata;
    integer i;
    
    assign r_data = (!enb) ? data[addr] : 4'd0;
    
    always@(posedge clk or negedge rst) begin
        if(!rst)
            for(i=0;i<128;i=i+1)
                data[i]    <= 4'd0;
        else if(enb)
            data[addr]    <= w_data;
    end

//*************code***********//
endmodule

Verilog 解法, 执行用时: 0ms, 内存消耗: 0KB, 提交时间: 2022-08-06

`timescale 1ns/1ns

module RAM_1port(
    input clk,
    input rst,
    input enb,
    input [6:0]addr,
    input [3:0]w_data,
    output wire [3:0]r_data
);
//*************code***********//
    reg [3:0] ram [127:0];
    integer i;
    always @(posedge clk or negedge rst)
        begin
            if(!rst)
                for(i=0;i<=128;i=i+1)
                    ram[i] <=0;
             else
            ram[addr] <= enb? w_data: ram[addr];
        end
    assign r_data  = enb ? 4'd0:ram[addr];
    


//*************code***********//
endmodule

Verilog 解法, 执行用时: 0ms, 内存消耗: 0KB, 提交时间: 2022-08-06

`timescale 1ns/1ns

module RAM_1port(
    input clk,
    input rst,
    input enb,
    input [6:0]addr,
    input [3:0]w_data,
    output wire [3:0]r_data
);
//*************code***********//
    reg[3:0] ram_reg[127:0] ;//前面是位宽,后面是深度
    integer i;
    always@(posedge clk or negedge rst)begin
        if(~rst)begin
            for(i = 0; i < 128;i = i+1)begin
                ram_reg[i] <= 4'b0;
            end
        end
        else begin
            if(enb)begin//读使能有效
                ram_reg[addr] <= w_data;
            end
            else begin//不有效保持不变
                ram_reg[addr] <= ram_reg[addr];
            end
        end
    end
    assign r_data = enb ? 4'b0:ram_reg[addr];//只要不是写使能,它就认为是读的东西

//*************code***********//
endmodule

上一题