FPGA跨时钟域之数据流跨时钟域
0 2023-03-22

所谓数据流跨时钟域即:时钟不同但是时间段内的数据量一定要相同。

常用的数据流跨时钟域可以使用fifo或者ram实现。fifo的实现我们之前文章中fifo资源的介绍中已经详细讲解过了,xilinx FIFO 硬核的结构如下:

但是FIFO实现有一个问题,由于没有地址控制,需要固定时延是不方便,另外就是xilinx IP的fifo深度较大,可能存在资源浪费。

第二种方法就是使用ram自己搭建跨时钟域模块。我们使用bram做数据流跨时钟域。

例示代码如下   ,代码时钟比例为5:4,a时钟每5个clk写入4个数据,b时钟每个clk输出,代码中有两个点要注意:

1、0地址的写是能;

2、有一个防抖处理。











































































































// ============================================================// File Name: cm_cdc_bram// VERSION  : V1.0// DATA     : 2022/10/4// Author   : FPGA干货分享// ============================================================// 功能:数据流使用bram跨时钟域模块// ============================================================  `timescale 1ns/1psmodule cm_cdc_bram ( input wire I_clk_a , ///输入时钟a,500Mhz input wire I_clk_b , ///输入时钟b,400Mhz input wire I_data_a_valid , ///输入时钟b input wire [31:0] I_data_a , ///a时钟输入信号 output wire[31:0] O_data_b ///b时钟输出信号 );// ============================================================// wire reg// ============================================================reg     [8:0] S_wr_addr ;reg S_wr_zero_flag ; wire S_wr_zero_flag_rd ;reg     [3:0] S_clk_cnt ;reg S_wr_clr_falg_temp ;reg S_wr_clr_falg ;reg     [8:0] S_rd_addr ; // ============================================================// main code// ============================================================  // ============================================================// clk_a// ============================================================ always @(posedge I_clk_a) if(I_data_a_valid) S_wr_addr <= S_wr_addr + 9'd1; else S_wr_addr <= S_wr_addr ;  always @(posedge I_clk_a) S_wr_zero_flag <= (!(|S_wr_addr)); // ============================================================// clk_b// ============================================================ cm_cdc_1bit cm_cdc_1bit ( .I_clk_a (I_clk_a ) , ///输入时钟a .I_clk_b (I_clk_b ) , ///输入时钟b .I_single_a (S_wr_zero_flag ) , ///a时钟输入信号 .O_single_b (S_wr_zero_flag_rd ) ///b时钟输出信号 ); always @(posedge I_clk_b) if(S_wr_zero_flag_rd & (S_clk_cnt > 4'd2)) S_clk_cnt <= 4'd2; else S_clk_cnt <= S_clk_cnt + 4'd1; always @(posedge I_clk_b) if(S_wr_zero_flag_rd) S_wr_clr_falg_temp <= 1'b1; else if(&S_clk_cnt) S_wr_clr_falg_temp <= 1'b0; else S_wr_clr_falg_temp <= S_wr_clr_falg_temp ; always @(posedge I_clk_b) S_wr_clr_falg <= S_wr_clr_falg_temp & (&S_clk_cnt) ; always @(posedge I_clk_b) if(S_wr_clr_falg) S_rd_addr <= 9'd256; else S_rd_addr <= S_rd_addr + 'd1; BRAM_SDP_MACRO #( .BRAM_SIZE ("18Kb" ), // Target BRAM, "18Kb" or "36Kb"  .DEVICE ("7SERIES" ), // Target device: "7SERIES"  .WRITE_WIDTH (32 ), // Valid values are 1-72 (37-72 only valid when BRAM_SIZE="36Kb") .READ_WIDTH (32 ), // Valid values are 1-72 (37-72 only valid when BRAM_SIZE="36Kb") .DO_REG (1 ), // Optional output register (0 or 1) .INIT_FILE ("NONE" )) BRAM_SDP_MACRO_inst ( .DO (O_data_b ), // Output read data port, width defined by READ_WIDTH parameter .DI (I_data_a ), // Input write data port, width defined by WRITE_WIDTH parameter .RDADDR (S_rd_addr ), // Input read address, width defined by read port depth .RDCLK (I_clk_b ), // 1-bit input read clock .RDEN (1'b1           ), // 1-bit input read port enable .REGCE (1'b1           ), // 1-bit input read output register enable .RST (1'b0           ), // 1-bit input reset .WE (4'hf           ), // Input write enable, width defined by write port depth .WRADDR (S_wr_addr ), // Input write address, width defined by write port depth .WRCLK (I_clk_a ), // 1-bit input write clock .WREN (I_data_a_valid ) // 1-bit input write port enable);   endmodule





声明: 本文转载自其它媒体或授权刊载,目的在于信息传递,并不代表本站赞同其观点和对其真实性负责,如有新闻稿件和图片作品的内容、版权以及其它问题的,请联系我们及时删除。(联系我们,邮箱:evan.li@aspencore.com )
0
评论
  • 【上海/北京/深圳】立即报名SiFive RISC-V论坛


  • 相关技术文库
  • FPGA
  • 可编程
  • PLC
  • verilog
  • 时钟发生器的相位噪声和抖动性能

    系统设计师通常侧重于为应用选择最合适的数据转换器,在向数据转换器提供输入的时钟发生器件的选择上往往少有考虑。然而,如果不慎重考虑时钟发生器的相位噪声和抖动性能,

    前天
  • 雷达信号处理上是选FPGA还是GPU,它们各自的特点又是什么?

      FPGA和CPU一直是雷达信号处理不可分割的组成部分。传统上FPGA用于前端处理,CPU用于后端处理。随着雷达系统的处理能力越来越强,越来越复杂,对信息处理

    05-29
  • PLC的相关知识分析

    写点纯理论的东西,最近一直在思考怎么跟零基础的人讲PLC。也就是当你面对一个门外汉时,怎么让他对PLC感兴趣,然后慢慢的带着学习PLC。思考了很多,又把学校的里

    05-27
  • 一文分析DDR线长匹配与时序

    DDR布线在PCB设计中占有举足轻重的地位,设计成功的关键就是要保证系统有充足的时序裕量。要保证系统的时序,线长匹配又是一个重要的环节。我们来回顾一下,DDR布

    05-27
  • 带你区分时序图、活动图、状态图、协作图

      时序图  时序图用于描述对象之间的传递消息的时间顺序,即用例中的行为顺序。  当执行一个用例时,时序图中的每条消息对应了一个类操作或者引起转换的触发事件。 

    05-26
  • 区分FPGA与DSP特点及用途

      FPGA是一种可编程的硅芯片,DSP是数字信号处理,当系统设计人员在项目的架构设计阶段就面临到底采用FPGA还是DSP的重要问题。本文将首先分别介绍FPGA

    05-26
  • FPGA概念对比CPU架构有啥特点

      你还没听过FPGA?那你一定是好久没有更新自己在企业级IT领域的知识了。今天笔者就和大家聊聊何为FPGA?FPGA主要应用场景是什么?有人说FPGA是替代传

    05-26
  • 时序收敛十大准则

    本文摘自《Vivado使用误区与进阶》,作者为Xilinx工具与方法学应用专家Ally Zhou。 时序收

    05-26
  • 仿真软件ModelSim及其应用

    如果您是FPGA开发方面的初学者,那么这个教程一定能够帮助你在仿真技术上越过新人的台阶;如果您是FPGA开发的老手,这篇文档也并非对您没有帮助,您可以把教程发给其他刚入门的同事,免去您亲自上阵指导的麻烦,把主要的精力放在更有价值的地方。

    05-25
  • 快速认识FPGA

      学习FPGA,在不同层次的人明显有不同的答案。先说一句,说不要开发版的都是菜鸟级选手。  我把FPGA层次划分为,鸡蛋级别,菜鸟级别,老鸟级别,高手级别四类

    05-25
  • 分析FPGA与CPLD的差别在哪

      1.CPLD  CPLD主要是由可编程逻辑宏单元(LMC,LogicMacroCell)围绕中心的可编程互连矩阵单元组成,其中LMC逻辑结构较复杂,并具有复

    05-25
  • FPGA与CPLD的作用及不同之处

      FPGA/CPLD能完成任何数字器件的功能,上至高性能CPU,下至简单的74电路,都可以用FPGA/CPLD来实现。  FPGA/CPLD如同一张白纸或是一

    05-24
下载排行榜
更多
广告