中村/第二回
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[中村/春プロジェクト]]
*第2回 2007年6月号 4ビット加算器を設計しよう [#x8749e93]
**概要 [#l91c0f76]
-4bits adderの作成
-補数表現について
-Verilog HDLの演算子
**Verilog HDL記述の解説 [#l91c0f76]
***4bits adder(すべての信号線の論理を定義する方法) [#eabd94a7]
-adder4_1.v
1 module adder4_1(a, b, s);
2
3 input [3:0]a, b;
4 output [3:0] s;
5 wire [2:0] c;
6
7 assign s[0] = a[0] ^ b[0];
8 assign c[0] = a[0] & b[0];
9 assign s[1] = a[1] ^ b[1] ^ c[0];
10 assign c[1] = (a[1] & b[1]) | (b[1] & c[0]) | (c[0] & a[1]);
11 assign s[2] = a[2] ^ b[2] ^ c[1];
12 assign c[2] = (a[2] & b[2]) | (b[2] & c[1]) | (c[1] & a[2]);
13 assign s[3] = a[3] ^ b[3] ^ c[2];
14
15 endmodule // adder4_1
***4bits adder(モジュール・インスタンス化) [#tdf6ce17]
-adder4_2.v
1 `include "fa.v"
2
3 module adder4_2(a,b,s);
4
5 input [3:0]a,b;
6 output [3:0] s;
7 wire [2:0] c;
8
9 fa fa0(.a(a[0]), .b(b[0]), .cin(0), .s(s[0]), .cout(c[0]));
10 fa fa1(.a(a[1]), .b(b[1]), .cin(c[0]), .s(s[1]), .cout(c[1]));
11 fa fa2(.a(a[2]), .b(b[2]), .cin(c[1]), .s(s[2]), .cout(c[2]));
12 fa fa3(.a(a[3]), .b(b[3]), .cin(c[2]), .s(s[3]));
13
14 endmodule // adder4_2
***4bits adder(算術演算子を用いる方法) [#q1ea15a5]
-adder4_3.v
1 module adder4_3(a, b, s);
2
3 input[3:0]a,b;
4 output [3:0] s;
5 reg [3:0] s;
6
7 always @(a or b)
8 s = a + b;
9
10 endmodule // adder4_3
-7行目のalways @(…)は、…の部分(イベント・リスト)の値が変化するたびに後に続く分が実行される。
***テストベンチ [#bf26333b]
-adder4_*_tb.v
1 `timescale 1ns /1ps
2
3 // include needed module
4 `include "adder4_*.v"
5
6 module adder4_*_tb;
7
8 reg[3:0] a,b;
9 wire [3:0] s;
10
11 adder4_* adder4_*_0(.a(a), .b(b), .s(s));
12
13 initial begin
14 // output waveform
15 $dumpfile("adder4_*_tb_wf.vcd");
16 $dumpvars(0, adder4_*_tb);
17
18 // decide the input signals
19 a = 4'b0000; b = 4'b0000;
20 #100 a = 4'b0001;
21 #100 a = 4'b0010;
22 #100 b = 4'b0111;
23 #100 a = 4'b1101;
24 #100 a = 4'b1011;
25 #100 b = 4'b1001;
26 #100 b = 4'b1110;
27 #100 a = 4'b0000; b = 4'b0000;
28 end // initial begin
29
30 endmodule
**メモ [#n17a0467]
-always文の中で用いられる代入文の左辺は、レジスタ宣言(reg)で宣言されたレジスタ型変数でなければいけない
-assign文の中で用いられる代入文の左辺は、ネット宣言(wire)で宣言されたネット型変数でなければいけない
-レジスタ型変数は、値を保持するレジスタにも信号線にもなりえる
-Verilog HDLはビット列を数値として取り扱うとき「符号なしの2進数表現」とみなす
-Verilog HDLで使える演算子 http://hp.vector.co.jp/authors/VA016670/verilog/index.html
**感想 [#pf317837]
-ケアレスミスを減らしたい
-2と3だとどちらのほうがいいのだろうか?
-
終了行:
[[中村/春プロジェクト]]
*第2回 2007年6月号 4ビット加算器を設計しよう [#x8749e93]
**概要 [#l91c0f76]
-4bits adderの作成
-補数表現について
-Verilog HDLの演算子
**Verilog HDL記述の解説 [#l91c0f76]
***4bits adder(すべての信号線の論理を定義する方法) [#eabd94a7]
-adder4_1.v
1 module adder4_1(a, b, s);
2
3 input [3:0]a, b;
4 output [3:0] s;
5 wire [2:0] c;
6
7 assign s[0] = a[0] ^ b[0];
8 assign c[0] = a[0] & b[0];
9 assign s[1] = a[1] ^ b[1] ^ c[0];
10 assign c[1] = (a[1] & b[1]) | (b[1] & c[0]) | (c[0] & a[1]);
11 assign s[2] = a[2] ^ b[2] ^ c[1];
12 assign c[2] = (a[2] & b[2]) | (b[2] & c[1]) | (c[1] & a[2]);
13 assign s[3] = a[3] ^ b[3] ^ c[2];
14
15 endmodule // adder4_1
***4bits adder(モジュール・インスタンス化) [#tdf6ce17]
-adder4_2.v
1 `include "fa.v"
2
3 module adder4_2(a,b,s);
4
5 input [3:0]a,b;
6 output [3:0] s;
7 wire [2:0] c;
8
9 fa fa0(.a(a[0]), .b(b[0]), .cin(0), .s(s[0]), .cout(c[0]));
10 fa fa1(.a(a[1]), .b(b[1]), .cin(c[0]), .s(s[1]), .cout(c[1]));
11 fa fa2(.a(a[2]), .b(b[2]), .cin(c[1]), .s(s[2]), .cout(c[2]));
12 fa fa3(.a(a[3]), .b(b[3]), .cin(c[2]), .s(s[3]));
13
14 endmodule // adder4_2
***4bits adder(算術演算子を用いる方法) [#q1ea15a5]
-adder4_3.v
1 module adder4_3(a, b, s);
2
3 input[3:0]a,b;
4 output [3:0] s;
5 reg [3:0] s;
6
7 always @(a or b)
8 s = a + b;
9
10 endmodule // adder4_3
-7行目のalways @(…)は、…の部分(イベント・リスト)の値が変化するたびに後に続く分が実行される。
***テストベンチ [#bf26333b]
-adder4_*_tb.v
1 `timescale 1ns /1ps
2
3 // include needed module
4 `include "adder4_*.v"
5
6 module adder4_*_tb;
7
8 reg[3:0] a,b;
9 wire [3:0] s;
10
11 adder4_* adder4_*_0(.a(a), .b(b), .s(s));
12
13 initial begin
14 // output waveform
15 $dumpfile("adder4_*_tb_wf.vcd");
16 $dumpvars(0, adder4_*_tb);
17
18 // decide the input signals
19 a = 4'b0000; b = 4'b0000;
20 #100 a = 4'b0001;
21 #100 a = 4'b0010;
22 #100 b = 4'b0111;
23 #100 a = 4'b1101;
24 #100 a = 4'b1011;
25 #100 b = 4'b1001;
26 #100 b = 4'b1110;
27 #100 a = 4'b0000; b = 4'b0000;
28 end // initial begin
29
30 endmodule
**メモ [#n17a0467]
-always文の中で用いられる代入文の左辺は、レジスタ宣言(reg)で宣言されたレジスタ型変数でなければいけない
-assign文の中で用いられる代入文の左辺は、ネット宣言(wire)で宣言されたネット型変数でなければいけない
-レジスタ型変数は、値を保持するレジスタにも信号線にもなりえる
-Verilog HDLはビット列を数値として取り扱うとき「符号なしの2進数表現」とみなす
-Verilog HDLで使える演算子 http://hp.vector.co.jp/authors/VA016670/verilog/index.html
**感想 [#pf317837]
-ケアレスミスを減らしたい
-2と3だとどちらのほうがいいのだろうか?
-
ページ名: