中村/第三回
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[中村/春プロジェクト]]
*第3回 2007年8月号 マルチプレクサと算術論理演算回路[#x8749e93]
**概要 [#l91c0f76]
-マルチプレクサの設計
-算術論理演算回路の設計
**Verilog HDL記述の解説 [#u5739096]
***算術論理演算回路 [#b0abb1e1]
-alu.v
1 `define ADD 5'b00000
2 `define SUB 5'b00001
3 `define MUL 5'b00010
4 `define SHL 5'b00011
5 `define SHR 5'b00100
6 `define BAND 5'b00101
7 `define BOR 5'b00110
8 `define BXOR 5'b00111
9 `define AND 5'b01000
10 `define OR 5'b01001
11 `define EQ 5'b01010
12 `define NE 5'b01011
13 `define GE 5'b01100
14 `define LE 5'b01101
15 `define GT 5'b01110
16 `define LT 5'b01111
17 `define NEG 5'b10000
18 `define NOT 5'b10001
19 `define BNOT 5'b10010
20
21 module alu(a,b,f,s);
22
23 input [15:0] a,b;
24 input [4:0] f;
25 output [15:0] s;
26 reg [15:0] s;
27 wire [15:0] x,y;
28
29 assign x = a + 16'h8000;
30 assign y = b + 16'h8000;
31
32 always @(a or b or x or y or f)
33 case(f)
34 `ADD : s = b + a;
35 `SUB : s = b - a;
36 `MUL : s = b * a;
37 `SHL : s = b << a;
38 `SHR : s = b >> a;
39 `BAND : s = b & a;
40 `BOR : s = b | a;
41 `BXOR : s = b ^ a;
42 `AND : s = b && a;
43 `OR : s = b || a;
44 `EQ : s = b == a;
45 `NE : s = b != a;
46 `GE : s = x >= y;
47 `LE : s = x <= y;
48 `GT : s = x > y;
49 `LT : s = x < y;
50 `NEG : s = -a;
51 `BNOT : s = ~a;
52 `NOT : s = !a;
53 default : s = 16'hxxxx;
54 endcase // case (f)
55
56 endmodule // alu
-1行目はマクロで書式は`define マクロ名 テキスト。使うときは`マクロ名~
-29,30行目は16'h8000を足すことで2の補数による比較の誤差を直している~
-32〜54行目がマルチプレクサの動作をし、書式はcase(…)〜endcaseで…の値で動作が決まる。組み合わせ回路を書く場合は最後にdefault文を入れる。~
***テストベンチ [#ndd6b8b6]
-alu_tb.v
1 `timescale 1ns/1ps
2
3 `include "alu.v"
4
5 module alu_tb;
6
7 reg [15:0] a,b;
8 reg [4:0] f;
9 wire [15:0] s;
10
11 alu alu0(.a(a), .b(b), .f(f), .s(s));
12
13 initial begin
14
15 $dumpfile("alu_tb_wf.vcd");
16 $dumpvars(0, alu_tb);
17
18 a = -3; b = 3; f = 5'b01100;
19 #100 a = -2;
20 #100 a = -1;
21 #100 a = 0;
22 #100 a = 1;
23 #100 a = 2;
24 #100 a = 3;
25 #100 a = 4;
26 #100 a = 5;
27 #100 a = 6;
28 #100 f = 5'b00000; //ADD
29 #100 f = 5'b00001; //SUB
30 #100 f = 5'b00011; //SHL
31 #100 f = 5'b00110; //BOR
32 #100 f = 5'b10000; //NEG
33 #100 f = 5'b00010; //MUL
34 #100 $finish;
35 end // initial begin
36
37 endmodule // alu_tb
**メモ [#c98018eb]
-`include "filemane.v" の""を忘れない
-`defineや`includeのときは「`」,5'b00000のときは「'」
-シミュレーションの最後に$finishを入れる
**感想 [#n358f5ca]
論回であんなに苦労したALUがこんなに簡単に作れるとは。
終了行:
[[中村/春プロジェクト]]
*第3回 2007年8月号 マルチプレクサと算術論理演算回路[#x8749e93]
**概要 [#l91c0f76]
-マルチプレクサの設計
-算術論理演算回路の設計
**Verilog HDL記述の解説 [#u5739096]
***算術論理演算回路 [#b0abb1e1]
-alu.v
1 `define ADD 5'b00000
2 `define SUB 5'b00001
3 `define MUL 5'b00010
4 `define SHL 5'b00011
5 `define SHR 5'b00100
6 `define BAND 5'b00101
7 `define BOR 5'b00110
8 `define BXOR 5'b00111
9 `define AND 5'b01000
10 `define OR 5'b01001
11 `define EQ 5'b01010
12 `define NE 5'b01011
13 `define GE 5'b01100
14 `define LE 5'b01101
15 `define GT 5'b01110
16 `define LT 5'b01111
17 `define NEG 5'b10000
18 `define NOT 5'b10001
19 `define BNOT 5'b10010
20
21 module alu(a,b,f,s);
22
23 input [15:0] a,b;
24 input [4:0] f;
25 output [15:0] s;
26 reg [15:0] s;
27 wire [15:0] x,y;
28
29 assign x = a + 16'h8000;
30 assign y = b + 16'h8000;
31
32 always @(a or b or x or y or f)
33 case(f)
34 `ADD : s = b + a;
35 `SUB : s = b - a;
36 `MUL : s = b * a;
37 `SHL : s = b << a;
38 `SHR : s = b >> a;
39 `BAND : s = b & a;
40 `BOR : s = b | a;
41 `BXOR : s = b ^ a;
42 `AND : s = b && a;
43 `OR : s = b || a;
44 `EQ : s = b == a;
45 `NE : s = b != a;
46 `GE : s = x >= y;
47 `LE : s = x <= y;
48 `GT : s = x > y;
49 `LT : s = x < y;
50 `NEG : s = -a;
51 `BNOT : s = ~a;
52 `NOT : s = !a;
53 default : s = 16'hxxxx;
54 endcase // case (f)
55
56 endmodule // alu
-1行目はマクロで書式は`define マクロ名 テキスト。使うときは`マクロ名~
-29,30行目は16'h8000を足すことで2の補数による比較の誤差を直している~
-32〜54行目がマルチプレクサの動作をし、書式はcase(…)〜endcaseで…の値で動作が決まる。組み合わせ回路を書く場合は最後にdefault文を入れる。~
***テストベンチ [#ndd6b8b6]
-alu_tb.v
1 `timescale 1ns/1ps
2
3 `include "alu.v"
4
5 module alu_tb;
6
7 reg [15:0] a,b;
8 reg [4:0] f;
9 wire [15:0] s;
10
11 alu alu0(.a(a), .b(b), .f(f), .s(s));
12
13 initial begin
14
15 $dumpfile("alu_tb_wf.vcd");
16 $dumpvars(0, alu_tb);
17
18 a = -3; b = 3; f = 5'b01100;
19 #100 a = -2;
20 #100 a = -1;
21 #100 a = 0;
22 #100 a = 1;
23 #100 a = 2;
24 #100 a = 3;
25 #100 a = 4;
26 #100 a = 5;
27 #100 a = 6;
28 #100 f = 5'b00000; //ADD
29 #100 f = 5'b00001; //SUB
30 #100 f = 5'b00011; //SHL
31 #100 f = 5'b00110; //BOR
32 #100 f = 5'b10000; //NEG
33 #100 f = 5'b00010; //MUL
34 #100 $finish;
35 end // initial begin
36
37 endmodule // alu_tb
**メモ [#c98018eb]
-`include "filemane.v" の""を忘れない
-`defineや`includeのときは「`」,5'b00000のときは「'」
-シミュレーションの最後に$finishを入れる
**感想 [#n358f5ca]
論回であんなに苦労したALUがこんなに簡単に作れるとは。
ページ名: