首页 > 其他分享 >握手信号

握手信号

时间:2023-08-26 20:34:29浏览次数:33  
标签:ack 数据 握手 req 发送 信号 data

verilog企业真题 VL60 使用握手信号实现跨时钟域数据传输

描述:

1)分别编写一个数据发送模块和一个数据接收模块,模块的时钟信号分别为clk_a,clk_b。

2)两个时钟的频率不相同。数据发送模块循环发送0-7,在每个数据传输完成之后,间隔5个时钟,发送下一个数据。

3)请在两个模块之间添加必要的握手信号,保证数据传输不丢失。

data_req表示数据请求接受信号。当data发出时,该信号拉高,在确认数据被成功接收之前,保持为高,期间data应该保持不变,等待接收端接收数据。
当数据接收端检测到data_req为高,表示该时刻的信号data有效,保存数据,并拉高data_ack。
当数据发送端检测到data_ack,表示上一个发送的数据已经被接收。撤销data_req,然后可以改变数据data。等到下次发送时,再一次拉高data_req。

 

解题思路:

发送方

①处理收到的响应信号data_ack,进行打2拍处理;

②所发送数据data在收到响应后重新生成,即+1;

③发送请求信号data_req,会用到计数器来记时data_req的时间间隔。

接收方

①处理收到的请求信号data_req,进行打2拍处理;

②收到了请求后,两件事同时进行:a.发送响应, b.数据接收。

 

`timescale 1ns/1ns
module data_driver(
    input clk_a,
    input rst_n,
    input data_ack,
    output reg [3:0]data,
    output reg data_req
    );
   
    reg data_ack_r1, data_ack_r2;
    reg [2:0] cnt;
    //--------------两级同步------------------//
    always @(posedge clk_a, negedge rst_n) begin
        if(!rst_n) begin
            data_ack_r1 <= 0;
            data_ack_r2 <= 0;
        end else begin
            data_ack_r1 <= data_ack;
            data_ack_r2 <= data_ack_r1;
        end
    end
    //-----------------数据产生----------------------//
    always @(posedge clk_a, negedge rst_n) begin
        if(!rst_n) begin
            data <= 0;
        end else if(data_ack_r1 && !data_ack_r2) begin
            data <= data + 1;
        end else begin
            data <= data;
        end
    end
    //-----------------data_req----------------------//
    always @(posedge clk_a, negedge rst_n) begin
        if(!rst_n) begin
            data_req <= 0;
        end else if(data_ack_r1 && !data_ack_r2) begin
            data_req <= 0;
        end else if(cnt == 3'd4) begin
            data_req <= 1'b1;
        end else begin
            data_req <= data_req;
        end
    end
    //-----------------计数器----------------------//
    always @(posedge clk_a, negedge rst_n) begin
        if(!rst_n) begin
            cnt <= 0;
        end else if(data_ack_r1 && !data_ack_r2) begin
            cnt <= 0;
        end else if(data_req) begin
            cnt <= cnt;
        end else begin
            cnt <= cnt + 1;
        end
    end
endmodule

module data_receiver(
    input clk_b,
    input rst_n,
    input [3:0]data,
    output reg data_ack,
    input data_req
    );
   
    reg data_req_r1, data_req_r2;
    reg [3:0] data_reg;
    //--------------两级同步------------------//
    always @(posedge clk_b, negedge rst_n) begin
        if(!rst_n) begin
            data_req_r1 <= 0;
            data_req_r2 <= 0;
        end else begin
            data_req_r1 <= data_req;
            data_req_r2 <= data_req_r1;
        end
    end
    //-----------------数据存储----------------------//
    always @(posedge clk_b, negedge rst_n) begin
        if(!rst_n) begin
            data_reg <= 0;
        end else if(data_req_r1 && !data_req_r2) begin
            data_reg <= data;
        end else begin
            data_reg <= data_reg;
        end
    end
    //-----------------data_ack----------------------//
    always @(posedge clk_b, negedge rst_n) begin
        if(!rst_n) begin
            data_ack <= 0;
        end else if(data_req_r1 && !data_req_r2) begin
            data_ack <= 1'b1;
        end else begin
            data_ack <= 0;
        end
    end
   
endmodule

 

 

 

 

 

标签:ack,数据,握手,req,发送,信号,data
From: https://www.cnblogs.com/blog-address/p/17659400.html

相关文章

  • tcp三次握手和四次挥手
    三次握手所谓三次握手(Three-wayHandshake),是指建立一个TCP连接时,需要客户端和服务器总共发送3个报文。三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号,交换TCP窗口大小信息。在socket编程中,客户端执行connect()时。将触发三次握手。......
  • 测试DE10-Standard开发板VGA接口(基于ADV7123)输出RGB彩条时显示器显示“无信号”Signal
    SignalTap工具真的是一款非常非常实用的调试工具。最近想显示VGA 三色彩条(源码:基于友晶科技FPGA开发板DE2-115和DE10-STANDARD的VGA彩条显示设计(ADV7123)),引 脚分配和控制信号的设计都检查了  没有错误。也排除了VGA显示器故障(测试DE10-Standard\Demonstration\FPGA\D......
  • 锁、递归锁、条件变量、信号量代码解析(Lock, RLock, Condition, Semaphore)
    锁Lock>>>help(type(threading.Lock()))Helponclasslockinmodule_thread:classlock(builtins.object)锁对象是一个同步原语。Alockobjectisasynchronizationprimitive.Tocreatealock,callthreading.Lock().Methodsare:acqui......
  • 4G模块信号强弱测试总结
      wcdma_rssi(接受信号强度指示)资料依据:在CDMA网络中,RSSI的范围在-110dbm—-20dbm之间。一般来说,如果RSSI<-95dbm,说明当前网络信号覆盖很差,几乎没什么信号;-95dmb<RSSI<-90dbm,说明当前网络信号覆盖很弱;RSSI〉-90dbm,说明当前网络信号覆盖较好。所以,一般都是以-90dbm为临界点,......
  • lora芯片PCB电路板影响接受信号的原因汇总
    Lora芯片的PCB板受力接收信号有问题可能有以下原因:电路板设计问题:电路板的设计不合理可能导致信号接收出现问题。例如,电路板的天线布局、走线可能影响到信号的接收效果。在设计电路板时,需要考虑到天线的布局、走线、接地等细节,以确保信号接收的稳定性。电路板受潮或受损:电路板受......
  • lora芯片PCB电路板影响接受信号的原因汇总
    Lora芯片的PCB板受力接收信号有问题可能有以下原因:电路板设计问题:电路板的设计不合理可能导致信号接收出现问题。例如,电路板的天线布局、走线可能影响到信号的接收效果。在设计电路板时,需要考虑到天线的布局、走线、接地等细节,以确保信号接收的稳定性。电路板受潮或受损:电路板受潮......
  • Qt 信号槽管理方式
    连接信号槽connect函数的第五个参数ConnectionType是一个定义在Qtnamespace中的一个枚举,具体内容如下:enumConnectionType{ AutoConnection, DirectConnection, QueuedConnection, BlockingQueuedConnection, UniqueConnection=0x80};Qt::AutoConnection:默认......
  • t113-c-线程、锁、信号
    线程:这个之前的文章已经记录过了线程之间的通信(同步)https://blog.csdn.net/weixin_56187542/article/details/126251049锁:c的锁同样是pthread头文件里面的https://blog.csdn.net/shaosunrise/article/details/107620885创建线程和加锁:信号这个是用来通知线程该工作了,不......
  • 嵌入式教程_数字信号处理:2-18 模数转换(AD)实验(采集波形)
    实验目的本节视频的目的是掌握EMIFA的使用,了解AD7606的芯片特性和使用,并实现基于AD7606采集正弦波。实验原理AD9833原理图找到波形发生器,可查看相关控制引脚。本次实验采集的波形是由AD9833输出的。AD7606原理图找到AD采集,可查看相关控制引脚,同时可看到ADC输入的V1~V8通道分别对应C......
  • 高速信号处理处理卡设计原理图:501-基于TMS320C6670的软件无线电核心板
    基于TMS320C6670的软件无线电核心板一、板卡概述     北京太速科技自主研发的TMS320C6670核心板,采用TI KeyStone系列的四核定点/浮点DSP TMS320C6670作主处理器。板卡引出处理器的全部信号引脚,便于客户二次开发,降低了硬件的开发难度和时间成本。板卡满足工......