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.mzph.cn/news/145913.shtml

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

相关文章

微信小程序渲染的富文本里面除了img标签外什么都没有,该如何设置img的大小

微信小程序富文本渲染&#xff1a; <rich-text nodes"{{content}}"style"{{style}}" ></rich-text> content是接口得到的值 let cont object.contentlet a cont.replace(/<img/gi,<img style"max-width:94%;height:auto;margi…

python环境安装教程

1.python解释器安装 python解释器&#xff1a;将书写的代码转换为二进制。 1.打开官网&#xff1a;Welcome to Python.org&#xff0c;点击下载&#xff0c;选择对应的系统和想要下载的python版本进行下载&#xff1a; 2.双击打开下载好的python解释器进行安装&#xff0c;可…

Android 摇一摇功能实现,重力加速度大于15

最近接到需求实现摇一摇需求&#xff0c;不过这个法律限制的很严格&#xff0c;属于敏感地带&#xff0c;实现后又被叫停了。 法律要求&#xff1a; 如果按照规定&#xff0c;操作时间不少于3s就基本没什么跳转了。 实现的话&#xff0c;只考虑了第一条&#xff0c;即&#…

CTFd-Web题目动态flag

CTFd-Web题目动态flag 1. dockerhub注册2. dockerfile编写3. 上传到docker仓库4. 靶场配置5. 动态flag实现 1. dockerhub注册 想要把我们的web题目容器上传到docker仓库中&#xff0c;我们需要dockerhub官网注册一个账号&#xff0c;网址如下 https://hub.docker.com/2. dock…

redis运维(六)redis-cli命令

一 redis-cli 注意&#xff1a; redis-cli核redis-server版本必须适配 --> 见 redis-cli --version提示&#xff1a; 不过一般安装服务端 redis-server 时内置了客户端 redis-cli说明&#xff1a; redis-cli 是 redis 的一种命令行的客户端工具备注&#xff1a; redis-se…

Android 13.0 recovery出厂时清理中字体大小的修改

1.前言 在13.0的系统rom定制化开发中,在recovery模块也是系统中比较重要的模块,比如恢复出厂设置,recovery ota升级, 清理缓存等等,在一些1080p的设备,但是density只是240这样的设备,会在恢复出厂设置的时候,显示的字体有点小, 产品要求需要将正在清理的字体调大点,这…

APP安全加固怎么做?加固技术、加固方法、加固方案

​ 前面的文章中我们为大家介绍了移动应用安全检测的测试依据、测试方法、和测试内容&#xff0c;本文我们着重分享App安全加固的相关内容。 ​ &#xff08;安全检测内容&#xff09; 通过前面的文章我们知道了app安全检测要去检测哪些内容&#xff0c;发现问题后我们如何去修…

状态模式-

定义&#xff1a;当一个对象的内在状态改变时允许改变其行为&#xff0c;这个对象看起来像是改变了其类。 适用场景&#xff1a; 1、一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。 2、条件、分支语句的代替者&#xff0c;且这些分支依赖于该对象…

常见的数据结构有哪些?

数据结构分为逻辑结构和物理结构。 逻辑结构&#xff1a;指数据元素之间逻辑关系的数据结构&#xff0c;这里的逻辑关系是指数据元素之间的前后间关系&#xff0c;与数据在计算机中的存储位置无关。物理结构&#xff1a;指数据的逻辑结构在计算机存储空间中的存放形式称为数据…

mysql中的各种日志文件redo log、undo log和binlog

mysql中的各种日志文件redo log、undo log和binlog mysql中的各种日志文件redo log、undo log和binlog1.MySQL日志文件类型2.redo log日志2.1 作用2.2工作原理&#xff1a;2.3详解 3.undo log日志4.binlog日志5.总结 mysql中的各种日志文件redo log、undo log和binlog 1.MySQL…

JavaScrip获取视频第一帧作为封面图

在JavaScript中&#xff0c;你可以使用HTML5的<video>元素来加载视频&#xff0c;然后使用Canvas来捕获视频的第一帧作为封面图。以下是一个简单的例子&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8&qu…

常见排序算法实现

&#x1f495;"每一天都是值得被热爱的"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;常见排序算法实现 1.排序的概念 所谓排序&#xff0c;就是按照特定顺序重新排列序列的操作 排序的稳定性&#xff1a; 当一个序列中存在相同的元素时 排序过…

docker小技能:容器IP和宿主机IP一致( Nacos服务注册ip为内网ip,导致Fegin无法根据服务名访问 )

文章目录 I 预备知识1.1 Docker组成1.2 命名空间 (进程隔离)1.3 Docker的网络模式1.4 容器IP和宿主机IP一致1.5 容器时间和服务器时间的一致性II 常用命令2.1 案例:流水线docker 部署2.2 删除没有使用的镜像2.3 shell 不打印错误输出2.4 阿里云流水线/jenkins忽略shell步骤中…

R语言绘制精美图形 | 火山图 | 学习笔记

一边学习&#xff0c;一边总结&#xff0c;一边分享&#xff01; 教程图形 前言 最近的事情较多&#xff0c;教程更新实在是跟不上&#xff0c;主要原因是自己没有太多时间来学习和整理相关的内容。一般在下半年基本都是非常忙&#xff0c;所有一个人的精力和时间有限&#x…

pipeline agent分布式构建

开启 agent rootjenkins:~/learning-jenkins-cicd/07-jenkins-agents# docker-compose -f docker-compose-inbound-agent.yml up -d Jenkins配置添加 pipeline { agent { label docker-jnlp-agent }parameters {booleanParam(name:pushImage, defaultValue: true, descript…

vue echart 立体柱状图 带阴影

根据一个博主代码改编而来 <template><div class"indexBox"><div id"chart"></div></div> </template><script setup> import * as echarts from "echarts"; import { onMounted } from "vue&…

缺陷分级(过程质量bug分级)

缺陷按照其影响的严重程度&#xff0c;从高到低分成5级&#xff0c;分别为致命&#xff08;Blocker&#xff09;、严重&#xff08;Critical&#xff09;、一般&#xff08;Major&#xff09;、轻微&#xff08;Minor&#xff09;以及建议&#xff08;Enhancement&#xff09;。…

netty之EventLoopGroup

创建EventLoopGroup使用无参构造方法时&#xff0c;发现会创建24个NioEventLoop&#xff08;readonlyChildren.size24&#xff09;,经查&#xff0c;是取的java虚拟机的可用处理器数2倍。源码如下&#xff1a; 重点就是最后哪个方法的注释&#xff1a;Returns the number of p…

查看libc版本

查看libc库版本 查看系统libc版本 $ ldd --version ldd (Ubuntu GLIBC 2.27-3ubuntu1.2) 2.27 Copyright (C) 2018 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or …

LabVIEW进行MQTT通信及数据解析

需求&#xff1a;一般通过串口的方式进行数据的解析&#xff0c;但有时候硬件的限制&#xff0c;没法预留串口&#xff0c;那么如何通过网络的方式特别是MQTT数据的通信及解析 解决方式&#xff1a; 1.MQTT通信控件&#xff1a; 参考开源的mqtt-LabVIEW https://github.com…