基于FPGA的单脉冲发生器
- 格式:doc
- 大小:244.00 KB
- 文档页数:15
可编程单脉冲发生器设计可编程单脉冲发生器是一种脉冲宽度可编程的信号发生器,其输出为TTL 电平。
在输入按键的控制下,产生单次的脉冲,脉冲的宽度由8位的输入数据控制(以下称之为脉宽参数)。
由于是8位的脉宽参数,故可以产生255种宽度的单次脉冲。
在目标板上,I0~I7用作脉宽参数输入,PULSE_OUT用做可编程单脉冲输出,而KEY和/RB作为启动键和复位键。
图3示出了可编程单脉冲发生器的电路图。
图3 可编程单脉冲发生器的电路图8.3.1 由系统功能描述时序关系可编程单脉冲发生器的操作过程是:(1) 预置脉宽参数。
(2) 按下复位键,初始化系统。
(3) 按下启动键,发出单脉冲。
以上三步可用三个按键来完成。
但是,由于目标板已确定,故考虑在复位键按下后,经过延时自动产生预置脉宽参数的动作。
这一过程可用图4的时序来描述。
图4 可编程单脉冲发生器的时序图图中的/RB为系统复位脉冲,在其之后自动产生LOAD脉冲,装载脉宽参数N。
之后,等待按下/KEY键。
/KEY键按下后,单脉冲P_PULSE便输出。
在此,应注意到:/KEY的按下是与系统时钟CLK不同步的,不加处理将会影响单脉冲P_PULSE的精度。
为此,在/KEY按下期间,产生脉冲P1,它的上跳沿与时钟取得同步。
之后,在脉宽参数的控制下,使计数单元开始计数。
当达到预定时间后,再产生一个与时钟同步的脉冲P2。
由P1和P2就可以算出单脉冲的宽度Tw。
8.3.2 流程图的设计根据时序关系,可以做出图5所示的流程图。
在系统复位后,经一定的延时产生一个预置脉冲LOAD,用来预置脉宽参数。
应该注意:复位脉冲不能用来同时预置,要在其之后再次产生一个脉冲来预置脉宽参数。
为了产生单次的脉冲,必须考虑到在按键KEY有效后,可能会保持较长的时间,也可能会产生多个尖脉冲。
因此,需要设计一种功能,使得当检测到KE Y有效后就封锁KEY的再次输入,直到系统复位。
这是本设计的一个关键所在。
摘要:本实验是采用fpga方式基于Alter Cyclone2 EP2C5T144C8的简易脉冲信号发生器,可以实现输出一路周期1us到10ms,脉冲宽度:0.1us到周期-0.1us,时间分辨率为0.1us的脉冲信号,并且还能输出一路正弦信号(与脉冲信号同时输出)。
输出模式可分为连续触发和单次手动可预置数(0~9)触发,具有周期、脉宽、触发数等显示功能。
采用fpga计数实现的电路简化了电路结构并提高了射击精度,降低了电路功耗和资源成本。
关键词:FPGA;脉冲信号发生器;矩形脉冲;正弦信号;引言(一)方案设计与比较脉冲信号产生方案:方案一、采用专用DDS芯片的技术方案:目前已有多种专用DDS集成芯片可用,采用专用芯片可大大简化系统硬件制作难度,内部数字信号抖动小,输出信号指标高;但专用芯片控制方式比较固定,最大的缺点是进行脉宽控制,测量困难,无法进行外同步,不满足设计要求。
方案二、单片机法:利用单片机实现矩形脉冲,可以较方案以更简化外围硬件,节约成本,并且也可以实现灵活控制、能产生任意波形的信号发生器。
但是单片机的内部时钟一般是小于25Mhz,速度上无法满足设计要求,通过单片机产生脉冲至少需要三条指令,所需时间大于所要求的精度要求,故不可取。
方案二:FPGA法:利用了可编程逻辑器件的灵活性且资源丰富的特点,通过Quartus软件的设计编写,实现脉冲信号的产生及数控,并下载到试验箱中,这种方案电路简单、响应速度快、精度高、稳定性好故采用此种方案。
(二)理论分析与计算脉冲信号产生原理:输入量周期和脉宽,结合时钟频率,转换成两个计数器的容量,用来对周期和高电平的计时,输出即可产生脉冲信号。
脉冲信号的精度保证:时间分辨率0.1us,周期精度:+0.1%+0.05us,宽度精度:+0.1%+0.05us,为满足精度要求,所以所选时钟频率至少1/0.05us=20MHZ,由于试验箱上大于10MHZ只有50MHZ,故选时钟信号50MHZ,此时精度1/50MHZ=0.02us<0.05us,满足精度要求。
可编程单脉冲发生器的设计一.功能描述1. 可编程单脉冲发生器是一种脉冲宽度可编程的信号发生器,其输出为TTL电平。
2. 在输入按键的控制下,产生单次的脉冲,脉冲的宽度由8位的输入数据控制。
由于是8位的脉宽参数,故可以产生255种宽度的单次脉冲。
3. 按下复位键,初始化系统。
4. 按下启动键,产生单脉冲。
二.输入输出信号描述信号名输入/输出目标/源功能描述clk Input 时钟信号width Input Pin 脉冲宽度start Input Pin 开始输出信号命令RST Input Pin 复位信号pluse_out Output Pin 输出脉冲信号时钟分析顶层模块:设计思想说明:1、在系统复位后,经一定的延时产生一个预置脉冲load,用来预置width。
应该注意:复位脉冲不能用来同时预置,要在其之后再次产生一个脉冲来预置脉宽参数。
为了产生单次的脉冲,必须考虑到在按键start有效后,可能会保持较长的时间,也可能会产生多个尖脉冲。
因此,需要设计一种功能,使得当检测到start有效后就封锁start 的再次输入,直到系统复位。
这是本设计的一个关键所在。
2、start产生后,单脉冲pluse_out便输出。
在此,应注意到:start是与系统时钟clk 不同步的,不加处理将会影响单脉冲pluse_out的精度。
为此,在start产生后,等待cl k到达上升沿,当clk到达上升沿后,计数单元开始计数。
当达到预定时钟宽度后,再产生一个宽度为widyh的单脉冲。
四、子模块描述4.1,延时模块1、功能描述本设计中需要产生一个延时为5个时钟的延时信号。
2、管脚描述信号名称输入/ 输出源功能描述cnt[2:0]输入PIN 计数信号CLK 输入PIN 时钟信号load输出PIN 延迟标志信号RST输入PIN 复位信号3、实现说明:当RST无效时,由计数器计数5个时钟周期后输出一个时钟延时信号。
4.2 计数模块1、功能描述本设计中要产生一个预置位宽的计数寄存器。
一、设计报告: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清零。
可编程单脉冲发生器设计一、功能描述:本设计实现一个可编程单脉冲发生器,具体功能如下:1.异步信号复位,复位后信号输出重新开始。
2.复位后5个时钟周期时,产生一个脉冲,对输入的脉冲宽度参数读取。
3.当有按键使能时,输出脉冲信号,重复再按使能键,无效。
4.使能按键后产生的单脉冲的上升沿与时钟取得同步。
5.产生的脉冲信号的最大宽度为255。
二、输入输出信号描述:系统结构框图顶层模块说明:1、counter:计数比较,确保输出信号宽度为输入data值;2、sync:将按键产生的单脉冲的上升沿与时钟取得同步;3、T_trigger:T触发器模块,锁按键信号,使按键只能第一次有效;4、preset_parameter:预置脉冲参数;5、LED:将输入data用数码管输出显示。
设计说明:设计分为计数比较、按键同步、预置脉冲参数、T触发器模块、LED 显示五个模块。
计数比较模块:计数延时,由输入的宽度参数data的不同而得到不同宽度的脉冲。
按键同步模块:使按键产生的单脉冲的上升沿与时钟取得同步。
预置脉冲参数:在系统进行复位操作的5个时间单位后,将输入的脉冲参数data预置到flag_data中。
T触发器模块:T触发器模块,锁按键信号,使按键只能第一次有效。
LED显示模块:将脉冲宽度的预置值和计数模块的计数值转换为数码管输出显示。
四、子模块描述:4.1、counter:计数判断输出模块1、功能描述计数延时,由输入的宽度参数data的不同而得到不同宽度的脉冲。
信号名称输入/ 输出源目标功能描述clk Input Pin 时钟信号50MHzrst Input Pin 复位信号,低电平有效data_in[7:0] Input Pin 脉冲宽度参数Q_in Input Pin 按键使能标志out Output Pin 脉冲输出复位后输出out为0。
当Q_in按键使能标志有效时,cnt[7:0]从零开始计数,当cnt<data_in时,输出out=1;其余输出为0。
基于FPGA的脉冲信号发生器设计章欣【摘要】基于FPGA并运用DDS技术的相关理论,通过模块化设计,使标准脉冲信号发生器达到较高的性能指标,能够产生1~100 kHz 线性可调的脉冲,脉冲分辨率达100 Hz,上升沿及下降沿为2.5 ns,脉冲宽度从200 ns~5μs可调,脉宽分辨率50 ns,满足集成电路的脉冲驱动要求。
%Based on FPG and the theory of DDS technology,according to the design of each module,the standard pulse signal generator achieves the high performance index.It can produce 1 k-100 kHz linear adjustable pulse,100Hz the pulse resolution,2.5ns rising and falling edge,pulse width adjustable from 200ns-5μs and 50ns pulse width resolution,which meets the requirement of pulse drive in the integrated circuits.【期刊名称】《气象水文海洋仪器》【年(卷),期】2014(000)002【总页数】5页(P69-73)【关键词】FPGA;脉冲信号发生器;DDS【作者】章欣【作者单位】南京信息工程大学,气象灾害预报预警与评估协同创新中心,南京210044【正文语种】中文【中图分类】TP317.40 引言在集成电路应用中经常需要使用脉冲源来驱动集成芯片,在雷达、计算机硬件系统和通信系统等领域的设计和调试中,同样需要大量的精度高、速度快的脉冲信号和数字序列作为激励。
在其他领域例如:激光器供电、电火花加工、静电除尘、脉冲电镀等方面,脉冲源也得到了广泛的应用,因而脉冲信号发生器的设计和研制具有很大的价值。
可编程单脉冲发生器FPGA课程设计报告提纲1.任务根据输入的8位的脉宽参数,输出255种宽度的单次脉冲。
可编程单脉冲发生器是一种脉冲宽度可编程的信号发生器,在输入按键的控制下,产生单次的脉冲,脉冲的宽度由8位的输入数据控制。
由于是8位的脉宽参数,故可以产生255种宽度的单次脉冲。
2.目的产生一个脉冲宽度可根据8位输入数据(data)可变的脉冲发生器。
可变的脉冲信号可以通过把输入的data赋值给一个count,通过对count信号做减1操作控制输出的脉冲宽度。
把data赋给count后,在key键启动的情况下,输出脉冲pulse信号开始输出低电平,count同时在每来一个时钟信号的时候做减1操作,而且pulse信号一直保持高电平,当count减为0时,把pulse信号拉低。
这样就输出了一个脉冲宽度可以根据data输入信号可变的脉冲信号。
3.使用环境(软件/硬件环境,设备等)布局布线使用的环境是Quartus II。
仿真测试使用的环境是ModelSim SE。
4.FPGA课程设计详细内容4.1 技术规范(一)、功能定义如下:本设计实现一个可编程单脉冲发生器,具体功能如下:1.异步信号复位,复位后信号输出可以重新开始。
2.把8为脉冲宽度data赋给计数信号count。
3.当有key按键使能时,输出脉冲信号,并做count减1操作,重复再按使能键无效。
4.使能按键后产生的单脉冲的上升沿与时钟取得同步。
5.当count减为0时,脉冲信号拉低。
高电平持续的宽度,即所需的脉冲宽度。
(二)、引脚定义信号名输入/输出功能描述clk Input 时钟频率50M占空比1:1。
rst_n Input 低电平有效,程序重新执行,计数器清零。
data[7:0] Input 8位控制脉冲信号的宽度。
key Input 按键控制pulse输出。
pulse Output 输出信号。
4.2 设计方案(1)系统功能描述(1)分频模块:输入为总的时钟50M,经过分频以后变为100HZ。
一、设计报告: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//结束计数模块。