ZYNQ_project:test_fifo_255X8

首先,这个vivado的fifo和quartus有很大不同。

用BRAM来实现异步fifo。

vivado的fifo有复位,在时钟信号稳定后,复位至少三个时钟周期(读写端口的慢时钟),复位完成后30个时钟周期后再进行写操作(慢时钟)。

有两个模式:标准模式和预读模式。

标准模式,读出的数据会比读使能延后一个时钟周期,fifo的深度也会比配置的少一个。

预读模式,读出的数据会与读使能同步,深度会比配置的多一个。

犯下的错误:顶层模块,fifo的复位接到了系统复位上。

没有认真阅读正点原子开发指南,忽略了深度的问题。

模块框图:

时序图:

 

代码:

module  fifo_wr_ctrl(input       wire                sys_clk     , // clk_wr // 50Mhzinput       wire                sys_rst_n   ,output      wire                rst_fifo    ,output      wire                wr_clk      ,output      wire    [7:0]       wr_din      ,output      reg                 wr_en       
);// parameter    parameter   RST_FIFO_CNT = 3    ,RST_WAIT_CNT = 30   ,DATA_IN_CNT  = 200  ; // 设置深度256,但实际深度只有255.写进数据0~254// localparamlocalparam  RST         = 4'b0001 ,RST_WAIT    = 4'b0010 ,DATA_IN_S   = 4'b0100 ,FINISH_S    = 4'b1000 ;// reg signal definereg     [7:0]       cnt_core    ;reg                 finish      ;reg     [3:0]       state       ;// wire signal definewire                rst_flag        ;wire                wait_flag       ;wire                data_over_flag  ;// reg     [7:0]       cnt_core    ;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) cnt_core <= 8'd0 ;else if(rst_flag || wait_flag || data_over_flag || finish)cnt_core <= 8'd0 ;else cnt_core <= cnt_core + 1'b1 ;end// reg                 finish          ;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) finish <= 1'b0 ;else if(data_over_flag)finish <= 1'b1 ;else finish <= finish ;end// reg     [3:0]       state       ;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) state <= 4'b0001 ;else case (state)RST         :   if(rst_flag)state <= RST_WAIT ;else state <= RST ;RST_WAIT    :   if(wait_flag)state <= DATA_IN_S ;else state <= RST_WAIT ;DATA_IN_S   :   if(data_over_flag)state <= FINISH_S ;else state <= DATA_IN_S ;FINISH_S    :   state <= FINISH_S ;default     :   state <= RST ;endcaseend// wire                rst_flag        ;assign  rst_flag  = ((cnt_core == (RST_FIFO_CNT - 1)) && (state == RST)) ;// wire                wait_flag       ;assign  wait_flag = ((cnt_core == (RST_WAIT_CNT - 1)) && (state == RST_WAIT)) ;// wire                data_over_flag  ;assign  data_over_flag = ((cnt_core == (DATA_IN_CNT - 1)) && (state == DATA_IN_S)) ;// output      reg                 rst_fifo    ,// always @(posedge sys_clk or negedge sys_rst_n) begin//     if(~sys_rst_n) //         rst_fifo <= 1'b1 ;//     else if(state == RST && rst_flag)//         rst_fifo <= 1'b1 ;//     else if(state == RST)//         rst_fifo <= 1'b0 ;//     else //         rst_fifo <= 1'b1 ;  // endassign  rst_fifo = (state == RST) ? 1'b1 : 1'b0 ;// output      wire                wr_clk      ,assign  wr_clk = (sys_rst_n) ? sys_clk : 1'b0  ;// output      wire    [7:0]       wr_din      ,assign  wr_din = (state == DATA_IN_S) ? cnt_core : 8'd0 ;// output      reg                 wr_en       ,always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) wr_en <= 1'b0 ;else if(wait_flag || data_over_flag)wr_en <= ~wr_en ;else wr_en <= wr_en ;endendmodule
module  fifo_rd_ctrl(input       wire            sys_clk     ,// clk_rdinput       wire            sys_rst_n   ,input       wire            wr_full     ,input       wire            almost_empty,// 将要读空output      reg             rd_en       ,output      wire            rd_clk      
);assign  rd_clk = (sys_rst_n) ? sys_clk : 1'b0 ;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) rd_en <= 1'b0 ;else if(almost_empty) // 将要读空后拉低读使能。因为是时序逻辑,应该正好读空fiford_en <= 1'b0 ;else if(wr_full) // 写满后拉高写使能rd_en <= 1'b1 ;else rd_en <= rd_en ;end
endmodule
module top(input       wire            sys_clk     ,input       wire            sys_rst_n   ,output      wire    [7:0]   data_out    
);// 例化间连线wire				clk_100Mhz	;wire				clk_50Mhz	;wire  				locked		;wire  				rst_n 		;wire                rst_fifo    ; // fifo的复位信号wire                wr_clk      ; // 写端口相关信号wire    [7:0]       wr_din      ; // 写端口相关信号wire                wr_en       ; // 写端口相关信号wire      [7:0]     dout		;wire                full		;wire                almost_full	;wire                empty		;wire                almost_empty;wire      [7:0]     rd_data_count;wire      [7:0]     wr_data_count;wire                wr_rst_busy	;wire                rd_rst_busy	;wire            	rd_en       ;wire            	rd_clk      ;mmcm_100M_50M mmcm_100M_50M_inst (.resetn				( sys_rst_n 	) ,.clk_in1			( sys_clk 		) ,.clk_out1			( clk_100Mhz 	) ,.clk_out2			( clk_50Mhz  	) ,.locked				( locked	 	) 
);assign 	rst_n = sys_rst_n && locked ;fifo_wr_ctrl fifo_wr_ctrl_inst(.sys_clk     		( clk_50Mhz 	) , // clk_wr // 50Mhz.sys_rst_n   		( rst_n     	) ,.rst_fifo    		( rst_fifo  	) ,.wr_clk      		( wr_clk    	) ,.wr_din      		( wr_din    	) ,.wr_en      		( wr_en     	) 
);fifo_rd_ctrl fifo_rd_ctrl_inst(.sys_clk     		( clk_100Mhz 	) ,// clk_rd.sys_rst_n   		( rst_n 		) ,.wr_full     		( full 			) ,.almost_empty		( almost_empty  ) ,// 将要读空.rd_en       		( rd_en    		) ,.rd_clk     		( rd_clk   		)  
);fifo_256X8 fifo_256X8_inst(.rst				( rst_fifo 		) ,  // 在fpga配置完成后,fifo必须要进行复位操作�?�复位信号至少保�?3个时钟周期以慢时钟为准�?�复位完成后至少经过30个时钟周期后,才能进行数据写操作�?.wr_clk				( wr_clk 		) ,  // 写数据时�?50Mhz // 复位高有效�??.rd_clk				( rd_clk 		) ,  // 读数据时�?100Mhz.din				( wr_din 		) ,  // 写入数据.wr_en				( wr_en 		) ,  // 写使�?.rd_en				( rd_en 		) ,  // 读使�?.dout				( data_out 		) ,  // 输出数据.full				( full			) ,  // 写满.almost_full		( almost_full	) ,  // 将写�?.empty				( empty			) ,  // 读空.almost_empty		( almost_empty	) ,  // 将读�?.rd_data_count		( rd_data_count	) ,  // 可读数据.wr_data_count		( wr_data_count	) ,  // 已写数据.wr_rst_busy		( wr_rst_busy	) ,  // 写复位忙�?.rd_rst_busy		( rd_rst_busy	)    // 读复位忙�?
); endmodule

 

`timescale 1ns/1ns
module  test_top();reg             sys_clk     ;reg             sys_rst_n   ;wire    [7:0]   data_out    ;top top_inst(.sys_clk            ( sys_clk   ) ,.sys_rst_n          ( sys_rst_n ) ,.data_out           ( data_out  )  
);parameter CYCLE = 20 ;initial beginsys_clk = 1'b1 ;sys_rst_n <= 1'b0 ;#( CYCLE * 5) ;sys_rst_n <= 1'b1 ;#(3000*CYCLE) ;$stop;endalways #(CYCLE/2) sys_clk = ~sys_clk ;
endmodule

 

仿真图:

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

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

相关文章

linux进程之进程的优先级➕环境变量

文章目录 1.优先级的认识1.1优先级的介绍1.2初识优先级1.3ps指令1.4查看/修改进程的优先级1.5对优先级的认识1.6对进程的深一步理解 2.环境变量2.0环境变量相关的命令2.1环境变量的概念2.2常见/查看环境变量2.3环境变量的作用2.4修改环境变量1.将zombie可执行程序放到PATH现有的…

Unity在Windows选项下没有Auto Streaming

Unity在Windows选项下没有Auto Streaming Unity Auto Streaming插件按网上说的不太好使最终解决方案 Unity Auto Streaming插件 我用的版本是个人版免费版&#xff0c;版本号是&#xff1a;2021.2.5f1c1&#xff0c;我的里边Windows下看不到Auto Streaming选项,就像下边这张图…

ThinkPHP 系列漏洞

目录 2、thinkphp5 sql注入2 3、thinkphp5 sql注入3 4、 thinkphp5 SQL注入4 5、 thinkphp5 sql注入5 6、 thinkphp5 sql注入6 7、thinkphp5 文件包含漏洞 8、ThinkPHP5 RCE 1 9、ThinkPHP5 RCE 2 10、ThinkPHP5 rce3 11、ThinkPHP 5.0.X 反序列化漏洞 12、ThinkPHP…

原型网络Prototypical Network的python代码逐行解释,新手小白也可学会!!-----系列8

文章目录 前言一、原始代码二、对每一行代码的解释&#xff1a;总结 前言 这是该系列原型网络的最后一段代码及其详细解释&#xff0c;感谢各位的阅读&#xff01; 一、原始代码 if __name__ __main__:##载入数据labels_trainData, labels_testData load_data() # labels_…

Linux下非root用户安装CUDA

目录 前言 参考链接 步骤 一. 首先&#xff0c;需要查看系统版本&#xff1a; 二. 安装包下载。 下载CUDA&#xff1a; cuDNN下载 三. 开始安装CUDA和cuDNN 安装CUDA 修改环境变量 安装 cuDNN 查看是否安装成功&#xff0c;输入nvcc -V 前言 由于一些代码实现&…

消息消费过程

前言 本文介绍下Kafka消费过程, 内容涉及消费与消费组, 主题与分区, 位移提交&#xff0c;分区再平衡和消费者拦截器等内容。 消费者与消费组 Kafka将消费者组织为消费组, 消息只会被投递给消费组中的1个消费者。因此, 从不同消费组中的消费者来看, Kafka是多播(Pub/Sub)模式…

十三、Docker的安装

0.安装Docker Docker 分为 CE 和 EE 两大版本。CE 即社区版&#xff08;免费&#xff0c;支持周期 7 个月&#xff09;&#xff0c;EE 即企业版&#xff0c;强调安全&#xff0c;付费使用&#xff0c;支持周期 24 个月。 Docker CE 分为 stable test 和 nightly 三个更新频道…

CTFhub-RCE-过滤cat

查看当前目录&#xff1a;输入:127.0.0.1|ls 127.0.0.1|cat flag_42211411527984.php 无输出内容 使用单引号绕过 127.0.0.1|cat flag_42211411527984.php|base 64 使用双引号绕过 127.0.0.1|c""at flag_42211411527984.php|base64 使用特殊变量绕过 127.0.0.…

第四篇 《随机点名答题系统》——基础设置详解(类抽奖系统、在线答题系统、线上答题系统、在线点名系统、线上点名系统、在线考试系统、线上考试系统)

目录 1.功能需求 2.数据库设计 3.流程设计 4.关键代码 4.1.设置题库 4.1.1数据请求示意图 4.1.2选择题库&#xff08;index.php&#xff09;数据请求代码 4.1.3取消题库&#xff08;index.php&#xff09;数据请求代码 4.1.4业务处理Service&#xff08;xztk.p…

计算机的发展

硬件的发展 第一台电子数字计算机&#xff1a;ENIAC&#xff08;1946&#xff09;&#xff0c;作者&#xff1a;冯诺依曼&#xff0c;逻辑元件&#xff1a;电子管 bug&#xff1a;小虫子&#xff0c;会影响打点 Intel&#xff1a; 机器字长&#xff1a;计算机一次整数运算所能…

企业计算机服务器中了mallox勒索病毒怎么解决,勒索病毒解密文件恢复

随着科技技术的不断发展&#xff0c;网络技术得到了快速提升&#xff0c;但网络安全威胁也不断增加&#xff0c;近期&#xff0c;云天数据恢复中心陆续接到很多企业的求助信息&#xff0c;企业的计算机服务器遭到了mallox勒索病毒攻击&#xff0c;导致企业的所有业务中断&#…

[nlp] 损失缩放(Loss Scaling)loss sacle

在深度学习中,由于浮点数的精度限制,当模型参数非常大时,会出现数值溢出的问题,这可能会导致模型训练不稳定。为了解决这个问题,损失缩放(Loss Scaling)技术被引入,它通过缩放损失值来解决这个问题。 在深度学习中,损失缩放技术通常是通过将梯度进行缩放来实现的。具…

鸿蒙APP外包开发上线流程

鸿蒙系统的上线流程可能会根据具体的版本和平台要求而略有不同。在进行上线之前&#xff0c;开发人员应该详细了解并遵循鸿蒙生态系统的相关规定和要求。鸿蒙&#xff08;HarmonyOS&#xff09;应用的上线流程通常包括以下步骤&#xff0c;希望对大家有所帮助。北京木奇移动技术…

【深度学习】pytorch快速得到mobilenet_v2 pth 和onnx

在linux执行这个程序&#xff1a; import torch import torch.onnx from torchvision import transforms, models from PIL import Image import os# Load MobileNetV2 model model models.mobilenet_v2(pretrainedTrue) model.eval()# Download an example image from the P…

安卓中轻量级数据存储方案分析探讨

轻量级数据存储功能通常用于保存应用的一些常用配置信息&#xff0c;并不适合需要存储大量数据和频繁改变数据的场景。应用的数据保存在文件中&#xff0c;这些文件可以持久化地存储在设备上。需要注意的是&#xff0c;应用访问的实例包含文件所有数据&#xff0c;这些数据会一…

Qt6版使用Qt5中的类遇到的问题解决方案

如果有需要请关注下面微信公众号&#xff0c;会有更多收获&#xff01; 1.QLinkedList 是 Qt 中的一个双向链表类。它提供了高效的插入和删除操作&#xff0c;尤其是在中间插入和删除元素时&#xff0c;比 QVector 更加优秀。下面是使用 QLinkedList 的一些基本方法&#xff1a…

微服务学习 | Eureka注册中心

微服务远程调用 在order-service的OrderApplication中注册RestTemplate 在查询订单信息时&#xff0c;需要同时返回订单用户的信息&#xff0c;但是由于微服务的关系&#xff0c;用户信息需要在用户的微服务中去查询&#xff0c;故需要用到上面的RestTemplate来让订单的这个微…

JVM虚拟机:通过日志学习PS+PO垃圾回收器

我们刚才设置参数的时候看到了-XXPrintGCDetails表示输出详细的GC处理日志&#xff0c;那么我们如何理解这个日志呢&#xff1f;日志是有规则的&#xff0c;我们需要按照这个规则来理解日志中的内容&#xff0c;它有两个格式&#xff0c;一个格式是GC的格式&#xff08;新生代&…

YOLOv8/YOLOv7/YOLOv5/YOLOv4/Faster-rcnn系列算法改进【NO.79】改进损失函数为VariFocal Loss

前言 作为当前先进的深度学习目标检测算法YOLOv8&#xff0c;已经集合了大量的trick&#xff0c;但是还是有提高和改进的空间&#xff0c;针对具体应用场景下的检测难点&#xff0c;可以不同的改进方法。此后的系列文章&#xff0c;将重点对YOLOv8的如何改进进行详细的介绍&…

Egress-TLS-Origination

目录 文章目录 目录本节实战1、出口网关TLS发起2、通过 egress 网关发起双向 TLS 连接关于我最后 本节实战 实战名称&#x1f6a9; 实战&#xff1a;Egress TLS Origination-2023.11.19(failed)&#x1f6a9; 实战&#xff1a;通过 egress 网关发起双向 TLS 连接-2023.11.19(测…