JobPlus知识库 IT 工业智能4.0 文章
异步时钟脉冲同步器的设计


  1. module edge_detect(

  2. input sclk_1,//100M

  3. input sclk_2,//50M

  4.                    input p_in,

  5.                    output p_out

  6.                    );

  7. reg p_in_reg=0;

  8. reg dly1,dly2,dly3;

  9. wire mux_2;

  10. //组合逻辑产生毛刺,p_in没有和sclk_1 同步

  11. assign mux_2 = (p_in==1'b1)? (~p_in_reg):p_in_reg;


  12.    always @(posedge sclk_1)

  13.        p_in_reg <= mux_2;


  14.    always @(posedge sclk_2)

  15.        {dly3,dly2,dly1} <= {dly2,dly1,p_in_reg};//流水移位赋值


  16.    assign p_out = dly3 ^ dly2;


  17. endmodule


//仿真tb

  1. `timescale 1ns/1ps

  2. module edge_detect_tb;

  3. reg sclk_1,sclk_2;

  4. reg p_in;

  5. reg p_in_r;//消除mux_2中的毛刺

  6. wire p_out;

  7. initial sclk_1 = 1;

  8. //always #5 sclk_1 = ~sclk_1;

  9. always #20 sclk_1 = ~sclk_1;

  10. initial sclk_2 = 1;

  11. always #10 sclk_2 = ~sclk_2;

  12. //pin和sclk_1 进行同步

  13. always @(posedge sclk_1)

  14. p_in_r <= p_in;

  15. initial begin

  16. p_in = 0;

  17. p_in_r = 0;

  18. #200;

  19. @(posedge sclk_1)

  20. p_in = 1;

  21. @(posedge sclk_1)

  22. p_in = 0;

  23. #200;

  24. @(posedge sclk_1)

  25. p_in = 1;

  26. @(posedge sclk_1)

  27. p_in = 0;

  28. end

  29. edge_detect edge_detect_inst(

  30. .sclk_1(sclk_1),//100M

  31. .sclk_2(sclk_2),//50M

  32. .p_in(p_in_r),

  33. .p_out(p_out)

  34. );

  35. endmodule


//这里使用的是run.do脚本仿真,不需要再quartus建立工程了,直接用modelsim就可以了 
//run.do脚本代码

  1. quit -sim

  2. .main clear

  3. vlib work

  4. vlog edge_detect_tb.v

  5. vlog ./../src/edge_detect.v

  6. vsim -voptargs=+acc work.edge_detect_tb

  7. add wave edge_detect_tb/edge_detect_inst/*


  8. run 1us


根据图示很容易就能写出代码, 
需要注意的是 
组合逻辑MUX_2的变化是和p_in有关,所以输入信号p_in要同步输入时钟,消除组合逻辑中产生的毛刺

具体仿真效果可以动手做一下,不做永远不知道哪里会出错


如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

¥ 打赏支持
278人赞 举报
分享到
用户评价(0)

暂无评价,你也可以发布评价哦:)

扫码APP

扫描使用APP

扫码使用

扫描使用小程序