带相位偏移的Verilog方波

时间:2019-06-22 11:06:37

标签: verilog fpga

我正在尝试生成2个方波,第二个方波使用verilog在spartan 6上具有相位偏移。我目前正在使用低频的2 led。我正在使用基本的计数器方法来生成两个波形,当第一个波形计数到某个值时,这将触发另一个波形达到该延迟。在满足if语句条件(delayCounter

谢谢。

    reg [32:0] delayCounter;
    reg [32:0] systemCounter1;
    reg [32:0] systemCounter2;
    reg [32:0] counterSig1;
    reg [32:0] counterSig2;

    reg LED1;
    reg LED2;
    reg [32:0] trigger;

    parameter signalFrequency = 2;
    parameter CLOCK_FREQUENCY = 50000000;
    parameter FREQUENCY = CLOCK_FREQUENCY * signalFrequency / 2;

    always @(posedge clk)
        begin
            if(counterSig1==0) 
                begin
                    counterSig1 <= FREQUENCY - 1;       
                    LED1 <= ~LED1;                              
                end
            else 
             begin
                    counterSig1 <= counterSig1 - 1; 
                    delayCounter <= delayCounter + 1;
             end


    end

    always @(posedge clk)
        begin
            if(delayCounter > FREQUENCY / 4)
            begin
                if(counterSig2==0) 
                    begin
                        counterSig2 <= FREQUENCY - 1;  
                        LED2 <= ~LED2;                      
                    end
                else 
                        counterSig2 <= counterSig1-1;
            end

编辑1:

以下代码用于测试平台,并添加了触发器。我还将延迟计数器放在else语句之外,以改善同步。模拟工作正常。

module Simulator;

    // Inputs
    reg clk;


    // Outputs
    reg LED1;
    reg LED2;
    reg trigger;
    wire SO;

    reg [32:0] counterSig1;
    reg [32:0] counterSig2;
    reg [32:0] delayCounter;
    parameter FREQUENCY = 50000000;


    // Instantiate the Unit Under Test (UUT)
    Freq_Gen_Button_source uut (
        .clk(clk), 
        .LED1(LED1), 
        .LED2(LED2)
    );

    initial begin
        // Initialize Inputs
        clk = 0;

        counterSig1 = 0;
        counterSig2 = 0;
        delayCounter = 0;
        LED1 = 0;
        LED2 = 0;
        trigger = 0;

    end

    always 
     begin
        #1  clk =  ! clk; 
     end

     always @(posedge clk)
        begin

             if(counterSig1 == 0)  
                 begin
                      counterSig1 <= FREQUENCY - 1;         
                      LED1 <= ~LED1; 
                 end
             if(counterSig1 != 0) 
                begin
                    counterSig1 <= counterSig1 - 1;                     
                end         
            delayCounter <= delayCounter + 1;
        end

    always @(posedge clk)
        begin
            if(delayCounter > 25000000 - 2)
                trigger <= 1;
        end

    always @(posedge clk)
        begin
            if(trigger == 1)
                begin
                     if(counterSig2 == 0)  
                         begin
                              counterSig2 <= FREQUENCY - 1;         
                              LED2 <= ~LED2; 
                         end
                     if(counterSig2 != 0) 
                        begin
                            counterSig2 <= counterSig2 - 1;  
                        end
                end
    end

    initial 
     #500000000  $finish; 
endmodule`

应具有90度相位仿真:

enter image description here

然后我将测试台代码复制到verilog中,以为某处可能有错字,但仍然无法正常工作。

1 个答案:

答案 0 :(得分:1)

开始于:
您没有重置。像许多设计人员一样,您依靠FPGA上电将所有寄存器设为零。这使我非常怀疑您没有仿真电路。在模拟中,您所有的计数器一直都是X。

其次:
查看您的代码,我注意到您的delayCounter一直在递增。它永远不会清除。它可能需要一段时间,因为它的长度为33位,但最终会翻转,然后counterSig2会停止一会儿。
如果您想进行初始延迟,请确保延迟时间结束后,延迟计数器停止计时。

请注意,在不进行任何重置的情况下,延迟计数器在加电后将仅工作一次。

第三次:
如果延迟始终小于半个时钟周期,则可以省略counterSig2delayCounter。只需使用类似的内容:

if (counterSig1==(FREQUENCY - (FREQUENCY/4))
   LED2 <= LED1;

最后一个:
请仔细使用您的姓名和公式。您所说的FREQUENCY用于计数器,因此是一个延迟,期间。您也计算错误。如果时钟频率为CLOCK_FREQUENCY,而输出频率为signalFrequency,则延迟应为(CLOCK_FREQUENCY/signalFrequency)/2