快時鍾域到慢時鍾域


一、快時鍾域到慢時鍾域

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

 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
View Code

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
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM