• 跨时钟域信号处理


    1、什么是跨时钟域?

      如图所示:

      缺点:数据传输不可靠

     2、如何实现信号传输稳定?

      1)为什么要同步时钟?

        设计最基本的思想就是同步。如下图:

        如果来自异步的时钟信号(一个来自CPU,一个来自FPGA内部)同时对FPGA中的寄存器进行写入和读取操作,那么就会出现亚稳定状态。

        FPGA外部:控制总线(片选、写信号)、地址总线、数据总线

        FPGA内部:CPU接口控制(地址锁存寄存器、数据锁存寄存器)

      2)如何同步异步的时钟?

        I、先是使用脉冲检测法把脉冲信号与系统时钟信号clk同步

        II、然后使用脉冲检测法得到一个系统时钟宽度的使能脉冲作为数据锁存信号,也就将CPU的控制信号和系统时钟信号clk同步了

        相信我依然没有把过程描述清楚,还是举个例子吧,如下:

     1 wire wr_state=mcu_cs_n||mcu_wr_n;    //组合逻辑用来检测信号变化
     2 
     3 always@(posedge clk or negedge rst_n)
     4     if(!rst_n)
     5         begin
     6             mcu_addr_r<=4'h0;    //地址寄存器
     7             mcu_db_r<=8'h00;  //数据寄存器
     8         end
     9     else if(!wr_state)   //这里是每一个clk都在检测信号此时的变化
    10         begin
    11             mcu_addr_r<=mcu_addr;    //寄存地址
    12             mcu_db_r<=mcu_db;  //寄存数据
    13         end
    14         
    15 always@(posedge clk or negedge rst_n)
    16     if(!rst_n)
    17         begin
    18             wr1<=1'b1;
    19             wr2<=1'b1;
    20         end
    21     else
    22         begin
    23             wr1<=wr_state;  //这是写数据
    24             wr2<=wr1;  
    25         end
    26         
    27 assign pos_wr=~wr2&&wr1;    //这里可以检测到标志位的变化,如果我们直接检测变化,无非就是if(wr1)...但是这样不行的,因为if(这里数据类型必须是wire型的,也就是线型,我们怎么可能检测到reg寄存器型呢,这就是说明了为什么我们需要的“变量”很多。)
    28 endmodule
  • 相关阅读:
    聊聊es6中的解构
    JavaScript 中的面向对象编程
    TypeScript 中的类型保护
    7个你应该知道的 JavaScript 原生错误类型
    使用JavaScript策略模式校验表单
    nodejs如何解决高并发?
    nodejs核心模块有哪些?
    Dungeon Master
    Gold Balanced Lineup
    poj 2513Colored Sticks
  • 原文地址:https://www.cnblogs.com/qidaiymm/p/4966870.html
Copyright © 2020-2023  润新知