片内存储器的设计

片内存储器分为RAM和ROM两类。

RAM :随机存取存储器(random access memory,RAM)又称作“随机存储器”。是与CPU直接交换数据的内部存储器,也叫主存(内存)。它可以随时读写,而且速度很快,通常作为操作系统或其他正在运行中的程序的临时数据存储媒介。

根据地址总线、数据总线以及读写控制线的数目,可以将RAM分为单端口RAM和双端口RAM两大类。

单端口RAM只有一套地址总线,读操作和写操作是分开的Verilog HDL代码如下:

module ram_single(clk,addm,cs_n,we_n,din,dout);

    input                 clk;            //clock
    input[2:0]            addm;           //address
    input                 cs_n;           //option signal
    input                 we_n;           //enable signal
    input[7:0]            din;            //input
    output[7:0]           dout;           //output
    reg [7:0]             dout;
    reg[7:0]              raml[7:0];      //8*8bit register

    always@(posedge clk)begin
        if(cs_n)
          dout <= 8'bzzz_zzzz;
          else begin
           if(we_n)
              dout <= raml[addm];
              else
              raml[addm] <= din;
          end
    end

endmodule

 双端口RAM具有两套地址总线,一套用于读数据,一套用于写数据,两者可以分别进行操作,Verilog HDL代码如下:

module ram_dual(q,addr_in,addr_out,d,we,rd,clk1,clk2);

    input                 clk1;           //clock
    input                 clk2;           //clock
    input[2:0]            addr_in;        //write address
    input[2:0]            addr_out;       //read address
    input                 we;             //write enable
    input                 rd;             //read  enable
    output[7:0]           q;              // data output
    input [7:0]           d;              // data in
    reg [7:0]             q;
    reg[7:0]              raml[7:0];      //8*8bit register

    always@(posedge clk1)begin
        if(we)
         raml[addr_in] <= d;
    end

    always@(posedge clk2)begin
       if(rd)
       q <= raml[addr_out];
    end
endmodule

 ROM即只读存储器,是一种只能读出事先存储的数据的存储器,其特性是存入的数据无法改变。也就是说,这种存储器只能读不能写。由于ROM在断电之后数据不会丢失,所以通常用在不需要经常变更资料的电子或电脑系统中,资料不会因为电源的关闭而消失,Verilog HDL代码如下:

module rom(dout,clk,addm,cs_n);
    input                clk,cs_n;
    input[2:0]           addm;
    output[7:0]          dout;
    reg[7:0]             dout;
    reg[7:0]             rom[7:0];

    initial begin
      rom[0] = 8'b1234_0001;
      rom[1] = 8'b1234_0010;
      rom[2] = 8'b1234_0011;
      rom[3] = 8'b1234_0100;
      rom[4] = 8'b1234_0101;
      rom[5] = 8'b1234_0110;
      rom[6] = 8'b1234_0111;
      rom[7] = 8'b1234_1000;
    end

    always@(posedge clk) begin
    if(cs_n) 
        dout <= 8'bzzz_zzzz;
    else
        dout <= rom[addm]; 
    end

endmodule

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值