1.很多资料中,在将coding style时,会提到组合电路与时序电路要分开设计。
我本人觉得这个区分没有必要搞得太严格,某些简单的设计可以将组合部分与时序部分合起来。如果分开写,反而显得很笨拙。
比如有这样的两段代码:
///例1_1
always @ (A,B)
begin
C <= A + B;
end
always @ (posedge clk)
begin
D <= C;
end
///例1_2
always @ (posedge clk)
begin
D <= A+ B;
end
综合工具不至于笨得非得让我们按照例1_2中的写法才能综合出比较好的电路吧。
我不知道各位同仁在实际使用中,这一点是不是严格区分的。如果不严格区分,有没有一个衡量的标准,就是什么时候需要分开,什么时候必须合并。这个真有点困惑啊。
2.然后,我想到另外一个问题,就是关于状态机的写法。在描述状态跳转时,一般是一个组合逻辑块+一个时序块。如下:
always @ ( * )
begin
case(cur_state)
.........;
.........;
next_state <= .....;
endcase
end
always @ (posedge clk)
begin
cur_state <= next_state ;
end
上面的这个两个always块合并起来感觉也无大碍啊,为什么不合并起来写呢?分开写,具体能好在哪里?
3.我感觉平时在些电路时,应当综合考虑FF前的数据端D和时钟使能端E的因素,使我们的设计最优化。如果决定FF的输出Q的信号,一部分综合到D,另一部分巧妙地综合到E端,不仅可以提高电路的速度,还可以提高资源的利用率。
比如这样的两段代码:
///例3_1
always @ (A,B,C,D,E,RES_BUF)
begin
if(E)
RES_BUF <= (A&B) | (C&D);
else
RES_BUF <= RES_BUF;
end
always @ (posedge clk)
begin
RES <= RES_BUF;
end
///例3_2
always @ (posedge clk)
begin
if(E)//E 会被综合到FF的时钟使能端
RES <= (A&B) | (C&D);
end
例3_2的电路是否要比例3_1的要好些?请高人指教。 |