最近在调试250M的时序的时候,发现有段关键路径怎么调试也调试不成功,其中关键路径中有比较器和计数器,
以前采用如下方式写的
module counter(
input clk ,clr ,
input [31:0] cin ,
output wire cout
) ;
reg [31:0]cnt ;
always @(posedge clk or posedge clr)
begin
if (clr)
cnt <= 32'b0 ;
else if (cnt == cin )
cnt <= 32'b0 ;
else
cnt <= cnt + 1'b1 ;
end
后来调试时候发现是比较器占用的时间很长,也就是DFF中的置位端很长,导致了DFF产生了亚域态,因此采用一下方式来写 ;
module counter(
input clk ,clr ,
input [31:0] cin ,
output wire cout
) ;
reg [31:0]cnt ;
reg com_cnt ;
always @(posedge clk)
if (cnt == cin )
com_cnt <= 1'b1 ;
else
com_cnt <= 1'b0 ;
always @(posedge clk or posedge clr)
begin
if (clr)
cnt [7:0]<= 8'b0 ;
else if (com_cnt )
cnt [7:0]<= 8'b0 ;
else
cnt [7:0]<= cnt [7:0]+ 1'b1 ;
end
always @(posedge clk or posedge clr)
begin
if (clr)
cnt [31:8]<= 24'b0 ;
else if (com_cnt )
cnt [31:8]<= 24'b0 ;
else if (cnt[7:0] == 8'b1111_1111)
cnt [31:8]<= cnt [31:8]+ 1'b1 ;
end
endmodule
此时问题解决
因此总结如下 :
在写计数器的时候,当频率比较高的时候,可采用
小 + 大的方式
比较器可采用单独比较,然后加一个DFF方式,或者只比较一位的方式。
2011-11-16 shiyinjita