FPGA--基于Verilog HDL利用PLL在FPGA中实现双脉冲信号(含仿真激励代码)

由于期望脉冲的最小宽度为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

目前代码只是实现了期望功能,肯定还有值得优化的地方,有兴趣的可在评论区交流 

  • 4
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cheeky_man

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值