zoukankan      html  css  js  c++  java
  • 跨时钟域信号处理

    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
  • 相关阅读:
    Maven常用命令:
    正向代理、反向代理、透明代理
    linux命令ps aux|grep xxx详解
    Java中Comparable和Comparator区别小结
    Java Queue之PriorityQueue
    java读写分离的实现
    CSS颜色名称和颜色值
    使用Access-Control-Allow-Origin解决跨域
    Tomcat 下启用 https:// 访问
    使用Jedis操作redis
  • 原文地址:https://www.cnblogs.com/qidaiymm/p/4966870.html
Copyright © 2011-2022 走看看