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;发现问题后我们如何去修…

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…

常见排序算法实现

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

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&…

查看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…

vmware安装MacOS以及flutter遇到的问题

安装过程&#xff1a;参考下面的文章 链接&#xff1a; 虚拟机VMware安装苹果系统macOS&#xff0c;超级详细教程&#xff0c;附文件下载&#xff0c;真教程&#xff01;&#xff01; 无限重启情况&#xff1a; &#xff08;二&#xff09; 配置虚拟机找到你的虚拟机安装文件…

21. 深度学习 - 拓朴排序的原理和实现

文章目录 Hi,你好。我是茶桁。 上节课&#xff0c;我们讲了多层神经网络的原理&#xff0c;并且明白了&#xff0c;数据量是层级无法超过3层的主要原因。 然后我们用一张图来解释了整个链式求导的过程&#xff1a; 那么&#xff0c;我们如何将这张图里的节点关系来获得它的求…

【kerberos】使用 curl 访问受 Kerberos HTTP SPNEGO 保护的 URL

前言&#xff1a; 大数据集群集成 Kerberos 后&#xff0c;很多 WEBUI 打开都会提示输入用户名和密码。由于我想获取 flink 任务的详情&#xff0c;且KNOX 并不支持Flink api&#xff0c;查看KNOX 直接的列表&#xff1a;https://docs.cloudera.com/cdp-private-cloud-base/7.…

双剑合璧:基于Elasticsearch的两路召回语义检索系统,实现关键字与语义的高效精准匹配

搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术细节以及项目实战(含码源) 专栏详细介绍:搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术…

叮!您收到了一封来自达坦科技的Hackthon邀请函

DatenLord Hackathon 2023正式启动&#xff01;达坦科技基于其跨云分布式文件系统DatenLord项目&#xff0c;结合AI大模型时代背景&#xff0c;搭建了擂台&#xff0c;在此正式向您发出邀约&#xff01; 本次大赛赛题深刻有趣&#xff0c;奖品丰厚多样&#xff0c;借此机会您不…

卷积神经网络(CNN)鲜花的识别

文章目录 前期工作1. 设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09;我的环境&#xff1a; 2. 导入数据3. 检查数据 二、数据预处理1. 加载数据2. 可视化数据3. 再次检查数据4. 配置数据集 三、构建CNN网络四、编译五、训练模型六、模型评估 前期工作 1. 设置GP…