当前位置:文档之家› 基于FPGA的单脉冲发生器

基于FPGA的单脉冲发生器

一、设计报告:1.技术规范:在clr的控制下置入脉宽data,在输入按键key的控制下,产生单次的脉冲pulse,脉冲的宽度由data 8位的输入数据控制(以下称之为脉宽参数)。

clk_50M为系统的时钟。

2.总体设计方案:①系统功能描述:(1)分频模块:输入为总的时钟50M,经过分频以后变为100HZ。

(2)延时模块:当clk为高电平且在复位脉冲clr有效时置入延时脉宽,延时5个始终周期后输出一个高电平load 。

(3)计数模块:脉宽参数端data接受8位的数据,经数据预置端clr 装载脉宽参数,在计数允许端有效后便开始计数。

该计数器设计成为减法计数的模式,当其计数到0时,输出端pulse由高电平变为低电平。

便可得到单脉冲的输出。

②系统功能描述时序关系:可编程单脉冲发生器的操作过程是:(1) 预置脉宽参数。

(2) 按下复位键,初始化系统。

(3) 按下启动键,发出单脉冲。

以上三步可用三个按键来完成。

但是,由于目标板已确定,故考虑在复位键按下后,经过延时自动产生预置脉宽参数的动作。

输出的信号加到灯上,输如的脉宽有开发版上的拨码开关决定,当输入脉宽后,按下复位键置入脉宽,然后按下启动键,发出单脉冲,延时一段时间后灯开始亮,亮一段时间后灯熄灭。

延时模块的时序图如下:clkclrload3.流程图的设计:根据时序关系,可以做出图所示的流程图。

在系统复位后,经一定的延时产生一个预置脉冲load,用来预置脉宽参数。

当按键key有效后产生脉冲pulse。

二、验证方案:1.验证方案的设计:①分频模块的设计:分频模块的代码:module div(clk_50M,clk);//模块名及端口的定义,到endmodule。

input clk_50M;//输入端口的定义。

output clk;//输出端口的定义。

reg [31:0] a=32‘d0;//定义内部寄存器并赋初值。

reg clk=0;//给输出赋初值。

always@(posedge clk_50M)beginif(a==32'd500000)//判断计数器是不是记到了500000begina<=32'd0;// 计数器记到了500000清零。

clk=~clk; // 输出脉冲取反end// 结束。

else a<=a+1;// 计数器没有记到了500000自加。

end//结束always块。

endmodule//结束分频模块。

分频模块的仿真结果:在验证的时候设计了一个8分频。

有波形图可以看出clk_50M经过8个周期后clk取反,实现了8分频,验证了自己的设计。

②延时模块的设计:延时模块的代码:module dely(clk,clr,load); //模块名及端口的定义,endmodule。

input clk,clr; //输入端口的定义。

output load; //输出端口的定义。

reg [2:0] counta; //延时计数器。

reg load;//输出。

always@(posedge clk or negedge clr)beginif(!clr) // 当clr为低电平时begincounta<=5;//清零。

load<=0;end//结束清零。

else // 当clr为高电平时计数器减一。

begincounta<=counta-8'd1;if(counta==8'd0)//计数器减到零时,进行复位输出load为高 begincounta<=8'd0;load<=1;// 输出load为高。

endendendendmodule //结束延时模块。

延时模块的仿真结果:从波形图可以看出当clr为高电平,且时钟的上升沿到来的时候,延时5个时钟周期后输出load为高电平。

③计数模块的设计:计数模块代码:module count(clk,data,clr,load,pulse,key);//模块名定义。

input clk,clr,load,key;//输入端口的定义。

input[7:0] data;// mai kuan de ding yioutput pulse;//输出的定义。

reg pulse;//输出定义为reg类型。

reg [7:0] count;// 计数器的定义。

always@(posedge clk or negedge clr)beginif(!clr)//低电平复位。

begincount<=data;//置入脉宽。

pulse<=0;//输出为零。

endelse if(load==1)//load有效的时候。

beginif(key==0)//当有按键按下的时候。

begincount<=count-8'd1;//计数器减一。

pulse<=1;//输出为高电平。

if(count==8'd0)//当计数器减到零的时候。

begincount<=8'd0;pulse<=0;//输出为低电平。

end// end beginend//end beginend//end beginend//end alwaysendmodule//结束计数模块。

上图为可编程单脉冲发生器的逻辑仿真结果。

由仿真结果可以看出,单脉冲输出的持续时间(脉冲宽度)由输入的脉宽参数data决定。

2.仿真激励源代码:`timescale 1ns/100psmodule confirmpulse_tb;//仿真模块名字的定义。

,reg [7:0] data;// 输入的脉宽。

reg clk_50M,key,clr;//输入的时钟,按键,清零。

wire pulse;//输出。

always #10 clk_50M=~clk_50M;//时钟周期。

initialbeginclk_50M=0;clr=0;key=1;data=8'd10; //赋初值。

#10 clr=1;key=0;#10000 $finish;//结束仿真。

endinitial// 监控。

begin$monitor($time,,,"clk_50M=%d,clr=%d,data=%d,key=%d,pulse= %d\n" ,clk_50M,clr,data,key,pulse);endconfirmpulse //实例化。

wsm(.key(key),.clk_50M(clk_50M),.data(data),.clr(clr),.pulse(pulse));endmodule//激励模块结束。

五、电路设计源代码:/*顶层模块*/module confirmpulse(clk_50M,data,clr,key,pulse);input [7:0] data;//脉宽的定义。

input clk_50M,key,clr;// key是发脉冲的信号,clr为清零信号。

output pulse;//脉宽的输出。

wire load;//中间变量的定义。

wire clk;div div(.clk_50M(clk_50M),.clk(clk));//实例化。

dely u1(.clk(clk),.clr(clr),.load(load));// 实例化。

countu2(.clk(clk),.data(data),.clr(clr),.load(load),.pulse(pul se),.key(key));// 实例化。

Endmodule//结束顶层模块。

/*分频模块*/module div(clk_50M,clk);//模块名及端口的定义,到endmodule。

input clk_50M;//输入端口的定义。

output clk;//输出端口的定义。

reg [31:0] a=32‘d0;//定义内部寄存器并赋初值。

reg clk=0;//给输出赋初值。

always@(posedge clk_50M)beginif(a==32'd500000)//判断计数器是不是记到了500000begina<=32'd0;// 计数器记到了500000清零。

clk=~clk; // 输出脉冲取反end// 结束。

else a<=a+1;// 计数器没有记到了500000自加。

end//结束always块。

endmodule//结束分频模块。

/*延时模块*/module dely(clk,clr,load); //模块名及端口的定义,endmodule。

input clk,clr; //输入端口的定义。

output load; //输出端口的定义。

reg [2:0] counta; //延时计数器。

reg load;//输出。

always@(posedge clk or negedge clr)beginif(!clr) // 当clr为低电平时begincounta<=5;//清零。

load<=0;end//结束清零。

else // 当clr为高电平时计数器减一。

begincounta<=counta-8'd1;if(counta==8'd0)//计数器减到零时,进行复位输出load为高 begincounta<=8'd0;load<=1;// 输出load为高。

endendendendmodule //结束延时模块。

/*计数模块*/module count(clk,data,clr,load,pulse,key);//模块名定义。

input clk,clr,load,key;//输入端口的定义。

input[7:0] data;// mai kuan de ding yioutput pulse;//输出的定义。

reg pulse;//输出定义为reg类型。

reg [7:0] count;// 计数器的定义。

always@(posedge clk or negedge clr)beginif(!clr)//低电平复位。

begincount<=data;//置入脉宽。

pulse<=0;//输出为零。

endelse if(load==1)//load有效的时候。

beginif(key==0)//当有按键按下的时候。

begincount<=count-8'd1;//计数器减一。

pulse<=1;//输出为高电平。

if(count==8'd0)//当计数器减到零的时候。

begincount<=8'd0;pulse<=0;//输出为低电平。

end// end beginend//end beginend//end beginend//end alwaysendmodule//结束计数模块。

相关主题