由于期望脉冲的最小宽度为125M,所以利用IP核PLL进行倍频,倍频过程在此不再赘述,利用倍频得到250MHz的频率(FPGA的时钟为50MHz,即5倍频)
给出quartus中项目的文件名:
一、单个双脉冲
1、期望波形
如图所示,期望输出波形为两个脉宽不同的矩形波,tp1脉宽为16ns(62.5MHz),tp2脉宽为4ns(250MHz),参考频率为CLK_250MHz,计数器cnt对其上升沿敏感,计算周期为120,因此整个双脉冲的周期的T=120*(1/250MHz)=480ns。
2、Verilog HDL编程
思路:一个周期内要出现两个脉宽不同,且间隔时间为1/3T的信号,可以通过判断cnt的值,来对输出进行幅值;只需要提前计算好不同的cnt对于的输出的高低状态就行了
module PLL(
input clk,rst,
output clk_250M,
output reg wave,
output reg led,
output reg [9:0] cnt
);
mypll mypll_inst (
.inclk0 ( clk ),
.c0 ( clk_250M )
);
always @(posedge clk_250M or negedge rst)
begin
if(!rst)//rst为0时复位
begin
led <= ~ led;
cnt <= 0;
end
else if(cnt<10'd120)
cnt <= cnt + 1'd1;
else
cnt <= 0;
end
always @(posedge clk_250M)
begin
if(!rst)//rst为0时复位
wave <= 0;
else if(cnt <4)
wave <= 1;
else if(cnt < 40)
wave <= 0;
else if(cnt<41)
wave <= 1;
else
wave <= 0;
end
endmodule
`timescale 1ns/100ps
module tb_mypll();
reg clk,rst;
wire clk_250M;
wire wave;
wire [9:0] cnt;
PLL U1(
.clk(clk),
.rst(rst),
.clk_250M(clk_250M),
.wave(wave),
.cnt(cnt)
);
initial
begin
clk = 0;rst=0;#10;rst=1;
end
always #(10)
begin
clk = ~clk;
end
endmodule
二、多个双脉冲
1、期望波形
2、Verilog HDL编程
思路:不同于单个双脉冲,对于一个周期内先后出现多个脉冲,其脉宽不同的信号,有着更多的限制,这里利用对cnt取余的方式,使输出信号在参考周期的整数倍进行取反,达到脉宽不同的目的
module PLL(
input clk,rst,
output clk_250M,
output reg wave,
output reg led,
output reg [9:0] cnt
);
mypll mypll_inst (
.inclk0 ( clk ),
.c0 ( clk_250M )
);
always @(posedge clk_250M or negedge rst)
begin
if(!rst)//rst为0时复位
begin
led <= ~ led;
wave <= 0;
cnt <= 0;
end
else if(cnt <40)
begin
cnt <= cnt + 1'd1;
if(cnt % 4 == 0)
wave <= ~wave;
else
wave <= wave;
end
else if(cnt<10'd120)
begin
cnt <= cnt + 1'd1;
wave <= ~wave;
end
else
begin
cnt <= 0;
wave <= wave;
end
end
endmodule
`timescale 1ns/100ps
module tb_mypll();
reg clk,rst;
wire clk_250M;
wire wave;
wire [9:0] cnt;
PLL U1(
.clk(clk),
.rst(rst),
.clk_250M(clk_250M),
.wave(wave),
.cnt(cnt)
);
initial
begin
clk = 0;rst=0;#10;rst=1;
end
always #(10)
begin
clk = ~clk;
end
endmodule
目前代码只是实现了期望功能,肯定还有值得优化的地方,有兴趣的可在评论区交流