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 输入由少量组合逻辑驱动。唯一的区别是第二个示例的组合逻辑可能比第一个示例更小,因为实现 == 通常比实现 <>.

需要更少的面积