在FPGA中一般采用同步时序设计,比如在延时设计中,一般都是设计成延时几个时钟周期,这样程序可移植性比较好,多次编译的结果也相同,不过有时候为了满足时序条件,比如建立时间,保持时间等不满足条件,需要适当做调整,调整的时间可能比一个时钟周期小,可能的一种方法是在节点处加入若干的BUF(LCELL),引入延迟。不过这样做也有一个缺点是每次布局布线后延迟的时间会有细微的变化。默认情况下,QuartusII会优化掉无用的LCELL,比如如下的程序:
module demo(input a,input b,output out);
wire t1;
wire t2;
assign t1=a&b;
assign t2=t1;
assign out="t2";
endmodule
该程序的本意是将a和b相与后经过t1,t2后再输出,不过QuartusII将t1,t2视为多余节点,在综合时优化了,产生如下结果:
a,b到out的延时为11.632ns,逻辑单元使用数为1。
为了保留用户有意加入的LCELL,以达到延时的目的,需要在程序中加入特定的指令以避免被优化,下面的程序基于Verilog-2001标准。关于在QuartusII中选择何种标准请参考我的另一篇文章【原创】Verilog-2001新增特性(实例分析) 。
module demo(input a,input b,output out);
(* keep="1" *)wire t1;
(* keep="1" *)wire t2;
assign t1=a&b;
assign t2=t1;
assign out="t2";
endmodule
这里加入了指令(* keep="1" *),以防止将组合逻辑节点t1,t2优化掉。综合后的RTL视图为:
此时a,b到out的延时为12.188ns,逻辑单元使用数为2。
可以看到,此时的t1,t2没有被综合掉,并且使a,b到out的传输时延有少许增加。
用户1404984 2009-1-11 10:08
ilove314_323192455 2009-1-8 20:01
用户1332143 2009-1-7 22:37