HDL 计数器和标志编码风格
HDL counter and flag coding style
在 Verilog/VHDL 中,假设我有一个 4 位计数器和一个标志,当计数器等于 4 到 8 时应该声明该标志。有两种方法可以实现这个
if((cntr>=4)&&(cntr<8))
flag <=1;
else
flag <= 0;
或者,我可以这样做
if(cntr==4)
flag<=1;
else if (cntr==8)
flag<=0;
在我看来,在功能上,它们做同样的事情。
有什么理由比另一个更好吗?风格明智? synthesis/implementation 怎么样?
在这两个例子中,flag
都会被合成为触发器。这是因为(我假设)您是从时钟始终块内驱动它的,即您的两个示例是:
always @(posedge clk)
if ((cntr>=4)&&(cntr<8))
flag <= 1;
else
flag <= 0;
和
always @(posedge clk)
if (cntr==4)
flag <= 1;
else if (cntr==8)
flag <= 0;
这两个示例都是简单的(2 态)FSM。他们之间几乎没有选择。两者都将由触发器 (flag
) 实现,触发器的 D 输入由少量组合逻辑驱动。唯一的区别是第二个示例的组合逻辑可能比第一个示例更小,因为实现 ==
通常比实现 <
或 >
.
需要更少的面积
在 Verilog/VHDL 中,假设我有一个 4 位计数器和一个标志,当计数器等于 4 到 8 时应该声明该标志。有两种方法可以实现这个
if((cntr>=4)&&(cntr<8))
flag <=1;
else
flag <= 0;
或者,我可以这样做
if(cntr==4)
flag<=1;
else if (cntr==8)
flag<=0;
在我看来,在功能上,它们做同样的事情。
有什么理由比另一个更好吗?风格明智? synthesis/implementation 怎么样?
在这两个例子中,flag
都会被合成为触发器。这是因为(我假设)您是从时钟始终块内驱动它的,即您的两个示例是:
always @(posedge clk)
if ((cntr>=4)&&(cntr<8))
flag <= 1;
else
flag <= 0;
和
always @(posedge clk)
if (cntr==4)
flag <= 1;
else if (cntr==8)
flag <= 0;
这两个示例都是简单的(2 态)FSM。他们之间几乎没有选择。两者都将由触发器 (flag
) 实现,触发器的 D 输入由少量组合逻辑驱动。唯一的区别是第二个示例的组合逻辑可能比第一个示例更小,因为实现 ==
通常比实现 <
或 >
.