iandphp的个人空间 https://blog.eetop.cn/iandphp [收藏] [复制] [分享] [RSS] 这是我的空间

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

随机访问存储器(RAM)

已有 2799 次阅读| 2020-7-16 09:39 |系统分类:其他

不知道从哪本书/哪篇文章摘来的了,先mark一下:

一、随机访问存储器(RAM

1)随机访问存储器(RAM)概述

  ①随机存储器可以随时从任何一个指定地址出数据,也可以随时将数据写入任何一个指定的存储单元中,RAM的结构如下:

                                                                          

 

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

  ·单口RAM 只有一套数据总线、地址总线和读写控制线,因此当多个外设需要访问同一块单口RAM 时,需要通过仲裁电路来判断。

  ·双口RAM 具有两套完全独立的数据线、地址线和读写控制线,从而实现了大量数据的高速访问以及不同时钟域的数据交换。

 

(2)随机存储器设计基础

  ①在Verilog HDL 中,若干个相同宽度的向量构成数组,其中reg 型数组变量就代表着存储器。例如:

        reg [7:0]  memory[1023:0];

该语句定义了1024 个字的存储器变量memory,每个字的字长为8 位,(说白了,就是有1024个8bit宽的寄存器)经过定义后的memory 型变量可以用下面的语句对存储器单元赋值:

        memory [7] = 90; //存储器memory 的第7 个字被赋值为90

  ②存储器单元中的数据也可以读出,因此存储器型变量相当于一个RAM。由于存储器由逻辑资源产生,因此存储容量越大,所需要的逻辑资源就越多。

 

(3)单口RAM 单元的实现

  ①单口RAM,只有一套地址总线,读和写是分开(至少不能在同一个周期内完成)。8× 8 位RAM 的设计举例实现如下:

  ②部分信号说明:

·addm 为3 比特地址线,可以实现8 个存储单元的寻址;

·cs_n 为片选信号,低有效,当cs_n 为低时,存储器处于工作状态(可以读或写);当cs_n 为高时,存储器处于禁止状态(强制输出0)。

·we_n 为写使能信号,低有效,当we_n为高时,存储器处于读状态,否则处于写状态。

·dout 为存储器的输出端口,din 为存储器的输入端口。

复制代码
 1 module ram_single( 2         input clk, 3         input [2:0] addm, 4         input cs_n, 5         input we_n, 6         input [7:0] din, 7         output reg [7:0] dout 8 ); 9 reg [7:0] ram1[7:0];10 always @(posedge clk) begin11     if(cs_n)12         dout <= 8'b0000_0000;13     else14         if(we_n)15             dout <= ram1[addm];16         else17             ram1[addm] <= din;18 end19 20 endmodule
复制代码

 

 综合得到的电路如下所示:

 

 

4)双口同步RAM 单元

①双口同步RAM 具有两套地址总线,一套用于读数据,一套用于写数据,二者可分别独立操作。128× 8 位双口RAM 的实现举例:

②代码如下所示:

复制代码
 1 module rom_test( 2     output reg [7:0] q, 3     input [7:0] d, 4     input [6:0] addr_in, 5     input [6:0] addr_out, 6     input we, clk1, clk2 7 ); 8 reg [6:0] addr_out_reg; 9 reg [7:0] mem[127:0];10 always @(posedge clk1)begin11     if (we)12         mem[addr_in] <= d;13 end14 15 always @(posedge clk2) begin16     q <= mem[addr_out_reg];17     addr_out_reg <= addr_out;18 end19 20 endmodule
复制代码

 

 

 

综合得到的电路如下所示:

 

 

二、只读存储器

①在数字系统中,由于ROM 掉电后数据不会丢失,对于容量不大的ROM,在Verilog HDL 中可以通过case 语句来实现。

②在应用中,case 语句中的数值可以根据实际需要修改,其中addm 为地址输入信号,cs_n为片选信号,8× 8 位的ROM 模块的实现:

复制代码
 1 module rom_test( 2         input clk, 3         input [2:0] addm, 4         input cs_n, 5         output reg [7:0] dout 6 ); 7  8 always @(posedge clk) begin 9 if(cs_n)10     dout <= 8'b0000_0000;11 else12     case(addm)13         3'b000: dout <= 1;14         3'b001: dout <= 2;15         3'b010: dout <= 4;16         3'b011: dout <= 8;17         3'b100: dout <= 16;18         3'b101: dout <= 32;19         3'b110: dout <= 64;20         3'b111: dout <= 128;21     endcase22 end
复制代码

 

综合得到的电路如下所示:

 

 

 



点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 1

    总排名
  • 51

    关注
  • 6

    粉丝
  • 45

    好友
  • 17

    获赞
  • 24

    评论
  • 6188

    访问数
关闭

站长推荐 上一条 /2 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-20 16:17 , Processed in 0.023493 second(s), 14 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部