數(shù)字IC基礎(chǔ)知識(shí)總結(jié)(筆試、面試向)-持續(xù)更新

該總結(jié)生成于找工作準(zhǔn)備期机打,更新做筆試題中常見(jiàn)的題目涉及到的知識(shí)點(diǎn)矫户,同時(shí)也是對(duì)數(shù)字IC基礎(chǔ)知識(shí)的一些總結(jié)。列入內(nèi)容來(lái)自:1.筆試題知識(shí)點(diǎn)残邀;2.個(gè)人覺(jué)得需要總結(jié)的一些知識(shí)皆辽。其中verilog語(yǔ)法部分過(guò)于龐雜,因此僅總結(jié)一些平辰嬲酰可能用到的但是不是特別明確的部分驱闷。同時(shí)有些知識(shí)因?yàn)殚g隔太過(guò)久遠(yuǎn)或疫情期間查不到比較權(quán)威的紙質(zhì)資料可能總結(jié)的不正確,歡迎大家留言批評(píng)指正空免。由于本文持續(xù)更新空另,因此有需要轉(zhuǎn)載的同學(xué)可以等持續(xù)更新刪除后再轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)務(wù)必征得本人同意且注明作者和出處

2020.05.18

  • 填充【2.5.建立時(shí)間與保持時(shí)間】相關(guān)內(nèi)容
  • 增加并填充【2.6.非理想時(shí)鐘】相關(guān)內(nèi)容
  • 增加并填充【2.7.跨時(shí)鐘域】相關(guān)內(nèi)容

2020.05.19

  • 填充【6.1.功耗公式】相關(guān)內(nèi)容
  • 填充【6.2.低功耗相關(guān)】相關(guān)內(nèi)容

2020.05.20

  • 新增并填充【5.1.FPGA概念】相關(guān)內(nèi)容
  • 填充【8.1.I2C】相關(guān)內(nèi)容

2020.06.05

  • 填充UART協(xié)議
  • 填充流程相關(guān)

2020.06.06

  • 新增并填充【3.3.默認(rèn)值】
  • 新增并填充【7.1.序列檢測(cè)器】
  • 新增并填充【7.2.基本自動(dòng)售貨機(jī)】

數(shù)制相關(guān)

二進(jìn)制-十進(jìn)制轉(zhuǎn)換

  • 二進(jìn)制-> 十進(jìn)制:對(duì)于整數(shù)而言蹋砚,從低到高第n個(gè)bit表示2^{n-1}痹换,0110 = 2^2 \times 1 + 2^1 \times 1 = 6;對(duì)于小數(shù)而言都弹,小數(shù)點(diǎn)后從高到低的第n個(gè)bit表示2^{-n}娇豫,即小數(shù)點(diǎn)后011表示2^{-2} + 2^{-3} = 0.375
  • 十進(jìn)制->二進(jìn)制:對(duì)于整數(shù),為除2取模畅厢,逆序排列冯痢,對(duì)于小數(shù),為乘2取模框杜,順序排列浦楣,例子如下所示:

例子:14->二進(jìn)制1110

數(shù)字 除2結(jié)果 除2取模
14 7 0
7 3 1
3 1 1
1 0 1

例子:0.6875->二進(jìn)制1011

數(shù)字 乘2結(jié)果
0.6875 1.375 1
0.375 0.75 0
0.75 1.5 1
0.5 1 1

原碼、反碼與補(bǔ)碼

其區(qū)別主要在于負(fù)數(shù)的表達(dá)咪辱,具體要求如下:

  • 原碼:最高位為符號(hào)位振劳,符號(hào)位為0表示整數(shù),符號(hào)位為1表示負(fù)數(shù)
  • 反碼:同樣具有符號(hào)位油狂,規(guī)則與原碼相同历恐,負(fù)數(shù)較原碼非符號(hào)為均按位取反
  • 補(bǔ)碼:為了消除+0和-0,擴(kuò)展表達(dá)容量专筷,符號(hào)位規(guī)則與原碼相同弱贼,負(fù)數(shù)為原碼非符號(hào)位按位取反+1

舉例:以4bit碼為例

十進(jìn)制 原碼 反碼 補(bǔ)碼
4 0100 0100 0100
-4 1100 1011 1100
-7 1111 1000 1001
-8 - - 1000

BCD碼與余3碼

BCD碼為使用4個(gè)bit表示一個(gè)十進(jìn)制位數(shù),即123的BCD碼為0x123磷蛹,余3碼表示BCD碼基礎(chǔ)上加3(十進(jìn)制)吮旅,例子如下,對(duì)于26而言:

  • BCD碼為0x26即二進(jìn)制為0010 0110
  • 余3碼為BCD碼直接加3味咳,二進(jìn)制為0010 0110 + 0011 = 0010 1001

格雷碼

格雷碼的優(yōu)勢(shì)在于相鄰的數(shù)之間的二進(jìn)制表達(dá)僅有一個(gè)bit發(fā)生變化庇勃,在跨時(shí)鐘域中不會(huì)產(chǎn)生競(jìng)爭(zhēng)冒險(xiǎn)檬嘀,格雷碼-二進(jìn)制轉(zhuǎn)換如下所示:

  • 二進(jìn)制轉(zhuǎn)格雷碼:保留最高位,剩余相鄰位數(shù)異或责嚷。例如數(shù)據(jù)1001鸳兽,結(jié)果為1101,如下:
確定方式 運(yùn)算 結(jié)果
取最高位 1 1
異或 1 xor 0 1
異或 0 xor 0 0
異或 0 xor 1 1
  • 格雷碼轉(zhuǎn)二進(jìn)制:保留最高位再层,從最高位往低運(yùn)算,對(duì)于第n位為第n位格雷碼和第n+1位的異或堡纬,例如數(shù)據(jù)1001聂受,結(jié)果為1110,如下:
確定方式 運(yùn)算 結(jié)果
取最高位 1 1
異或 0 xor 1 1
異或 0 xor 1 1
異或 1 xor 1 0

數(shù)字邏輯相關(guān)

布爾邏輯運(yùn)算律

名稱 運(yùn)算律
結(jié)合律 (a + b) + c = a + (b + c)烤镐、a(bc) = (ab)c
交換律 a + b = b + a蛋济、a \cdot b = b \cdot a
分配律 a(b + c) = ab + ac
吸收律 a + ab = a
冪等律 a + a = aaa = a
德摩根律 (a + b)' = a'b'炮叶、(ab)'=a' + b'
互補(bǔ)律 a + a' = 1碗旅、a \cdot a' = 0
零一律 a + 1 = 1a \cdot 1 = a镜悉、a + 0 = a a + 1 =1

卡諾圖

卡諾圖的思路為可視化的將電路邏輯轉(zhuǎn)為最小乘積項(xiàng)祟辟,再通過(guò)合并最小乘積項(xiàng)進(jìn)行化簡(jiǎn),如這一個(gè)例子:
Y = AB' + A'C + BC + C'D
對(duì)應(yīng)的卡諾圖為:

AB\CD 00 01 11 10
00 1 1 1
01 1 1 1
11 1 1 1
10 1 1 1 1

表中為1表示有這一個(gè)乘積項(xiàng)侣肄,例如在AB=01旧困、CD=00有一個(gè)1,即表示邏輯表達(dá)式含有項(xiàng)A'BC'D'稼锅。隨后繪制框吼具,繪制框的過(guò)程即為將最小項(xiàng)進(jìn)行組合化簡(jiǎn)的過(guò)程:同時(shí)包括0和1的乘積項(xiàng)可消去,如下圖所示:

框越大矩距,可消去的項(xiàng)越多拗盒,根據(jù)以上卡諾圖,化簡(jiǎn)結(jié)果為:
Y = A + B + CD'
除了化簡(jiǎn)外锥债,卡諾圖還可用于判定競(jìng)爭(zhēng)冒險(xiǎn)陡蝇,當(dāng)存在相切的框時(shí),存在競(jìng)爭(zhēng)冒險(xiǎn)

競(jìng)爭(zhēng)冒險(xiǎn)

組合競(jìng)爭(zhēng)冒險(xiǎn)即信號(hào)在實(shí)際電路中的傳輸存在延遲(Delay)哮肚,所以由于信號(hào)到達(dá)同一元件的時(shí)間并不一致毅整,到達(dá)的時(shí)間可能存在延遲。導(dǎo)致組合邏輯電路在某些時(shí)刻的結(jié)果看上去可能是錯(cuò)誤的绽左。競(jìng)爭(zhēng)冒險(xiǎn)的檢查方法有:

  • 代數(shù)法:當(dāng)邏輯表達(dá)式中出現(xiàn)A+A'或A'A時(shí)悼嫉,會(huì)產(chǎn)生競(jìng)爭(zhēng)冒險(xiǎn)
  • 卡諾圖法:當(dāng)存在相切的框時(shí),存在競(jìng)爭(zhēng)冒險(xiǎn)

解決方法有以下幾種:

  • 增加冗余項(xiàng):在卡諾圖中增加一個(gè)冗余的框拼窥,同時(shí)與相切的兩個(gè)框相交即可
  • 增加選通信號(hào):當(dāng)輸出穩(wěn)定后才輸出數(shù)據(jù)
  • 改用時(shí)序邏輯:同步時(shí)序邏輯中D觸發(fā)器對(duì)競(jìng)爭(zhēng)冒險(xiǎn)不敏感戏蔑,添加D觸發(fā)器可解決競(jìng)爭(zhēng)冒險(xiǎn)問(wèn)題
  • 改用格雷碼:格雷碼僅有1bit發(fā)生變化
  • 輸出端增加濾波電容

同步復(fù)位與異步復(fù)位

同步復(fù)位的優(yōu)點(diǎn):

  • 一般能夠確保電路是百分之百同步的蹋凝。
  • 確保復(fù)位只發(fā)生在有效時(shí)鐘沿,可以作為過(guò)濾掉毛刺的手段总棵。

同步復(fù)位的缺點(diǎn):

  • 復(fù)位信號(hào)的有效時(shí)長(zhǎng)必須大于時(shí)鐘周期鳍寂,才能真正被系統(tǒng)識(shí)別并完成復(fù)位。同時(shí)還要考慮如:時(shí)鐘偏移情龄、組合邏輯路徑延時(shí)迄汛、復(fù)位延時(shí)等因素。
  • 由于大多數(shù)的廠商目標(biāo)庫(kù)內(nèi)的觸發(fā)器都只有異步復(fù)位端口骤视,采用同步復(fù)位的話鞍爱,就會(huì)耗費(fèi)較多的邏輯資源。

異步復(fù)位優(yōu)點(diǎn):

  • 異步復(fù)位信號(hào)識(shí)別方便专酗,而且可以很方便的使用全局復(fù)位睹逃。
  • 由于大多數(shù)的廠商目標(biāo)庫(kù)內(nèi)的觸發(fā)器都有異步復(fù)位端口,可以節(jié)約邏輯資源祷肯。

異步復(fù)位缺點(diǎn):

  • 復(fù)位信號(hào)容易受到毛刺的影響沉填。
  • 復(fù)位結(jié)束時(shí)刻恰在亞穩(wěn)態(tài)窗口內(nèi)時(shí),無(wú)法決定現(xiàn)在的復(fù)位狀態(tài)是1還是0佑笋,會(huì)導(dǎo)致亞穩(wěn)態(tài)翼闹。

(以上優(yōu)缺點(diǎn)內(nèi)容來(lái)自知乎用戶Kevin Zhang的回答,如有侵權(quán)可聯(lián)系本人刪除)

異步復(fù)位電路需要注意以下兩點(diǎn):

  • 輸入端需濾除毛刺并做抗干擾處理(使用專用的異步復(fù)位IO)蒋纬,放置干擾
  • 需要同步釋放橄碾,防止亞穩(wěn)態(tài)的出現(xiàn)

異步復(fù)位同步釋放的代碼表達(dá)如下所示:

// rst_n_out為處理后的復(fù)位信號(hào)
always @ (posedge clk or negedge rst_n) begin
    if(~rst_n) begin
        rst_n_buff <= 1'b0;
        rst_n_out  <= 1'b0;
    end else begin
        rst_n_buff <= 1'b1;
        rst_n_out  <= rst_n_buff;
    end
end

建立時(shí)間與保持時(shí)間

建立時(shí)間和保持時(shí)間的定義如下所示:

  • 建立時(shí)間:輸入數(shù)據(jù)在時(shí)鐘采樣沿前必須有效的時(shí)間(時(shí)鐘沿之前必須穩(wěn)定的時(shí)間)
  • 保持時(shí)間:輸入數(shù)據(jù)在時(shí)鐘采樣沿后必須保持穩(wěn)定的時(shí)間(時(shí)鐘沿后必須穩(wěn)定的時(shí)間)

違反建立時(shí)間和保持時(shí)間可能產(chǎn)生亞穩(wěn)態(tài),對(duì)于一個(gè)一般的時(shí)序邏輯模型如下所示:

為了滿足后一個(gè)寄存器的建立時(shí)間要求颠锉,需要滿足:
T_{clk} > T_{c-q} + T_{comb} + T_{steup}
為了滿足后一個(gè)寄存器的保持時(shí)間要求法牲,需要滿足:
T_{c-q} + T_{comb} > T_{hold}
由以上公式,可以推斷出理想狀態(tài)下的:

  • 最小時(shí)鐘周期:T_{c-q} + T_{comb} + T_{steup}
  • 組合邏輯延遲范圍:T_{hold} - T_{c-q} < T_{comb} < T_{clk} - T_{c-q} - T_{setup}

非理想時(shí)鐘

非理想時(shí)鐘因素包括時(shí)鐘偏差(skew)和時(shí)鐘抖動(dòng)(jitter):

  • clock skew(時(shí)鐘偏差):集成電路中一個(gè)時(shí)鐘翻轉(zhuǎn)到達(dá)時(shí)間在空間上的差別(時(shí)鐘沿到達(dá)不同寄存器時(shí)鐘端口的時(shí)間差距)
  • clock jitter(時(shí)鐘抖動(dòng)):芯片的某一個(gè)給定點(diǎn)(寄存器時(shí)鐘端口)上時(shí)鐘周期發(fā)生暫時(shí)的變化(每個(gè)時(shí)鐘周期之間具有的差異)

偏差和抖動(dòng)對(duì)電路性能均有影響琼掠,對(duì)于時(shí)鐘偏差而言:
T_{clk} + \delta > T_{c-q} + T_{comb} + T_{steup} \\ T_{c-q} + T_{comb} > T_{hold} + \delta
這里的\delta即為skew拒垃,表示后級(jí)寄存器相對(duì)于前一級(jí)寄存器的時(shí)鐘偏差,亦可理解為“時(shí)鐘的從前級(jí)到后級(jí)的傳播延遲”瓷蛙,其值可以為正也可以為負(fù)(時(shí)鐘流向與數(shù)據(jù)流向反向)悼瓮。對(duì)于抖動(dòng)而言:
T_{clk} - 2t_j > T_{c-q} + T_{comb} + T_{steup} \\ T_{c-q} + T_{comb} > T_{hold} + 2t_j
其中t_j為時(shí)鐘抖動(dòng),表示抖動(dòng)的最大值(絕對(duì)值)艰猬。當(dāng)同時(shí)考慮時(shí)鐘skew和jitter時(shí)横堡,有:
T_{clk} + \delta -2t_j > T_{c-q} + T_{comb} + T_{steup} \\ T_{c-q} + T_{comb} > T_{hold} + \delta + 2t_j
產(chǎn)生非理想時(shí)鐘的原因可能包括:

  • 時(shí)鐘信號(hào)產(chǎn)生:偏上時(shí)鐘發(fā)生器可能產(chǎn)生時(shí)鐘jitter
  • 器件制造:由于工藝偏差不同路徑上的緩沖器參數(shù)不同,引起時(shí)鐘skew
  • 互聯(lián)偏差:互聯(lián)線的形態(tài)參數(shù)偏差冠桃,引起時(shí)鐘skew
  • 環(huán)境:溫度和電源命贴,溫度變化可以引起時(shí)鐘skew,用反饋電路校準(zhǔn)溫度補(bǔ)償可以緩解;供電一般產(chǎn)生jitter胸蛛,在時(shí)鐘驅(qū)動(dòng)器周圍加去耦電容緩解

跨時(shí)鐘域

在跨時(shí)鐘域過(guò)程中污茵,可能會(huì)產(chǎn)生以下問(wèn)題:

  • 數(shù)據(jù)丟失:常出現(xiàn)在高頻時(shí)鐘域到低頻時(shí)鐘域中,由于采樣時(shí)鐘過(guò)慢導(dǎo)致數(shù)據(jù)丟失
  • 數(shù)據(jù)重復(fù):常出現(xiàn)在低頻時(shí)鐘域到高頻時(shí)鐘域中葬项,由于采樣時(shí)鐘過(guò)快導(dǎo)致數(shù)據(jù)重復(fù)
  • 亞穩(wěn)態(tài):數(shù)據(jù)建立時(shí)間和保持時(shí)間不符合

解決方法有:

  • 同步器:多個(gè)(一般為兩個(gè))接收域寄存器串聯(lián)泞当,不能解決亞穩(wěn)態(tài)問(wèn)題,僅能緩解民珍。同時(shí)需要注意連接到同步器上的輸入必須是無(wú)組合邏輯的寄存器輸出信號(hào)襟士,否則可能產(chǎn)生毛刺問(wèn)題。多bit信號(hào)一般不用同步器嚷量,可能產(chǎn)生毛刺傳遞錯(cuò)誤的數(shù)據(jù)陋桂。
  • 握手信號(hào):通過(guò)多次握手
  • 異步FIFO:用于多bit數(shù)據(jù)的跨時(shí)鐘域傳輸(使用格雷碼傳遞地址指針,僅有1bit發(fā)生跳變不會(huì)產(chǎn)生毛刺)

根據(jù)時(shí)鐘頻率區(qū)別津肛,在跨時(shí)鐘域傳輸時(shí)還需要以下操作:

  • 從低頻時(shí)鐘域到高頻時(shí)鐘域:在高頻時(shí)鐘域需要進(jìn)行間隔采樣章喉,否則會(huì)產(chǎn)生數(shù)據(jù)重復(fù)
  • 從高頻時(shí)鐘域到低頻時(shí)鐘域:在高頻時(shí)鐘域需要進(jìn)行數(shù)據(jù)保持汗贫,否則會(huì)產(chǎn)生數(shù)據(jù)丟失

另外身坐,還有一種脈沖同步器需要注意,這種脈沖同步器的方法為在發(fā)送時(shí)鐘域中落包,每接收到一次脈沖部蛇,傳遞信號(hào)的電平發(fā)生一次跳變,傳遞信號(hào)通過(guò)同步器傳遞到接收時(shí)鐘域后使用邊沿檢測(cè)還源出脈沖咐蝇。

線性反饋移位寄存器

線性反饋移位寄存器用于生成偽隨機(jī)碼涯鲁,其結(jié)構(gòu)如下所示:

其中Gx為0表示沒(méi)有這一條連接,為1表示有這一條連接有序,每一種連接對(duì)應(yīng)一種多項(xiàng)式抹腿,如下所示:
Y = G_n x^n + G_{n-1}x^{n-1} + ... + G_{2} x^2 + G_1 x + G_0
當(dāng)該多項(xiàng)式為本原多項(xiàng)式(不可再因式分解)時(shí),可生成覆蓋2^n-1個(gè)數(shù)據(jù)旭寿。

Verilog語(yǔ)法

位寬推斷

verilog的位寬推斷的基本準(zhǔn)則為:中間值的位寬=整個(gè)表達(dá)式中所有操作數(shù)(包括結(jié)果警绩,即等號(hào)左邊的數(shù)字),例如:

a[7:0] = b[9:0] + c[4:0]

該表達(dá)式b+c的結(jié)果為10bit盅称,賦值給a的時(shí)候舍去最高2bit肩祥,再例如:

a[7:0] = b[7:0] + c[7:0]

該表達(dá)式b+c的結(jié)果為8bit,因此很容易產(chǎn)生數(shù)據(jù)溢出的問(wèn)題(255+255->254)

宏定義

宏定義的方式為使用``define A B進(jìn)行缩膝,聲明一個(gè)宏定義A混狠,內(nèi)容是B,使用時(shí)需要使用\A表示這是一個(gè)宏定義疾层。宏定義的使用可以理解為“字符串呼喚”将饺,即在代碼中使用`A從字符串角度等效于B,如下例子:

`define SUM A+B+C
assign a = `SUM;   // 使用宏定義
assign a = A+B+C;  // 宏定義等效

注意宏定義不需要使用;結(jié)尾,否則;也會(huì)被替換俯逾,如下:

`define SUM A+B+C;
assign a = `SUM;   // 使用宏定義
assign a = A+B+C;; // 宏定義等效

默認(rèn)值

對(duì)于定義了但是沒(méi)有賦值過(guò)的數(shù)據(jù)贸桶,不同類型具有不同默認(rèn)值:

  • wire:高阻態(tài)z
  • reg:不定值x

還有一種情況是沒(méi)有指定變量(net)的類型,默認(rèn)類型為wire

運(yùn)算符優(yōu)先級(jí)

優(yōu)先級(jí) 運(yùn)算符類型 運(yùn)算符
0(最高) 連接運(yùn)算符 {}桌肴、{{}}
1 一元運(yùn)算符 皇筛!、~坠七、&水醋、|、^
2 算數(shù)運(yùn)算符 *彪置、/拄踪、%、+拳魁、-
3 移位運(yùn)算符 <<惶桐、>>
4 關(guān)系運(yùn)算符 >、<潘懊、<=县耽、>=
5 相等運(yùn)算符 ==玲献、!=、===、!==
6 按位運(yùn)算符 &祭饭、惋鸥、~游沿、|
7 邏輯運(yùn)算符 &&乡小、||
8 條件運(yùn)算符 ?:

數(shù)字信號(hào)處理相關(guān)

香農(nóng)公式

香農(nóng)公式描述了信噪比-帶寬-信道容量之間的關(guān)系,公式如下所示:
C = B \times log_2(1 + \frac{S}{N})
其中奢啥,\frac{S}{N}為信噪比秸仙,B為帶寬,C為信道容量

FPGA相關(guān)

FPGA基本知識(shí)有:

  • FPGA的中文全稱為現(xiàn)場(chǎng)可編程邏輯門陣列

  • FPGA基于查找表實(shí)現(xiàn)多種邏輯桩盲,具有豐富的時(shí)序邏輯資源

  • FPGA布線為分段式布線寂纪,延遲具有不可預(yù)測(cè)性

  • FPGA的連接具有易失性(使用SRAM編程),掉電丟失正驻,需要片外存儲(chǔ)固件弊攘,存儲(chǔ)固件一般使用FLASH或EEPROM

SOC設(shè)計(jì)常識(shí)

功耗公式

數(shù)字集成電路的功耗主要由兩個(gè)來(lái)源:

  • 動(dòng)態(tài)功耗:在運(yùn)行時(shí)才產(chǎn)生的功耗
  • 靜態(tài)功耗:只要上電就會(huì)產(chǎn)生的功耗

動(dòng)態(tài)功耗的來(lái)源主要有以下幾種:

  • 開(kāi)關(guān)功耗:當(dāng)門的輸出發(fā)生改變時(shí),理解為輸出端等效電容的充電(0->1)或放電(1->0)姑曙,這個(gè)過(guò)程產(chǎn)生動(dòng)態(tài)功耗
  • 短路功耗:當(dāng)邏輯門輸出發(fā)生跳變時(shí)襟交,電源到地會(huì)短暫的產(chǎn)生通路(上拉網(wǎng)絡(luò)和下拉網(wǎng)絡(luò)均導(dǎo)通),此時(shí)有電流從電源流動(dòng)到地伤靠,產(chǎn)生動(dòng)態(tài)功耗

動(dòng)態(tài)功耗中開(kāi)關(guān)功耗的公式如下所示:
P_{switch} = \alpha C_LV_D^2f
其中捣域,C_L為等效負(fù)載電容啼染,V_D為電源電壓,f為頻率焕梅,\alpha為翻轉(zhuǎn)率迹鹅,即平均時(shí)間內(nèi)單個(gè)節(jié)點(diǎn)在單位時(shí)鐘周期之內(nèi)翻轉(zhuǎn)的概率。短路功耗的公式如下:
P_{dp} = t_{sc}V_DI_{peak}f
其中t_{sc}為單位時(shí)間內(nèi)兩個(gè)期間同時(shí)導(dǎo)通的時(shí)間贞言,V_D為電源電壓斜棚,I_{peak}為短路電流,f為頻率该窗。除了動(dòng)態(tài)功耗外弟蚀,還存在靜態(tài)功耗,靜態(tài)功耗的來(lái)源是各種漏電酗失,公式為:
P = V_DI_{peak}
其中V_D為電源電壓义钉,I_{peak}為等效漏電電流

低功耗相關(guān)

低功耗技術(shù)分為以下幾種:

  • 工藝級(jí)低功耗技術(shù):包括降低電源電壓(降低動(dòng)態(tài)功耗,但導(dǎo)致閾值降低规肴,增大靜態(tài)功耗)捶闸,降低晶體管尺寸,多層金屬布線(避免大范圍連線拖刃,減少開(kāi)關(guān)電容删壮,但會(huì)增加耦合寄生電容)等
  • 版圖級(jí)低功耗技術(shù):優(yōu)化時(shí)鐘樹(shù)(占功耗40%左右),多電源電壓(MSMV關(guān)鍵路徑電壓高提高性能序调,其他路徑電壓低降低功耗)醉锅,路徑平衡技術(shù)(使輸入信號(hào)盡量同時(shí)到達(dá)兔簇,減少不必要的翻轉(zhuǎn))
  • 門級(jí)低功耗技術(shù):門尺寸優(yōu)化(減小器件尺寸降低功耗发绢,會(huì)導(dǎo)致性能下降),門級(jí)多閾值電壓
  • RTL級(jí)低功耗技術(shù):減少不必要的跳變(增加使能信號(hào))垄琐,門控時(shí)鐘
  • 系統(tǒng)級(jí)低功耗技術(shù):動(dòng)態(tài)電源電壓管理(DVS边酒,根據(jù)負(fù)載調(diào)整電源電壓),動(dòng)態(tài)閾值調(diào)節(jié)(DTS)狸窘,多電壓域(關(guān)閉不需要的區(qū)域的電源墩朦,降低靜態(tài)功耗)

這里需要著重介紹的是門控時(shí)鐘,門控時(shí)鐘的基本結(jié)構(gòu)如下所示:

該電路消除了直接使用AND門控制產(chǎn)生的毛刺問(wèn)題翻擒,即僅當(dāng)CLK為低時(shí)氓涣,控制信號(hào)才可以發(fā)生變化,因此不會(huì)產(chǎn)生毛刺問(wèn)題(本來(lái)CLK為高時(shí)直接被控制信號(hào)關(guān)斷)

DFT相關(guān)

設(shè)計(jì)流程

步驟 流程 工具
1 前端設(shè)計(jì) VCS(仿真器)陋气、Verdi(波形查看)劳吠、nLint(代碼檢查)、Incisive(仿真器)巩趁、NCsim(仿真器)
2 邏輯綜合:將RTL代碼綜合為門級(jí)網(wǎng)表 Design Compiler痒玩、Genus
3 形式驗(yàn)證:通過(guò)數(shù)學(xué)等價(jià)性的理論性方法驗(yàn)證兩個(gè)設(shè)計(jì)的等價(jià)性,不需要測(cè)試向量 Formality
4 Floorplan:布局,放置macro cell蠢古,建立電源網(wǎng)絡(luò) ICC(IC Compiler)奴曙、Innovus
5 Placement:放置stand cell ICC(IC Compiler)、Innovus
6 Clock Tree Synthesis:時(shí)鐘網(wǎng)絡(luò)綜合 ICC(IC Compiler)草讶、Innovus
7 Routing:布線 ICC(IC Compiler)洽糟、Innovus
8 靜態(tài)時(shí)序分析(STA) StarRC+PT
9 物理驗(yàn)證:LVS、DRC和ERC(電氣規(guī)則檢查) calibre堕战、Hercules脊框、Diva/dracula

常見(jiàn)硬件編程

序列檢測(cè)器

module sequence_detection #(
    parameter SEQ = 5'b10010,
    parameter SEQ_WIDTH = 5
) (
    input clk,    // Clock
    input rst_n,  // Asynchronous reset active low

    input val,
    input din,

    output reg dout
);
    
reg [SEQ_WIDTH - 1:0] buf_din;
wire [SEQ_WIDTH - 1:0] next_buf_din = {buf_din[SEQ_WIDTH - 2:0],din};
always @ (posedge clk or negedge rst_n) begin
    if (~rst_n) begin
        buf_din <= {SEQ_WIDTH{1'b0}};
    end else if (val) begin
        buf_din <= next_buf_din;
    end
end 

always @ (posedge clk or negedge rst_n) begin
    if (~rst_n) begin
        dout <= 1'b0;
    end else if (val && next_buf_din == SEQ) begin
        dout <= 1'b1;
    end else begin
        dout <= 1'b0;
    end
end

endmodule

基本自動(dòng)售貨機(jī)
只有一種商品,售價(jià)為10分践啄,可投入硬幣5分或10分浇雹,考慮找零

module store (
    input clk,    // Clock
    input rst_n,  // Asynchronous reset active low

    input corn_val,
    input corn_type,

    output reg return_corn,
    output reg return_commodity
    
);

localparam NOW_0 = 1'b0;
localparam NOW_5 = 1'b1;

reg mode,next_mode;
always @ (posedge clk or negedge rst_n) begin
    if (~rst_n) begin
        mode <= NOW_0;
    end else begin
        mode <= next_mode;
    end
end

wire is_5 = corn_val && !corn_type;
wire is_10 = corn_val && corn_type;
always @ (*) begin
    case (mode)
        NOW_0:begin
            if (is_5) begin
                next_mode = NOW_5;
            end else begin
                next_mode = NOW_0;
            end
        end
        NOW_5:begin
            if (corn_val) begin
                next_mode = NOW_0;
            end else begin
                next_mode = NOW_5;
            end
        end
        default : next_mode = NOW_0;
    endcase
end

always @ (posedge clk or negedge rst_n) begin
    if (~rst_n) begin
        return_corn <= 1'b0;
    end else if (mode == NOW_5 && is_10) begin
        return_corn <= 1'b1;
    end else begin
        return_corn <= 1'b0;
    end
end

always @ (posedge clk or negedge rst_n) begin
    if (~rst_n) begin
        return_commodity <= 1'b0;
    end else if (mode == NOW_5 && corn_val) begin
        return_commodity <= 1'b1;
    end else if (mode == NOW_0 && is_10) begin
        return_commodity <= 1'b1;
    end else begin
        return_commodity <= 1'b0;
    end
end

endmodule

擴(kuò)展自動(dòng)售貨機(jī)

有兩種商品A和商品B,A商品售價(jià)5分屿讽,B商品售價(jià)10分昭灵,可投入5分或10分的硬幣,考慮找零

module store_plus (
    input clk,    // Clock
    input rst_n,  // Asynchronous reset active low

    input want_val,
    input want_type,

    input corn_val,
    input corn_type,

    output reg return_corn,
    output reg return_store 
);

localparam INIT = 2'd00;
localparam CORN = 2'd01;
localparam RETU = 2'd10;

reg [1:0] mode,next_mode;
always @ (posedge clk or negedge rst_n) begin
    if (~rst_n) begin
        mode <= INIT;
    end else begin
        mode <= next_mode;
    end
end

reg is_corn_finish;
always @ (*) begin
    case (mode)
        INIT:begin
            if (want_val) begin
                next_mode = CORN;
            end else begin
                next_mode = INIT;
            end
        end
        CORN:begin
            if (is_corn_finish) begin
                next_mode = RETU;
            end else begin
                next_mode = CORN;
            end
        end
        RETU:next_mode = INIT;
        default : next_mode = INIT;
    endcase
end

reg store_type;
always @ (posedge clk or negedge rst_n) begin
    if (~rst_n) begin
        store_type <= 1'b0;
    end else if(want_val)begin
        store_type <= want_type;
    end
end

reg [1:0]corn_num,next_corn_num;
always @ (posedge clk or negedge rst_n) begin
    if (~rst_n) begin
        corn_num <= 2'd0;
    end else if (mode == INIT) begin
        corn_num <= 2'd0;
    end else if (mode == CORN && corn_val) begin
        corn_num <= next_corn_num;
    end
end
always @ (*) begin
    if (corn_type == 1'b0) begin
        next_corn_num = corn_num + 1'd1;
    end else begin
        next_corn_num = corn_num + 2'd2;
    end
end

always @ (*) begin
    if (store_type == 1'b0 && next_corn_num >= 2'd1) begin
        is_corn_finish = 1'b1;
    end else if (store_type == 1'b1 && next_corn_num >= 2'd2) begin
        is_corn_finish = 1'b1;
    end else begin
        is_corn_finish = 1'b0;
    end
end

always @ (posedge clk or negedge rst_n) begin
    if (~rst_n) begin
        return_store <= 1'b0;
    end else if (next_mode == RETU) begin
        return_store <= 1'b1;
    end else begin
        return_store <= 1'b0;
    end
end
always @ (posedge clk or negedge rst_n) begin
    if (~rst_n) begin
        return_corn <= 1'b0;
    end else if (next_mode == RETU && !store_type && next_corn_num > 2'd1) begin
        return_corn <= 1'b1;
    end else if (next_mode == RETU && store_type && next_corn_num > 2'd2) begin
        return_corn <= 1'b1;
    end else begin
        return_corn <= 1'b0;
    end
end

endmodule

50%占空比分頻器

module frequence_divider #(
    parameter CWIDTH = 8
) (
    input clk,    // Clock
    input rst_n,  // Asynchronous reset active low
    
    input cfg_val,
    input [CWIDTH - 1:0]cfg_data,

    output reg clock_div

);

reg [CWIDTH - 1:0] cfg;
always @ (posedge clk or negedge rst_n) begin
    if (~rst_n) begin
        cfg <= {CWIDTH{1'b0}};
    end else if (cfg_val) begin
        cfg <= cfg_data;
    end
end

reg [CWIDTH - 1:0] count_pos;
always @ (posedge clk or negedge rst_n) begin
    if (~rst_n) begin
        count_pos <= {CWIDTH{1'b0}};
    end else if (count_pos >= cfg) begin
        count_pos <= {CWIDTH{1'b0}};
    end else begin
        count_pos <= count_pos + 1'b1;
    end
end

reg [CWIDTH - 1:0] count_neg;
always @ (negedge clk or negedge rst_n) begin
    if (~rst_n) begin
        count_neg <= {CWIDTH{1'b0}};
    end else begin
        count_neg <= count_pos;
    end
end

wire [CWIDTH - 1:0] judge = {1'b0,cfg_data[CWIDTH - 1:1]} + 1'b1;

always @ (*) begin
    if (cfg == {CWIDTH{1'b0}}) begin
        clock_div = clk;
    end else if (cfg[0] == 'b1) begin
        clock_div = (count_pos < judge)?1'b1:1'b0;
    end else begin
        clock_div = (count_pos < judge && count_neg < judge)?1'b1:1'b0;
    end
end

endmodule

格雷碼計(jì)數(shù)器

第一種寫(xiě)法伐谈,節(jié)約寄存器烂完,時(shí)序比較慢

module gray_count #(
    parameter WIDTH = 4
) (
    input clk,    // Clock
    input rst_n,  // Asynchronous reset active low

    output reg [WIDTH - 1:0] dout_gray
);

one methed
wire [WIDTH - 1:0] count_bin,next_count_bin,next_count_gray;

genvar i;
generate
    for (i = 0; i < WIDTH; i = i + 1) begin:gray
        if (i == WIDTH - 1) begin
            assign count_bin[i] = dout_gray[i];
            assign next_count_gray[i] = next_count_bin[i];
        end else begin
            assign count_bin[i] = dout_gray[i] ^ count_bin[i + 1];
            assign next_count_gray[i] = next_count_bin[i] ^ next_count_bin[i + 1];
        end
    end
endgenerate
assign next_count_bin = count_bin + 1'b1;

always @ (posedge clk or negedge rst_n) begin
    if (~rst_n) begin
        dout_gray <= {WIDTH{1'b0}};
    end else begin
        dout_gray <= next_count_gray;
    end
end
endmodule

第二種寫(xiě)法,多用一套寄存器诵棵,時(shí)序較好

module gray_count #(
    parameter WIDTH = 4
) (
    input clk,    // Clock
    input rst_n,  // Asynchronous reset active low

    output reg [WIDTH - 1:0] dout_gray
);

reg [WIDTH - 1:0]count_bin;
wire [WIDTH - 1:0] next_count_bin = count_bin + 1'b1;
always @ (posedge clk or negedge rst_n) begin
    if (~rst_n) begin
        count_bin <= {WIDTH{1'b0}};
    end else begin
        count_bin <= next_count_bin;
    end
end

wire [WIDTH - 1:0] next_count_gray;
genvar i;
generate
    for (i = 0; i < WIDTH; i = i + 1) begin:gray
        if (i == WIDTH - 1) begin
            assign next_count_gray[i] = next_count_bin[i];
        end else begin
            assign next_count_gray[i] = next_count_bin[i] ^ next_count_bin[i + 1];
        end
    end
endgenerate

always @ (posedge clk or negedge rst_n) begin
    if (~rst_n) begin
        dout_gray <= {WIDTH{1'b0}};
    end else begin
        dout_gray <= next_count_gray;
    end
end
endmodule

常見(jiàn)協(xié)議

I2C

I2C是由 Phiilps提出的一種串行協(xié)議抠蚣,具有兩根信號(hào)線,分別為:

  • SCL:時(shí)鐘信號(hào)線履澳,由主機(jī)產(chǎn)生
  • SDA:數(shù)據(jù)信號(hào)線嘶窄,為雙向信號(hào)線(inout類型),用弱上拉電阻上拉到1

靜默時(shí)距贷,SCL和SDA均為1柄冲,傳輸開(kāi)始和結(jié)束如下所示:

  • 開(kāi)始信號(hào):SCL為高時(shí)SDA拉低
  • 結(jié)束信號(hào):SCL為高時(shí)SDA拉高

具體如下圖所示:

其中S為SCL高且SDA拉低,表示傳輸開(kāi)始忠蝗;P為SCL高且SDA拉高现横,表示傳輸結(jié)束。數(shù)據(jù)部分輸入與輸出共享信號(hào)線SDA阁最,數(shù)據(jù)的傳輸需要滿足以下要求:

  • 當(dāng)SCL為高時(shí)戒祠,SDA不發(fā)生變化(SCL為高時(shí)采樣);當(dāng)SCL為低時(shí)數(shù)據(jù)可以發(fā)生變化
  • 一拍數(shù)據(jù)傳輸8bit(帶ACK為9bit)速种,數(shù)據(jù)從高位傳輸姜盈,即先發(fā)的為MSB,最后發(fā)送的為L(zhǎng)SB哟旗,每次傳輸發(fā)送的數(shù)據(jù)拍數(shù)任意

如下圖所示:

整體傳輸如下圖所示:

主機(jī)發(fā)送開(kāi)始信號(hào)即可開(kāi)始傳輸數(shù)據(jù)贩据,發(fā)送8bit后有一個(gè)ACK信號(hào)需要傳輸栋操,即主機(jī)發(fā)送第9個(gè)脈沖,同時(shí)釋放總線饱亮,若從機(jī)在第9個(gè)脈沖為高前將其數(shù)據(jù)拉低并保持到第9個(gè)脈沖結(jié)束矾芙,則表示為ACK,從機(jī)響應(yīng)主機(jī)傳輸近上,可繼續(xù)傳輸剔宪;否則為NACK,應(yīng)當(dāng)結(jié)束傳輸壹无。

UART

UART為一個(gè)全雙工的雙線協(xié)議葱绒,每一根線負(fù)責(zé)一個(gè)方向,分為TX和RX斗锭,每根線上一次傳輸如下:

  • 起始幀:信號(hào)線拉低一個(gè)時(shí)鐘周期
  • 數(shù)據(jù)幀:根據(jù)約定可以發(fā)送多個(gè)bit的數(shù)據(jù)地淀,低位先發(fā)送,每個(gè)bit占據(jù)一個(gè)時(shí)鐘周期
  • 奇偶校驗(yàn)(可選):在數(shù)據(jù)bit后添加一個(gè)bit岖是,使數(shù)據(jù)整體1的數(shù)量為奇數(shù)或者偶數(shù)帮毁,占據(jù)一個(gè)時(shí)鐘周期
  • 結(jié)束幀:信號(hào)線拉高一個(gè)時(shí)鐘周期

由于線上沒(méi)有相關(guān)時(shí)鐘,因此時(shí)鐘靠通信雙方進(jìn)行約定豺撑。當(dāng)通信雙方時(shí)鐘不同時(shí)烈疚,會(huì)出現(xiàn)數(shù)據(jù)亂碼問(wèn)題。時(shí)鐘的約定靠波特率完成聪轿,在UART中波特率一般與比特率等效爷肝,即每秒鐘發(fā)送的bit數(shù)量。對(duì)于一個(gè)下圖的傳輸陆错,需要1bit起始位灯抛,7bit數(shù)據(jù)位,1bit校驗(yàn)位危号,1bit停止位牧愁,一次傳輸一共需要10bit素邪,以波特率為9600為例外莲,1s可以發(fā)送9600bit,因此一共可以進(jìn)行960次傳輸兔朦,此時(shí)時(shí)鐘頻率被約定為1/9600偷线。

根據(jù)上圖,起始狀態(tài)為高沽甥,當(dāng)需要發(fā)送數(shù)據(jù)時(shí)声邦,將該信號(hào)拉低,即第一個(gè)bit為起始幀摆舟。隨后發(fā)送數(shù)據(jù)亥曹,低位優(yōu)先邓了,發(fā)送約定好的數(shù)據(jù)bit位數(shù)后,發(fā)送奇偶檢驗(yàn)位媳瞪,最后拉高骗炉,表示一次數(shù)據(jù)發(fā)送完成。

SPI

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蛇受,一起剝皮案震驚了整個(gè)濱河市句葵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌兢仰,老刑警劉巖乍丈,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異把将,居然都是意外死亡轻专,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門察蹲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)铭若,“玉大人,你說(shuō)我怎么就攤上這事递览〉鹜溃” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵绞铃,是天一觀的道長(zhǎng)镜雨。 經(jīng)常有香客問(wèn)我,道長(zhǎng)儿捧,這世上最難降的妖魔是什么荚坞? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮菲盾,結(jié)果婚禮上颓影,老公的妹妹穿的比我還像新娘。我一直安慰自己懒鉴,他們只是感情好诡挂,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著临谱,像睡著了一般璃俗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上悉默,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天城豁,我揣著相機(jī)與錄音,去河邊找鬼抄课。 笑死唱星,一個(gè)胖子當(dāng)著我的面吹牛雳旅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播间聊,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼岭辣,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了甸饱?” 一聲冷哼從身側(cè)響起沦童,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎叹话,沒(méi)想到半個(gè)月后偷遗,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡驼壶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年氏豌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片热凹。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡泵喘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出般妙,到底是詐尸還是另有隱情纪铺,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布碟渺,位于F島的核電站鲜锚,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏苫拍。R本人自食惡果不足惜芜繁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望绒极。 院中可真熱鬧骏令,春花似錦、人聲如沸垄提。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)塔淤。三九已至摘昌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間高蜂,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工罕容, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留备恤,地道東北人稿饰。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像露泊,于是被迫代替她去往敵國(guó)和親喉镰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345