使用Verilog编写的3-8译码器代码如下:
module decoder3_8
(
input wire in1,
input wire in2,
input wire in3,
output reg [7:0] out
);
always @(*)
if({in1,in2,in3} == 3'b000)
out = 8'b0000_0001;
else if({in1,in2,in3} == 3'b001)
out = 8'b0000_0010;
else if({in1,in2,in3} == 3'b010)
out = 8'b0000_0100;
else if({in1,in2,in3} == 3'b011)
out = 8'b0000_1000;
else if({in1,in2,in3} == 3'b100)
out = 8'b0001_0000;
else if({in1,in2,in3} == 3'b101)
out = 8'b0010_0000;
else if({in1,in2,in3} == 3'b110)
out = 8'b0100_0000;
else if({in1,in2,in3} == 3'b111)
out = 8'b1000_0000;
else
out = 8'b0000_0001;
endmodule
野火的教程中给出的RTL视图为
但是实际综合之后生成的RTL视图为
产生了很多冗余的latch,但是if-else段中已经加了else了,包括了未列举的情况,但是仍然产生了latch。
甚至直接用野火的代码都不能仿真出野火所给的图一的结果。
希望路过的大神解惑。
回来写答案:
1.教程是quartus13.0,而我的是13.1,所以综合出来的结果不同,上面两个是不同的 版本出来的正常的结果,知识13.0优化的比较好(这里也奇怪,新版本反而优化的差)
2.上面图中我自己生成的RTL视图中其实也没有Latch,当我把最后一句else注释掉之后
可以看到这时候最后一列才有latch,
3.一个信号的状态不只有0和1,else考虑的是除了01组合之外的其他,比如x和z