FPGA中利用fifo时钟域转换---慢时钟域转快时钟域

news/2025/2/24 23:21:51/

FPGA中利用fifo时钟域转换—慢时钟域转快时钟域

一、时间计算方法

FIFO的输入数据的时钟是40MHz,FIFO输出数据取60MHz,刚好是40MHz的1.5倍,将慢时钟域转快时钟域。另外,fifo输出的数据,要输出给上位机,一帧数据要传输640*512=327680个像素数据,要求帧频为100Hz,对应的时间是1/100Hz=10ms,即要求10ms内将327680个数据传输完毕。验证fifo的输出时钟60MHz是否满足要求的方法:输出一帧数据的时间 = 一帧的总数据量/频率,T=(640 ×1.5 ×512 )/ 60M=8.192 ms

什么是频率:单位时间内周期变化的次数。1 Hz 表示每秒发生一次

二、注意的问题

1、FPGA中的计数器其实就是在计时。FIFO输入端的时钟频率小,输出时钟频率快,为了保证输入FIFO的数据与输出数据速度相等,即FIFO不至于读空,行计数器计数的最大值也必须放大1.5倍,即640*1.5=960,从FIFO中读数据时前640个计数时数据有效,这640个计数期间可以至一个标志rd_en位为1,作为FIFO读使能信号,960中的后320个计时为FIFO读数据消隐期,此时rd_en=0,即不读数据。这样输入FIFO的数据读出FIFO的数据时间上就可以匹配上,不至于将FIFO读空。

2、先预存一行640个数据到FIFO中,存第二行数据的同时,读取第一行的数据,这样FIFO就不会被读空;

3、FIFO输出后面的模块必须要60M的时钟来接收数据,不然数据会不正确。后面模块的时钟慢了数据会丢失,时钟快了会多出无效的数据。

三、代码设计:


module Slow2Fast(input i_reset,input i_clk_60m ,input i_clk_40m,input i_valid ,input [15:0] data ,output o_hsync,output o_vsync,output [11:0]o_vcnt,output [15:0] o_data
);reg  fifo_clr;reg  vsync ;reg  hsync ;reg  vsync_d ;reg  hsync_d;wire fifo_rd_req ;wire fifo_wr_req  ;wire [15:0] fifo_wr_data ;wire [15:0] fifo_rd_data ;reg [11:0]  hcnt;reg [11:0]  vcnt ;reg i_valid_d1;reg i_valid_d2,i_valid_d3;reg valid_shift_out,valid_buf;    //行场计数器,就是计时    always@(posedge i_clk_60m)begini_valid_d1 <= i_valid;i_valid_d2 <= i_valid_d1;i_valid_d3 <= i_valid_d2;if ((i_valid_d2 == 1'b1) && (i_valid_d3 == 1'b0)) begin //valid 信号的上升沿。上升沿到来,行场计数器清零hcnt <= 0;vcnt <= 0;endelse beginif (hcnt == (960 - 1))begin //输入时钟为40M,输出时钟为60M,60M=1.5*40M。 640*513 乘1.5时得: 960*563if (vcnt = (566 - 1)) //563vcnt <= vcnt;else beginvcnt <= vcnt + 1;endhcnt <=0;endelsehcnt <= hcnt + 1;      end//vcnt:0到513 hcnt:0到639      always@(posedge i_clk_60m) beginif (vcnt >= 1 and vcnt <= 512)// vcnt从1开始,因为要预存一行vsync <= 1'b1;elsevsync <= 1'b0;if((hcnt >= 0 && hcnt <= 639) && (vcnt >= 1 && vcnt <= 512))//FIFO读使能信号,在60M下在前640个计数,读信号为1,后320个计数为读FIFO消隐期hsync <= 1'b1;elsehsync <= 1'b0;if(vcnt = 513) fifo_clr <=  1'b1;elsefifo_clr <=  1'b0;end //		打拍always@(posedge i_clk_60m)  begin //60Mhsync_d <= hsync;vsync_d <= vsync;endassign  fifo_wr_req  = i_valid;assign  fifo_wr_data = i_data;assign  fifo_rd_req  = hsync;assign  o_hsync      = hsync_d;assign  o_vsync      = vsync_d; assign  o_data       = fifo_rd_data;assign  o_vcnt = vcnt;fifo_out inst_fifo_out (.rst		( fifo_clr ),.wr_clk	(  i_clk_40m ),//写FIFO时钟为40M.rd_clk 	(i_clk_60m) ,//读FIFO时钟为60M.din  	(fifo_wr_data)   ,.wr_en   	(fifo_wr_req)  ,.rd_en   	(fifo_rd_req) ,.dout    	(fifo_rd_data) ,.full  	(),.empty   	(),.wr_rst_busy	(),.rd_rst_busy 	());endmodule    
---晓凡	2025220日于武汉书

http://www.ppmy.cn/news/1574712.html

相关文章

什么是 Vue 的自定义事件?如何触发和监听?

Vue 的自定义事件详解 什么是自定义事件&#xff1f; 在 Vue 中&#xff0c;自定义事件是组件之间通信的重要机制。自定义事件允许子组件向父组件发送消息&#xff0c;通常用于处理用户交互或异步操作的结果。这种机制使得组件间的通信更加灵活和解耦。 自定义事件的基本概念…

八大排序算法(1)插入排序-直接插入排序 和 希尔排序

直接插入排序&#xff08;Insertion Sort&#xff09; 直接插入排序是最基本的插入排序算法&#xff0c;工作原理如下&#xff1a; 从第二个元素开始&#xff0c;将其与前面已经排好序的部分进行比较。 找到合适的位置后&#xff0c;将该元素插入到合适的位置&#xff0c;同…

力扣——杨辉三角

题目链接&#xff1a; 链接 题目描述&#xff1a; 思路&#xff1a; 直接找规律&#xff0c;按照数学的思路来 每一行的列最大索引 < 行索引 实现代码&#xff1a; class Solution {public List<List<Integer>> generate(int numRows) {List<List<In…

一、Spring框架系统化学习路径

系统化的Spring框架学习路径 第1阶段&#xff1a;基础知识准备 Java基础 核心概念&#xff1a;面向对象、异常处理、集合框架、多线程等。JVM基础&#xff1a;内存模型、垃圾回收机制。 Maven或Gradle Maven&#xff1a;创建项目、依赖管理、生命周期。Gradle&#xff1a;基本…

【GPU驱动】OpenGLES图形管线渲染机制

OpenGLES图形管线渲染机制 OpenGL/ES 的渲染管线也是一个典型的图形流水线&#xff08;Graphics Pipeline&#xff09;&#xff0c;包括多个阶段&#xff0c;每个阶段都负责对图形数据进行处理。管线的核心目标是将图形数据转换为最终的图像&#xff0c;这些图像可以显示在屏幕…

百度首页上线 DeepSeek 入口,免费使用

大家好&#xff0c;我是小悟。 百度首页正式上线了 DeepSeek 入口&#xff0c;这一重磅消息瞬间在技术圈掀起了惊涛骇浪&#xff0c;各大平台都被刷爆了屏。 百度这次可太给力了&#xff0c;PC 端开放仅 1 小时&#xff0c;就有超千万人涌入体验。这速度&#xff0c;简直比火…

黑马点评 面试话术

MybatisPlus session技术会把jsessionid自动写到cookie里 ThreadLocal保证线程安全 用springmvc的自定义拦截器把登出用户 查看详情 获取当前用户并且返回 上传操作 登录查看详情 以下是不拦截的路径 在tomcat负载均衡时 如果不使用redis 直接用相互拷贝 1 浪费空间 2 如果此时…

开放表格式和对象存储架构指南

比较 Apache Iceberg、Delta Lake 和 Apache Hudi&#xff0c;并了解如何为您的数据湖仓一体选择合适的开放表格式。开放表格式和对象存储正在重新定义组织构建其数据系统的方式&#xff0c;为可扩展、高效且面向未来的数据湖仓一体奠定了基础。通过利用对象存储的独特优势&…