1)我知道在ASIC中使用复位从已知状态开始。像
always @ (posedge clk or negedge reset)
begin
if (reset)
//Initialize the signals
else
//do something
end
但如果是这种情况,为什么我们不使用set
信号从一个不同的状态开始并最终结束电路的假设?这看起来很傻但我很好奇,那个
是的。我从来没有见过像这样的代码。
always @ (posedge clk or negedge set)
begin
if (set)
//Initialize the signals
else
//do something
end
2)另外,我读到有必要使用if/else
语句对复位信号进行建模,并在if
条件下进行复位。谁能给我一个例子怎么做呢?
答案 0 :(得分:1)
您的问题中的示例中存在轻微错误:
always @ (posedge clk or negedge reset) begin
if (~reset) begin //<-- Reset when rest low
//Initialize the signals
end
else begin
//do something
end
end
当信号变低时,negedge reset
将触发,因此您希望重置条件匹配。这是低电平有效复位。对于您想要的有效高电平复位(reset == 1
时复位):
always @ (posedge clk or posedge reset) begin //<--Posedge trigger reset
if (reset) begin //<-- Reset when rest high
//Initialize the signals
end
else begin
//do something
end
end
复位条件不必为0.它可以是任何东西,但它必须是已知的静态值。即NOT next_state
或a+b
等。它连接到触发器的复位引脚,这就是我们保持名称重置的原因。
ASIC中优先使用低电平有效复位,因为复位时没有电源。当芯片启动时,你经常同步释放时钟的复位。通常至少有2个posedges。这样可以避免少量时间的复位故障。
因为您希望在芯片上电时应用低电平有效复位,因此当上电时一切都处于已知状态时,我们使用异步复位。使用同步重置,您不知道第一个状态是什么。同步复位通常由需要清除数据的状态机和过滤器使用。异步复位用于上电复位(POR)以设置已知值。
使用if (reset) else
结构,以便合成工具可以将其作为具有异步复位的触发器进行重新编程,尝试其他结构可以模拟精细,甚至可以合成(错误地),但您可以轻松地使用硬件在模拟中没有显示的错误使得调试变得非常困难。
您可能有兴趣阅读set-reset flip-flops (SR Flip-Flop)。这只是一个没有Toggle功能的JK。
可以使用以下内容暗示:
always @ (posedge clk or negedge reset or posedge set) begin
if (~reset) begin
//reset the signals
end
else if (set) begin
//set the signals
end
else begin
//do something
end
end