一、快時鍾域到慢時鍾域
當信號從快時鍾域同步到慢時鍾域時,有可能會導致信號的丟失,這時,我們很直接的想法是將脈沖信號拉寬之后再進行采樣,主要原理就是就是在快時鍾域下,將脈沖信號展寬,變成電平信號,再在慢時鍾域下同步該電平信號,再用快時鍾域同步慢時鍾域下的脈沖信號,用該脈沖信號拉低在快時鍾域下的脈沖信號。

1 // ********************************************************************************* 2 // Project Name : fast2low 3 // Email : 4 // Create Time : 2020/07/15 : 5 // Module Name : 6 // editor : 7 // Version : Rev1.0.0 8 // ********************************************************************************* 9 10 module fast2low( 11 input clka, // fast clk 12 input clkb, 13 input s_rst_n, 14 15 input pulse_a, 16 17 output pulse_outb, 18 output signal_outb 19 ); 20 21 reg signal_a ; 22 reg signal_b ; 23 24 reg signal_b_r1 ; 25 reg signal_b_r2 ; 26 27 reg signal_b_a1 ; 28 reg signal_b_a2 ; 29 30 always @(posedge clka or negedge s_rst_n) begin // 在時鍾 clka 下,生成展寬信號signal_a 31 if(s_rst_n == 1'b0) 32 signal_a <= 1'b0; 33 else if(pulse_a == 1'b1) // 檢測到輸入信號 pulse_a_in被拉高,則拉高signal_a 34 signal_a <= 1'b1; 35 else if(signal_b_a2 == 1'b1) // 檢測到 signal_b_a2被拉高,則拉低signal_a 36 signal_a <= 1'b0; 37 else 38 signal_a <= signal_a; 39 end 40 41 always @ (posedge clkb or negedge s_rst_n) begin // 在clkb下同步signal_a 42 if(s_rst_n == 1'b0) 43 signal_b <= 0; 44 else 45 signal_b <= signal_a; 46 end 47 48 always @ (posedge clkb or negedge s_rst_n) begin 49 if(s_rst_n == 1'b0) begin 50 signal_b_r1 <= 1'b0; 51 signal_b_r2 <= 1'b0; 52 end 53 else begin 54 signal_b_r1 <= signal_b; 55 signal_b_r2 <= signal_b_r1; 56 end 57 end 58 59 always @ (posedge clka or negedge s_rst_n) begin // 在時鍾域clk_a下,采集signal_b_r1,用於反饋來拉低展寬信號signal_a 60 if(s_rst_n == 1'b0) begin 61 signal_b_a1 <= 1'b0; 62 signal_b_a2 <= 1'b0; 63 end 64 else begin 65 signal_b_a1 <= signal_b_r1; 66 signal_b_a2 <= signal_b_a1; 67 end 68 end 69 70 assign signal_outb = signal_b_r1; 71 assign pulse_outb = signal_b_r1 & (~signal_b_r2); 72 73 endmodule
Modelsim仿真:
注:此部分代碼來源於https://www.cnblogs.com/rouwawa/p/7501319.html
二、慢時鍾域到快時鍾域

1 // ********************************************************************************* 2 // Project Name : slow2fast 3 // Email : 4 // Create Time : 2020// : 5 // Module Name : slow2fast 6 // editor : Qing 7 // Version : Rev1.0.0 8 // ********************************************************************************* 9 10 module slow2fast( 11 input sclk , 12 input s_rst_n , 13 input pluse_in , 14 15 output pulse_out 16 ); 17 18 reg pluse_in_r1 ; 19 reg pluse_in_r2 ; 20 reg pluse_in_r3 ; 21 22 always @ (posedge sclk or negedge s_rst_n) begin 23 if(s_rst_n == 1'b0) begin 24 pluse_in_r1 <= 1'b0; 25 pluse_in_r2 <= 1'b0; 26 pluse_in_r3 <= 1'b0; 27 end 28 else begin 29 pluse_in_r1 <= pluse_in; 30 pluse_in_r2 <= pluse_in_r1; 31 pluse_in_r3 <= pluse_in_r2; 32 end 33 end 34 35 assign pulse_out = pluse_in_r3; 36 37 endmodule