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

ops/2025/2/25 18:07:05/

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/ops/161258.html

相关文章

NLP-RNN-LSTM浅析

目录 双向 LSTM&#xff08;Bi - LSTM&#xff09; 双向 LSTM&#xff08;Bi - LSTM&#xff09;原理深入讲解 代码示例&#xff08;基于 PyTorch&#xff09; LSTM 应用到双向 RNN 中 代码示例&#xff08;基于 PyTorch&#xff09; 双向 LSTM - CRF&#xff08;Conditio…

基于ffmpeg+openGL ES实现的视频编辑工具-添加贴纸(八)

在当下丰富多元的音视频编辑应用领域,添加贴纸已然成为一项广受欢迎的功能,它能够为音视频作品注入独特的趣味与创意元素。本文将深入探究音视频添加贴纸背后所涉及的技术原理与实现路径。 一、技术原理概述 音视频从本质上来说,是由一系列连续的图像帧(针对视频部分)以…

软件测试之压力测试

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 压力测试 压力测试是一种软件测试&#xff0c;用于验证软件应用程序的稳定性和可靠性。压力测试的目标是在极其沉重的负载条件下测量软件的健壮性和错误处理能力&…

收到线上服务器出现cpu告警一般怎么排查?

当线上服务器出现CPU告警时&#xff0c;可以按照以下步骤进行系统性排查&#xff0c;逐步定位问题根源&#xff1a; 1. 快速确认CPU使用情况 命令工具&#xff1a;top # 实时查看CPU占用&#xff08;按P排序进程&#xff09; htop …

蓝桥杯备考:贪心算法之矩阵消除游戏

这道题是牛客上的一道题&#xff0c;它呢和我们之前的排座位游戏非常之相似&#xff0c;但是&#xff0c;排座位问题选择行和列是不会改变元素的值的&#xff0c;这道题呢每每选一行都会把这行或者这列清零&#xff0c;所以我们的策略就是先用二进制把选择所有行的情况全部枚举…

DeepSeek为云厂商带来新机遇,东吴证券看好AI带动百度智能云增长

近日&#xff0c;摩根士丹利&#xff08;亚洲&#xff09;发布研究报告《DeepSeek-Al Bifurcation》&#xff0c;报告指出DeepSeek的爆火催生了低成本人工智能市场&#xff0c;为数据中心、芯片及云服务提供商带来新的发展机遇。 同时&#xff0c;东吴证券发布研究报告维持百度…

DevEco Studio常用快捷键以及如何跟AndroidStudio的保持同步

DevEco Studio快捷键 DevEco Studio是华为推出的用于开发HarmonyOS应用的集成开发环境&#xff0c;它提供了丰富的快捷键以提高开发效率&#xff0c;以下为你详细介绍不同操作场景下的常用快捷键&#xff1a; 通用操作快捷键 操作描述Windows/Linux 快捷键Mac 快捷键打开设置窗…

前端基础知识

1. 变量和常量 1.1 变量 // 变量let name Jacklet age 20name lisiage 18 1.2 常量 // 常量const PI 3.14// PI 3.1415926 // error&#xff0c;常量不可重新赋值const articleList []const user {name: vue3,age: 10} 1.3 const 声明的数组和对象 因为数组和对象在…