|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
一下是看了shiyinjita 的博客,提出自己的小疑问
关于这个程序计数器的分段,是不是因为片上资源不够,所以要手动修改.v 文件,
倘若片上的逻辑资源充足,编写适当的.sdc 文件,系统应该可以自动适配,自动切割组合逻辑。
我经常用32位计数器,跑100M,没问题
250M,很少,所以借此机会,大胆发问,望指点,交流
“
最近在调试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方式,或者只比较一位的方式。
” |
|