不可重置的翻牌代码

时间:2016-06-02 04:06:18

标签: verilog system-verilog

这是一种可以接受的方法来编码不可重置的翻牌吗?

input clk;
input b; 
output a;
reg a= 1'b0;

always_ff @ (posedge clk)
  if(b>a)
    a<=b;

2 个答案:

答案 0 :(得分:1)

无法在任何地方使用不可复位的翻牌.......

可重置触发器的技术优势是,您可以使用复位引脚上的单个转换在有限的机器中达到“已知”状态,否则您可能必须经历多个周期< / strong>在时钟上达到已知状态。

当您打开芯片电源时,主要需要这样做。在需要为可复位的触发器支付的额外区域之间存在“需要周期数”之间的权衡。

此外,如上所述at this page

  

如果没有置位/复位引脚的触发器,只有输入D在时钟到达时处于已知稳定状态并且满足建立和保持要求时,输出才是确定的。在初始上电期间,这些触发器的输出将不会被初始化并且将处于未知状态,在数字模拟中将其视为X.它保持为X直到第一个时钟沿到来,并且它随之输入功能稳定值。

在verilog中实现后,你的SV可以接受,

  always @ (posedge sclk) 
    din_o <= din_i;

请记住,在声明时,即使您没有为它指定0,它也可以正常工作,但如果您不这样做,您将看到X.据我所知,在宣布时分配一些变量是不好的习惯。

你有比较器,所以除非条件为真,否则a保持为X,但如果你按照上面的实施(你的那个)尝试,那么它将在开机时稳定下来。

硅没有X它只有1,0和Z.

答案 1 :(得分:1)

此代码描述了具有初始值的翻牌。如何使用该初始值完全取决于目标。 FPGA将在复位时将该初始值加载到寄存器中。 ASIC忽略了初始值。模拟器在时间0加载初始值,但不在加载时加载。

所以,这段代码创建了一个寄存器a

  1. 语句reg a = 1'b0初始化为零,但会忽略重置。这是模拟中的行为。
  2. 通过语句reg a = 1'b0重置为零值。这是FPGA上的行为(如果您在开始时只有一个复位,则在模拟中足够接近)。
  3. 在重置时包含随机未知值,因此比较结果a > b将是未知的,并且电路的行为将是未知的。这是ASIC上的行为。
  4. 我怀疑你所追求的行为是第二​​个,因为其他两个并不是很有用。请注意,为了获得电路的可预测行为,您需要在复位时加载初始值,因此 是一个复位触发器,只是您没有明确地编写代码来观察复位。 / p>

    非重置翻牌是我们不关心初始状态的翻牌。例如,FIFO具有存储通过它的数据的寄存器,以及存储FIFO的空/满状态的寄存器。在上电或复位时,我们关心FIFO的状态被复位为空,因此必须复位状态寄存器。我们不关心数据寄存器包含什么因为FIFO是空的,所以数据寄存器可以不复位。

    顺便说一句,您编写的代码在a中始终为零,因为a从零开始,永远不会大于b。因此永远不会分配a。我希望你的条件是a < b,以及捕获b

    最大值的电路