用verilog单端口RAM设计

这篇博客详细介绍了如何使用Verilog语言设计一个16位深度、8位宽度的单端口静态随机存取存储器(SRAM),包括初始化、读取和写入操作。设计中包含了DC综合的引导语句,并提供了测试代码来验证SRAM的功能,通过时钟信号控制读写操作,并进行了一系列的读写测试。
摘要由CSDN通过智能技术生成

目录

一、目标

二、结构图

三、设计代码

四、测试代码


一、目标

用verilog实现一个深度为16,位宽8bit的单端口SRAM。搭建一个仿真环境,完成初始化,读取,写入的操作

二、结构图

三、设计代码

module single_ram#(
    parameter   ADDR_WIDTH  = 4,
    parameter   MEM_DEPTH = 16,
    parameter   DATA_WIDTH  = 8
    )(
    input   clk,
    input   wr_en,
    input   rd_en,
    input   [DATA_WIDTH-1:0] din,
    input   [ADDR_WIDTH-1:0] addr,
    
    output reg  [DATA_WIDTH-1:0] dout
    );

    reg   [DATA_WIDTH-1:0] mem [MEM_DEPTH-1:0]; 

    // synopsys_translate_off
    integer i;
      initial begin
        for(i=0; i<MEM_DEPTH;i=i+1)
        begin
          mem[i] = 8'h00;
        end
      end
   // synopsys_translate_on

   always@(posedge clk)
    begin
        if(rd_en)
          begin
            dout <= mem[addr];
          end
        else
          begin
            if(wr_en)
            begin
                mem[addr] <= din;
            end
          end
    end

endmodule

 Synopsys提供了引导语句,设计者可以使用这些引导语句控制DC综合的对象。
在设计代码中,引导语句“// synopsys translate_off”后直到“// synopsys translate_on”之间的语句被DC忽略。

四、测试代码

`timescale 1ns / 1ps 
module sram_tb(
    );
	
	parameter   ADDR_WIDTH  = 4,
    parameter   MEM_DEPTH = 16,
    parameter   DATA_WIDTH  = 8
	reg [ADDR_WIDTH-1 : 0] addr;
	reg [DATA_WIDTH-1 : 0]data_in;
	reg clk;
	reg wr_en;
	reg rd_en;
	wire [DATA_WIDTH-1 : 0] data_out;

	integer i;
	
	//clock generation
	initial begin
		clk = 0;
		forever
			#4 clk = ~clk;
	end
	
	
	
	initial begin
		rd_en = 1'b0;
		wr_en = 1'b0;
		addr = 4'd0;
		data_in = 8'h00;
		#20
		@(negedge clk)//read
		rd_en = 1'b1;
		
		for (i = 0; i<16; i=i+1) begin
			@(negedge clk)
				addr = i;
		end
		
		@(negedge clk)//write
			wr_en = 1'b1;
		for (i = 0; i<16; i=i+1) begin
			@(negedge clk) begin
				addr = i;
				data_in = data_in + 'h01;
			end
		end
		@(negedge clk)//read
			wr_en = 1'b0;
		for (i = 0; i<16; i=i+1) begin
			@(posedge clk)
				addr = i;
		end
		
		@(negedge clk)
			rd_en = 1'b0;
 
		 //#100 $finish;
		#100 $stop;
	end
	
	
	
	
	
	single_ram #(parameter   ADDR_WIDTH  = 4,
                 parameter   MEM_DEPTH = 16,
                 parameter   DATA_WIDTH  = 8) 
          u_sram(
	  .clk(clk),
	  .rd_en(rd_en),
	  .wr_en(wr_en),
	  .addr(addr),
	  .din(data_in),
	  .dout(data_out)	
	            );
 
endmodule

参考链接

             

 

  • 1
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值