該總結(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表示痹换,0110 = ;對(duì)于小數(shù)而言都弹,小數(shù)點(diǎn)后從高到低的第n個(gè)bit表示娇豫,即小數(shù)點(diǎn)后011表示
- 十進(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é)合律 | 烤镐、 |
交換律 | 蛋济、 |
分配律 | |
吸收律 | |
冪等律 | 、 |
德摩根律 | 炮叶、 |
互補(bǔ)律 | 碗旅、 |
零一律 | 、镜悉、 |
卡諾圖
卡諾圖的思路為可視化的將電路邏輯轉(zhuǎn)為最小乘積項(xiàng)祟辟,再通過(guò)合并最小乘積項(xiàng)進(jìn)行化簡(jiǎn),如這一個(gè)例子:
對(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é)果為:
除了化簡(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í)間要求颠锉,需要滿足:
為了滿足后一個(gè)寄存器的保持時(shí)間要求法牲,需要滿足:
由以上公式,可以推斷出理想狀態(tài)下的:
- 最小時(shí)鐘周期:
- 組合邏輯延遲范圍:
非理想時(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í)鐘偏差而言:
這里的即為skew拒垃,表示后級(jí)寄存器相對(duì)于前一級(jí)寄存器的時(shí)鐘偏差,亦可理解為“時(shí)鐘的從前級(jí)到后級(jí)的傳播延遲”瓷蛙,其值可以為正也可以為負(fù)(時(shí)鐘流向與數(shù)據(jù)流向反向)悼瓮。對(duì)于抖動(dòng)而言:
其中為時(shí)鐘抖動(dòng),表示抖動(dòng)的最大值(絕對(duì)值)艰猬。當(dāng)同時(shí)考慮時(shí)鐘skew和jitter時(shí)横堡,有:
產(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)式抹腿,如下所示:
當(dāng)該多項(xiàng)式為本原多項(xiàng)式(不可再因式分解)時(shí),可生成覆蓋個(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)系,公式如下所示:
其中奢啥,為信噪比秸仙,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)功耗的公式如下所示:
其中捣域,為等效負(fù)載電容啼染,為電源電壓,f為頻率焕梅,為翻轉(zhuǎn)率迹鹅,即平均時(shí)間內(nèi)單個(gè)節(jié)點(diǎn)在單位時(shí)鐘周期之內(nèi)翻轉(zhuǎn)的概率。短路功耗的公式如下:
其中為單位時(shí)間內(nèi)兩個(gè)期間同時(shí)導(dǎo)通的時(shí)間贞言,為電源電壓斜棚,為短路電流,為頻率该窗。除了動(dòng)態(tài)功耗外弟蚀,還存在靜態(tài)功耗,靜態(tài)功耗的來(lái)源是各種漏電酗失,公式為:
其中為電源電壓义钉,為等效漏電電流
低功耗相關(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