取时钟线的下降沿时的数据错位问题解决

在项目中,涉及到不同时钟域通信的时候,往往要在时钟边沿时刻取数据线的值,但是如果数据线上的数据持续时间比较短,取时钟沿之后将无法捕捉到数据线上的数据,此时读取的数据都是错误的数据。此时可以把数据线上的数据也相应的延迟几个时钟周期,则就可以读到正确的数据。

例:

读不到正确的数据的例程:

程序:

 module  testedge(
                  clk,
                                    rst_n,

                                    sclk,
                                    sdat,

                                    dataout,
                                    flag
                                    );

 input           clk;
 input           rst_n;

 input           sclk;
 input           sdat;

 output   [7:0]  dataout;
 output          flag;
 reg             flag;
 reg      [7:0]  dataout;
 //-------------------------------------
 /* 取边沿时刻 */
  reg                sclk_1;
    reg                sclk_2;
    reg                sclk_3;
    wire               sclk_pos;
 always @(posedge clk or negedge rst_n)
 begin
  if(!rst_n)
   begin
      {sclk_3,sclk_2,sclk_1} <=  3‘d0;
    end
  else
    begin
       {sclk_3,sclk_2,sclk_1} <=  {sclk_2,sclk_1,sclk};
    end
  end

    assign sclk_pos = ~sclk_3&sclk_2;

    reg   [2:0]  n;
    reg   [2:0]  state;
 always @(posedge clk or negedge rst_n)
 begin
  if(!rst_n)
   begin
      dataout <= 0;
            flag <= 0;
            state <= 0;
            n <= 0;
    end
  else
    begin
      case(state)
            ‘d0:
              begin
                    if(sclk_pos)
                     begin
                         dataout[n] <= sdat;
                         state <= ‘d1;
                        end
                    end
             ‘d1:
               begin
                        if(n == 7)
                         begin
                             n <= 0;
                             state <= ‘d2;
                            end
                         else
                             begin
                             n <= n + 1;
                             state <= ‘d0;
                             end
                     end
                ‘d2:
                  begin
                        flag <= 1;
                        state <= ‘d3;
                     end
                ‘d3:
                  begin
                        flag <= 0;
                        state <= ‘d0;
                     end
                default:state <= ‘d0;
             endcase
    end
  end

endmodule

仿真程序:

发送的数据为8‘h55;

/********************************Copyright**************************************
**----------------------------File information--------------------------
** File name  :.v
** CreateDate :2015.
** Funtions   :
** Operate on :M5C06N3L114C7
** Copyright  :All rights reserved.
** Version    :V1.0
**---------------------------Modify the file information----------------
** Modified by   :
** Modified data :
** Modify Content:
*******************************************************************************/

 module   testedg_tb;
 reg           clk;
 reg           rst_n;

 reg           sclk;
 reg           sdat;

 wire   [7:0]  dataout;
 wire          flag;

 testedge   testedge_1(
                  .clk,
                                    .rst_n,

                                    .sclk,
                                    .sdat,

                                    .dataout,
                                    .flag
                                    );

  parameter  tck = 24;
    parameter  t = 1000/tck;
    always
        #(t/2) clk = ~clk;

        task   send;
        input  [7:0]  datain;
        begin
            #(5*t)    sclk = 0;
            #(2*t)  sdat = datain[0];
            #(2*t)  sclk = 1;
            #(2*t)  sclk = 0;
                    sdat = datain[1];
            #(2*t)  sclk = 1;
            #(2*t)  sclk = 0;
                    sdat = datain[2];
            #(2*t)  sclk = 1;
            #(2*t)  sclk = 0;
                    sdat = datain[3];
            #(2*t)  sclk = 1;
            #(2*t)  sclk = 0;
                    sdat = datain[4];
            #(2*t)  sclk = 1;
            #(2*t)  sclk = 0;
                    sdat = datain[5];
            #(2*t)  sclk = 1;
            #(2*t)  sclk = 0;
                    sdat = datain[6];
            #(2*t)  sclk = 1;
            #(2*t)  sclk = 0;
                    sdat = datain[7];
            #(2*t)  sclk = 1;
            #(2*t)  sclk = 0;
                    sdat = 0;
            end
        endtask

    initial
      begin
        clk = 0;
            rst_n = 0;

        sclk = 0;
            sdat = 0;

            #(6*t)      rst_n = 1;

            #(6*t) send(8‘h55);

      end

 endmodule
 

仿真图:

数据线上加入延时之后可以读到正确的数据:

程序:

 module  testedge(
                  clk,
                                    rst_n,

                                    sclk,
                                    sdat,

                                    dataout,
                                    flag
                                    );

 input           clk;
 input           rst_n;

 input           sclk;
 input           sdat;

 output   [7:0]  dataout;
 output          flag;
 reg             flag;
 reg      [7:0]  dataout;
 //-------------------------------------
 /* 取边沿时刻 */
  reg                sclk_1;
    reg                sclk_2;
    reg                sclk_3;
    wire               sclk_pos;
 always @(posedge clk or negedge rst_n)
 begin
  if(!rst_n)
   begin
      {sclk_3,sclk_2,sclk_1} <=  3‘d0;
    end
  else
    begin
       {sclk_3,sclk_2,sclk_1} <=  {sclk_2,sclk_1,sclk};
    end
  end

    assign sclk_pos = ~sclk_3&sclk_2;
    //----------------------------------------------
      /* 添加部分 */
     reg         sdat_1;
     reg         sdat_2;
     reg         sdat_3;
     wire        sdat_flag;
    always @(posedge clk or negedge rst_n)
     begin
      if(!rst_n)
       begin
        {sdat_3,sdat_2,sdat_1} <= 3‘d0;
        end
      else
        begin
         {sdat_3,sdat_2,sdat_1} <= {sdat_2,sdat_1,sdat};
        end
      end
    assign     sdat_flag = sdat_3;

    //----------------------------------------
    reg   [2:0]  n;
    reg   [2:0]  state;
 always @(posedge clk or negedge rst_n)
 begin
  if(!rst_n)
   begin
      dataout <= 0;
            flag <= 0;
            state <= 0;
            n <= 0;
    end
  else
    begin
      case(state)
            ‘d0:
              begin
                    if(sclk_pos)
                     begin
                         dataout[n] <= sdat_flag;      /* 修改为延时之后的输入数据 */
                         state <= ‘d1;
                        end
                    end
             ‘d1:
               begin
                        if(n == 7)
                         begin
                             n <= 0;
                             state <= ‘d2;
                            end
                         else
                             begin
                             n <= n + 1;
                             state <= ‘d0;
                             end
                     end
                ‘d2:
                  begin
                        flag <= 1;
                        state <= ‘d3;
                     end
                ‘d3:
                  begin
                        flag <= 0;
                        state <= ‘d0;
                     end
                default:state <= ‘d0;
             endcase
    end
  end

endmodule

仿真程序同上。

仿真图:

注:并非所有情况都要这么做,视情况而定,而这样做的好处是更严谨。

时间: 2024-11-05 18:49:39

取时钟线的下降沿时的数据错位问题解决的相关文章

如何监听第三方应用程序(SOAP or RESTful 客户端)访问HTTPS网站时的数据?

随着互联网的应用越来越多,在我们的日常开发和调试当中(比如调试SOAP和RESTFul的时候),我们常常需要访问用第三方的工具访问HTTPS的网站,为了简化描述,本文使用IE浏览器访问Google 提供的https://www.googleapis.com/discovery/v1/apis RESTful服务为例,注意这个是基于https协议的访问,如果用第三方的嗅探工具,比如wiresharp,即使我们能把http的数据包抓到,显示出来的内容也是乱码,因为传送的内容经过了加密,而加密的私钥就

android83 Activity的生命周期,启动模式,返回时传递数据

#Android四大组件 * Activity * BroadCastReceiver * Service * ContentProvider #Activity生命周期 * oncreate:Activity对象创建完毕,但此时不可见 * onstart:Activity在屏幕可见,但是此时没有焦点(不能够点,不能够交互) * onResume:Activity在屏幕可见,并且获得焦点 * onPause:Activity此时在屏幕依然可见,但是已经没有焦点 * onStop:Activity

发布或重启线上服务时抖动问题解决方案

发布或重启线上服务时抖动问题解决方案 一.问题描述       在发布或重启某线上某服务时(jetty8作为服务器),常常发现有些机器的load会飙到非常高(高达70),并持续较长一段时间(5分钟)后回落(图1),与此同时响应时间曲线(图2)也与load曲线一致.注:load飙高的初始时刻是应用服务端口打开,流量打入时(load具体指什么可参考http://www.cnblogs.com/amsun/p/3155246.html). 图1 发布时候load飙高 图2 发布时候响应时间飙高 二.问

运用python抓取博客园首页的所有数据,而且定时持续抓取新公布的内容存入mongodb中

原文地址:运用python抓取博客园首页的所有数据,而且定时持续抓取新公布的内容存入mongodb中 依赖包: 1.jieba 2.pymongo 3.HTMLParser # -*- coding: utf-8 -*- """ @author: jiangfuqiang """ from HTMLParser import HTMLParser import re import time from datetime import date im

easyui使用datagrid时列名包含特殊字符导致表头与数据错位的问题

做一个用easyui的datagrid显示数据的功能时发现表格的列头与数据错位了,而且这个现象不总是能重现,一直没搞清楚原因.后来偶然在控制台看出了一点端倪: 推测表头或者单元格的class名应该是用字段名拼出来的,如果含有特殊字符可能违反了css的命名规则(权威的css命名规则暂时没有找到,这篇文章稍有提到). 我找了个有特殊字符的列的数据,发现果然歪了.验证了想法. 由于项目的特殊性,数据库的表是动态创建的,也就是部分列名是由用户输入的,比较随意(当然,列头是另外是有显示名称的). 所以这个

通过存储过程提单时进行数据校验,优先于预算控制

19.42版支持 通过存储过程提单时进行数据校验,优先于预算控制,如果数据校验不通过将不再执行预算控制 实现方法,在XML里添加节,同时支持多种校验拼接:    <DataControls>      <!--如果返回不为空则显示返回同时不允许提交,通过 G_FORM_ID 获得当前单据id -->     <DataContol name="金额控制举例1">           exec Logining 'root','','',''     

按某一字段分组取最大(小)值所在行的数据 分拆列值(转) 日期的推算

数据如下:name val memoa 2 a2(a的第二个值)a 1 a1--a的第一个值a 3 a3:a的第三个值b 1 b1--b的第一个值b 3 b3:b的第三个值b 2 b2b2b2b2b 4 b4b4b 5 b5b5b5b5b5*/--创建表并插入数据:create table tb(name varchar(10),val int,memo varchar(20))insert into tb values('a', 2, 'a2(a的第二个值)')insert into tb v

JavaScript 绑定事件时传递数据

var data = { name: 'Ruchee', email: '[email protected]' }; data.handleEvent = function (e) { console.log(this); }; document.getElementById('test_button').addEventListener('click', data, false); 重点:1. 绑定事件时传递数据本身2. 传递的数据中需要定义有一个 handleEvent 方法来负责事件响应

运用python抓取博客园首页的全部数据,并且定时持续抓取新发布的内容存入mongodb中

原文地址:运用python抓取博客园首页的全部数据,并且定时持续抓取新发布的内容存入mongodb中 依赖包: 1.jieba 2.pymongo 3.HTMLParser # -*- coding: utf-8 -*- """ @author: jiangfuqiang """ from HTMLParser import HTMLParser import re import time from datetime import date im