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. 三態 -> 雙向埠

2013年3月11日 星期一

fpga 0311 - 針對 test fixture 的再進化


針對 test fixture 的再進化

我們剛剛寫好的 test fixture 有什麼缺點 ?

缺點1. 我們所測試出來的波形,系統無法自行判斷是正確或是錯誤的波形,得要由人類的眼睛來判斷。

缺點2. 輸入波形無法自動產生


針對缺點1之解決方式

我們使用行為模式(behavior model)來撰寫 testfixture,其目的是讓 testfixture 能自動產生 x+y 的半加器輸出,程式碼如下:

reg sumY, coutY;        // test result


// self calculate coutY, sumY
always @ ( a or b)
  begin
    {coutY, sumY} = a+b;
  end


並以此輸出來與原始 ha_gate/ha_rtl/ha_cont.v 中電路所產生之輸出作比對。

reg testok;             // 0 == error, 1 == testok;

// compare
always @ ( coutX or sumX )
begin
  if ( coutX == coutY && sumX == sumY)
    testok=1;
  else
    testok=0;
end

我們可以觀察 testok 的波形,當 testok == 1 時,我們的電路輸出與自動產生之電路輸出是一致的,萬一 testok == 0 時,兩者不一致,運算有錯,必須進行除錯。

針對缺點2之解決方式
a. 定義一個 clock 訊號源
b. 利用 clock 訊號源來產生訊號

fpga 0311 講義


$display 語法 (課本 p2-10 - p2-12)

$display("Hello world")

可以在螢幕上顯示 Hello world 字串,在半加器的測試檔中作以下修改:

initial begin
$display("Half Adder test begin!!");    // 加入此行
$dumpvars;
$dumpfile("testha.dmp");

#0 a=0;
   b=0;
   $display($time, "=>a=%b,b=%b,sumX=%b,coutX=%b",a,b,sumX,coutX); // 加入此行

然後執行模擬,我們可以得到以下螢幕輸出:

Half Adder test begin!!
                   0=>a=0,b=0,sumX=x,coutX=x

從以上輸出我們可以得到當 a=0, b=0 的時候,sumX 跟 coutX 的值為 x (未知)。為什麼會有這個輸出結果 ?



原因:所有的電路都有延遲,當訊號在第 0 秒輸入時,不可能輸出就跟著改變。因此,
我們可以再修改程式碼如下:

#0      a=0;
        b=0;
        $display($time, "=>a=%b,b=%b,sumX=%b,coutX=%b",a,b,sumX,coutX);

#1
        $display($time, "=>a=%b,b=%b,sumX=%b,coutX=%b",a,b,sumX,coutX);

其輸出為:
Half Adder test begin!!
                   0=>a=0,b=0,sumX=x,coutX=x
                   1=>a=0,b=0,sumX=0,coutX=0

我們可以觀察上面的第二行,發現在第 1 個時間單位時,sumX=0, coutX=0。這表示經過一個時間單位的延遲之後,電路已完成運算並在輸出端看到結果。

現在有個問題,萬一我們每個訊號的改變都希望能從螢幕上看到數值,該如何作 ?

1. 每一個訊號改變都加上 $display ==> 累死人,我們最好不要作這種蠢事

2. 使用 $monitor ==> 比較聰明的作法

因此我們可以將測試檔改成:

initial begin
$display("Half Adder test begin!!");                            // 加入此行
$monitor($time, "=>a=%b,b=%b,sumX=%b,coutX=%b",a,b,sumX,coutX); // 加入此行
$dumpvars;
$dumpfile("testha.dmp");

#0      a=0;
        b=0;

其輸出為:

Half Adder test begin!!
                   0=>a=0,b=0,sumX=0,coutX=0
                  10=>a=0,b=1,sumX=1,coutX=0
                  20=>a=1,b=0,sumX=1,coutX=0
                  30=>a=1,b=1,sumX=0,coutX=1


我們可以看到只要加一行 $monitor 之後,系統即會根據輸出/入的變化而自動列印其數值,不必每一行都加 $display。

RTL level 的程式寫法

連接運算子 (p 5-19)

請將 half adder 以 rtl 方式撰寫出來


//RTL Level code                    | // Gate Level code
//ha_rtl.v                                 | // ha_gate.v
module half_adder(x, y, Sum, Cout); | module half_adder(x, y, Sum, Cout);
                                               |
input x, y;                                | input x, y;
output Sum, Cout;                   | output Sum, Cout;
reg Sum, Cout;                       |
                                              | // Circuit Description
// Circuit Description              |
                                             | xor xor0(Sum, x, y);
always @ (x or y)                  | and and0(Cout, x, y);
{Cout,Sum} = x+y;               |
                                            | endmodule
endmodule                           |

上面左邊的程式碼是告訴我們以 RTL 方式撰寫出來的 code,現在我們希望能將寫完的程式進行模擬,請執行:

cver ha_rtl.v test_ha.v

此時我們可以看到

1. $monitor 輸出與之前 ha_gate.v 相同
2. testha.dmp 亦相同


使用 continuous assignment 來撰寫 half adder:

module half_adder(x, y, Sum, Cout);

input x, y;
output Sum, Cout;

// Circuit Description

assign {Cout, Sum} = x + y;

endmodule

上面的例子是使用 assign 語法 (又稱為 continuous assignment,課本 p5-2) 來進行 half adder 的設計。

小結:在這三個半加器的例子中,我們使用了同一個 test fixture 來針對我們所寫的三個不同語法之半加器進行測試,而且測試後之結果均一模一樣。







2013年3月10日 星期日

Blender 0308 上課講義

第二種畫桌子的方法

1. 加入 Cube,將 Cube 左下角移至原點,並按 z 切換至骨架模式 (Wire frame)

a. 按 RMB 點選 Cube 以選擇 Cube,按 g 再押著 Ctrl 不放將左下角移至 0,0
   然後按 LMB。
b. 按 TAB 進入物件編輯模式,然後按 b 拉一個框框圈選最上面的端點。
c. 移動端點:按 g、按 y、按 3。
d. 取消端點選擇,然後選擇右側的面
e. 移動端點:按 g、按 x、按 8。到目前為止,我們會有一個方塊其大小為 5 x 10 x 2(高)
f. 移至視窗 3 (yz 平面),取消端點選擇,然後選擇最底下的面
g. 移動端點:按 g、按 z、按 1.7,此時我們即可得到一個 5 x 10 x 0.3 之方塊


練習 2

1. 回到初始狀態,刪除內建方塊
2. 切至視角 7,新增一個 Circle,其端點數為 32 (預設值),半徑 (Radius) 設為 1, fill type 設為 Triangle Fan,此時我們可以得到一片圓形。
3. 按 b 拉一個框框圈選左半圓的點,再按 x 然後將其刪除,刪完之後我們有半個圓。
4. 新增一個 plan,將此 plan 高度調為 1,並與半圓重疊
5. 刪半圓之某些端點,將圓切 plan 處加上一個新的端點,使用 k (knife) 工具。
6. 將切完之端點填面,可以選三個端點(按 Shift + RMB 點選) 再填面 (f)或是四個端點填面 (f)
7. 將 3D 遊標歸零 -> Shift +s -> Cursor to Grid / Cursor to Center
8. 全選所有端點,按 Ctrl + D 複製,將旋轉點  pivot 改為 3D 遊標,按 r 旋轉 180 度,即可完成一個重疊的圓。
9. 全選所有端點,按 Remove Double 按鍵,即可將重疊的端點「融合」
10. 移至視角 3,全選所有端點,按 e(extrude 延伸)、按 z、按 0.3

2013年3月3日 星期日

fpga 0304 上課講義


1. 如何證明我們所寫的半加器工作正確 ?

在 simulation command 的部份,我們需要針對半加器的動作來進行完整測試,請問什麼是半加器的完整測試 ? 要判別一個半加器是否完整動作,最簡單的方法是把真值表上的每一列都模擬一次,如果輸出/入之狀態完全符合真值表,則我們可以確認此電路工作正常。

x  y | Sum   Cout
-----+-----------
0  0 |   0      0
0  1 |   1      0
1  0 |   1      0
1  1 |   0      1

將全部可能的輸入訊號都跑一次模擬並檢查模擬結果是否正確,若全部正確的話,我們可以假設電路設計是對的。

2. 如何撰寫 test fixture (測試程式)

2.1 什麼是 test fixture ?

當我們寫完 verilog 電路後,我們必須證明它是對的,因此我們要寫 test fixture 來針對我們所寫的 verilog 程式進行測試。

2.2 test fixture 的內容

一個 test fixture 就是一個 verilog module,以半加器 test fixture 為例,其語法大致如下:

module test_ha;
reg   definition  -> 暫存器定義
wire  definition  -> 線定義
other definition  -> 其它定義

half_adder ha0 () -> 呼叫我們要進行測試的電路

initial begin                   -> 開始進行波形輸入
$dumpvars;                      -> 產生 gtkwave 語法
$dumpfile("testha.dmp");        -> 將波形以 VCD 格式存在 testha.dmp 檔中,
                                   testha.dmp 可照自己的需求改名字

simulation command   模擬指令,以下特別說明!!

$dumpall;                       -> 紀錄所有訊號
$dumpflush;                     -> 必要
#10 $finish;                    -> 在 10 個時間單位後結束模擬
end                             -> 結束 initial begin
endmodule

因此一個完整的半加器 test fixture 如下,我們將其存為 test_ha.v

module test_ha;
reg a, b;
wire sumX, coutX;

half_adder ha0(a, b, sumX, coutX);

initial begin
$dumpvars;
$dumpfile("testha.dmp");

#0      a=0;
        b=0;

#10     a=0;
        b=1;

#10     a=1;
        b=0;

#10     a=1;
        b=1;


$dumpall;
$dumpflush;
#10 $finish;
end
endmodule


2.3 進行 verilog 測試模擬

請執行

cver ha_gate.v test_ha.v \Enter

理論上應該輸出如下:

GPLCVER_2.12a of 05/16/07 (Linux-elf).
Copyright (c) 1991-2007 Pragmatic C Software Corp.
  All Rights reserved.  Licensed under the GNU General Public License (GPL).
  See the 'COPYING' file for details.  NO WARRANTY provided.
Today is Mon Mar  7 11:25:30 2011.
Compiling source file "ha_gate.v"
Compiling source file "test_ha.v"
Highest level modules:
test_ha

Halted at location **test_ha.v(25) time 40 from call to $finish.

我們會發現沒有 error、沒有 warning,而且會有個檔案叫 testha.dmp,接下來就可以用 GTKwave 觀察波形了。




3. 使用 GTKwave

請執行

gtkwave testha.dmp

來載入模擬波形檔,並觀察我們所寫的變數 (reg, wire .. 之類) 的輸出,若想將目前觀察狀態留待下次載入,請選擇

File -> Write Save File

存檔為 testha.sav,下次載入 gtkwave 時請執行:

gtkwave testha.dmp testha.sav

即可載入前一次觀察狀態。




作業 1. 畫 Full Adder 的電路圖
        以 Gate Level 寫 Verilog 程式
        撰寫 test fixture,並跑模擬,可存檔檔名為 testfa.dmp
        列印波形

2013年3月1日 星期五

blender 0301 上課講義


安裝執行 Blender

1. 請至 blender 網頁下載 Blender 檔案:

http://www.blender.org/download/get-blender/

下載

blender-2.63a-linux-glibc27-i686.tar.bz2

2. 將此檔案解壓縮至 /usr/local

/usr/local# tar jxfv 目錄/blender-2.63a-linux-glibc27-i686.tar.bz2

此時會解開一個 blender-2.63a-linux-glibc27-i686 目錄,其完整路徑為

/usr/local/blender-2.63a-linux-glibc27-i686

3. 在 /usr/local/bin 建一個 blender 之連結

/usr/local/bin# ln -s /usr/local/blender-2.63a-linux-glibc27-i686/blender .

4. 呼叫 Blender

在選單中啟動 Blender 或是直接輸入 blender,看是不是最新的 2.63a 版


Blender 基本操作:

視角切換(以鍵盤右側數字鍵盤來操作)

  • 7 -> yx 平面
  • 3 -> zy 平面
  • 1 -> xz 平面
  • 0 -> Camera 視角
  • 5 -> 切換透視投影 / 平行投影

基本操作
  • 旋轉視角 -> MMB 按著移動滑鼠可以旋轉視角
  • 拉近/拉遠與物件的距離 -> MMB 滾輪
  • 平移視角 -> 左手先按 Shift + 右手按 MMB 再移動
  • 選取物件 -> 以 RMB 點選不同的物件,這裡面的物件泛指 3D 物件、Camera、燈源皆是物件。
  • 刪除物件 -> 先選取物件,再按 x,此時會出現一個 Delete 視窗,請點 OK 即可刪除物件。
  • 還原上一步 -> Ctrl + z,可以還原上一步,例如將剛剛刪除的物件還原回來
  • z -> 切換著色模式/網格模式
  • 新增物件 -> 選單 Add -> Mesh 可以新增基本物件,其快捷鍵為 Shift + a
  • 旋轉物件 -> r 移動滑鼠
    • 若臨時不想執行旋轉操作,可以按 Esc 退出,
    • 若要固定角度旋轉,請按 r 之後,將左手按 Ctrl,右手移動滑鼠,如此一來可以以 5 度角為單位旋轉物件。
    • 若想針對某軸進行特定角度旋轉,請在左下角 rotation 小表格中直接填入該軸的旋轉角度。
  • 縮放物件 -> s 移動滑鼠
    •         a. 若臨時不想執行縮放操作,可以按 Esc 退出,
    •         b. 若要固定單位縮放,請按 s 之後,將左手按 Ctrl,右手移動滑鼠,如此一來
    •            可以以 0.1 為單位旋轉物件。
    •         c 若想針對某軸進行縮放,請按 s 之後,再按該軸 (x or y or z),右手移動
    •           滑鼠,如此一來可以沿該軸縮放。
  • 移動物件 -> g 移動滑鼠
    • 若臨時不想執行移動操作,可以按 Esc 退出,
    • 若要固定單位移動,請按 s 之後,將左手按 Ctrl,右手移動滑鼠,如此一來可以以 0.1 為單位移動物件。
    • 若想針對某軸進行移動,請按 s 之後,再按該軸 (x or y or z),右手移動滑鼠,如此一來可以沿該軸移動。
  • 取消/全選物件 -> a
  • 複製物件 -> Shift + d