FPGA邏輯面試筆試準備材料

背景

由於平時也沒太注重基礎,這次針對我本人,自己準備了一些面試官可能問到的,以及網上別人被面試到的問題,問題的難度都不大,但你不復習也許就不行。
我的文章禁止轉載!!!你可以收藏!
QQ:1183699227

專業問題

問題1 狀態機的編碼

在使用Verilog描述狀態機時,通常用參數定義語句 parameter指定狀態編碼。常用的狀態編碼有三種分別是:遞增二進制編碼,格雷碼和one-hot編碼。
在這裏插入圖片描述
遞增的二進制碼在轉檯跳轉條件比較複雜的時候會導致很大的組合邏輯。
格雷碼,這種編碼方式能夠避免進入錯誤的狀態,常用於高可靠性設計。
獨熱碼,這種編碼所佔用的D觸發器資源比遞增二進制編碼多一些,速度非常快。
個人理解:格雷碼非常可靠,建議格雷碼

面試2 串口線最長有多少米

異步串行是指UART,通用異步接收/發送。
UART包含了TTL電平的串口和RS232電平的串口。
RS232
RS232採用不平衡傳輸方式,即所謂的單端通訊,由於發送電平與接收電平的差僅僅爲2V到3V左右,所以其共模抑制能力差,再加上雙絞線上的分佈電容,其傳送距離最大爲約15米,在115200波特率的情況下,最高速率爲11.5KByte/s
RS422

RS422定義了四線接口,實際上還有一根地線。RS422支持最多10個節點,即一個主設備,其餘從設備,從設備之間不能通信,所以RS422支持點對多的雙向通信。RS422的最大傳輸距離爲1219米,最大傳輸速率爲10Mb/s。其平衡雙絞線的長度與傳輸速率成反比,在 100kb/s速率以下,纔可能達到最大傳輸距離。只有在很短的距離下才能獲得最高速率傳輸。一般100米長的雙絞線上所能獲得的最大傳輸速率僅爲 1Mb/s。
RS-485
RS 485與RS232類似,只是有二線和四線,所以可以最大帶有32個從屬設備。

USB設備 2.0

最新的USB2.0可以達到480Mbps,最長5米。

USB 3.0
5.0Gbps (500MB/s),從5米突破到100米。

問題3 負數補碼的計算

其實這個問題以前我就寫過,這裏僅僅拿出例子來,回顧一下。
https://blog.csdn.net/ciscomonkey/article/details/87104636
正數的反碼就是原碼,負數的反碼等於原碼除符號位以外所有的位取反
補碼:符號位保持不變,其餘位取反加1

原碼:-8,-8的源碼是1【1000】,取反碼:1【0111】,補碼:1【1000】(十進制轉二進制)
原碼:-4,-4的原碼是1100,取反碼:1011, 補碼:1100(十進制轉二進制)

補碼:1000,-8
補碼:1100,說明此數是負數,減1,得1011,取反:1100,十進制4:因此爲-4. 

在不超限溢出的前提下,如果計算結果爲正數,那麼補碼與原碼相同,得到的就是正確結果; 如果計算結果爲負數,還需要將補碼再轉換成原碼。
-4+2=1100+0010=1110 =1101(減1)=1010(取反)= -2
-6+7=1010+0111=10001 == = 》捨去溢出得0001

通過以上練習,足以了。只需要牢記正數的反碼就是源碼,負數的補碼等於源碼除了符號位以外所有的位取反再加1.【除符取反加1】
通過計算後的補碼要轉換成源碼。

問題4 化簡邏輯表達式

在這裏插入圖片描述
基本運算無非就是上述7種,上述有幾處公式有誤,但是圖片做的好看。以國際圖片爲準。
下面我對其總結:
與、或、非
與非:AB條件都具備、Y不發生
或非:任意條件具備、Y不發生
異或:條件AB不同,則Y發生
同或:條件AB相同,則Y發生

那麼在verilog種要實現與非、或非、異或、同或運算是不是也只需要一個符號呢?答案是不行的,我們需要用與或非三種運算符號組合起來。
爲什麼要化簡?
當表達式複雜時,其對應的數字電路所使用的元器件就會比較複雜,減少元器件可以提高電路的可靠性。
這裏就介紹卡諾圖化簡法吧,公式我記不住。
首先找出最小項,最小項就是乘積項在輸入隨機的情況下,結果爲1的可能性最小。n個變量可以構成2^n個最小項。
在這裏插入圖片描述
如何寫出卡諾圖?
在這裏插入圖片描述
我們可以觀察到最小項都是用格雷碼編碼的,然後序列號就是格雷碼的十進制
在這裏插入圖片描述
注意,遵循A爲最高位的原則
卡諾圖的化簡:誰變了,幹掉誰的原則,其實,我們只用觀察誰不變,保留誰即可
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
掌握了上述如何化簡卡諾圖後,接下來,我來說明一下根據表達式,如何畫出卡諾圖吧
在這裏插入圖片描述
其實就是將只要有表達式出現的那一項,都寫上1。
在這裏插入圖片描述
在這裏插入圖片描述
對於一般的表達式,需要將其轉換爲最小項的形式。

補充:公式法如何轉換爲最小項。
在這裏插入圖片描述
其中反演律最爲重要,利用反演律可以化簡爲最小項。然後利用卡諾圖化簡。
在這裏插入圖片描述
上面給了個練習題,具體卡諾圖化簡步驟,這裏不再贅述了,我做過,和上述結果一樣。

問題5 什麼是組合邏輯?什麼是時序邏輯?

在數字電路中,根據邏輯功能的不同,我們可以將數字電路分爲2大類,一類叫做組合咯及電路,另一類叫時序邏輯電路。
在這裏插入圖片描述
輸出只與當前的輸入有關係,而與輸入信號的上一個狀態沒有關係。
而時序電路是有記憶功能的,它在任何時刻的輸出,不僅與該時刻的輸入信號有關,而且還與該時刻以前的輸入信號有關。

問題6 談一談競爭冒險的產生、解決方案。

在這裏插入圖片描述
在這裏插入圖片描述
若輸入變量在卡諾圖的圈內發生改變時候,則輸出不會有冒險現象,若輸入變量是在相鄰卡諾圈的相鄰處發生變化,並且從一個卡諾圈進入到另一個卡諾圈,則可能產生邏輯冒險。
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
通過增加冗餘項來消除邏輯冒險。
在這裏插入圖片描述
在這裏插入圖片描述
有兩個以上同時變化比如0001變到0111,可能走0101這條路,或者走0011這條路。所以兩者是有差別的,如果走0011這條路就會發生功能冒險,解決方法只有增加選通信號或者輸出電容。(個人建議是寄存2拍)
信號由於經由不同路徑傳輸達到某一匯合點的時間有先有後的現象,就稱之爲競爭,由於競爭現象所引起的電路輸出發生瞬間錯誤的現象,就稱之爲冒險。FPGA設計中最簡單的避免方法就是儘量使用時序邏輯同步輸入輸出。

加濾波電容,消除毛刺的影響;
加選通信號,避開毛刺
增加冗餘項,消除邏輯冒險

問題7 談一談鎖存器和觸發器的區別

常用的存儲電路有兩類,一類是鎖存器,另一類是觸發器,它們兩者所採用的電路結構形式不同,信號的觸發方式也不同,其中,採用電平觸發方式的叫做鎖存器,而採用脈衝邊沿觸發方式的叫做觸發器。

鎖存器(latch)是數字電路中的一種具有記憶功能的邏輯元件。鎖存器對脈衝電平敏感的存儲單元電路,它只在輸入脈衝的高(低)電平期間對輸入信號敏感並改變狀態。
這裏介紹一種D鎖存器,多說兩句,當控制門等於1時,此時鎖存器的狀態是由激勵輸入端D來確定的,並且D等於什麼,鎖存器的狀態就是什麼。

觸發器(Flip-Flop)是對脈衝邊沿敏感的存儲單元電路,它只在觸發脈衝的上升沿(或者下降沿)瞬間改變其狀態。

在這裏插入圖片描述

問題8 談一談阻塞邏輯和非阻塞邏輯的區別。

非阻塞邏輯用<=
使用阻塞邏輯可以在幾個ns內完成

問題9 用異或門怎麼構建非門?

這個問題,我們首先要知道異或門,就是相異爲1,相同爲0.
用異或門實現非門:只需將輸入與高電平進行異或就行了。

問題10 使用二選1選擇器和一個非門實現異或

在這裏插入圖片描述

問題11 使用二選一選擇器mux構建或門


module FPGA_mianshi 
(
input a,
input b,
output q

);
assign q=a?1:b;
endmodule


在這裏插入圖片描述

問題12 用狀態機進行序列檢測

用序列檢測機,檢測一串數字序列:
1101


//檢測序列1101

module FPGA_mianshi (
    input clk,  
    input rst,  
    input  data,		//輸入串行數據流
    output reg valid	//代表檢測到輸入數據
    );  
    

localparam s1=3'b001;
localparam s2=3'b011;
localparam s3=3'b010;
localparam s4=3'b110;

reg [2:0] now_state=s1;
reg [2:0] next_state=s1;

always @ (posedge clk or negedge rst)
begin
	if(!rst)
		now_state<=s1;
	else
		now_state<=next_state;
end

always @ (*)	//實現條件轉換
begin
	case(now_state)
		s1:
			if(data==1)
				begin
					next_state=s2;
				end
			else
				begin
					next_state=s1;
				end
			
		s2:
			if(data==1)
				begin
					next_state=s3;
				end
			else
					next_state=s1;
		s3:
			if(data==0)
				begin
					next_state=s4;
				end
			else 
				begin
					next_state=s3;
				end

		s4:
			if(data==1)
				begin
					next_state=s1;
					
				end
			else
					next_state=s1;
		default:next_state=s1;
		endcase
end
always @ (posedge clk or negedge rst)
begin
	if(!rst)
		valid<=0;
	else
		begin
			if((now_state==s4)&(data==1))
				valid<=1;
			else
				valid<=0;
		end
end
endmodule

在這裏插入圖片描述
在這裏插入圖片描述
這種題目一定要先考慮出狀態圖,比如,我這個1101,每種狀態無非要麼0,要麼1.
比如已經出了 11了,那麼接下來檢測第三個數據是1還是0,如果是0,那麼繼續,如果是1,我們就要回到初始狀態嗎?答案是否定的,因爲111,能夠證明已經檢測到了11兩個連續了,所以,此時我們要停留在此狀態,如果還是1,那麼就成了1111,也滿足了檢測到兩個1,直到我們檢測到0,才邁向下一個狀態。
所以序列檢測,千萬不要認爲簡單,這些細節,稍不注意,你可能出現漏檢的情況。

問題13 什麼是同步邏輯和異步邏輯

同步邏輯是時鐘之間有固定的因果關係,異步邏輯是各時鐘時間沒有固定的因果關係。
同步邏輯必須要收到時鐘脈衝的控制;異步邏輯,只要輸入變化,輸出就立即變化。

問題14 如何理解觸發器要滿足建立/保持時間?

電路設計的難點在於時序設計,時序設計的實質就是滿足每一個觸發器的建立/保持時間而要求的

建立時間:觸發器在時鐘上升沿到來之前,其數據輸入端的數據必須保持不變的時間。
保持時間:觸發器在時鐘上升沿到來之後,其數據輸入端的數據必須保持不變的時間。

因爲觸發器內部數據的形成是需要一定的時間的,如果不滿足建立和保持時間,觸發器將進入亞穩態,進入亞穩態後觸發器的輸出將不穩定,在0和1之間變化,這時候需要經過一個恢復時間,其輸出才能穩定,但穩定後的值並不一定是你的輸入值。這就是爲什麼要用兩級觸發器來同步異步輸入信號(這一點在檢測外部輸入觸發,尤爲有經驗,這也是我之間檢測外部觸發信號上升沿,爲什麼都要用2級檢測,否則不穩定,但是在系統內部,我只需要一級檢測即可)。這樣做可以防止由於異步輸入細心好對於本級時鐘可能不滿足建立保持時間而使本級觸發器產生的亞穩態傳播到後面邏輯中,導致亞穩態的傳播。

問題15 什麼是亞穩態?爲什麼兩級觸發可以防止亞穩態?

亞穩態是指觸發器無法再某個規定的時間段內到達一個可以確認的狀態。使用兩級觸發器來使異步電路同步化的電路其實叫做“一步同位器”,他只能用來對他只能用來對一位異步信號進行同步。兩級觸發器可以防止亞穩態傳播的原理:假設第一級觸發器的輸入不滿足建立保持時間,它在第一個脈衝沿到來後輸出的數據就爲亞穩態,那麼在下一個脈衝沿到來之前,其輸出的亞穩態數據在一段恢復時間後必須穩定下來,而穩定的數據必須滿足第二級觸發器的建立時間,如果都滿足了,在下一個脈衝沿到來時,第二級觸發器將不會出現亞穩態,因爲其輸入端的數據滿足其建立保持時間。

問題16 時序約束的計算題

這個問題,以前我專門花了不少力氣寫過,並從官方文檔入手,這裏再次拿出來回顧
https://blog.csdn.net/ciscomonkey/article/details/88877296

在這裏插入圖片描述
在這裏插入圖片描述
上述公式可以說,充分總結了如何計算建立時間餘量(slack)的方法。注意這是同步系統時鐘信號。
只要好好領悟,非常簡單。

下面,我建議自己手推hold slack的公式。
在這裏插入圖片描述
在這裏插入圖片描述

問題17 解釋FPAG和ASIC的概念及區別

問題18 解釋相關名詞

SRAM:Static Random-Access Memory,靜態隨機存取存儲器,主要是供電數據就會保持,但斷電就會消失。也稱之爲Volatile memory.
SDRAM:Synchronous Dynamic Random Access Memory,同步動態隨機存儲器,同步寫入和讀出數據的DRAM。
EEOROM:Electrically Erasable Programmable Read Only Memory,電可擦除可編程只讀存儲器。
DDR:Double Data Synchronous Dynamic Random Accsee Memory,雙倍速率同步動態隨機存儲器,雙倍速率傳輸的SDRAM,在時鐘的上升沿和下降沿都可以進行數據傳輸。我們的電腦內存條都是DDR芯片。
FLASH:flash memory,閃存,非易失性固態存儲,如製成內存條或U盤。

問題 19 數制轉換

十進制數轉換成R進制:整數部分,除R取餘法,除到商爲0爲止,小數部分,乘R取整法,乘到積爲0爲止。

問題 20 跨時鐘域的幾種方法

問題 21 用與非門等設計一個全加法器

問題 22 理解MOS門電路,根據門電路,寫出表達式

這個問題,問的組裏的師兄,還是當面講解效率高不少,然後下來簡單看了一下視頻就理解了。
在這裏插入圖片描述
在這裏插入圖片描述
箭頭朝裏,屬於NMOS,所以左邊屬於NMOS,當G端大於S時,D、S之間相當於開關閉合,那麼D與S之間可能電流D流向S,也可能S流向D。
箭頭朝外,屬於PMOS,S大於G時,D與S之間相當於開關閉合
通常來講,S一般是接的電源,D端接的是輸出。

記憶:
箭頭往裏NMOS、箭頭朝外PMOS,箭頭朝誰,誰更大。與G端靠近的是源極。

例子:

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

在這裏插入圖片描述
在這裏插入圖片描述
參考視頻:https://www.dianyuan.com/class/video_2123.html
在這裏插入圖片描述
注意上述表示符號,PMOS就是有一個圓圈。NMOS是沒有圓圈的。

問題 23 關於FIFO的深度計算,你是如何理解?

這一點,我查閱了諸多CSDN的blog,發現抄襲居多,很多人1是沒講清楚,2是也許作者自己也沒有真正理解到位。下面,作爲處女座,無法看下去了。根據自己的理解,以及我的抄襲閱讀。來談談這個FIFO的深度計算處理跨時鐘域數據問題。

在數字IC設計中,我們經常遇到這種工作場景,工作在不同時鐘域下的兩個模塊,它們之間需要進行數據傳遞,爲了避免數據丟失,我們會使用到FIFO。當讀數據的速率小於寫數據的速率時候,我們就不得不將還沒有被讀走的數據緩存下來,那麼我們需要開多大的控件緩存這些數據呢?緩存開大了,會浪費資源,開小了,會丟失數據,如何計算最小FIFO深度。

如何理解數據突發長度?爲什麼FIFO能解決?
首先,我得說一下數據突發長度(burst length)這個概念,如果模塊A不間斷的往FIFO中寫數據,模塊B同樣不間斷的從FIFO中讀數據,不同的是模塊A寫數據的時鐘頻率大於B讀數據的頻率,那麼如果系統一直在工作的話,有一部分數據還沒來得及讀走,新的數據又來了,也就是說那些沒有被讀走的數據會越累積越多,那麼FIFO的深度需要無窮大,因此只有在突發數據傳輸過程中討論FIFO深度纔是有意義的。什麼叫突發數據長度,那就好明白了,就是發送一段數據後,然後停下來等待。這一段數據就是突發數據長度(burst length)。
這一點,很好理解,你想一下,如果飲水機的桶裝水,小口朝下,大口接一個超大的水管。如果大口不斷在注入水,小口同時在放水。這樣,即使同時進行。但這桶水肯定會在一段時間後溢出來。那麼,想一下,如果注入水和放水同時進行,但是一旦注入水剛要滿的時候,我就停止繼續注入水。這樣就能保持水不會溢出來,水桶達到緩存水的目的。
回到正題,也就是說我們一次傳遞一包數據完成後再去傳遞下一包數據,我們把一段時間內傳遞的數據個數稱爲burst length。
在維基百科中,burst transmission是這樣解釋的:In telecommunication, a burst transmission or data burst is the broadcast of a relatively high-bandwidth transmission over a short period。在通信中,被解釋爲在較短的時間週期內,傳輸高帶寬的數據。
下面,爲了更好的理解FIFO size的計算過程,這裏在不套用計算公式的前提下來逐步計算不同場景FIFO深度,當然在本文的最後會給出FIFO深度的計算公式。
在討論之間A模塊向FIFO寫數據的時鐘頻率爲fa,模塊B從FIFO讀數據的時鐘頻率爲fb。

場景1、fa>fb with no idle cycles in both write and read

寫速率大於讀速率,並且沒有空閒週期,一直讀與寫。
假設:

  • 寫數據時鐘頻率fa=80MHz
  • 讀數據時鐘頻率fb=50MHz
  • 突發長度=number of data to be transferred =120
  • 在突發傳輸過程中,數據都是連續讀寫的

計算:
寫120個數據需要的時間是:
1/80(us)*120=1500 ns
讀一個數據需要20ns(50MHz)
在1500ns內,讀取了75個數據
還剩餘數據120-75個=45個數據
也就是說在1500ns內還沒有被讀走的數據個數=45個
因此FIFO的最小深度爲45

場景2 fa>fb with two clock cycle delay between two successive read and write

場景2在場景1的基礎上增加了一個假設,即讀比寫慢兩拍。這種假設是真正存在的,在異步FIFO設計中,我們需要去判斷FIFO的空滿來保證邏輯的正確性,判斷空滿標誌需要去比較讀寫指針,而讀指針與寫指針處在不同的時鐘域中,我們需要採用格雷碼和兩級同步寄存器去降低亞穩態的概率,而兩級同步必然會導致空滿標誌位的判斷至少延遲2個cycle。對於空標誌位來說,將寫指針同步到讀時鐘域至少需要花費2個時鐘,而在同步這段時間內有可能還會寫入新的數據,因此同步後的寫指針一定小於或等於(當且僅有同步時間內沒有新數據寫入的情況下才會等於)當前的寫指針,所以此時判斷不一定是真空;同理,對於滿標誌位來說,將讀指針同步到讀時鐘域至少需要花費2個時鐘,而在同步這段時間內有可能還會讀出新的數據,因此同步後的讀指針一定小於或等於當前讀指針,所以此時判斷並不一定是真滿。

通過上述討論可以知道場景2的FIFO最小深度應該比場景1的FIFO最小深度45略大。

場景3 fa>fb with idle cycles in both write and read

fa>fb 並且都有空閒週期

  • 寫時鐘頻率fa=80MHz
  • 度數據時鐘頻率fb=50MHz
  • 突發長度=number of data to be transferred =120
  • 每隔1個cycle寫一次
  • 每隔3個cycle讀一次
    計算:
    每隔一個一個cycle寫一次,意味着2個cycle才寫一個數據
    每隔3個cycle讀一次,意味着4個cycle纔讀一個數據
    那麼寫120個數據需要時間:1201/802=3000ns
    讀一個數據需要時間:4*1/50=80ns
    在3000ns的時間內,讀取數據 3000/80=37.5個
    那麼還剩餘數據:120-37.5=82.5個–》83個
    也就說,至少需要FIFO的深度爲83個

場景4 fa<fb with no idle cycles in both write and read

  • 寫數據時鐘頻率fa=40MHz
  • 讀數據時鐘頻率fb=50MHz
  • 突發長度=number of data to be transferred =120
  • 在突發傳輸過程中,數據都是連續讀寫的

那麼:
由於讀數據比寫數據要快,因此FIFO只起到了過時鐘域的作用,FIFO的最小深度爲1即可。

場景5 fa<fb with idle cycles in both write and read

讀的速率大於寫的速率,但是讀和寫都有空閒期

  • 寫數據時鐘頻率fa=40MHz
  • 讀數據時鐘頻率fb=50MHz
  • 突發長度=number of data to be transferred=120
  • 每隔1個cycle寫一次
  • 每隔3個cycle讀一次
    計算:
    每隔1個cycle寫一次,意味着2個cycle才寫一個數據
    每隔3個cycle讀一次,意味着4個cycle纔讀一個數據
    寫一個數據所需要的時間 21/40(us)=50ns
    120個數據傳輸完畢,需要120
    50=6000ns
    讀一個數據需要時間:4*1/50=80ns
    在6000ns的時間內,能夠讀取6000/80=75 個數據
    剩餘數據:120-75=45個數據
    也就是說FIFO的最小深度爲45個數據

場景6 fa=fb with no idle cycles in both write and read

  • 寫數據時鐘頻率fa=50MHz
  • 讀數據時鐘頻率fb=50MHz
  • 突發長度=number of data to be transferres =120
    那麼
    如果讀寫時鐘同源並且無相位1,可以不需要FIFO,否則FIFO的最小深度設置爲1即可

場景7 fa=fb with idle cycles in both write and read

  • 寫數據時鐘頻率fa=50MHz
  • 讀數據時鐘頻率fb=50MHz
  • 突發長度=number of data to be transferred =120
  • 每隔1個cycle寫一次
  • 每隔3個cycle讀一次

計算:
每隔1個cycle寫一次,意味着2個cycle才寫一個數據
每隔3個cycle讀一次,意味着4個cycle纔讀一個數據
寫一個數據需要的時間:21/50=40ns
突發傳輸中,寫完所有數據所需要的時間=120
40=4800ns
讀一個數據所需要的時間是4*1/50MHz=80ns
在4800ns內能夠讀走的數據個數是4800/80=60
還剩餘數據120-60=60個數據
因此FIFO的最小深度爲60

場景8 data rates are given,read and write random(important!!!)

在上面給出的場景中,我們給出的條件都是每隔幾個時鐘讀寫一次,這種週期性讀寫在實際中很常見。但是在工程設計中還存在着這樣一種情況,只給出數據在一段時間內的讀寫速率,怎麼讀寫完全隨機,這種情況我們需要考慮最壞的一種情況避免數據丟失。在最壞的情形的情況中,讀寫的速率應該相差最大,也就是說需要找出最大的寫速率和最小的讀速率。
假設:
寫數據時鐘頻率fa=80MHz
讀數據時鐘頻率fb=50MHz
在寫時鐘週期內,每100個週期就有40個數據寫入FIFO
在讀時鐘週期內,每10個週期可以有8個數據讀出FIFO

這裏沒有給出數據的突發長度,從假設中可以得出每100個週期就有40個數據寫入FIFO,這裏可能就有人會說突發長度就是40個數據,其實不是這樣的,因爲數據是隨機寫入FIFO的,需要考慮最壞的情形,即寫速率最大的情形,只有如下所示的情形纔是寫速率最高的情形,burst length爲80
在這裏插入圖片描述
其實這一點也很好理解,也就是寫入數據,連續寫入的持續時間最長。
那麼讀數據應該是怎麼樣的呢?讀數據當然是越慢,情況越糟糕
計算:
連續寫入80個數據需要的時間1/80(us)80=1000ns
由於每10個週期可以有8個數據讀出FIFO;
80個數據,需要B時鐘的100個週期,也就是說需要100
1 /50=2000ns
也就是說讀這80個數據,需要2000ns,那麼就是說在1000ns的時間能夠讀取1000 /(20ns*10/8)=40 個數據
那麼還剩下40個數據,所以需要FIFO 40個

總結

1、從上面分析來看,求FIFO的最小深度主要有以下幾個要點:
不管在什麼場景下,要確定FIFO的深度,關鍵在於計算出在突發讀2、寫這段時間內有多少個數據沒有被讀走;
由於FIFO空滿標誌位的判斷延遲,在實際應用中需要預留一些餘量
3、求FIFO深度需要考慮最壞的情形,讀寫的速率應該相差最大,也就是說需要找出最大的寫速率和最小的讀速率。
4、下面給出網上的公式,就很好理解了,這些公式不用記憶,理解了就自然會做了。
在這裏插入圖片描述

問題 24 如何解決高速數據接口?如何理解串並/並串 轉換器

並行轉換是載入並行的數據,在同步信號爲有效電平時,寄存器內的數據被逐位移出。

串轉並思想

串並轉換是在時鐘驅動下,將單比特的位數據流輸入寄存器,並依次諸逐位移動,直到寄存器滿了爲止,然後直接讀取並行輸出。
在這裏插入圖片描述
串行數據轉並行數據的verilog:

reg [7:0]sda_reg;
//wire en;
 
always@(posedge clk or negedge rst_n)
	begin
		if(!rst_n)
			begin
				sda_reg<=0;
			end
		else
			begin
				if(en)
					begin
						sda_reg<={sda_reg[6:0],sda};  //將並轉串模塊輸出的串行數據sda轉入sda_reg的每一位(從低位到高位)
					end
				else
					begin
						sda_reg<=0;
					end
			end
	end
	

串並轉換器,我們看到,其實就是流水線操作,如果輸入爲1Gbps
那麼可以轉換爲100M*位寬10位
其實這樣來理解上圖,串行時鐘是1ns更新一個數據,那麼10ns(100M)就更新10個數,此時10個寄存器的數據都已經更新完畢,由於此時FPGA內部時鐘的速度是100M。所以10個寄存器的數據都被更新,所以,實現100M採樣10個bit。從而實現了串轉並的思想。接口可以跑到1G以上,但是FPGA內部時鐘只能夠跑到400M就差不多了。通常一些高速的AD採樣都是達到了1G,所以採用串轉並的思想,可以實現對高速數據的處理。

並轉串的思想

並行數據轉串行數據的verilog:

問題25 談談FPGA的設計思想-流水線設計

流水線操作是處理高速設計中的一個常用設計手段。如果某個設計的處理流程分爲若干步驟,而且整個數據處理是單流向的,即沒有反饋或者迭代運算,前一個步驟的輸出是下一個步驟的輸入,則可以考慮採用流水線設計來提高系統的工作頻率。
在這裏插入圖片描述
在 WCDMA 設計中經常使用到流水線處理的方法,如 RAKE 接收機、搜索器、前導捕獲等。流水線處理方式之所以頻率較高,是因爲複製了處理模塊,它是面積換取速度思想的又一種具體體現。

問題26 異步FIFO的設計

前面關於FIFO的深度計算,我已經介紹得很詳細了。相信已經能夠熟練掌握了,那麼下面來看一下異步FIFO;
FIFO是一種先進先出的數據緩衝器,特點是沒有外部的讀寫笛子。由於沒有外部的地址信號,所以只能順序的讀寫,而不能跳讀。FIFO的讀寫是根據滿和空信號設計。當FIFO滿的時候不可以往裏面寫、當FIFO空的時候不能讀數據。讀FIFO的時候,內部的讀指針自動加1當寫FIFO的時候寫指針自動加1.
什麼是異步FIFO,什麼又是同步FIFO呢?
異步FIFO簡單的來說就是讀寫時鐘不相同,同步FIFO就是讀寫的時鐘相同。
使用異步FIFO可以在兩個不同的時鐘域之間快速而方便的傳輸數據,起到跨時鐘域處理的作用。經常用於處理跨時鐘域問題。
此外對於不同寬度的數據接口也可以採用FIFO進行緩衝,如8位輸入,16位輸出。
如何使用異步FIFO,請參照我的另一篇blog:
https://blog.csdn.net/ciscomonkey/article/details/99702628

問題27 格雷碼與二進制碼的相互轉換

在這裏插入圖片描述
格雷碼的概念不用多說,就是相鄰兩個二進制,只有1位發生了變化。

  • 二進制轉換爲格雷碼
    在這裏插入圖片描述
    在這裏插入圖片描述
    簡而言之,就是二進制新增一位最高位被默認爲0,然後依次如上圖所指做異或運算即可
    比如0101,轉化爲格雷碼爲0111
  • 格雷碼轉二進制碼(解碼)
    同理,也是在格雷碼的最高位新增一位0,然後從左邊起,將每一位異或後得到的值與下一位再異或,直到最低位。就能得到格雷碼轉換後二進制碼的值。

舉例:
如果採集器器採到了格雷碼:1010
就要將它變爲自然二進制:
0 與第四位 1 進行異或結果爲 1
上面結果1與第三位0異或結果爲 1
上面結果1與第二位1異或結果爲 0
上面結果0與第一位0異或結果爲 0
因此最終結果爲:1100 這就是二進制碼即十進制 12

再舉例:

在這裏插入圖片描述
注意格雷碼轉二進制一定要從左邊起!!!

27 LSFR (線性反饋移位寄存器)的工作原理

線性反饋移位寄存器(LFSR)是內測試電路中的最基本標準模塊,作爲僞隨機測試碼產生器
一個n階的LFSR由n個觸發器和若干個異或門組成。特點是產生僞隨機序列的最大長度爲2^n-1;

在這裏插入圖片描述

module test(
  CLR,
  CLK,
  EN,
  DIN,         //需要置進的數
  DOUT);
input CLR;
input CLK;
input EN;
input [7:0] DIN;
output DOUT;
wire DOUT;
reg din;
reg [7:0] state;

always @(posedge CLK)
  begin 
    if(CLR)
      begin
        state <= 8'b00000000;
      end
    else
      begin
        if(EN)
          begin
            state<=DIN; 
          end 
        else
          begin
            state[7:1] <= state[6:0];
            state[0] <= din;
          end
      end
  end
  
assign DOUT = state[7];
  
always @(state[7] or state[5]or state[4] or state[0])
  begin
    din = state[7] ^ state[5]^ state[4]^ state[0]; 
  end
    
endmodule

與HR的心理博弈

面試心理戰1

這裏提一點,如果有人問你有offer了嗎,就實話實說,有的話就說有了,因爲這是你個人能力的體現,不然別人會以爲你一個offer都沒有,實力不行,可以不跟他們透露具體公司和待遇,這屬於你自己的隱私,他不會強問的,所以,要自信,不要隱瞞自己的offer。

面試心理戰2

(技術宅們一定要注意,你可能技術好,但是不給你展示的機會,一定要自己主動)這裏強調一點。很重要:面試不要等着面試官問什麼你說什麼,你要掌握好節奏,你來帶着面試官按照你的思路走,多說一些自己的好處,當然我不是讓你不給面試官插嘴的機會,自己把握好度,說的好,就算技術不好可能一年比別人多好幾萬的工資,所以面試會說很重要,非常重要,特別重要。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章