双口ram 简介及Verilog实现

2023-11-07

简介:

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

 注意点

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

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

时序图查看相关的数据手册

Verilog代码实现

module RAM #(
    parameter FIFO_DATA_WIDTH = 3,
    parameter FIFO_ADDR_WIDTH = 2,

)(
    input clk_w ,
    input rst_w ,
    input clk_r ,
    input rst_r ,

    input full  ,
    input empty ,

    input w_en ,
    input r_en ,

    input [FIFO_ADDR_WIDTH-1:0] w_addr ,
    input [FIFO_ADDR_WIDTH-1:0] r_addr ,

    input [FIFO_DATA_WIDTH-1:0] data_in,
    output reg  [FIFO_DATA_WIDTH-1:0] data_out ,


);

//======================================================================================

reg  [FIFO_DATA_WIDTH-1:0] mem [{FIFO_ADDR_WIDTH{1'b1}}:0];
integer i ;
always @(posedge clk_w or negedge rst_w) begin
    if(!rst_w)begin
        for(i=0;i<=FIFO_DATA_WIDTH;i+i+1)begin
            mem[i] <= {FIFO_DATA_WIDTH{1'b0}} ;

        end 
    end 
    else if(w_en && full==0)begin
        mem[w_addr] <= data_in ;
    end 
    else begin
        mem[w_addr] <= {FIFO_DATA_WIDTH{1'b0}};
    end 
end

//===========================================================================

always@(posedge clk_r or negedge rst_r)begin
    if(!rst_r)
    begin
        data_out <= {FIFO_DATA_WIDTH{1'b0}};

    end 
    else if(r_en && empty==0)begin
        data_out <= mem[r_addr];
    end 
    else begin
        data_out <= {FIFO_DATA_WIDTH{1'b0}};
    end 

end 

endmodule

总结:

双口ram四种操作情况

1两个端口不同时对同一个地址单元写入数据。(ok)

2两个端口同时对一个地址单元读出数据(ok)

3两个端口同时对同一个地址单元写入数据(write err)

4两个端口同时对同一个地址单元,一个写入数据,一个读取数据(read err )

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

双口ram 简介及Verilog实现 的相关文章

  • Quartus II 安装

    本次介绍使用的 Quartus 版本为 10 1 目前 Quartus II 官网已经没有 13 1 以下版本的安装包 大家可以安装 13 1 以上版本的软件 功能都是大同小异 下载地址 FPGA Software Download Cen
  • PRBS笔记

    1 概述 PRBS 伪随机二进制序列 也称为伪随机码 通常被用来测试高速信号的信号质量 伪随机 也说明了该码流并不是真正的随机 而是具有特性属性 码流由 多项式 决定 具有重复周期 PRBS具有多种阶数 如PRBS7 PRBS15 PRBS
  • modelsim 关联 notepad++

    modelsim 控制窗口敲入 1 proc external editor filename linenumber exec I notepad notepad exe filename 2 set PrefSource altEdito
  • HDLBits — Verilog Practice(每日一题)

    HDLBits Verilog Practice 每日一题 一 Getting Started 1 Getting Started 一 Getting Started 1 Getting Started 问题描述 Build a circu
  • Matlab 高斯信道下QPSK通带通信系统的简单仿真

    1 原理 2 仿真 3 总结反思 4 参考资料 1 原理 QPSK的具体内容请参考百度 QPSK的调制jie框图大致如下 QPSK信号可以采用正交调制的方式产生 如第一张图片的左半部分 I路信号与cos 信号相乘 Q 路信号与sin信号相乘
  • 硬件基础知识

    SPI是串行外设接口 Serial Peripheral Interface 的缩写 是一种高速的 全双工 同步的通信总线 SCLK SCLK是一种有固定周期并与运行无关的信号量 CLK CLK是一种脉冲信号 TDNN 时延神经网络 它的两
  • verilog中wire和reg类型的区别

    module counter parameter CNT MAX 25 d24 999 999 input wire sys clk input wire sys rst n output reg led out reg 24 0 cnt
  • 笔试

    文章目录 前言 40 复位电路设计 1 recovery time和removal time 2 同步复位和异步复位 3 异步复位同步释放 本文参考 往期精彩 前言 嗨 今天来学习复位电路设计相关问题 微信关注 FPGA学习者 获取更多精彩
  • 最详细的Vivado安装教程

    V i v a d o 安 装
  • 【FPGA】:频率测量

    转载 1 FPGA频率测量的三种方法 直接测量法 间接测量法 等精度测量法
  • 数码管电子时钟

    文章目录 前言 一 回顾数码管 二 任务描述 三 系统框图 四 模块调用 五 模块原理图 六 工程源码 6 2 时钟计数模块代码 6 2 数码管驱动模块代码 6 3 顶层模块代码 七 仿真测试 7 1 测试代码 7 2 仿真结果 八 管脚信
  • FPGA提示产生latch的报错

    在fpga的设计中有时会遇到 latch 的报错 1 latch是什么 Latch 就是锁存器 是一种在异步电路系统中 对输入信号电平敏感的单元 用来存储信息 锁存器在数据锁存使能时 数据被锁存 输入信号不起作用 这违背了组合逻辑中输出随输
  • Verilog之assign

    Verilog中的关键词assign主要用于如下两个地方 数据流建模 用于数据流建模的显示连续赋值语句语法格式如下
  • 关于xilinx BRAM IP的延迟以及流程

    关于RAM IP的延迟 1 选择了output registers 可以在RAM输出端口添加register 也可以在core的输出添加 在primitives添加 降低clock to out到primitive的延迟 在core添加re
  • 【FPGA】面试问题及答案整理合集

    面试问题及答案整理合集 1 硬件描述语言和软件编程语言的区别 2 FPGA选型问题 3 建立时间和保持时间问题 3 亚稳态问题 4 竞争和冒险问题 5 乒乓操作问题 6 同步和异步逻辑电路 7 同步复位和异步复位 8 MOORE 与 MEE
  • 【DDR3 控制器设计】(3)DDR3 的写操作设计

    写在前面 本系列为 DDR3 控制器设计总结 此系列包含 DDR3 控制器相关设计 认识 MIG 初始化 读写操作 FIFO 接口等 通过此系列的学习可以加深对 DDR3 读写时序的理解以及 FIFO 接口设计等 附上汇总博客直达链接 DD
  • Verilog HDL——Modelsim仿真

    常用testbench语法 finish 和 stop finish任务用于终止仿真并跳出仿真器 stop任务则用于中止仿真 timescale time unit time precision time unit指定计时和延时的测量单位
  • FPG—VGA显示器字符显示(附代码)

    目录 1 实操 1 1 字符取模 1 2 顶层模块 1 3 图像数据生成模块 1 3 1 模块框图 1 3 2 波形图绘制 1 3 3 代码编写 1 3 4 仿真验证 2 总结 本例程大部分与VGA显示驱动内容相同 只是显示部分改变了 故此
  • ALLEGRO等长时如何将PIN DELAY和VIA长度计算在内

    在PCB设计中 对于时序要求严格的线路 Via和IC pin delay的长度必须得到重视 通过下面的操作 可将Via和Pin delay加入到线路长度的计算中 1st 计算Pin delay 打开Constraint Manager 选择
  • 【FMC141】基于VITA57.4标准的4通道2.8GSPS 16位DA播放子卡(2片DAC39J84)

    FMC141是一款基于VITA57 4标准的4通道2 8GSPS 2 5GSPS 1 6GSPS采样率16位DA播放FMC子卡 该板卡为FMC 标准 符合VITA57 4与VITA57 1规范 16通道的JESD204B接口通过FMC 连接

随机推荐

  • 强大的Source Insight查找操作和代码查看

    系列文章 一 Source Insight 简介 常用设置和常用的快捷键 二 Source Insight 工程操作 三 Source Insight 窗口介绍 四 强大的Source Insight查找操作和代码查看 五 Source I
  • Logcat 的常用命令说明

    个人认为有一下几个常用命令 adb logcat c 清除所有以前的日志 adb logcat d 这个命令是在时间上倒过来用的 就是你先操作 然后敲这个命令 打出来的log就是你刚操作那段时间的log 而且自动退出log模式 adb lo
  • Vue PostCss插件——autoprefixer,自动补全css浏览器前缀

    Autoprefixer是一款基于PostCSS插件 用于解析CSS并使用Can I Use中的值向CSS规则添加供应商前缀 它是 Google 推荐的 并在Twitter和阿里巴巴中使用 可以实现css3代码自动补全 也可以运用到sass
  • 实例:vmem_disk驱动-->vmem_disk驱动模块的加载与卸载(2)

    支持 制造请求 请求队列 static void setup device struct vmem disk dev dev int which memset dev 0 sizeof struct vmem disk dev dev gt
  • 达蒙DM数据库使用经验

    DM表 字段注释 注 dm数据库无法在建表的同时为字段名添加注释 为表添加注释 comment on table 库名 表名 is 表注释 为表字段添加注释 comment on column 库名 表名 列名 is 列注释 DM查询错误
  • 如何搭建一个CRM系统

    搭建一个客户关系管理系统 CRM 需要以下几个步骤 定义需求 明确您对 CRM 系统的要求 以便确定它应该具有哪些功能和特性 选择技术 根据您的需求 选择合适的技术平台 例如使用自主开发 购买现成软件或使用云 CRM 服务 数据收集 收集所
  • QT中如何在主窗口中添加子窗口

    1 方法 原理其实很简单 和在窗口上动态 代码的形式 添加控件的方法一样 但需要设置一下子窗口的属性 在子窗口构造函数中添加代码 setWindowFlags Qt FramelessWindowHint 作用 隐藏子窗口的标题栏和边框 如
  • 统计各专业学生人数

    题目描述 学生表 专业表 SELECT dept name ifnull z studen cou 0 AS 人数 FROM SELECT dept id COUNT AS cou FROM z studen GROUP BY dept i
  • 一种设置python函数执行超时时间

    问题来源 写该文章的缘由是因为最近回答CSDN用户一个关于函数超时的问题 当时用户提问 最近想用python实现如下的一个功能 即设置函数的超时时间 当超过这个时间后函数退回到父函数而不会引发异常或导致整个程序结束 当时用户还贴出了另一篇文
  • Python 朴素贝叶斯(Naive Bayes)分类

    Na ve Bayes 分类的核心是计算条件概率P y x 其中y为类别 x为特征向量 其意义是在x样本出现时 它被划分为y类的可能性 概率 通过计算不同分类下的概率 进而把样本划分到概率最大的一类 根据条件概率的计算公式可以得到 P y
  • oracle_11 linux客户端安装说明以及如何添加sqlldr命令

    1 安装文件准备 oracle instantclient11 2 basic 11 2 0 2 0 x86 64 rpm oracle instantclient11 2 devel 11 2 0 2 0 x86 64 rpm oracl
  • Th4.2:类模板的概念、类模板的定义和使用之详述

    本小节回顾的知识点分别是类模板的概念 类模板的定义和使用 今天总结的知识分为以下4个点 1 概述 2 类模板定义 3 类模板的成员函数 4 非类型模板参数 1 概述 类模板 就是包含待指定数据类型的类 这个待指定的数据类型就是类模板的模板参
  • Centos7安装Python3的方法(亲测高效)

    Centos7下安装Python3的方法 由于centos7原本就安装了Python2 而且这个Python2不能被删除 因为有很多系统命令 比如yum都要用到 root VM 105 217 centos Python 3 6 2 pyt
  • css布局中关于 块状元素和行内元素的区分

    这两天在准备实习的面试和笔试 准备复习一下这些基础的概念 避免自己处于一种仅脑袋理解嘴巴不能表述出来的状态 块状元素和行内元素的概念是在css页面布局这个地方出现 主要是将html标签按照一定的特性分成2类 块状元素和行内元素 内联元素 首
  • 循环双向链表

    循环双向链表 1 简介 单链表 总是从头到尾找结点 难道就不可以正反遍历都可以吗 当然可以 只不过需要加点东西而已 有了 next 指针 这就使得我们要查找下 结点的时同复杂度为 1 可是如果我们要查找的是上一结点的话 那最坏的时间复杂度就
  • Linux:死锁与解决方法

    死锁 死锁 指在一组进程中的各个进程均占有不会释放的资源 但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态 死锁现象 现象1 如果执行流加锁完毕后 不进行解锁则会造成死锁 上篇所述 现象2 线程A获取了1锁 线程B获取了2
  • [Qt5.12.3] 使用Chart模块中warning: ‘setAxisX‘ is deprecated, warning: ‘setAxisY‘ is deprecated的解决办法

    文章目录 问题描述 解决方案 后记 问题描述 在使用QtCharts模块绘图的过程中 X轴需要显示DateTime 不能使用默认的createDefaultAxes 遂使用了setAxisX setAxisY方法 但一直报方法被弃用 虽暂时
  • Latex: 参考文献双栏对齐

    参考 How to level columns in bibliography Latex 参考文献双栏对齐 需要实现的效果 方法1 在开头引用balance usepackage balance 在文末 参考文献前 加上 balance
  • Stream使用技巧(1)------数据处理技巧

    Stream使用技巧 1 数据处理技巧 一 背景 作为java8新特性之一的Stream API为开发者带来了极大的便利 它可以对我们需要操作的集合进行非常复杂的操作 以活的我们想要的结果 本文不会告诉你什么是Stream 毕竟网上花里胡哨
  • 双口ram 简介及Verilog实现

    简介 RAM Random Access Memory 随机存储器 是一种用来暂时存储中间数据的存储器 掉电易失 按照类型可以分为单口ram 双口ram 其中双口ram又有简单 伪 的ram 真双端口ram 在异步FIFO的内部就是一个双端