-1

我想知道是否有人可以帮助我?我不知道如何表达这个问题,但我基本上是在尝试编写一个程序,从方波输入信号生成方波输出信号,匹配输入信号的占空比和频率。基本上,输出只是复制输入。以图形方式总结我所说的,这是我制作的一张图片:

链接到图表

这不是我的最终目标,但足以让我继续前进。我很难弄清楚如何使用输入。我有一个信号发生器产生输入方波信号,并将其发送到输入引脚。我尝试过以数学方式计算占空比,然后只是尝试将输出分配给一个设置为等于时钟信号每个上升沿上的输入的 reg,但它不起作用。

这是我的代码。它具有生成 1 Hz 信号的额外功能,但这只是从早期学习如何创建 pwm 中得出的。您可以忽略“pwm_reg”和“pwm”输出。“pwm2”输出旨在复制“apwm”输入:

`timescale 1ns / 1ps
module duty_cycle_gen(
    input clk,
    input rst_n,
    input apwm,
    output pwm,
    output pwm2
);
    // Input clock is 250MHz
    localparam CLOCK_FREQUENCY = 250000000;
    // Counter for toggling of clock
    integer counter = 0;
    reg pwm_reg = 0;
    assign pwm = pwm_reg;
    reg apwm_val;
always @(posedge clk) begin
        if (!rst_n) begin
            counter <= 8'h00;
            pwm_reg <= 1'b0;
        end
        else begin 
            apwm_val <= apwm;
            // If counter is zero, toggle pwm_reg
            if (counter == 8'h00) begin
                pwm_reg <= ~pwm_reg;
                // Generate 1Hz Frequency
                counter <= CLOCK_FREQUENCY/2 - 1;  
                
            end 
            // Else count down
            else 
                counter <= counter - 1; 
            end
            $display("counter : %d", counter);
            
        end
assign pwm2 = apwm_val;
endmodule
4

1 回答 1

0

这是一个带有测试台的简单示例。(我喜欢在分配 , 时使用一个小的延迟#1来帮助捕获因果关系以进行调试):

module example(
    input wire clk,
    input wire in,
    output reg out);

    always @(posedge clk)
      begin
        out <= #1 in;
      end

endmodule // example

module example_test();
    reg chip__clk;
    reg chip__in;
    wire chip__out;
    reg [10:0] count;

    example ex(
        chip__clk,
        chip__in,
        chip__out);

    initial
      begin
        $dumpvars();
        count <= #1 0;
      end

    always @(count)
      begin
        count <= #1 (count + 1);
        if (count == 1000)
          begin
            $display("RESULT=PASS:0 @ done");
            $finish_and_return(0);
          end
        if ((count == 60) & (chip__out != 1))
          begin
            $display("RESULT=FAIL:1 @ chip.out not raised");
            $finish_and_return(1);
          end
        if ((count == 30) & (chip__out != 0))
          begin
            $display("RESULT=FAIL:1 @ chip.out not lowered");
            $finish_and_return(1);
          end
        chip__in <= #1 count[5];
        chip__clk <= #1 count[1];
      end

endmodule // example_test

它通过将in信号视为在较高频率的时间尺度上可以被认为是恒定的东西来工作clk

如果您的in时钟是一个可能有噪音的外部信号,并且延迟很小,您可以尝试使用以高频运行的小型 fifo 来稳定它clk

module example(
    input wire clk,
    input wire in,
    output reg out);

    reg [1:0] buffer;

    always @(posedge clk)
      begin
        out <= #1 buffer[1];
        buffer[1] <= #1 buffer[0];
        buffer[0] <= #1 in;
      end

endmodule // example
于 2021-12-08T04:53:09.853 回答