同学问我一道O2的笔试题,
module C_case1(clk,out1);
input clk;
output out1;
reg state1;
reg out1;
always @(posedge clk)
case(state1)
0: state1<=1;
1: state1<=0;
endcase
always @(state1)
case(state1)
0: out1<=1;
1: out1<=0;
endcase
endmodule
module C_case2(clk,out2);
input clk;
output out2;
reg state2;
reg out2;
always @(posedge clk)
case(state2)
0:begin
state2<=1;
out2<=1;
end
1:begin
state2<=0;
out2<=0;
end
endcase
endmodule
两者资源比较。
在Quartus综合结果如下:
第一种:
组合Case
第二种:
时序Case
明显第一种比第二种省个触发器
工程文件打包如下:
ash_riple_768180695 2007-10-16 09:10
ash_riple_768180695 2007-10-16 09:07
资源和性能从来就是一对矛盾,需要设计者权衡。第二种方式可以切断第一种方式潜在的关键路径,在资源允许的情况下,作为一种好的设计习惯,可以提高系统的整体运行频率。
这里,第一种方式潜在的关键路径在于从state1寄存器,经过out1,经过可能的组合逻辑,到达下一个寄存器的路径。如果从out1到下一个寄存器之间的组合逻辑很复杂的话,再加上out1之前的decoder0的组合逻辑,该路径就会更长;在decoder0之后添加寄存器,就能切断该路径。
增加寄存器的另一个好处是,在out1输出不会看到毛刺。这一点是综合工具按照out1寄存器的建立保持时间优化后决定的。