【verilog】单端口与双端口RAM设计
我的学记|刘航宇的博客

【verilog】单端口与双端口RAM设计

刘航宇
3年前发布 /正在检测是否收录...
温馨提示:
本文最后更新于2022年08月30日,已超过906天没有更新,若内容或图片失效,请留言反馈。

RAM (Random Access Memory)随机访问存储器. RAM又称随机存取存储器,存储单元的内容可按照需要随机取出或存入,且存取的速度与存储单元的位置无关。这种存储器在断电时,将丢失其存储内容,所以主要用于存储短时间使用的程序。它主要用来存储程序中用到的变量。凡是整个程序中,所用到的需要被改写的量(包括全局变量、局部变量、堆栈段等),都存储在RAM中。

单端口RAM设计

题目描述:
设计一个单端口RAM,它有: 写接口,读接口,地址接口,时钟接口和复位;存储宽度是4位,深度128。
注意rst为低电平复位
信号示意图:
图片[1] - 【verilog】单端口与双端口RAM设计 - 我的学记|刘航宇的博客
输入描述:
输入信号 enb, clk, rst addr w_data
类型 wire
在testbench中,clk为周期5ns的时钟,rst为低电平复位
输出描述:
输出信号 r_data
类型 wire

`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];
    reg [3:0] ram_data;
    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//wire
                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

双端口RAM设计

描述
实现一个深度为8,位宽为4bit的双端口RAM,数据全部初始化为0000。具有两组端口,分别用于读数据和写数据,读写操作可以同时进行。当读数据指示信号read_en有效时,通过读地址信号read_addr读取相应位置的数据read_data,并输出;当写数据指示信号write_en有效时,通过写地址信号write_addr 和写数据write-data,向对应位置写入相应的数据。
程序的信号接口图如下:
图片[2] - 【verilog】单端口与双端口RAM设计 - 我的学记|刘航宇的博客
模块的时序图如下:
图片[3] - 【verilog】单端口与双端口RAM设计 - 我的学记|刘航宇的博客
使用Verilog HDL实现以上功能并编写testbench验证。
输入描述:
clk:系统时钟信号
rst_n:异步复位信号,低电平有效
read_en,write_en:单比特信号,读/写使能信号,表示进行读/写操作
read_addr,write_addr:8比特位宽的信号,表示读/写操作对应的地址
write_data:4比特位宽的信号,在执行写操作时写入RAM的数据
输出描述:
read_data:4比特位宽的信号,在执行读操作时从RAM中读出的数据

`timescale 1ns/1ns
module ram_mod(
    input clk,
    input rst_n,
    
    input write_en,
    input [7:0]write_addr,
    input [3:0]write_data,
    
    input read_en,
    input [7:0]read_addr,
    output reg [3:0]read_data
);
    reg [3:0] ram_reg[7:0];
    integer i;
    always@(posedge clk or negedge rst_n)begin
        if(~rst_n) begin
            for(i=0;i<8;i=i+1)begin
                ram_reg[i]<=4'b0; 
            end
        end
        else begin
            if(write_en)begin
                ram_reg[write_addr]<=write_data;
            end
        end
    end
    always@(posedge clk or negedge rst_n)begin
        if(~rst_n) begin
            read_data<=4'b0; 
        end
        else begin
            if(read_en)begin
                read_data<=ram_reg[read_addr];
            end
        end
    end
endmodule
© 版权声明
THE END
喜欢就支持一下吧
点赞 0 分享 赞赏
评论 抢沙发
取消