如何在SystemVerilog中更改和操作时钟

时间:2016-11-22 22:54:17

标签: system-verilog

我试图通过使用自己的时钟分频器模块来操作我的时钟。

module clockDivider(input logic input0,
                    input logic input1,
                    input logic clock,
                    output logic y);

// 00 = stop, 01 = slow, 10 = medium, 11 = fast;

if( ~input1 & ~input0 )      /*stop clock*/ ;
else if( ~input1 & input0 )  /*slow*/ ;
else if( input1  & ~input0 ) /*medium*/ ;
else if( input1  & input0 )  /*fast*/ ; 

endmodule

如上所示,根据我的输入,我将操作我的时钟然后让步进电机位于我们的FPGA板上。但我无法弄清楚如何去做。

还有除doulos以外的任何网站吗?我认为它不是很清楚,只包含有关System Verilog的少量信息。

由于

2 个答案:

答案 0 :(得分:2)

您可以直接使用模N计数器将频率除以N.

假设这是你所有3种类型的时钟。

@blur=validate(...)

这是代码。请注意,它是一个概念性代码,未经过验证。

00 - No Clock
01 - Clock/4
02 - Clock/2
03 - Clock

答案 1 :(得分:1)

通过slowmediumfast,我将假设您通过此逻辑预期的最快速度是clock本身的速度,即您正在实施时钟分频器。

我假设了以下内容:

slow = 0.25 *时钟

medium = 0.5 *时钟

fast =时钟

module clockDivider(input logic reset,
                    input logic input0,
                    input logic input1,
                    input logic clock,
                    output logic y);

// 00 = stop, 01 = slow, 10 = medium, 11 = fast;
  logic delayed_y;
  logic delayed_delayed_y;
  logic [1:0] counter;

  always @(posedge clock) begin
    if (reset) begin
      counter <= 'h0;
    end
    else begin
      counter <= counter+1'b1;
    end
  end

  always @(posedge clock) begin
    if (reset) begin
      delayed_y <= 1'b0;
    end
    else begin
      delayed_y <= counter[0];
    end
  end

  always @(posedge clock) begin
    if (reset) begin
      delayed_delayed_y <= 1'b0;
    end
    else begin
      delayed_delayed_y <= counter[1];
    end
  end

  always @(*) begin
    if (reset) begin
      y = 1'b0;
    end
    else begin
      /*stop clock*/
      if( ~input1 & ~input0 ) begin
        y = 1'b0;
      end

      /*slow*/
      else if( ~input1 & input0 ) begin
        y = delayed_delayed_y;
      end

      /* medium*/
      else if( input1  & ~input0 ) begin
        y = delayed_y;
      end

      /* fast */
      else if( input1  & input0 ) begin
        y = clock;
      end
    end
  end

endmodule

您可以在此处找到一个有效的示例:https://www.edaplayground.com/x/5J75

注意:如果您希望将时钟倍增,则需要在目标FPGA上使用DCM。还有另一种方法,有一个2输入XOR门和一个时钟缓冲器,但我会坚持使用DCM。