文章目錄
- clock gating 了解
-
- 1、latch
-
- 雙穩态器件
- 常見鎖存器結構
-
- SR鎖存器
- D鎖存器
- 2、clock gating
-
- (clock low-active) latch + AND gating 電路
-
- (clock high-active)latch + OR gating 電路
clock gating 了解
1、latch
參考:https://www.cnblogs.com/IClearner/p/6443539.html
雙穩态器件
穩定狀态為0或1兩種
舉例:交叉耦合反相器
假設初始Q為1,則可得電路輸出Q穩定在1
假設初始Q為0,則可得電路輸出Q穩定在0
**注意:**電路可能會有第三種狀态:亞穩态(不是一種穩定狀态)
常見鎖存器結構
鎖存器應用(數字電路中不希望出現鎖存器:timing borrow屬性,做timing會增加難度)
- 消除毛刺:clock gating
- DFT中解決 hold timing 問題
SR鎖存器
交叉耦合反相器沒有輸入,存儲不了輸入資料
真值表
輸入 | 輸出 |
---|---|
SR | Q |
00 | Q |
01 | 0(複位) |
10 | 1(置位) |
11 | 無效(Q=0,~Q=0,沖突) |
D鎖存器
SR鎖存器當SR=11時輸出錯誤;不能确定某個時候存某個資料。
D鎖存器:在clk高電平的時候通過資料;在clk低電平時鎖存資料
結構:
- 前級門電路:兩個與門(共12個半導體),一個非門(2個半導體)
- 後級:SR鎖存器:兩個或非門(共8個半導體)
真值表
輸入 | 輸出 |
---|---|
clk | Q |
clk=0時,SR=00 | Q(保持) |
clk=1時,SR=DD’(SR不會相同) | D |
功能
clk=1時,Q= D
clk=0時,Q = Q
代碼
[email protected](*) begin
if(en) // en在上圖為clock信号,
q = d;
end
注意:
上圖 latch 輸入的clock,表示在clk 為 1 和 0時,Q的值表現為鎖存和指派狀态(相當于使能信号)。
不要看到clk就想到時序邏輯或邊沿觸發,或在組合電路中看到clk就不知道如何處理
latch的畫法
推薦
不推薦(錯誤畫法)
注意區分
[email protected](*)
q = d; // 就是一根連線
應用
- 防電路毛刺:門控時鐘
2、clock gating
clock-gating 和 power-gating 的差別
//推薦風格:可生成門控時鐘
[email protected](posedge clk or negedge rst_n) begin
if(!rst_n)
data_out <= 8'b0;
else if(en)
data_out <= data_in;
end
//不推薦:無法生成門控時鐘
[email protected](posedge clk or negedge rst_n) begin
if(!rst_n)
data_out <= 8'b0;
else if(en)
data_out <= data_in;
else
//data_out <= 8'b0; 這是錯誤的,沒有en時應該保持,功能錯誤
// 下面這種不能生成 clock-gating,因為資料不變時還在指派,需要時鐘驅動,不能gating掉時鐘
data_out <= data_out;
end
普通電路映射電路圖:對應第二種寫法
門控時鐘電路:對應正确的clock-gating寫法(沒有第二個 else)
clock_gating結構演進
(clock low-active) latch + AND gating 電路
CK 為高電平,即CLK為低電平時,EN_Q=EN, 采樣EN信号
CK為低電平,即CLK為高電平時,EN_Q維持,保持信号,即使有 glitch信号,也不會傳下去
latch的屬性,在整個CLK為低電平的半個周期内,EN信号都可以鎖存進 latch,隻要保證EN信号在下一個CLK的上升沿來臨之前穩定(保證latch的setup/hold time),就能夠将正确的EN信号鎖存進去。
(clock high-active)latch + OR gating 電路
前面 latch要換成 clock high-active , 并根據 EN信号的高低電平有效不同,決定圖中的inverter cell是否存在,也能夠為EN信号穩定争取到一個 CLK cycle的時間
block level clock gating
将一個block 和 clock先做處理,gating之後送入block的clock端口
// 組合邏輯産生latch,用en生成e_latch信号,再和clk_in相與産生時鐘
[email protected](*) begin
clk_out = 0;
if(!clk_in)
e_latch = en;
end
assign clk_out = e_latch & clk_in;