基于FPGA的单脉冲发生器_第1页
基于FPGA的单脉冲发生器_第2页
基于FPGA的单脉冲发生器_第3页
基于FPGA的单脉冲发生器_第4页
基于FPGA的单脉冲发生器_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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由高电

2、平变为低电平。便可得到单脉冲的输出。系统功能描述时序关系:可编程单脉冲发生器的操作过程是:(1) 预置脉宽参数。(2) 按下复位键,初始化系统。(3) 按下启动键,发出单脉冲。以上三步可用三个按键来完成。但是,由于目标板已确定,故考虑在复位键按下后,经过延时自动产生预置脉宽参数的动作。输出的信号加到灯上,输如的脉宽有开发版上的拨码开关决定,当输入脉宽后,按下复位键置入脉宽,然后按下启动键,发出单脉冲,延时一段时间后灯开始亮,亮一段时间后灯熄灭。延时模块的时序图如下:clk clr load 3.流程图的设计:根据时序关系,可以做出图所示的流程图。在系统复位后,经一定的延时产生一个预置脉冲loa

3、d,用来预置脉宽参数。当按键key有效后产生脉冲pulse。 开始系统复位延时启动计数器预置脉宽计数器结束?产生单脉冲结束计数器减一二、验证方案:1.验证方案的设计: 分频模块的设计:分频模块的代码:module div(clk_50M,clk);/模块名及端口的定义,到endmodule。 input clk_50M;/输入端口的定义。 output clk;/输出端口的定义。 reg 31:0 a=32d0;/定义内部寄存器并赋初值。 reg clk=0;/给输出赋初值。 always(posedge clk_50M) begin if(a=32d500000)/判断计数器是不是记到了50

4、0000 begin a=32d0;/ 计数器记到了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; /输出端口的

5、定义。reg 2:0 counta; /延时计数器。reg load;/输出。always(posedge clk or negedge clr)begin if(!clr) / 当clr为低电平时 begin counta=5;/清零。 load=0; end/结束清零。else / 当clr为高电平时计数器减一。begin counta=counta-8d1;if(counta=8d0)/计数器减到零时,进行复位输出load为高 begin counta=8d0; load=1;/ 输出load为高。 endendendendmodule /结束延时模块。延时模块的仿真结果: 从波形图可以

6、看出当clr为高电平,且时钟的上升沿到来的时候,延时5个时钟周期后输出load为高电平。计数模块的设计: 计数模块代码:module count(clk,data,clr,load,pulse,key);/模块名定义。input clk,clr,load,key;/输入端口的定义。input7:0 data;/ mai kuan de ding yioutput pulse;/输出的定义。reg pulse;/输出定义为reg类型。reg 7:0 count;/ 计数器的定义。always(posedge clk or negedge clr)begin if(!clr)/低电平复位。 beg

7、in count=data;/置入脉宽。 pulse=0;/输出为零。endelse if(load=1)/load有效的时候。beginif(key=0)/当有按键按下的时候。begin count=count-8d1;/计数器减一。 pulse=1;/输出为高电平。 if(count=8d0)/当计数器减到零的时候。 begin count=8d0; pulse=0;/输出为低电平。 end/ end beginend/end beginend/end beginend/end alwaysendmodule/结束计数模块。上图为可编程单脉冲发生器的逻辑仿真结果。由仿真结果可以看出,单脉冲

8、输出的持续时间(脉冲宽度)由输入的脉宽参数data决定。2.仿真激励源代码:timescale 1ns/100ps module confirmpulse_tb;/仿真模块名字的定义。,reg 7:0 data;/ 输入的脉宽。reg clk_50M,key,clr;/输入的时钟,按键,清零。wire pulse;/输出。always #10 clk_50M=clk_50M;/时钟周期。initialbegin clk_50M=0;clr=0;key=1;data=8d10; /赋初值。 #10 clr=1;key=0; #10000 $finish;/结束仿真。endinitial/ 监控。

9、begin$monitor($time,clk_50M=%d,clr=%d,data=%d,key=%d,pulse=%dn ,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

10、,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(pulse),.key(key);/ 实例化。Endmodule/结束顶层模块。/*分频模块*/module div(clk_50M,clk

11、);/模块名及端口的定义,到endmodule。 input clk_50M;/输入端口的定义。 output clk;/输出端口的定义。 reg 31:0 a=32d0;/定义内部寄存器并赋初值。 reg clk=0;/给输出赋初值。 always(posedge clk_50M) begin if(a=32d500000)/判断计数器是不是记到了500000 begin a=32d0;/ 计数器记到了500000清零。 clk=clk; / 输出脉冲取反end/ 结束。else a=a+1;/ 计数器没有记到了500000自加。end/结束always块。endmodule/结束分频模块。

12、/*延时模块*/module dely(clk,clr,load); /模块名及端口的定义,endmodule。input clk,clr; /输入端口的定义。output load; /输出端口的定义。reg 2:0 counta; /延时计数器。reg load;/输出。always(posedge clk or negedge clr)begin if(!clr) / 当clr为低电平时 begin counta=5;/清零。 load=0; end/结束清零。else / 当clr为高电平时计数器减一。begin counta=counta-8d1;if(counta=8d0)/计数器

13、减到零时,进行复位输出load为高 begin counta=8d0; load=1;/ 输出load为高。 endendendendmodule /结束延时模块。/*计数模块*/module count(clk,data,clr,load,pulse,key);/模块名定义。input clk,clr,load,key;/输入端口的定义。input7:0 data;/ mai kuan de ding yioutput pulse;/输出的定义。reg pulse;/输出定义为reg类型。reg 7:0 count;/ 计数器的定义。always(posedge clk or negedge clr)begin if(!clr)/低电平复位。 begin count=data;/置入脉宽。 pulse=0;/输出为零。endelse if(load=1)/load有效的时候。beginif(key=0)/当有按键按下的时候。begin count=count-8d1;/计数器减一。 pulse=1;/输出为高电平。 if(count=8d0)/当计数器减到零的时候。 begin count=8d0; pu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论