11.1~11.2双端口RAM(报错复盘,一些理解(循环,阻塞非阻塞),三目运算符解决使能端)

双端口RAM

分别用于读写数据,同时进行

当读使能端有效时可以读出来数据

当写使能端有效时可以覆写数据

读写并行操作

报错

1.reg必须在always里

这个不能assign,因为reg型不能assign,单端口的那个可以assign是因为其定义为了wire型,就不在always里进行,而是在运算后输出时用的,所以可以assign

这里定义成了reg,那么赋值就一定要写在always里

2.多个else if的操作覆盖

这个不能得到正确输出是因为,一个if里只能执行一次,即即使有多个else if,且都满足,也只进行一个判别条件里的(靠近顶层的),就是说如果读写信号都有效,也只会进行写操作,而屏蔽掉读操作,所以就会出问题,导致一直读不出来

解决方式就是把读和写分在两个always里,保证不会因为else if只会执行一个,而使另一个被屏蔽掉

3.未知情况的完善缺陷

只是这样依然会得不到期望的输出,2的情况是一直读不出来,即输出信号一直是0

3的情况是,由于没有对读使能端情况的完善,即只在读为1时,才会对输出信号做出修改,但是却没有说读为0时该怎么做,就会导致,在读为0时,锁存上一个读为1时读到的信号,这样就会导致在不想读时,一直输出有信号的读信号,就会出错,得不到预期的波形

解决方法就是完善各种使能端的情况,当读使能端为0时,就要把读的输出信号置0

对于写使能,写的功能就是改变RAM内部数据值

当为1时,进行覆写;为0时,保持原状态(可写可不写,但必须明白这种情况的处理是这样的);

对于读使能,功能就是改变读信号,读出信号

当为1时,进行读;为0时,显然不希望之前的信号依然保存,所以要进行置0操作(这时就必须要额外写)

补充:对于2的另一种解决方法

还是在一个always里,只不过不用else if了,就用if,保证每次都会对if里的条件进行判断,简便,但是在互斥事件时,会浪费一定的不必要的判定时间,但是对独立的事件,就是必要的

其他

本例中的阻塞与非阻塞

这里面用阻塞赋值,即=可行,是因为状态的转移不涉及上一个状态,所以可以直接改变

而读写时,也是可以直接读出想写的内容,而不是之前写的内容,即读写和原来写的是什么无关

关于循环

要用循环,就要定义integer量,integer不能综合,只是用来循环,简化代码

这里的循环就是用来初始化,简化代码用的,无法综合,因为没有元件符合,只是用来简化代码长度而诞生的,初始化的本质逻辑还是逐个赋0,即

如果有128个寄存器,就需要128行,而循环无所谓深度多少

另一种实现思路

由于使能端只能是0或1,所以用三目运算符可以简单清晰,明了的表示出各种情况及方法,不重不漏。

读写分离always,两个三目运算符考虑两个使能端的各种情况

同步FIFO

就是说读使能时,返回队头;不读,则返回0;

写使能时,如果不满,就接着写,满了,就让队头出,写在队尾;不写,保持原态;

空信号,是读的时候空,对写没影响,即往后写,但是改变读的结果,为0;

满信号,是写的时候满,对读没影响,即一直读队头,但是改变写的模式;

但是注意,这里的读出,就是取出队列,即读一个取一个;

根据双口RAM实现FIFO

双端口实现

深度即寄存器数量,位宽为WIDTH

对组地址信号的位宽,为深度对2取对数,向上取整

电路功能

FIFO

空满状态的判断

统计队列内部数据数量的计数器CNT,并根据计数器的大小判断空满状况。

如果CNT==0,则空,如果CNT==深度,则满

读写同时进行时,计数器数值不变;写入时,CNT+1;读出时,CNT-1;

这里是声明读写地址,以及队列深度的计数(采用二进制)

关于位宽

常见的两种含义,第一种的位宽用于数据结构的定义,第二种用于数据结构内部数据特性、大小的定义

一是位宽代表个数

即有多少位宽,就意味有几个数据

队列定义,寄存器堆定义,数组定义,都是这个意思,即[n-1:0],从0拉到n-1,表示这个数据结构里有n个数据,一位就代表了一个数据单元

用来统筹管理数据的记录情况

二是代表实际大小

即用于实际计数,内部存储超过2的数据,表示数据,存储大的数据都是这种方式,位宽越大,表示这个数据越大,就代表一个实际的、实在的数据,采用的二进制计数,位宽就是用的几位二进制来记录

地址信号的定义,队列长度计数,分频器信号的计数,都是这个意思,其都是代表的一个数据

读写地址的确定

写功能,得到写的地址,

首先要写使能为1,接着判断是否满了,如果满了,地址就不动了,即指向队尾;不满,就让地址往后+1

读功能,得到读取元素的地址

首先要读使能为1,接着判断是不是为空,为空,则输出'0,即当前队列没有元素可以读出来;不为空,则地址往后+1,表示当前这个地址已经读出来了

注意,这里就是一定要用非阻塞赋值了,即等到这个电路功能都实现了再变化

因为此时后续的操作,都需要当前指针(即此时的waddr,raddr)所指向的地址,如果这时候更新,就访问不到了,所以需要在都结束后再更新

当前队列长度的确定

这个就是只取一个else if,即同一状态向后的不同分支,只取一个

当又读又写的时候,长度不变

读的时候,长度减1;写的时候,长度+1;

未知情况,保持不变

满空判断

实例化,以双端RAM实现FIFO

需要注意,如果能写而且还没满,就可以实际接着往下写,但是如果能写但是已经满了,就不接着往后写了;读也是这样

想的是,先一直写,然后读,这时候队列长度就减小了,还可以接着往里面写,但是写指针却没有动,所以就会导致越界

一种可能的思路是,它要读就一直读,直到读到空;要写就一直写,直到写到满;

主要就是读的时候,如果读,就一直读,全部读完,而不是读一部分,使其有剩余

那么FIFO的使用方式就是
`timescale 1ns/1ns
/**********************************RAM************************************/
module dual_port_RAM #(parameter DEPTH = 16,parameter WIDTH = 8)(input wclk,input wenc,input [$clog2(DEPTH)-1:0] waddr  //深度对2取对数,得到地址的位宽。,input [WIDTH-1:0] wdata      	//数据写入,input rclk,input renc,input [$clog2(DEPTH)-1:0] raddr  //深度对2取对数,得到地址的位宽。,output reg [WIDTH-1:0] rdata 		//数据输出
);reg [WIDTH-1:0] RAM_MEM [0:DEPTH-1];always @(posedge wclk) beginif(wenc)RAM_MEM[waddr] <= wdata;
end always @(posedge rclk) beginif(renc)rdata <= RAM_MEM[raddr];
end endmodule  /**********************************SFIFO************************************/
module sfifo#(parameter	WIDTH = 8,parameter 	DEPTH = 16
)(input 					clk		, input 					rst_n	,input 					winc	,input 			 		rinc	,input 		[WIDTH-1:0]	wdata	,output reg				wfull	,output reg				rempty	,output wire [WIDTH-1:0]	rdata
);wire                    wenc;reg [$clog2(DEPTH) : 0] waddr;reg [$clog2(DEPTH) : 0] raddr;always @(posedge clk or negedge rst_n) beginif (!rst_n) beginwfull <= 'd0;rempty <= 'd0;endelse beginwfull <= waddr == raddr + DEPTH;rempty <= waddr == raddr;endendassign wenc = winc && !wfull;assign renc = rinc && !rempty;always @(posedge clk or negedge rst_n) beginif (!rst_n) waddr <= 'd0;else if (wenc)waddr <= waddr + 'd1;endalways @(posedge clk or negedge rst_n) beginif (!rst_n) raddr <= 'd0;else if (renc)raddr <= raddr + 'd1;enddual_port_RAM #(.DEPTH (DEPTH),.WIDTH (WIDTH))dual_port_RAM (.wclk  (clk  ),.wenc  (wenc ),.waddr (waddr),.wdata (wdata),.rclk  (clk  ),.renc  (renc ),.raddr (raddr),.rdata (rdata));endmodule

输入信号里有时钟信号,复位信号,读写使能信号,输入信号,

输出信号里有满信号,空信号,输出的队头信号

输入的时候,就写使能打开,然后

同步FIFO是说读写的时钟是一致的

异步FIFO

第一部分是双口RAM,用于数据的存储

第二部分是数据写入控制器

第三部分是数据读取控制器

第四部分是读指针同步器

使用写时钟的两级触发器采集读指针,输出到数据写入控制其

第五部分是写指针同步器

比较空满,采用格雷码的比较来产生

格雷码是循环编码,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/179707.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

快速入手maven

文章目录 Maven介绍Maven安装和配置基于IDEA的Maven工程创建梳理Maven工程GAVP属性Idea构建Maven JavaSE工程Idea构建Maven JavaEE工程1. 手动创建2. 插件方式创建 Maven工程项目结构说明Maven核心功能依赖和构建管理依赖传递和冲突依赖导入失败场景和解决方案扩展构建管理和插…

Spring Boot 面试题——自动装配

目录 Spring Boot 中的自动装配是指什么&#xff1f;解决了什么问题&#xff1f;Spring Boot 自动装配的流程有哪些&#xff1f;Spring Boot 中实现自动装配的原理是什么&#xff1f;Spring 中的 ConfigurationClassPostProcessor 类有什么作用&#xff1f;Spring Boot 自动装配…

识别flink的反压源头

背景 flink中最常见的问题就是反压&#xff0c;这种情况下我们要正确的识别导致反压的真正的源头&#xff0c;本文就简单看下如何正确识别反压的源头 反压的源头 首先我们必须意识到现实中轻微的反压是没有必要去优化的&#xff0c;因为这种情况下是由于偶尔的流量峰值,Task…

unity 从UI上拖出3D物体,(2D转3D)

效果展示&#xff1a; 2D转3D视频 UI结构 UI组件挂载 UI结构 这个脚本挂载到 3D物体身上 using DG.Tweening; using System.Collections; using System.Collections.Generic; using UnityEngine;public class DragGame : MonoBehaviour {[HideInInspector]public bool isDrag…

Redis之 redis.config配置文件

文章目录 前言一、基本配置1.单位2.包含3.网络配置4.通用5.快照6.安全7.限制8.仅追加模式 二、总体主要介绍总结 前言 行家一出手&#xff0c;就知有没有&#xff0c;让一起学习redis.config配置文件。 一、基本配置 Redis 的配置文件位于 Redis 安装目录下&#xff0c;文件名…

2023李宏毅机器学习HW05样例代码中文注释版

这里只是 2023 李宏毅机器学习 HW05 样例代码的中文注释版的分享&#xff0c;下面的内容绝大部分是样例代码&#xff0c;补充了小部分函数的功能解释&#xff0c;没有做函数功能上的修改&#xff0c;是 Simple baseline 版本。 notebook 代码下载: [EN] [ZH] 文章目录 作业描述…

软件测试/测试开发丨利用ChatGPT 生成自动化测试脚本

点此获取更多相关资料 简介 自动化测试脚本可以模拟用户与应用程序的交互&#xff0c;例如点击按钮、输入数据、导航到不同的页面等等&#xff0c;以验证应用程序的正确性、性能和稳定性。 自动化测试在回归测试、冒烟测试等测试流程中都可以极大地起到节省时间、节省人力的作…

优先队列----数据结构

概念 不知道你玩过英雄联盟吗&#xff1f;英雄联盟里面的防御塔会攻击离自己最近的小兵&#xff0c;但是如果有炮车兵在塔内&#xff0c;防御塔会优先攻击炮车&#xff08;因为炮车的威胁性更大&#xff09;&#xff0c;只有没有兵线在塔内时&#xff0c;防御塔才会攻击英雄。…

Charles小白新手入门教程

最近系统地重温了下Charles的各种功能&#xff0c;根据小破站上百里老师的讲解&#xff0c;做了一些笔记&#xff0c;对于Charles入门小白&#xff0c;多少会有点帮助&#xff0c; 下面就把分享给大家~ 一、Charles介绍 1、Charles简介 是基于http和https的代理服务器。 2、…

香港服务器不稳定的几种情况

​  近年来&#xff0c;随着互联网的迅猛发展&#xff0c;香港作为一个重要的网络枢纽地区&#xff0c;扮演着连接中国内地和国际网络的重要角色。一些用户表示在使用香港服务器时可能会遇到不稳定的情况&#xff0c;导致访问困难、加载缓慢甚至无法连接。 为什么香港服务器会…

【广州华锐互动】军用飞机VR实战训练系统

随着科技的飞速发展&#xff0c;虚拟现实(VR)技术为军事训练带来了前所未有的机遇。军用飞机VR实战训练系统&#xff0c;正是在这一背景下应运而生的一种创新的训练方法。该系统利用先进的虚拟现实技术&#xff0c;为飞行员提供真实且逼真的模拟飞行环境&#xff0c;使之能够在…

如何将极狐GitLab 漏洞报告导出为 HTML 或 PDF 格式或导出到 Jira

目录 导出为 HTML/PDF 将漏洞信息导出到 Jira 参考资料 极狐GitLab 的漏洞报告功能可以让开发人员在统一的平台上面管理代码&#xff0c;对其进行安全扫描、管理漏洞报告并修复漏洞。但有些团队更喜欢使用类似 Jira 的单独工具来管理他们的安全漏洞。他们也可能需要以易于理…

3.网络之UDP

UDP协议 文章目录 UDP协议1. UDP概述2. UDP报文格式3. UDP传输限制4. UDP校验和4.1 CRC 循环冗余校验算法4.2 md5 校验算法 1. UDP概述 UDP&#xff08;UserDatagramProtocol&#xff09;是一个简单的面向消息的传输层协议&#xff0c;尽管UDP提供标头和有效负载的完整性验证&a…

机器学习---支持向量机的初步理解

1. SVM的经典解释 改编自支持向量机解释得很好 |字节大小生物学 (bytesizebio.net) 话说&#xff0c;在遥远的从前&#xff0c;有一只贪玩爱搞破坏的妖怪阿布劫持了善良美丽的女主小美&#xff0c;智勇双全 的男主大壮挺身而出&#xff0c;大壮跟随阿布来到了妖怪的住处&…

unraid 安装并设置 zerotier 内网穿透安装 unraid 局域网内其他设备

Read Original 最近看了以下两个文章&#xff0c;感谢发布的各种精彩文章&#xff0c;让我受益匪浅。OPENWRT 的固件在设置了&#xff0c;【自动允许客户端 NAT】后&#xff0c;可以直接访问局域网其他设备&#xff0c;而我 unraid 部署 zerotier 后&#xff0c;只能访问 unra…

STM32:AHT20温湿度传感器驱动程序开发

注&#xff1a;温湿度传感器AHT20数据手册.pdf http://www.aosong.com/userfiles/files/AHT20%E4%BA%A7%E5%93%81%E8%A7%84%E6%A0%BC%E4%B9%A6(%E4%B8%AD%E6%96%87%E7%89%88)%20B1.pdf 一、分析AHT数据手册文档 (1).准备工作 1.新建工程。配置UART2 2.配置I2C1为I2C标准模式&…

C++笔记之实现多态的所有方法

C笔记之实现多态的所有方法 文章目录 C笔记之实现多态的所有方法1.C中多态是是什么&#xff1f;请用简洁准确的话描述2.虚函数实现多态2.1.虚函数&#xff08;Virtual Functions&#xff09;2.2.纯虚函数&#xff08;Pure Virtual Functions&#xff09;2.3.虚析构函数&#xf…

Linux基础环境开发工具的使用(yum,vim,gcc,g++)

Linux基础环境开发工具的使用[yum,vim,gcc,g] 一.yum1.yum的快速入门1.yum安装软件2.yum卸载软件 2.yum的生态环境1.操作系统的分化2.四个问题1.服务器是谁提供的呢?2.服务器上的软件是谁提供的呢?3.为什么要提供呢?4.yum是如何得知目标服务器的地址和下载链接呢?5.软件源 …

安全第一!速卖通测评补单稳定的系统注意事项大盘点

对新卖家而言&#xff0c;测评并非可耻之事&#xff0c;反而是无法起步、耗费自身时间才是真正的可耻。由于速卖通新店几乎无法获得任何活动的支持&#xff0c;流量也基本没有&#xff0c;因此要在90天内达成60单的业绩对于许多卖家来说都是一项挑战。因此&#xff0c;通过快速…

一天掌握python爬虫【基础篇】 涵盖 requests、beautifulsoup、selenium

大家好&#xff0c;我是python222小锋老师。前段时间卷了一套 Python3零基础7天入门实战 以及1小时掌握Python操作Mysql数据库之pymysql模块技术 近日锋哥又卷了一波课程&#xff0c;python爬虫【基础篇】 涵盖 requests、beautifulsoup、selenium&#xff0c;文字版视频版。1…