FPGA/IC筆試——雜七雜八


1:什么是同步邏輯和異步邏輯?(漢王)

  • 同步邏輯是時鍾之間有固定的因果關系。異步邏輯是各時鍾之間沒有固定的因果關系。
  • 同步時序邏輯電路的特點:各觸發器的時鍾端全部連接在一起, 並接在系統時鍾端, 只有當時鍾脈沖到來時, 電路的狀態才能改變。 改變后的狀態將一直保持到下一個時鍾脈沖的到來,此時無論外部輸入 x 有無變化,狀態表中的每個狀態都是穩定的。
  • 異步時序邏輯電路的特點:電路中除可以使用帶時鍾的觸發器外,還可以使用不帶時鍾的觸發器和延遲元件作為存儲元件, 電路中沒有統一的時鍾, 電路狀態的改變由外部輸入的變化直接引起。

 

2:同步電路和異步電路的區別:

  • 同步電路: 存儲電路中所有觸發器的時鍾輸入端都接同一個時鍾脈沖源,因而所有觸發器的狀態的變化都與所加的時鍾脈沖信號同步。
  • 異步電路: 電路沒有統一的時鍾, 有些觸發器的時鍾輸入端與時鍾脈沖源相連, 只有這些觸發器的狀態變化與時鍾脈沖同步,而其他的觸發器的狀態變化不與時鍾脈沖同步。

 

3:時序設計的實質:

  時序設計的實質就是滿足每一個觸發器的建立 /保持時間的要求。

 

4:建立時間與保持時間的概念?

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

 

5:為什么觸發器要滿足建立時間和保持時間?

  因為觸發器內部數據的形成是需要一定的時間的,如果不滿足建立和保持時間,觸發器將進入亞穩態,進入亞穩態后觸發器的輸出將不穩定,在0和1之間變化,這時需要經過一個恢復時間,其輸出才能穩定,但穩定后的值並不一定是你的輸入值。這就是為什么要用兩級觸發器來同步異步輸入信號。這樣做可以防止由於異步輸入信號對於本級時鍾可能不滿足建立保持時間而使本級觸發器產生的亞穩態傳播到后面邏輯中,導致亞穩態的傳播。足建立保持時間而使本級觸發器產生的亞穩態傳播到后面邏輯中,導致亞穩態的傳播。

  換個方式理解:需要建立時間是因為觸發器的 D 端像一個鎖存器在接受數據, 為了穩定的設置前級門的狀態需要一段穩定時間; 需要保持時間是因為在時鍾沿到來之后,觸發器要通過反饋來鎖存狀態,從后級門傳到前級門需要時間。

 

6:什么是亞穩態?為什么兩級觸發器可以防止亞穩態傳播?

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

  同步器有效的條件:第一級觸發器進入亞穩態后的恢復時間 + 第二級觸發器的建立時間 <= 時鍾周期 。

  更確切地說, 輸入脈沖寬度必須大於同步時鍾周期與第一級觸發器所需的保持時間之和。 最保險的脈沖寬度是兩倍同步時鍾周期。所以,這樣的同步電路對於從較慢的時鍾域來的異步信號進入較快的時鍾域比較有效,對於進入一個較慢的時鍾域,則沒有作用。

 

7:系統最高速度計算(最快時鍾頻率)和流水線設計思想:

  同步電路的速度是指同步系統時鍾的速度,同步時鍾愈快,電路處理數據的時間間隔越短,電路在單位時間內處理的數據量就愈大。

  假設 Tco 是觸發器的輸入數據被時鍾打入到觸發器到數據到達觸發器輸出端的延時時間 (Tco=Tsetpup+Thold) Tdelay 是組合邏輯的延時; Tsetup 是D觸發器的建立時間。

  假設數據已被時鍾打入 D 觸發器,那么數據到達第一個觸發器的Q輸出端需要的延時時間是 Tco ,經過組合邏輯的延時時間為 Tdelay ,然后到達第二個觸發器的D端, 要希望時鍾能在第二個觸發器再次被穩定地打入觸發器, 則時鍾的延遲必須大於 Tco Tdelay Tsetup ,也就是說最小的時鍾周期 Tmin =Tco Tdelay Tsetup , 即最快的時鍾頻率 Fmax =1/Tmin

  FPGA 開發軟件也是通過這種方法來計算系統最高運行速度 Fmax 。因為 Tco Tsetup 是由具體的器件工藝決定的,故設計電路時只能改變組合邏輯的延遲時間 Tdelay ,所以說縮短觸發器間組合邏輯的延時時間是提高同步電路速度的關鍵所在。 由於一般同步電路都大於一級鎖存, 而要使電路穩定工作, 時鍾周期必須滿足最大延時要求。 故只有縮短最長延時路徑, 才能提高電路的工作頻率。 可以將較大的組合邏輯分解為較小的 N 塊, 通過適當的方法平均分配組合邏輯, 然后在中間插入觸發器,並和原觸發器使用相同的時鍾, 就可以避免在兩個觸發器之間出現過大的延時, 消除速度瓶頸,這樣可以提高電路的工作頻率。這就是所謂 "流水線 "技術的基本設計思想,即原設計速度受限部分用一個時鍾周期實現, 采用流水線技術插入觸發器后, 可用 N 個時鍾周期實現,因此系統的工作速度可以加快, 吞吐量加大。 注意, 流水線設計會在原數據通路上加入延時,另外硬件面積也會稍有增加。


8:時序約束的概念和基本策略?

  • 時序約束主要包括周期約束, 偏移約束, 靜態時序路徑約束三種。 通過附加時序約束可以綜合布線工具調整映射和布局布線,使設計達到時序要求。
  • 附加時序約束的一般策略是先附加全局約束, 然后對快速和慢速例外路徑附加專門約束。
  • 附加全局約束時, 首先定義設計的所有時鍾, 對各時鍾域內的同步元件進行分組, 對分組附加周期約束,然后對 FPGA/CPLD 輸入輸出 PAD 附加偏移約束、對全組合邏輯的 PAD TO PAD 路徑附加約束。
  • 附加專門約束時,首先約束分組之間的路徑,然后約束快、慢速例外路徑和多周期路徑,以及其他特殊路徑。

9:附加約束的作用?

  • 1:提高設計的工作頻率(減少了邏輯和布線延時);
  • 2:獲得正確的時序分析報告;(靜態時序分析工具以約束作為判斷時序是否滿足設計要求的標准, 因此要求設計者正確輸入約束,以便靜態時序分析工具可以正確的輸出時序報告)
  • 3:指定 FPGA/CPLD 的電氣標准和引腳位置。

 

10FPGA 設計工程師努力的方向:

  SOPC ,高速串行 I/O,低功耗,可靠性,可測試性和設計驗證流程的優化等方面。隨着芯片工藝的提高,芯片容量、集成度都在增加, FPGA 設計也朝着高速、高度集成、低功耗、高可靠性、高可測、可驗證性發展。芯片可測、可驗證,正在成為復雜設計所必備的條件,盡量在上板之前查出 bug ,將發現 bug 的時間提前,這也是一些公司花大力氣設計仿真平台的原因。另外隨着單板功能的提高、成本的壓力,低功耗也逐漸進入FPGA 設計者的考慮范圍,完成相同的功能下,考慮如何能夠使芯片的功耗最低,據說altera 、 xilinx都在根據自己的芯片特點整理如何降低功耗的文檔。高速串行 IO 的應用,也豐富了 FPGA的應用范圍,如 xilinx v2pro 中的高速鏈路也逐漸被應用。

 

11:對於多位的異步信號如何進行同步?

  對以一位的異步信號可以使用一位同步器進行同步(使用兩級觸發器),而對於多位的異步信號,可以采用如下方法:

  • 1:可以采用保持寄存器加握手信號的方法(多數據,控制,地址);
  • 2:特殊的具體應用電路結構 ,根據應用的不同而不同;
  • 3:異步 FIFO 。(最常用的緩存單元是 DPRAM

12: FPGA 和 CPLD 的區別?

 

 

13:鎖存器( latch )和觸發器( flip-flop)區別?

  電平敏感的存儲器件稱為鎖存器。可分為高電平鎖存器和低電平鎖存器,用於不同時鍾之間的信號同步。

  有交叉耦合的門構成的雙穩態的存儲原件稱為觸發器。分為上升沿觸發和下降沿觸發。可以認為是兩個不同電平敏感的鎖存器串連而成。前一個鎖存器決定了觸發器的建立時間,后一個鎖存器則決定了保持時間。

 


14FPGA 芯片內有哪兩種存儲器資源?

  FPGA 芯片內有兩種存儲器資源: 一種叫 BLOCK RAM, 另一種是由 LUT 配置成的內部存儲器(也就是分布式 RAM )。

  BLOCK RAM 由一定數量固定大小的存儲塊構成的,使用BLOCK RAM 資源不占用額外的邏輯資源,並且速度快。但是使用的時候消耗的 BLOCK RAM 資源是其塊大小的整數倍。

 

15:什么是時鍾抖動?

  時鍾抖動是指芯片的某一個給定點上時鍾周期發生暫時性變化,也就是說時鍾周期在不同的周期上可能加長或縮短。它是一個平均值為 0 的平均變量。


16FPGA 設計中對時鍾的使用?(例如分頻等)

  FPGA 芯片有固定的時鍾路由,這些路由能有減少時鍾抖動和偏差。需要對時鍾進行相位移動或變頻的時候, 一般不允許對時鍾進行邏輯操作, 這樣不僅會增加時鍾的偏差和抖動, 還會使時鍾帶上毛刺。 一般的處理方法是采用 FPGA 芯片自帶的時鍾管理器如 PLL,DLLDCM ,或者把邏輯轉換到觸發器的 D 輸入(這些也是對時鍾邏輯操作的替代方案)。

 

17FPGA 設計中如何實現同步時序電路的延時?

  首先說說異步電路的延時實現: 異步電路一半是通過加 buffer 、 兩級與非門等來實現延時(我還沒用過所以也不是很清楚),但這是不適合同步電路實現延時的。在同步電路中,對於比較大的和特殊要求的延時,一半通過高速時鍾產生計數器,通過計數器來控制延時;對於比較小的延時,可以通過觸發器打一拍,不過這樣只能延遲一個時鍾周期。

 

18FPGA 中可以綜合實現為 RAM/ROM/CAM 的三種資源及其注意事項?

  三種資源: BLOCK RAM ,觸發器( FF),查找表( LUT );

注意事項:

  • 1:在生成 RAM 等存儲單元時,應該首選 BLOCK RAM 資源;其原因有二:

   Ⅰ:使用BLOCK RAM 等資源, 可以節約更多的 FF 4-LUT 等底層可編程單元。 使用 BLOCK RAM可以說是 ―不用白不用, 是最大程度發揮器件效能, 節約成本的一種體現;

   Ⅱ: BLOCK RAM是一種可以配置的硬件結構, 其可靠性和速度與用 LUT REGISTER 構建的存儲器更有優勢。

  • 2:弄清 FPGA 的硬件結構,合理使用 BLOCK RAM 資源;
  • 3:分析 BLOCK RAM 容量,高效使用 BLOCK RAM 資源;
  • 4:分布式 RAM 資源(DISTRIBUTE RAM

 

19Xilinx 中與全局時鍾資源和 DLL 相關的硬件原語:

  常用的與全局時鍾資源相關的 Xilinx 器件原語包括:BUFG,IBUFGDS,BUFG,BUFGP,BUFGCE,BUFGMUX,BUFGDLL,DCM 等。

關於各個器件原語的解釋可以參考《 FPGA 設計指導准則》 p50 部分。

 

20HDL 語言的層次概念?

  HDL 語言是分層次的、類型的,最常用的層次概念有系統與標准級、功能模塊級,行為級,寄存器傳輸級和門級。

系統級,算法級, RTL (行為級 ),門級,開關級。

 

21:查找表的原理與結構?

  查找表(look-up-table )簡稱為 LUT LUT 本質上就是一個 RAM 。目前 FPGA 中多使4 輸入的 LUT ,所以每一個 LUT 可以看成一個有 4 位地址線的 16x1 RAM 。 當用戶通過原理圖或 HDL 語言描述了一個邏輯電路以后, PLD/FPGA 開發軟件會自動計算邏輯電路的所有可能的結果,並把結果事先寫入 RAM, 這樣,每輸入一個信號進行邏輯運算就等於輸入一個地址進行查表,找出地址對應的內容,然后輸出即可。

 

22IC 設計前端到后端的流程和 EDA 工具?

  設計前端也稱邏輯設計,后端設計也稱物理設計,兩者並沒有嚴格的界限,一般涉及到與工藝有關的設計就是后端設計。

  • 1:規格制定:客戶向芯片設計公司提出設計要求。
  • 2:詳細設計:芯片設計公司( Fabless )根據客戶提出的規格要求,拿出設計解決方案和具體實現架構, 划分模塊功能。目前架構的驗證一般基於 systemC 語言,對價后模型的仿真可以使用 systemC 的仿真工具。例如: CoCentric Visual Elite 等。
  • 3HDL 編碼:設計輸入工具: ultra visual VHDL
  • 4:仿真驗證: modelsim
  • 5:邏輯綜合: synplify
  • 6:靜態時序分析: synopsys Prime Time
  • 7:形式驗證: Synopsys Formality.

 

23:寄生效應在 IC 設計中怎樣加以克服和利用(這是我的理解,原題好像是說,IC 設計過程中將寄生效應的怎樣反饋影響設計師的設計方案)?

  所謂寄生效應就是那些溜進你的 PCB 並在電路中大施破壞、令人頭痛、原因不明的小故障。 它們就是滲入高速電路中隱藏的寄生電容和寄生電感。 其中包括由封裝引腳和印制線過長形成的寄生電感; 焊盤到地、 焊盤到電源平面和焊盤到印制線之間形成的寄生電容; 通孔之間的相互影響,以及許多其它可能的寄生效應。

  理想狀態下,導線是沒有電阻,電容和電感的。而在實際中,導線用到了金屬銅,它有一定的電阻率,如果導線足夠長,積累的電阻也相當可觀。兩條平行的導線,如果互相之間有電壓差異,就相當於形成了一個平行板電容器(你想象一下)。通電的導線周圍會形成磁場(特別是電流變化時),磁場會產生感生電場,會對電子的移動產生影響,可以說每條實際的導線包括元器件的管腳都會產生感生電動勢,這也就是寄生電感。

  在直流或者低頻情況下,這種寄生效應看不太出來。而在交流特別是高頻交流條件下,影響就非常巨大了。根據復阻抗公式,電容、電感會在交流情況下會對電流的移動產生巨大阻礙,也就可以折算成阻抗。這種寄生效應很難克服,也難摸到。只能通過優化線路,盡量使用管腳短的惇SMT元器件來減少其影響,要完全消除是不可能的。


24:用Verilog寫一段代碼,實現消除一個glitch。

  (1)濾掉小於1個周期glitch的原理圖如下:

 1 module digital_filter_(clk_in,rst,host_rst,host_rst_filter);  2 input clk_in;  3 input rst;  4 input host_rst;  5 output host_rst_filter;  6 reg host_rst_d1;  7 reg host_rst_d2;  8 
 9 always@(posedge clk_in or negedge rst) 10   begin
11     if(~rst) 12     begin
13         host_rst_d1 <= 1'b1;
14         host_rst_d2 <= 1'b1;
15        end
16     else
17       begin
18         host_rst_d1 <= host_rst; 19         host_rst_d2 <= host_rst_d1; 20       end
21   end
22   
23 assign host_rst_filter = host_rst_d1 | host_rst_d2; 24 endmodule

  (2)濾掉大於1個周期且小於2個周期glitch的原理圖如下:

 

 

 25:計算最小周期。

Tco:寄存器時鍾輸入到數據輸出的時間

Tdata:寄存器間的走線延遲

Tsu :建立時間

Tskew:時鍾偏斜

Tmin = Tco + Tdata + Tsu - Tskew。最快頻率Fmax = 1/Tmin

Tskew = Tclkd – Tclks。



26、F = A & ~A
有競爭不一定產生冒險,如紅線處。有冒險一定存在競爭。

 

 27、異步FIFO深度計算

  如果數據流連續不斷則FIFO深度無論多少,只要讀寫時鍾不同源同頻則都會丟數;
FIFO用於緩沖塊數據流,一般用在寫快讀慢時,

FIFO深度 / (寫入速率 - 讀出速率) = FIFO被填滿時間 應大於 數據包傳送時間= 數據量 / 寫入速率

例:A/D采樣率50MHz,dsp讀A/D讀的速率40MHz,要不丟失地將10萬個采樣數據送入DSP,在A/D在和DSP之間至少加多大容量(深度)的FIFO才行?
100,000 / 50MHz = 1/ 500 s = 2ms
(50MHz - 40MHz) * 1/500 = 20k既是FIFO深度。

 

 28、畫出用D觸發器實現2倍分頻的邏輯電路

 
        

 將D觸發器的Q非端接到數據輸入端D即可實現二分頻,說白了就是CLK時鍾信號的一個周期。

四分頻電路:

 

29、在同步電路設計中,電路時序模型如下∶T1為觸發器時鍾到輸出延時,T2和T4為連線延時,T3為組合路徑延時,T5為時鍾網絡延時,假設時鍾周期為Tcycle ,Tsetup,Thold分別為觸發器建立保持時間,為保證正確采樣(改路徑為multi-cycle路徑),下列必須滿足的是︰D

A.T1+T2+T3+T4<Tcycle-Tsetup+T5,T1+T2+T3+T4>Thold

B.T1+T2+T3+T4<Tcycle-Tsetup,T1+T2+T3+T4+T5>Thold

C.T1+T2+T3+T4+T5<Tcycle-Tsetup,T1+T2+T3+T4>Thold

D.T1+T2+T3+T4<Tcycle-Tsetup+T5,T1+T2+T3+T4> Thold+T5

 

30、下列降低功耗的措施,哪個可以降低峰值功耗:B

A.大幅度提高HVT比例

B.靜態模塊級clock gating

C.power gating

D.Memory shut down

解析:

峰值往往出現在時鍾翻轉的瞬間,hvt只能降低靜態功耗;

clock gating可以用效降低動態功耗,因為減少了不必要的時鍾翻轉;

power gating,通常是也是減少待機電流。因為正常工作時各種power domain都是打開的;

memory shutdown與power gating是一個意思。只是一個關memory模塊的電,一個是關邏輯模塊的電。

31、下圖是長除法的CRC4電路,其對應的多項式 G(x)=x^4+x^3+1

 四個寄存器從左向右依次輸出:x^1(reg3)、x^2(reg2)、x^3 、x^4

 

 32、用Verilog中設計模塊以滿足以下要求。

(1)頻率為100MHz的時鍾
(2)對時鍾敏感的4位寬信號,限制該信號在8到15的范圍內隨機化16次。

`timescale 1ns/1ps
module random1();
reg clk;
reg [3:0] out_rand;
 
initial begin
    clk  = 0;
    forever 
        #5 clk = ~clk;
end 
//always #5 clk = ~clk;

integer i;
 
initial begin
    for(i = 0;i < 16; i = i + 1) begin
        @(posedge clk) begin
            out_rand = 4'b1000+ {$random}%8;
        end
    end
end

endmodule

 

33、分析如下電路功能

 

 分析:看這個電路圖,下面四個觸發器和上面1個觸發器構成,下面四個觸發器的連接關系好像是分頻器的連接,我們要分析這個電路的功能,就要畫出每一個觸發器的波形圖,觸發器的默認復位輸出是0,當然Q反為1。

可見是一個八分頻輸出,當然這不重要。重要的是Y,當A為高電平的時候夠長,我就能檢測到A的高電平。

A的高電平時間必須大於等於7個時鍾周期,否則,當成毛刺過濾掉。那么我不禁想這個電路到底什么功能呢?濾波電路!對於A的高電平時候小於7個時鍾,我們就當做毛刺濾掉了。

module freq_div(
    input clk,
    input A,
    output reg Y
    );
    wire A1;
    assign A1 = A;
    reg Q1_n, Q2_n ,Q3_n, Q4;
    always@(posedge clk or negedge A) begin
        if(~A) begin 
            Q1_n <= 1'b1;
        end
        else begin 
            Q1_n <= ~Q1_n;
        end
    end
    always@(posedge Q1_n or negedge A) begin
        if(~A) Q2_n <= 1'b1; 
        else Q2_n <= ~Q2_n;
    end
    always@(posedge Q2_n or negedge A) begin
        if(~A) Q3_n <= 1'b1; 
        else Q3_n <= ~Q3_n;
    end
    always@(posedge Q3_n or negedge A) begin
        if(~A) Q4 <= 1'b0; 
        else Q4 <= ~Q4;
    end
    always@(posedge Q4 or negedge A) begin
        if(~A) Y <= 1'b0;
        else Y <= A1;
    end
    
endmodule

 

34、Given the following FIFO and rules, how deep does the FIFO need to beto prevent underflow or overflow?(75 entries) 

RULES:
1) frequency(clk_A) = frequency(clk_B)/4

2) period(en_B) = period(clk_A)*100

3) duty_cycle(en_B) = 25%

 

 

 35、Y=AB+CD為了檢測D是否錯誤,則AB=0且C=1,所以選 C

 

 36、時序建立

固有建立時間為:Tsu_valid = Tsu - T_offset + Tpd + Tpd1 = 2 - 1.2 + 1.2 + 0.9 = 2.9ns

固有保持時間為:Th_valid = Th + T_offset - Tpd - Tpd1 = 1.5 + 1.2 - 1.2 - 0.9 = 0.6ns.

而系統的最高頻率呢?

先求系統的最小周期,考慮兩個觸發器之間的路徑:

Tmin = Tco + Tpd + Tsu = 1.8 + 1.2 + 2 = 5ns,那么系統最高頻率為200MHz。

37、序列發生器,循環產生如下序列:0010_1101_11。

可以用狀態機寫,但是更好的辦法是:

循環左移,輸出高位。

module seq_gen(
    input clk,
    input rst_n,
    output reg q
    );
    reg [9:0]q_r;
    always@(posedge clk or negedge rst_n) begin
        if(~rst_n) begin
            q <= 0;
            q_r <= 10'b0010_1101_11;
        end
        else begin
            q <= q_r[9];
            q_r <= {q_r[8:0], q_r[9]};
        end
    end
 
endmodule

 

 38、CDC(Clock Domain Conversion)跨時鍾域:

分單bit和多bit傳輸,其中:

單bit(慢時鍾域到快時鍾域):用快時鍾打兩拍,直接采一拍大概率也是沒問題的,兩拍的主要目的是消除亞穩態;

單bit(快時鍾域到慢時鍾域):握手、異步FIFO、異步雙口RAM;快時鍾域的信號脈寬較窄,慢時鍾域不一定能采到,可以通過握手機制讓窄脈沖展寬,慢時鍾域采集到信號后再“告訴”快時鍾域已經采集到信號,確保能采集到;

多bit:異步FIFO、異步雙口RAM、握手、格雷碼;

單bit(慢時鍾域到快時鍾域): 快的一定能采到慢的,用快時鍾打兩拍;
單bit(快時鍾域到慢時鍾域): 快時鍾域的信號脈寬較窄,慢時鍾域不一定能采到,可以通過握手機制讓窄脈沖展寬,慢時鍾域采集到信號后再“告訴”快時鍾域已經采集到信號,確保能采集到;

 

39、(大疆2020芯片開發工程師A卷)對12.918做無損定點化,需要的最小位寬是多少位?位寬選擇11位時的量化誤差是多少?

A. 12位,0.0118

B. 13位,0.0039

C. 12位,0.0039

D. 13位,0.0118

答案:C,12位,誤差0.0039

解析:12.918,定點量化時對整數部分和小數部分分別量化。

(1)整數部分12,最少使用4位量化,4-bit表示范圍0~15;

(2)小數部分0.918,假設12.918整體使用12位量化,整數已使用4-bit,則小數部分還能使用8-bit量化,能夠表示2的8次方共計256個刻度,每個刻度的間隔是1/256 = 0.00390625,這個值也就是量化精度。

小數0.918需要多少個刻度來表示呢? 0.918/(1/256) = 0.918*256 = 235.008,四舍五入取整,則使用235個刻度來表示,誤差是0.008個刻度,誤差大小是0.008*(1/256) = 0.00003125。

量化誤差小於量化精度的一半,認為是“無損量化”。由於量化后誤差0.00003125肯定是小於精度0.00390625的一半,所以這個誤差小到可以認為是無損量化。

當使用11位量化時,同理:

(1)整數部分12,最少仍需要4位量化,4-bit表示范圍0~15;

(2)小數0.918,只能使用剩下的7-bit量化,能夠表示2的7次方共計128個刻度,每個刻度的間隔是1/128。

小數0.918需要多少個刻度來表示呢? 0.918/(1/128) = 0.918*128 = 117.504,四舍五入取整,則使用118個刻度來表示,誤差是-0.496個刻度,誤差大小是-0.496*(1/128) = -0.003875,保留四位小數並取正數,0.0039。

40、(大疆2020芯片工程師A卷,單選)1個16K x 8位的存儲器,其地址線和數據線總和是

A、46

B、17

C、48

D、22

答案: D

解析:

地址線:16K = 1K*16 = 1024*16 = (2^10)*(2^4) = 2^14,即需要 14 根地址線;

數據線:8 位數據需要 8 根數據線;

所以一共需要 22 根線。

 

 

 

未完待續。。。

參考資料:

[1] OpenS Lee:FPGA開源工作室(公眾號)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM