这是一种可以接受的方法来编码不可重置的翻牌吗?
input clk;
input b;
output a;
reg a= 1'b0;
always_ff @ (posedge clk)
if(b>a)
a<=b;
答案 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
:
reg a = 1'b0
初始化为零,但会忽略重置。这是模拟中的行为。reg a = 1'b0
重置为零值。这是FPGA上的行为(如果您在开始时只有一个复位,则在模拟中足够接近)。a > b
将是未知的,并且电路的行为将是未知的。这是ASIC上的行为。我怀疑你所追求的行为是第二个,因为其他两个并不是很有用。请注意,为了获得电路的可预测行为,您需要在复位时加载初始值,因此 是一个复位触发器,只是您没有明确地编写代码来观察复位。 / p>
非重置翻牌是我们不关心初始状态的翻牌。例如,FIFO具有存储通过它的数据的寄存器,以及存储FIFO的空/满状态的寄存器。在上电或复位时,我们关心FIFO的状态被复位为空,因此必须复位状态寄存器。我们不关心数据寄存器包含什么因为FIFO是空的,所以数据寄存器可以不复位。
顺便说一句,您编写的代码在a
中始终为零,因为a
从零开始,永远不会大于b
。因此永远不会分配a
。我希望你的条件是a < b
,以及捕获b