1 module Sync_Pulse 2 ( 3 input clka, 4 input clkb, 5 input rst_n, 6 input pulse_ina, //脈沖或電平信號都可以 7 output pulse_outb, //脈沖信號 8 output signal_outb //電平信號 9 ); 10 //-------------------------------------------------------- 11 reg signal_a; 12 reg signal_a_r1; 13 reg signal_a_r2; 14 reg signal_b; 15 reg signal_b_r1; 16 //-------------------------------------------------------- 17 //-- a時鍾域生成展寬信號 18 //-------------------------------------------------------- 19 always @(posedge clka or negedge rst_n)begin 20 if(!rst_n)begin 21 signal_a <= 1'b0; 22 end 23 else if(pulse_ina) begin //檢測到脈沖 24 signal_a <= 1'b1; //拉高 25 end 26 else if(signal_a_r2) begin //同步到b后同步回a 27 signal_a <= 1'b0; //拉低,展寬使命完成 28 end 29 end 30 //-------------------------------------------------------- 31 //-- 展寬信號同步到b時鍾域再同步回a時鍾域 32 //-------------------------------------------------------- 33 always @(posedge clkb or negedge rst_n)begin 34 if(!rst_n)begin 35 signal_b <= 1'b0; 36 signal_b_r1 <= 1'b0; 37 end 38 else begin 39 signal_b <= signal_a; 40 signal_b_r1 <= signal_b; 41 end 42 end 43 44 always @(posedge clka or negedge rst_n)begin 45 if(!rst_n)begin 46 signal_a_r1 <= 1'b0; 47 signal_a_r2 <= 1'b0; 48 end 49 else begin 50 signal_a_r1 <= signal_b_r1; 51 signal_a_r2 <= signal_a_r1; 52 end 53 end 54 //-------------------------------------------------------- 55 //-- 脈沖信號輸出,上升沿檢測 56 //-------------------------------------------------------- 57 assign pulse_outb = ~signal_b_r1 & signal_b; 58 //-------------------------------------------------------- 59 //-- 電平信號輸出,b時鍾域展寬信號 60 //-------------------------------------------------------- 61 assign signal_outb = signal_b_r1; 62 63 64 endmodule
這個代碼建議背出來,看不太懂就自己仿真看看吧!