脉冲同步器

脉冲同步器

  • 脉冲同步器作用
    • 脉冲同步器
    • verilog code
      • testbench
    • 仿真结果

脉冲同步器作用

在实际的电路设计中,设计人员很少遇到单一时钟的同步电路设计,更多的是多时钟域的设计,因此异步电路的设计在实际应用中的重要意义不言而喻。由于信号在不同时钟域之间传输,容易发生亚稳态的问题导致,不同时钟域之间得到的信号不同。处理亚稳态常用打两拍的处理方法。多时钟域的处理方法很多,最有效的方法异步fifo,具体可以参考博主的verilog异步fifo设计,仿真(代码供参考)异步fifo适合处理不同时钟域之间传输的数据组,但有时不同时钟域之间仅仅传递脉冲,异步fifo就显的有点大材小用的,因此单信号的跨时钟域处理通常有,

  • 两级寄存器串联。
  • 脉冲同步器。
  • 结绳法。
  • 采用握手。
    本博文仅仅对脉冲同步器进行设计

脉冲同步器

由于脉冲在快时钟域传递到慢时钟域时,慢时钟有时无法采样的信号奈奎是特采样定理
因此需要对信号进行处理,可以让慢信号采样到。
脉冲同步器的结果如图
脉冲同步器_第1张图片

verilog code

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: zhangsy
// 
// Create Date: 2019/08/12 15:37:33
// Design Name: 
// Module Name: pluse_sync
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module pluse_sync(
										input src_clk,
										input src_rst_n,
										input s_pluse,
										input des_clk,
										input des_rst_n,
										output des_pluse
									);
									
/*//**********************synchronization req form src***********
reg req;
reg d_req1,d_req2;
always @(posedge des_clk ,negedge des_rst_n)
    if(!des_rst_n)
        {d_req1,d_req2} <=2'b0;
     else
        {d_req1,d_req2} <={req,d_req1};
//**************************************************************
//------------------------------synchronization ack form destination------------
reg ack;
reg d2s_ack1,d2sack2;
always @(posedge src_clk ,negedge src_rst_n)
    if(!src_rst_n)
        {d2s_ack1,d2sack2} <=2'b0;
     else
        {d2s_ack1,d2sack2} <={ack,d2s_ack1};
//*******************************************/
reg src_pluse;
always @ (posedge src_clk or negedge src_rst_n)
	if(!src_rst_n)
		src_pluse <= 1'b0;
	else if(s_pluse)
		src_pluse <= ~src_pluse;
		
reg d_reg1,d_reg2;
always @ (posedge des_clk or negedge des_rst_n)
	if(!des_rst_n)
		{d_reg1,d_reg2} <= 2'b00;
	else
		{d_reg1,d_reg2} <= {src_pluse,d_reg1};

assign des_pluse = (d_reg1 != d_reg2) ? 1'b1:1'b0;

endmodule


testbench

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: zhangsy
// 
// Create Date: 2019/08/12 15:43:37
// Design Name: 
// Module Name: tset
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module tset();
reg src_clk;
reg src_rst_n;
reg s_pluse;
reg des_clk;
reg des_rst_n;
wire des_pluse;
//wire syn_fail;
initial
begin
    src_clk =0;
    des_clk =0;
    src_rst_n=0;
    des_rst_n =0;
    s_pluse =0;
    #40
    src_rst_n=1;
     des_rst_n =1;
    #60
    s_pluse =0;
    
       
    #20
    s_pluse =1;
    #20
    s_pluse =0;
    #140
    s_pluse =1;
    #20
     s_pluse=0;
     #100
      //#20
        s_pluse =1;
        #20
        s_pluse =0;
         #20
           s_pluse =1;
           #20
           s_pluse =0;
end
always #10 src_clk =~src_clk;
always #5 des_clk =~des_clk;

 pluse_sync pluse_sync_inst(
                  .src_clk,
                  .src_rst_n,
                  .s_pluse,
                  .des_clk,
                  .des_rst_n,
                  .des_pluse,
              //    .syn_fail
              );
endmodule

仿真结果

脉冲同步器_第2张图片

你可能感兴趣的:(verilog,仿真,FPGA)