数字IC笔面基础,项目常用IP——双口RAM(简介及Verilog实现)

article/2025/9/28 21:52:56

双口RAM简介及Verilog实现

  • 写在前面的话
  • 双口RAM简介
    • 伪双口RAM框图:(Xilinx FPGA)
    • 真双口RAM框图:(Xilinx FPGA)
    • RAM读写时序图
    • 伪双口RAM读写实列
  • 简单的双口RAM的Verilog实现
  • 总结

写在前面的话

RAM(Random Access Memory),随机存储器,是一种用来暂时存储中间数据的存储器,掉电易失。按照类型可分为单口 RAM(Single RAM)和双口 RAM(Dual RAM),其中双口RAM又有简单双口 RAM(Simple-Dual RAM)、真双口 RAM(True-Dual RAM)。在异步FIFO的内部就是一个双口RAM用来存取数据。RAM是最基础的IP,在FPGA和ASIC设计中,会经常调用成熟的RAM。重点是理解RAM的输出输出特性,了解在项目中如何使用RAM,使用什么类型的RAM,以及怎么控制RAM的写入和读出。

注意:
(1)手边有FPGA开发板的同学,可以学习对应公司的IP核手册,并尝试运行对应的例程,完成例程的学习后可以尝试将双口RAM应用到具体的项目实践中。
(2)双口RAM的重点在于读写地址生成及读写控制,比单口RAM更加灵活,可以同时处理读写数据,在数据缓存、图像处理等系统中有广泛应用。

RAM要点
单口RAM读写共享相同端口,不可同时读写
伪(简单)双口RAM读写采用两个端口,可同时读写,但端口固定,一个只能读,另一个只能写
真双口RAM读写采用两个端口,均可读写

单口RAM框图:(From Intel FPGA)
在这里插入图片描述
伪双口RAM框图:(From Intel FPGA)
在这里插入图片描述
真双口RAM框图:(From Intel FPGA)
在这里插入图片描述

双口RAM简介

双口RAM分为伪双口RAM和真双口RAM。
伪双口RAM,一个端口只读,另一个端口只写,写入和读取的时钟可以不同,位宽比可以不是1:1。
真双口RAM,两个端口都是可读可写,可以在没有干扰的情况下进行读写,彼此互不干扰。

伪双口RAM框图:(Xilinx FPGA)

在这里插入图片描述

信号方向说明
CLKAin端口A时钟输入
WEAin端口A写入使能
ENAin端口A使能
ADDRAin端口A地址输入
DINAin端口A数据输入
CLKBin端口B时钟输入
ADDRBin端口B地址输入
ENBin端口B使能
DOUTBin端口B数据输出

真双口RAM框图:(Xilinx FPGA)

在这里插入图片描述

信号方向说明
DINAin端口A数据输入
ADDRAin端口A地址输入
WEAin端口A读写使能
ENAin端口A使能
CLKAin端口A时钟
DINBin端口B数据输入
ADDRBin端口B地址输入
WEBin端口B读写使能
ENBin端口B使能
CLKBin端口B时钟

伪双口RAM:
允许同时端口A写入,端口B读出,且速率可以不同。

真双口RAM:
端口A和端口B的读出和写入相互独立,不受影响,可以对同一地址进行操作,但不能发生冲突!!!

注意点:
FIFO也是一个端口只读,另一个端口只写。,FIFO与伪双口RAM的区别在于,FIFO为先入先出,没有地址线,不能对存储单元寻址;而伪双口RAM两个端口都有地址线,可以对存储单元寻址。

异步时钟域的缓存只要是双口器件都可以完成,但FIFO不需要对地址进行控制,是最方便的。

RAM读写时序图

RAM的数据写入和读出都是同步与时钟上升沿,端口数据写入时,WEA信号需要置高,同时提供地址和要写入的数据。下图为RAM写入数据的时序图:
在这里插入图片描述
在读取数据时,提供地址后,数据会在下个周期输出,这里列举伪双口时序,真双口需要控制读写信号。
在这里插入图片描述

伪双口RAM读写实列

伪双口RAM将读写分开,资源消耗较低,应用范围较广,这里列举一个测试RAM的示例,向RAM的端口A写入一次数据,并从端口B读出。

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2022/06/12 10:32:29
// Design Name: 
// Module Name: ram_test
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//module ram_test(input   sys_clk_p   ,       //system clock 200Mhzinput   sys_clk_n   ,       //system clock 200Mhz on boardinput   sys_rst_n           //reset signals ,low level effective );//----------------------------------------------------------------------------
reg         [8:0]   w_addr  ;       //RAM PORTA写地址
reg         [15:0]  w_data  ;       //RAM PORTA写数据
reg                 wea     ;       //RAM PORTA使能 
reg         [8:0]   r_addr  ;       //RAM PORTB读地址
wire        [15:0]  r_data  ;       //RAM PORTB读数据   wire            clk        ;        //系统时钟IBUFDS IBUFDS_inst (.O(clk)                ,       // Buffer output.I(sys_clk_p)          ,       // Diff_p buffer input (connect directly to toplevel port).IB(sys_clk_n)                 // Diff_n buffer input (connect directly to toplevel port));//产生RAM PORTB读地址
always @(posedge clk or negedge  sys_rst_n)   beginif(~sys_rst_n) beginr_addr  <=  9'd0        ;end else  if (|w_addr) begin //w_addr位或,不等于0  w_addr !== 0r_addr <= r_addr+1'b1   ;endelse 	beginr_addr  <=   9'd0       ;end
end//产生RAM PORTA写使能信号
always@(posedge clk or negedge sys_rst_n) beginif(!sys_rst_n) beginwea <= 1'b0;endelse beginif(&w_addr) //w_addr的bit位全为1,共写入512个数据,写入完成 //不使用w_addr == 9'b1111_11111wea <= 1'b0; else wea <= 1'b1; //ram写使能end
end//产生RAM PORTA写入的地址和数据
always @(posedge clk or negedge sys_rst_n) begin if(~sys_rst_n) beginw_addr      <=      9'd0      ;w_data      <=      16'd1     ;   end else beginif(wea == 1'b1)   begin         //if(wea) begin//ram写使能有效if(&w_addr)     begin   //w_addr的bit位全为1,共写入512个数据,写入完成// 通过位于判断有没有写完w_addr  <= w_addr       ;       //将地址和数据的值保持住,只写一次RAMw_data  <= w_data       ;end else beginw_addr  <= w_addr + 1'b1;w_data  <= w_data + 1'b1;    endend/*else beginw_addr  <= w_addr       ;w_data  <= w_data       ;end    */end
end//实例化
//----------- Begin Cut here for INSTANTIATION Template ---// INST_TAG
ram_ip ram_ip_inst (.clka           (clk     ),     // input wire clka.wea            (wea     ),     // input wire [0 : 0] wea.addra          (w_addr  ),     // input wire [8 : 0] addra.dina           (w_data  ),     // input wire [15 : 0] dina.clkb           (clk     ),     // input wire clkb.addrb          (r_addr  ),     // input wire [8 : 0] addrb.doutb          (r_data  )      // output wire [15 : 0] doutb
);
// INST_TAG_END ------ End INSTANTIATION Template ---------//----------- Begin Cut here for INSTANTIATION Template ---// INST_TAGila_0 ila_inst (.clk(clk), // input wire clk.probe0(r_data), // input wire [15:0]  probe0  .probe1(r_addr) // input wire [8:0]  probe1
);// INST_TAG_END ------ End INSTANTIATION Template ---------
endmodule // ram_test

仿真图
地址1写入数据0002,在读取的时候延迟一个周期。
在这里插入图片描述

简单的双口RAM的Verilog实现

列举之前异步FIFO的code,帮助理解双口RAM的内部工作原理,在实际项目中建议采用IP核。

// -----------------------------------------------------------------------------
// Copyright (c) 2014-2022 All rights reserved
// -----------------------------------------------------------------------------
// Author : hfut904
// File   : RAM.v
// Create : 2022-03-04 10:02:58
// Revise : 2022-03-04 17:03:43
// Editor : sublime text4, tab size (4)
// -----------------------------------------------------------------------------//双口RAM模块module RAM #(
//------------------------paramter-------------------parameter 			FIFO_data_size 		=		3		,parameter 			FIFO_addr_size 		= 		2		)(//----------------------port	define		-----------------//write clock & resetinput				 					clk_w				,input 				 					rst_w				,//read clock & resetinput 				 					clk_r 				,input				 					rst_r				,//key signalsinput 				 					full				,input 				 					empty 				,//enable			input 				 					w_en				,input				 					r_en				,//wr rd addrinput 		[FIFO_addr_size-1:0] 		w_addr				,input 		[FIFO_addr_size-1:0]		r_addr				,input 		[FIFO_data_size-1:0]		data_in				,output	reg	[FIFO_data_size-1:0]		data_out			);//==============================================================
//------------paramter reg  wire  ------------------------------reg 	[FIFO_data_size-1:0]  mem [{FIFO_addr_size{1'b1}}:0 ]	; integer		i 		;
/*------------------------------------------------------------------------------
--  	wire 			flag_wr				;wire 			flag_rd	 			;
------------------------------------------------------------------------------*///always blockalways @(posedge clk_w or negedge rst_w) begin if(~rst_w) beginfor ( i = 0; i <= FIFO_data_size; i=i+1) beginmem[i]		<=		{FIFO_data_size{1'b0}}		;endend else if ((w_en == 1) && (full == 0))beginmem[w_addr] 	<=		data_in						;endelse beginmem[w_addr] 	<=		{FIFO_data_size{1'b0}}		;endend//rdalways @(posedge clk_r or negedge rst_r) begin if(~rst_r) begindata_out		<=		{FIFO_data_size{1'b0}}		;		//'d0	end else if ((r_en == 1) && (empty == 0))begindata_out 	<=		mem[r_addr] 					;endelse begindata_out		<=		{FIFO_data_size{1'b0}}		;endend//assign/*assign 			flag_wr		=	(w_en == 1) && (full == 0)		;assign 			flag_rd		=	(r_en == 1) && (empty == 0)		;*/endmodule 

总结

RAM之所以是基础IP,在于现有的数字IC中都是采用冯诺依曼架构,计算产生的中间数据需要存储器完成缓存,再送入下一个计算过程中。初学者需要了解RAM的类型以及使用范围,理解RAM的工作原理,而在实际项目中,多采用IP核,我们需要掌握的就是怎么使用这个IP,了解输入输出信号怎么工作的。

双口RAM四种操作情况:
(1)两个端口不同时对同一地址单元写入数据。(ok)
(2)两个端口同时对同一地址单元读出数据。(ok)
(3)两个端口同时对同一地址单元写入数据。(write error)
(4)两个端口同时对同一地址单元,一个写入数据,一个读取数据。(read error)


http://chatgpt.dhexx.cn/article/UHLEmj7U.shtml

相关文章

双口RAM及Vivado RAM IP核的使用

目录 1.双口RAM概述 2.Vivado 双口RAM IP核 2.1 Block Memory Generator概述 2.2 真双口RAM的设置 2.2.1 Basic设置 2.2.2 Port设置 3.双口RAM例程 4.仿真 4.后记 5.参考文献 1.双口RAM概述 双口RAM&#xff08;dual port RAM&#xff09;在异构系统中应用广泛&…

网络原理(一):初识网络

网络发展史 独立模式 独立模式&#xff1a;计算机之间相互独立&#xff1b; 在计算机最初的时候&#xff0c;每个计算机都是独立存在的。 我们拿游戏来举例&#xff0c;但是的计算机只能玩玩单机游戏&#xff0c;游戏通过了就没意思了。 随着时代的发展&#xff0c;来到了…

网络原理(小结)

网络原理 前言网络七层/五层模型OSI七层网络模型TCP/IP 五层网络模型封装和分用 TCP/IP五层网络模型各层代表协议的详解应用层常见状态码HTTP常见Header头ServletSession和CookieHTTP协议的特点HTTPSHTTP与HTTPS的区别 传输层网络传输的五元组端口号UDP协议TCP协议TCP如何保证数…

网络原理 | 网络初识之网络基础概念学习

目录 局域网与广域网 网络通信基础 IP地址 端口号 网络协议 五元组 局域网与广域网 根据网络互联的规模&#xff0c;可以将网络划分为局域网(LAN)和广域网(WAN). 网络互连即将多台计算机连接在一起&#xff0c;完成数据共享&#xff0c;数据共享的本质是网络数据传输&…

网络的基本原理

文章目录 一、计算机网络背景二、局域网和广域网1.局域网(LAN)2.广域网(WAN) 三、认识协议1.协议的概念2.协议分层3.网络OSI七层模型4.TCP/IP五层模型5.数据的封装和解包 四、局域网内主机交互与跨网段主机交互 一、计算机网络背景 我们用计算机完成一项工作时&#xff0c;不可…

网络:网络协议基本原理

引入 进程间通信&#xff0c;其实是通过内核的数据结构完成的&#xff0c;主要用于在一台linux上两个进程之间的通信。但是&#xff0c;一旦超出一台机器的范畴&#xff0c;我们就需要一种跨进程的通信机制。一台机器将自己想要表达的内容&#xff0c;按照某种约定好的格式发送…

网络原理(初识)

网络原理&#xff08;网络初识&#xff09; 1、局域网LAN&#xff08;Local Area Network&#xff09; &#xff08;1&#xff09;Local 即标识了局域网是本地&#xff0c;局部组建的一种私有网络。局域网内的主机之间能方便的进行网络通信&#xff0c;又称为内网&#xff1b;局…

网络原理(IP协议)

目录 IP协议IP地址IP 地址由网络和主机两部分标识组成IP 地址的分类广播地址IP多播子网掩码 路由IP 地址与路由控制 IP 分包与组包什么是IP分片为什么要进行IP分片IP分片是如何组装的路径 MTU 发现 IP协议 IP&#xff08;IPv4、IPv6&#xff09;相当于 OSI 参考模型中的第3层—…

网络原理——网络协议

目录 传输层协议TCP协议TCP协议格式段TCP原理连接管理可靠传输流量控制拥塞控制延迟应答和捎带应答错误检测TCP异常 UDP协议UDP协议格式段UDP协议特点无连接不可靠面向数据报大小受限 网络层协议IP协议 数据链路层协议​以太网MTUARP协议 传输层协议 ​ 传输层负责数据能够从发…

网络原理 2

文章目录 1. 网络层2. 数据链路层3. DNS 前言 : 上文已经 将 网络层 和 传输层 说完了&#xff0c; 下面我们来学习以下 网络层 和 数据链路层 里 相关的知识 &#xff0c; 关于 网络层 和 数据链路层 的知识 简单了解一下即可 . 1. 网络层 网络层 主要 做两件事 : 1.地址管…

计算机网络原理最详细解说

一、计算机网络概述 时代不同了&#xff0c;大家现在生活都好了&#xff0c;家家户户基本都有电脑&#xff0c;而且我们都习惯了使用电脑办公&#xff0c;打打游戏&#xff0c;聊聊天等等。 那我们一起来想一个场景&#xff1a;如果没有了网络&#xff0c;我们是不是就不能使…

[网络原理] 网络中的基本概念

人生,本就是苦乐参半,这样的生活才是丰富多彩. 文章目录 前言1. IP地址2. 端口号3. 协议4. 五元组5. 协议分层6. OSI七层模型7. TCP/IP协议8. 封装和分用9. 客户端与服务端10. 请求与响应 前言 本章开始,我们开启网络部分的知识大门. 1. IP地址 1.定义: IP地址主要用于表示网…

网络原理-网络发展史和通信基础

目录 1.网络发展史 面向终端的计算机网络 计算机网络阶段(局域网LAN) 组网方式 计算机网络互联阶段(广域网WAN) 2.通信基础 IP地址 端口号 网络协议 协议的作用 知名协议的默认端口 协议分层 分层的作用 OSI七层模型 TCP/IP五层模型 网络设备所在分层 网络分层…

【Linux】网络原理

本篇博客让我们一起来了解一下网络的基本原理 1.网络发展背景 关于网络发展的历史背景这种东西就不多bb了&#xff0c;网上很容易就能找到参考资料&#xff0c;我的专业性欠缺&#xff0c;文章参考意义也不大。这里只做简单说明。 网络发展经过了如下几个模式 独立模式&…

计算机网络 ——网络原理之初识

✨计算机网络 ——初识网络原理 作者介绍: &#x1f393;作者:偷偷敲代码的青花瓷&#x1f431;‍&#x1f680; &#x1f440;作者的Gitee:代码仓库 ✨✨我和大家一样都是热爱编程✨,很高兴能在此和大家分享知识,希望在分享知识的同时,能和大家一起共同进步,取得好成绩&#x…

计算机网络原理简介

物理层 电脑要联网,需要做什么,电脑需要电, 然后电脑与电脑之间相连,需要网,可以用光纤,双绞线,同轴电缆,无线波等 把电脑连接起来的物理手段,主要规定了网络的一些电气特性,作用是负责传送0和1的电信号.而机械特性,及时如何去与硬件相连了,比如说插座的尺寸 数据链路层 物…

快速了解网络原理

作者&#xff1a;~小明学编程 文章专栏&#xff1a;JavaEE 格言&#xff1a;热爱编程的&#xff0c;终将被编程所厚爱。 目录 局域网和广域网 局域网 局域网组建的方式 广域网 网络通信基础 IP地址 端口号 协议 什么是协议 协议分层 分层模型 OSI七层模型 TCP/IP…

网络原理 (1)

网络原理 文章目录 1. 前言&#xff1a; 2. 应用层2.1 XML2.2 json2.3 protobuffer 3. 传输层3.1 UDP3.1 TCP4. TCP 内部的工作机制 &#xff08;重点&#xff09;1. 确认应答 2.超时重传3. 连接管理3.1 建立联系 &#xff1a;三次握手3.2 断开连接 : 四次挥手 4. 滑动窗口5. 流…

网络原理初识(基础)

目录 一&#xff0c;网络的划分 1.局域网&#xff08;LAN&#xff09; 概念 局域网的组建&#xff08;连接方式&#xff09; 2.广域网&#xff08;WAN&#xff09; 概念 二&#xff0c;网络通信基础 1.IP地址 概念 格式 组成 分类 特殊IP 2.端口号&#xff08;po…

网络基本原理

一、网络与网卡 网络&#xff1a;进程与进程间跨主机&#xff08;Host&#xff09;通信 网卡&#xff1a; 网卡发送数据&#xff1a;1.填充数据 2.触发发送 网卡接收数据&#xff1a;1.接收数据 2.通过中断把控制权交给OS 3.OS把数据搬给进程 数据经过不断的封装之后才能发…