Verilog 可能的锁存器

标签 verilog hdl

我是一名 VHDL 编码员,并没有用 Verilog 编写太多代码。我正在检查别人的代码,我遇到了这个:

always@(posedge asix_clk_bufg or negedge pll_asix_locked)
begin
    if (~pll_asix_locked)
        asix_rst <= 0;
    else if (timer[5])  // 355us between asix_clk and asix_rst (min is 200us)
        asix_rst <= 1;
end

我不确定我是否同意上面的代码!不是可能的闩锁情况吗?我看到它正在等待 pll 锁定,然后使系统退出复位状态,但是这个编码是否正确?

我不喜欢将顺序代码和组合代码组合在一起,但是当 timer[5] = 0 时“asix_rst”的值是多少?!?

谢谢, --鲁迪

最佳答案

这是推断具有正边沿时钟 (asix_clk_bufg)、异步低电平有效复位 (pll_asix_locked) 和时钟使能 (timer[5]) 的触发器的方法。有一个 D 输入(连接到 1)和一个 Q 输出(asix_rst)。

我假设 PLL 开始时未锁定,因此 asix_rst 为 0,直到第一个时钟边沿 timer[5] == 1。然后它将保持高电平直到 PLL 失锁。复位必须是异步的,因为当 PLL 失锁时时钟将停止。

我猜测 timer[5] 位在 PLL 锁定后 5 或 6 个时钟周期变高,以确保在系统的其余部分退出复位之前有一个稳定的时钟。

如果您在灵敏度列表中有 timer[5] 而不是时钟,这将是一个锁存器,如下所示:

always@(timer[5] or pll_asix_locked)
begin
    if (~pll_asix_locked)
        asix_rst <= 0;
    else if (timer[5])  // 355us between asix_clk and asix_rst (min is 200us)
        asix_rst <= 1;
end

关于Verilog 可能的锁存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22340864/

相关文章:

verilog - 我们可以有一系列自定义模块吗?

verilog - 在逻辑中使用单端端口期待差异对?

haskell - 冲突教程示例中 'pure' 关键字的用途是什么?

scala - 凿子:如何避免错误 NO DEFAULT SPECIFIED FOR WIRE

verilog - SystemVerilog 中的单引号 (') 是什么意思?

verilog - 为什么这个Verilog函数中没有assign语句?

verilog - 使用 with 代替 iff 的功能覆盖问题

compiler-errors - 在reg声明中获取解析错误

hdl - 如何获取 chisel 中 UInt() 的大小?

scala - 如何将一些 Bundles 作为模块参数传递?