谢谢。
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度相位仿真:
然后我将测试台代码复制到verilog中,以为某处可能有错字,但仍然无法正常工作。
答案 0 :(得分:1)
开始于:
您没有重置。像许多设计人员一样,您依靠FPGA上电将所有寄存器设为零。这使我非常怀疑您没有仿真电路。在模拟中,您所有的计数器一直都是X。
其次:
查看您的代码,我注意到您的delayCounter
一直在递增。它永远不会清除。它可能需要一段时间,因为它的长度为33位,但最终会翻转,然后counterSig2
会停止一会儿。
如果您想进行初始延迟,请确保延迟时间结束后,延迟计数器停止计时。
请注意,在不进行任何重置的情况下,延迟计数器在加电后将仅工作一次。
第三次:
如果延迟始终小于半个时钟周期,则可以省略counterSig2
和delayCounter
。只需使用类似的内容:
if (counterSig1==(FREQUENCY - (FREQUENCY/4))
LED2 <= LED1;
最后一个:
请仔细使用您的姓名和公式。您所说的FREQUENCY用于计数器,因此是一个延迟,期间。您也计算错误。如果时钟频率为CLOCK_FREQUENCY
,而输出频率为signalFrequency
,则延迟应为(CLOCK_FREQUENCY/signalFrequency)/2
。