跨時鐘域處理

題目:多時鐘域設計中,如何處理跨時鐘域

  1. 單bit:兩級觸發器同步(適用於慢到快)
  2. 多bit:採用異步FIFO,異步雙口RAM
  3. 加握手信號
  4. 格雷碼轉換

題目:編寫Verilog代碼描述跨時鐘域信號傳輸,慢時鐘域到快時鐘域

 1 reg     [1:0]   signal_r;
 2 //-------------------------------------------------------
 3 //
 4 always @(posedge clk or negedge rst_n)begin
 5     if(rst_n == 1'b0)begin
 6         signal_r <= 2'b00;
 7     end
 8     else begin
 9         signal_r <= {signal_r[0], signal_in};
10     end
11 end
12 
13 assign  signal_out = signal_r[1];

題目:編寫Verilog代碼描述跨時鐘域信號傳輸,快時鐘域到慢時鐘域

    跨時鐘域處理從快時鐘域到慢時鐘域,若是是下面第一個圖,clkb則能夠採樣到signal_a_in,可是若是隻有單脈衝,如第二個圖,則不能確保採樣到signal_a_in。這個時候用兩級觸發器同步是沒有用的。html

代碼以下:微信

 1 //Synchronous
 2 module Sync_Pulse(
 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 //-------------------------------------------------------
12 reg             signal_a;
13 reg             signal_b;
14 reg     [1:0]   signal_b_r;
15 reg     [1:0]   signal_a_r;
16 
17 //-------------------------------------------------------
18 //在clka下,生成展寬信號signal_a
19 always @(posedge clka or negedge rst_n)begin
20     if(rst_n == 1'b0)begin
21         signal_a <= 1'b0;
22     end
23     else if(pulse_ina == 1'b1)begin
24         signal_a <= 1'b1;
25     end
26     else if(signal_a_r[1] == 1'b1)
27         signal_a <= 1'b0;
28     else 
29         signal_a <= signal_a;
30 end
31 
32 //-------------------------------------------------------
33 //在clkb下同步signal_a
34 always @(posedge clkb or negedge rst_n)begin
35     if(rst_n == 1'b0)begin
36         signal_b <= 1'b0;
37     end
38     else begin
39         signal_b <= signal_a;
40     end
41 end
42 
43 //-------------------------------------------------------
44 //在clkb下生成脈衝信號和輸出信號
45 always @(posedge clkb or negedge rst_n)begin
46     if(rst_n == 1'b0)begin
47         signal_b_r <= 2'b00;
48     end
49     else begin
50         signal_b_r <= {signal_b_r[0], signal_b};
51     end
52 end
53 
54 assign    pulse_outb = ~signal_b_r[1] & signal_b_r[0];
55 assign    signal_outb = signal_b_r[1];
56 
57 //-------------------------------------------------------
58 //在clka下采集signal_b[1],生成signal_a_r[1]用於反饋拉低signal_a
59 always @(posedge clka or negedge rst_n)begin
60     if(rst_n == 1'b0)begin
61         signal_a_r <= 2'b00;
62     end
63     else begin
64         signal_a_r <= {signal_a_r[0], signal_b_r[1]};
65     end
66 end
67 
68 endmodule

這部分代碼參考:異步

做者:肉娃娃spa

出處:https://home.cnblogs.com/u/rouwawa/設計

 

慢到快,單脈衝3d

慢到快,長信號傳遞code

快到慢,單脈衝htm

單脈衝,長信號傳遞blog

 

   上述代碼能夠實現快到慢,慢到快時鐘域任意轉換,pulse_outb會輸出單個脈衝,signal_outb輸出信號時間長度最少爲clkb的四個週期,當signal_a_in的信號長度大於clkb的四個週期,signal_outb輸出與signal_a_in時間長度相同。get

題目:邊沿檢測

 1 reg     [1:0]   signal_r;
 2 //-------------------------------------------------------
 3 //
 4 always @(posedge clk or negedge rst_n)begin
 5     if(rst_n == 1'b0)begin
 6         signal_r <= 2'b00;
 7     end
 8     else begin
 9         signal_r <= {signal_r[0], signal_in};
10     end
11 end
12 
13 assign  singal_posedge = ~signal_r[1] & signal_r[0];//檢測上升沿
14 assign  singal_negedge = signal_r[1] & ~signal_r[0];//檢測降低沿

       記憶:上升沿以前是0,如今變成1,因此上個週期傳輸到的signal_r[1]是0因此取反。反之亦然。

 

轉載請註明出處:NingHeChuan(寧河川)

我的微信訂閱號:硅農

若是你想及時收到我的撰寫的博文推送,能夠掃描左邊二維碼(或者長按識別二維碼)關注我的微信訂閱號

知乎ID:NingHeChuan

微博ID:NingHeChuan

原文地址:http://www.javashuo.com/article/p-tnbeqmxo-cv.html 

相關文章
相關標籤/搜索