2011年10月24日 星期一

2011/10/24 硬體描述語言 多工器設計 Multiplexer design

比照之前2011/10/03的多工器設計是個1-bit的多工器,

將兩個1-bit的多工器組合便可產生2-bits的多工器。
同理,
4-bits的多工器則是使用兩個2-bits組合而成。

同樣從2011/10/03的時脈圖可得知,
當SEL為0時,信號輸出為B。
當SEL為1時,信號輸出為A。
不論多少bit的多工器皆須滿足上述條件。

多工器本身的組合並不難,
只要注意將輸入線數除以二分成高腳位和低角位。

以下為1-bit組合成2-bits多工器的範例程式碼:


























以此類推便可推至64-bits的程式碼,在此則省略不多加說明。

當64-bits的多工器組合好後,
如何驗證該多工器是否正確成了今天最主要的課題。
緊接著先介紹一些會用到的Verilog語法:
※大多為網路上蒐集來的零星資料,和自己所學過的程式語言比較。

一、initial語法:
initial具對變數設出值的功能,
但它只在#0的時候動作,
也就是說透過initial設初值的動作只會被執行唯一一次,並且至於時脈設定的模組
其過程類似MATLAB的for迴圈動作,
開始與結尾分別用begin、end來囊括設初值的動作。

二、reg語法:
reg是register的縮寫,有登記的意思。
在Verilog中是指對變數設位數(也就是幾條線),
reg設的值是被動的,
必須透過initial和always設定初值才會改變。

三、wire語法:
wire起初也是對變數設位數,
之後透過assign來對變數設值,
或者是不設初值,透過輸入信號的不同而不同。

因此,一個用於測試64-bits的時脈設置如下:
















300的十六進制是12C,
100的十六進制是64,
故時脈圖當SEL=0時,輸出應是64,反之為12C。

2011年10月17日 星期一

2011/10/17 硬體描述語言 Verilog的"印出"練習

第一版:

    module hello1;
    initial $display("Hello Verilog");
    endmodule

結果:

 
字串在紅線處印出,
display本身和C語言的printf是相同的功能。

Verilog本身和C語言類似之處相當多,包括程式分行上的判斷。

module hello1;
initial $display(
"Hello Verilog"
);
endmodule

就算這樣打也可以執行。
唯獨"Hello Verilog"不可以分行(和其他識別字或關鍵字不可有空格),
若分行,會造成無法編譯的問題。
問題:

 

顯示於程式視窗右下角。

display內也可以加入跳脫字元
程式碼:

    module hello1;
    initial $display("   *   \n  ***  \n ***** \n*******\n");
    endmodule

其結果為:
 

display可以做為辨識程式執行到哪裡,印出現在某個變數的數值,以便判斷執行是否正確。

2011年10月3日 星期一

2011/10/03 硬體描述語言 - verilog入門

今天使用課本第七頁的範例測試

範例:

程式碼:

    module top;
    system_clock #100 clock1(A);
    system_clock #200 clock2(B);
    system_clock #400 clock3(SEL);
    mux  m1(OUT, A, B, SEL);
    endmodule
    module mux(OUT, A, B, SEL);
    output OUT;
    input A,B,SEL;
    not I5 (sel_n, SEL);
    and I6 (sel_a, A, SEL);
    and I7 (sel_b, sel_n, B);
    or I4 (OUT, sel_a, sel_b);
    endmodule
    module system_clock(clk);
    parameter PERIOD=100;
    output clk;
    reg clk;
    initial
    clk=0;
    always
    begin
    #(PERIOD/2)clk=~clk;
    end
    always@(posedge clk)
    if($time>1000)
    $stop;
    endmodule

時脈圖: