【问题标题】:How do I drive a signal from 2 sources in system verilog如何在系统 verilog 中驱动来自 2 个源的信号
【发布时间】:2019-08-09 22:53:32
【问题描述】:

我正在尝试编写一个 RTL 模型来监控独立的时钟源。这些时钟源可以具有可变频率(范围 5 到 50MHz)

让我们说 clk1 和 clk2。我正在尝试驱动一个信号“切换”,该信号在 clk1 的每个 posedge 处设置为“1”,在 clk2 的每个 negedge 处设置为“0”。我无法实现这个模型。

我尝试使用在 clk1 的上升沿触发的 1 个触发器,该触发器的输入绑定到“高”,另一个触发器在 clk2 的下降沿触发,输入绑定到“低”。我将这些输出发送到一个多路复用器,但我无法弄清楚如何驱动这个多路复用器的选择信号

这是我的代码 sn-p :

always_ff @(posedge clk1 or rstb) begin
    if(!rstb) begin
        flop1_out    <= 0;
    end else begin
        flop1_out    <= 1;
    end
end

always_ff @(negedge clk2) begin
    flop2_out <= 0;
end


assign toggle = sel ? flop1 : flop2;

所以,到目前为止,没有什么可以推动 sel 并试图弄清楚这是我遇到问题的地方

如果我尝试从 2 个不同的时钟源驱动相同的信号(切换),我会收到一条错误消息,指出为信号切换找到了多个驱动程序,这是有道理的。

如果您有任何建议,请告诉我

编辑:修正了一个错字并从 flop2 的敏感度列表中删除了 rstb

【问题讨论】:

    标签: verilog system-verilog register-transfer-level vlsi digital-design


    【解决方案1】:
    assign rstn = clk2;
    always @ (posedge clk1 or negedge rstn)
        if (~rstn) 
            toggle   = 1'b0;
        else
            toggle <= 1'b1;
    

    注意:根据时钟频率和插入延迟关系,此电路可能会变为亚稳态。如果您可以容忍延迟,请在输出上添加一个同步器。更好的是,如果您可以容忍失真,请在 clk2 上添加一个复位同步器到 clk1mx,其中 clk1mx 与时钟 1 同步,但速度快 x 倍。

    【讨论】:

      猜你喜欢
      • 2020-02-20
      • 1970-01-01
      • 2020-09-10
      • 1970-01-01
      • 1970-01-01
      • 2022-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多