这两天回归书本,继续阅读书上的内容,此时的体会与刚开始学那会的体会是不一样的,比如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方式仿真波形:
结果是相同的。