侧边栏壁纸
    • 累计撰写 302 篇文章
    • 累计收到 527 条评论
    【verilog】单端口与双端口RAM设计
    我的学记|刘航宇的博客

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

    刘航宇
    2022-08-30 / 0 评论 / 996 阅读 / 正在检测是否收录...

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

    单端口RAM设计

    题目描述:
    设计一个单端口RAM,它有: 写接口,读接口,地址接口,时钟接口和复位;存储宽度是4位,深度128。
    注意rst为低电平复位
    信号示意图:

    输入描述:
    输入信号 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,向对应位置写入相应的数据。
    程序的信号接口图如下:

    模块的时序图如下:

    使用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
    0
    Verilog实现FIFO的设计
    « 上一篇 2022-08-31
    Verilog教程-CIC 滤波器设计
    下一篇 » 2022-08-14

    评论 (0)

    取消