decoder3_8

这两天回归书本,继续阅读书上的内容,此时的体会与刚开始学那会的体会是不一样的,比如3_8decoder,之前就认为可以用case来写,而书上有一种更简便的方式来描述,带给你新的思路,既然有新方式可以描述,那就来比较这两者有什么区别。

方法1,利用case语句描述:

 1 module decoder3_8(in,out);
 2 input [2:0] in;
 3 output [7:0] out;
 4 
 5 reg [7:0] out;
 6 always @(*)
 7 begin
 8     case(in)
 9     3'b000: out = 8'b0000_0001;
10     3'b001: out = 8'b0000_0010;
11     3'b010: out = 8'b0000_0100;
12     3'b011: out = 8'b0000_1000;
13     3'b100: out = 8'b0001_0000;
14     3'b101: out = 8'b0010_0000;
15     3'b110: out = 8'b0100_0000;
16     3'b111: out = 8'b1000_0000;
17     default:out = 8'b0000_0000;
18     endcase
19 end
20 
21 endmodule

方法2,利用移位方式描述:

1 module decoder3_8(in,out);
2 input [2:0] in;
3 output [7:0] out;
4 
5 assign out = 1'b1<<in;
6 
7 endmodule

从上面两种方式来看,方法2代码非常的少,一行就搞定,方法1得要好几行才描述完,一般给人感觉就是代码越少消耗的资源也就越少,其实不是的,来看具体比较结果吧:

可以看到除了RTL Viewer不一样外,其他的基本都一样。

 在来看看仿真结果吧:

激励文件:

 1 module decoder3_8_top;
 2 reg [2:0] in;
 3 wire [7:0] out;
 4 
 5 initial 
 6 begin
 7     in = 3'dz;
 8     #100;
 9     in = 3'd0;
10     #100;
11     in = 3'd1;
12     #100;
13     in = 3'd2;
14     #100;
15     in = 3'd3;
16     #100;
17     in = 3'd4;
18     #100;
19     in = 3'd5;
20     #100;
21     in = 3'd6;
22     #100;
23     in = 3'd7;
24     #100;
25 end
26 decoder3_8 u1(
27                 .in(in),
28                 .out(out)
29              );
30 
31 endmodule

移位方式仿真波形:

case方式仿真波形:

结果是相同的。

posted @ 2013-12-04 17:52  MyBooks  阅读(331)  评论(0编辑  收藏  举报