2013年4月1日 星期一

Debounce 電路設計

1. 何謂 Bounce (彈跳):

所謂的 Bounce 是指我們在按下電源開關時,電壓不會從 0 伏直接升到 VDD 伏。而是在 0 及 VDD 間震盪好幾次,最後才在 VDD 端穩定下來。

一個電子產品若有彈跳現象的話,最常見到的「症狀」是按下一個開關,結果數字跳好幾下。

2. 何謂 Debounce 電路 ??

為了解決彈跳問題,我們設計了 Debounce (反彈跳)電路,Debounce 電路的原理是:我們設定一個 Time Window,當波形能穿過這個 Time Window 時,才切換波形。

假設我們希望開關穩定的時間為 0.001 秒 = 1*10^-3 秒 = 1 ms

3. 如何設計 Debounce 電路 ??

a. 第一種作法:使用 AND 閘
利用 AND 閘來作 Debounce 電路可以在很短的時間之內設計完成,它的優點是簡單易懂。

缺點:
 * 單一 AND 閘之 Delay 相當短,要湊 1ms 可能需要很多的 AND 閘串接
 * 由於我們使用固定數量之 AND 閘,因此其 time window 不可改變,其彈性比較差

b. 第二種作法:使用 NOT 閘加一個超大 AND 閘
利用 NOT 閘來作 Debounce 電路可以在很短的時間之內設計完成,它的優點是簡單易懂。

上述兩種作法最大的缺點有二:
1. 佔空間:如果我們要設計的 debounce 電路之 time window 為 1ms,我們可能要串 1000 個 NOT 閘才能成功,這是相當佔空間的。
2. 沒彈性:如果我們有兩個專案,其中 A 專案的 debounce 時間為 1ms,而 B 專案的 debounce 時間為 1.5 ms,則我們必須針對兩個不同的專案設計出不同的 debounce 電路。

因此這兩種作法是比較差的 debounce 電路。

c. 第三種作法:兼具彈性及省空間的作法 ??
利用 Counter 電路來設計 debounce 電路可以解決上述兩個問題,因此我們可以看實體
電路設計。

low-active  -> 低態動作:輸入為 0 時動作。
high-active -> 高態動作:輸入為 1 時動作。

{a[7:3],b[2:0]}

2013年3月28日 星期四

Blender 物理引擎練習


練習 #1


  1. 將系統還原至初始狀態,將 Box 沿 Z 軸移動 5 個單位。
  2. 將上面選項由 Blender Render 改為 Blender Game
  3. 調整右側視窗,使得 Physics 工具出現
  4. 按 RMB 點選 Box,再按 Physics 工具,選擇 Rigid Body,此時底下會出現相對應的參數,我們將 Rigid Body Collisions 中的 Shape 由 Convex Hull 改為 Box。
  5. 按 p 可以執行 Game Engine,我們會看到方塊往下掉,按 Esc 回復原狀。
  6. 任意旋轉方塊,準備待會使用。
  7. 切換至視角 7,新增一個平面,放大 5 倍,此時我們可以打 p 來觀察物理引擎
  8.  執行狀態,我們會發現方塊掉進平面中。
  9.  將方塊的物理參數改為 static,再執行 p。


練習 #2



  1. 將方塊刪除,只留下平面
  2. 加入 UV Sphere,將此圓球沿 Z 軸往上移 5 個單位
  3. 修改 UV Sphere 之物理特性為 Rigid Body,並按 p 模擬看看,模擬完按 Esc
  4. 將平面延伸出一個斜坡,將 UV Sphere 移至斜坡上,並按 p 模擬看看,看 UV Sphere 是否會順著斜坡往下滾,我們可以調整不同視角來觀察其模擬狀態。
  5. 加入一個方塊,調整大小準備作骨牌用。將其物理特性設為 Rigid Body,並記得
  6. 將 Collision Bounds 設為 Box,然後按 p 模擬看球撞到骨牌的效應。設定完單一個骨牌後,我們可以按 Shift+d 來複製/貼上骨牌。


作業 2

請用骨牌蓋一個 10 層樓高的建築物,用球打倒,球打到前房子不能先垮下來。

練習:

請看底下網頁建立齒輪:
http://www.youtube.com/watch?v=zi6MxMM09Ek

其中的 Extra Mesh 在:
http://wiki.blender.org/index.php/Extensions:2.6/Py/Scripts/Add_Mesh/Add_Extra



如何使用 GPU 來加速 Blender 的運算



  1. 需求 - Blender 2.66 版、Nvidia 3D 加速卡、Nvidia 官方驅動程式

  2. 設定完 Blender 驅動程式後,請進入 Blender,在選單的: File -> User Preferences (快捷鍵:Ctrl + Alt + U) 呼叫出 User Preferences 視窗,在 System 項目下,將 Compute Device   選擇為 CUDA,選擇完請點選最底下的「Save User Settings」,如此一來即可使用 GPU 來加速 Blender 運算。


2013年3月25日 星期一

fpga 0325 講義


1. 雙向埠的原理及設計
   hw4 -> (VLSI 的 hw8a)
   bufif0 bufif1

2. 四(N)顆並聯的七段顯示器如何驅動 ?

   a. 先將腳位如何驅動七段顯示器量測出來,使用三用電表,切換至二極體模式,然後將腳位列表出來。
   b. 使用掃瞄方式撰寫 verilog code。
          ^^^^

什麼叫掃瞄 ?

假設我們要在四顆並聯的七段顯示器顯示 1234,我們會遇上一個問題是 a0~a3, b0~b3 .. h0~h3 全部都短路在一起,最主要的原因是為了節省腳位,在這種情況之下顯示會變成:

1111
2222
3333
4444
5555
..
依此類推。

如果要顯示 1234 的話,那麼我們要使用掃瞄的技巧,也就是一次點亮一顆七段顯示器,
例如:

1 -> d0 打開
2 -> d1 打開
3 -> d2 打開
4 -> d3 打開

其畫面如
http://www.youtube.com/watch?v=qxGxtjlfhTE
所示。

當掃瞄的速度很快(24 frames/sec)的時候,我們的眼睛會因為視覺暫留的原理誤以為全
部的七段顯示器都是「同時」點亮的。所謂的很快是指每秒有 24 張以上的動畫,以
1 kHz 的掃瞄速度來說,有四個字元,因此每個字元平均一秒掃 250 次,相當足夠。

3. FPGA 常見 I/O 為何 ?

   a. 輸入 - jumper、dip switch、button、keypad
   b. 輸出 - 七段顯示器、LED、矩陣 LED、LCD、VGA
   c. 雙向埠 - Memory

2013年3月22日 星期五

blender 0322 講義


練習 5a

1. 清除方塊,在視角 7 重新建立 plane
2. 進入編輯模式,只刪除面 (only faces)
3. 加入 circle,並按 s,再按 .5 來將半徑縮為 .5
4. 選擇所有端點,按 Alt+f 如此一來即可自動補面
5. 切換至視角 3,將中心圓垂直延伸(e) 1 個單位。
6. 將圓封面,有兩種作法:
   a. 選擇所有圓之端點按 f,將整個圓封個一個面
   b. 選擇所有圓之端點按 Alt+f,將整個圓,以三角形一個面的方式補面
7. 接下來切換至視角 3,並將整個面往上移一個單位。
8. 全選所有端點,按 Shift+d,複製整個面。
9. 將基準點 (pivot Center) 設為 3D Cursor,再按 r 旋 90 度、180 度以及 270
   度來貼上模型。如此一來,我們便封了 4 個面。
10. 切換至視角 1,重複之前選擇、複製、旋轉、貼上的流程,將剩下兩個面補齊。
11. 選擇所有端點,再按 Remove Doubles 按鍵,此時會出現 Removed 24 vertices。

blender 0315 講義


practice 2b

1. 回到視角 7 (xy 平面),清除 cube。
2. shift + a -> 新增 circle,按 e,按 Esc,按 s,按 0.4 將圓縮小為 0.4
3. 之前步驟請參考上週教學。

practice 2c
1. 進入編輯模式 (TAB),按 w 叫出視窗,再選 Bevel,或是快捷鍵 Ctrl+B
   可以新增倒角,但此種方式不適用於太複雜之模型,只適用簡單的方塊。

2. 在編輯模式下按 b,再用滑鼠左鍵拉框框可以選擇端點。
   在編輯模式下按 b,再用滑鼠中鍵拉框框可以取消選擇端點。

practice 3
齒輪
渦輪葉片 -> spin 工具


practice 4
動畫

設定動畫格數:


1. 在最底下視窗設定起始頁面為 1 (內定值),結束頁面為 35。我們可以用 LMB
   切換頁面。

旋轉

1. 請將右側視窗切換至 Object,我們在此可以調整 Rotation 參數。

2. 在第1頁時,按 I 叫出 "Insert Keyframe Menu" 視窗,並選擇 Rotation

3. 以 LMB 移至 35 頁,將方塊旋 360 度,然後按 I 叫出 "Insert Keyframe Menu"
   視窗,並選擇 Rotation

4. 按底下控制按鍵即可撥放動畫。




2013年3月18日 星期一

fpga 0318 講義


作業 3.
  請寫出 VLSI 作業 2 正緣觸發之 D 正反器,要寫以下版本:

a. gate level 版                檔名:dff_gate.v,gate level 版必須使用 XCircuit 畫出正緣觸發 D 正反器之電路圖。
b. rtl level 版 (alway @)       檔名:dff_rtl.v

請撰寫可自我偵測錯誤之 testfixture,並且適用於上述兩個不同版本之 DFF 電路,其輸出為 test_dff.dmp,檔名為 test_dff.v。

p2-6
數字表示:

 8'hec          ->  8'h 指有 8個位元 hex 數字,其值為 ec
16'd2048        -> 16'd 指有16個位元 digital 數字,其值為 2048
  o -> 八進位、b-> 二進元

24'b111111111111111111111111 = 24'b1111_1111_1111_1111_1111_1111


x -> unknown
z -> 高阻抗

# 10 test ok
# 20 test ok
# 30 test fail

p2-11

表 2-2 關鍵字,關鍵字的重要性在於我們不能拿關鍵字來當變數。例如以下寫法很糟糕:

reg if;

因為 if 為關鍵字,使用 if 當變數會有問題。


P3-7

範例 3-3

assign mount = s ? ma : mb;

if s = 1 mount = ma;
if s = 0 mount = mb;

P3-15

assign dbus = (enable == 1) ?  value1: 4'bz;

http://www.cse.psu.edu/~cg577/DOCUMENTS/codingstandards/verilog.html

儘量不要使用巢狀 ? : 來寫程式,以免看不懂,如上述網頁之例子。


P3-9 資料型態

1. 數值 0 1 x z

2. 連接線

3. 暫存器

4. 向量 ?

reg [7:0] a; -> a7a6a5a4a3a2a1a0
                27            s0
reg [0:7] b; -> a0a1 ........ a7

a 跟 b 有何不同 ? (大印地安 V.S. 小印地安)
http://www.prudentman.idv.tw/2007/11/big-endianlittle-endian.html

5. 數字 -> 無號數

6. 參數 -> 有限狀態機

7. 陣列、記憶體 -> 本學期沒有用到

8. 三態 -> 雙向埠