-1

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

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

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

这是我的代码片段:

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

4

1 回答 1

1
assign rstn = clk2;
always @ (posedge clk1 or negedge rstn)
    if (~rstn) 
        toggle   = 1'b0;
    else
        toggle <= 1'b1;

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

于 2019-08-09T23:34:15.010 回答