比照之前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月24日 星期一
2011年10月17日 星期一
2011/10/17 硬體描述語言 Verilog的"印出"練習
第一版:
module hello1;
initial $display("Hello Verilog");
endmodule
結果:
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNVjs8mO7kVzBGAAeO9DZfSrF0_f_CXPWfXx16aY3M5EmmUHTCKix8TpFMLLL2R-zHSBI1ok2YbRgjveQkSbgzGuu3QJ8HctGQp6yVWnOxjEQEwAwHi0xa8BFOCR9ZQb3GTpcuj5yJHG0/s400/reslut1.JPG)
字串在紅線處印出,
display本身和C語言的printf是相同的功能。
Verilog本身和C語言類似之處相當多,包括程式分行上的判斷。
module hello1;
initial $display(
"Hello Verilog"
);
endmodule
就算這樣打也可以執行。
唯獨"Hello Verilog"不可以分行(和其他識別字或關鍵字不可有空格),
若分行,會造成無法編譯的問題。
問題:
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQTuocflqWIbV9U0i3X0my2SCJzpWo36l_HxNNam4LwaajIhOWjFhri7eZtsxM1DfWHuOJveJnxfpTRwE01QLiEdO4lrlUa9TMVD7Qk_Yi5xUd5JQMOSCapzfGAaX2LlJXrdGB85-ZN38/s200/result2.JPG)
顯示於程式視窗右下角。
display內也可以加入跳脫字元
程式碼:
module hello1;
initial $display(" * \n *** \n ***** \n*******\n");
endmodule
其結果為:
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjl_Yv0SdQ5IoKZgT3yVpfSXXK6717cvjq78KKlmY62lbYAcloc815nL2QQEqce71B87ZPQ0Dn1jU86ieBIRgj8YfeyNh_7tGrI7Kl6RHbmWTHIYsZPqXgaNSmy0xpHOi5h-cxcA4CmerM/s400/result3.JPG)
display可以做為辨識程式執行到哪裡,印出現在某個變數的數值,以便判斷執行是否正確。
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
時脈圖:
範例:
程式碼:
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
時脈圖:
訂閱:
文章 (Atom)