收藏 分享(赏)

基于FPGA的单脉冲发生器.doc

上传人:scg750829 文档编号:6029952 上传时间:2019-03-25 格式:DOC 页数:16 大小:543.50KB
下载 相关 举报
基于FPGA的单脉冲发生器.doc_第1页
第1页 / 共16页
基于FPGA的单脉冲发生器.doc_第2页
第2页 / 共16页
基于FPGA的单脉冲发生器.doc_第3页
第3页 / 共16页
基于FPGA的单脉冲发生器.doc_第4页
第4页 / 共16页
基于FPGA的单脉冲发生器.doc_第5页
第5页 / 共16页
点击查看更多>>
资源描述

1、西安邮电学院FPGA 硬件课程设计报告题 目: 可编程的单脉冲发生器系部专业: 计算机系微电子班 级: 微电子 0603 学生姓名: 李欢乐 学 号: 04064081 导师姓名:刘镇弢 起止时间:09 年 6 月 15 日至 09 年 6 月 26 日 09 年 6 月 26 日一、选题说明:可编程单脉冲发生器是一种脉冲宽度可编程的信号发生器,其输出为 TTL 电平。在输入按键的控制下,产生单次的脉冲,脉冲的宽度由 8 位的输入数据控制(以下称之为脉宽参数) 。由于是 8 位的脉宽参数,故可以产生 255 种宽度的单次脉冲。二、工作安排:序号 阶段名称 时间安排 地点或条件1 布置设计题目

2、周一 电科实验室2 技术规范制订 周一周二 电科实验室3 总体方案设计 周三周四 电科实验室4 详细方案设计第一周周五 电科实验室5 电路设计 周一周二 电科实验室6 仿真验证 周三 电科实验室7 综合布局布线 周四 电科实验室8 后仿真 周四 电科实验室9 下载实现 电科实验室10 总结撰写报告第二周周五电科实验室三、设计报告:1.技术规范:在 clr 的控制下置入脉宽 data,在输入按键 key 的控制下,产生单次的脉冲 pulse,脉冲的宽度由 data 8 位的输入数据控制(以下称之为脉宽参数) 。clk_50M 为系统的时钟。2.总体设计方案:系统功能描述:(1)分频模块:输入为总

3、的时钟 50M,经过分频以后变为 100HZ。(2)延时模块:当 clk 为高电平且在复位脉冲 clr 有效时置入延时脉宽,延时 5 个始终周期后输出一个高电平 load 。(3)计数模块:脉宽参数端 data 接受 8 位的数据,经数据预置端 clr装载脉宽参数,在计数允许端有效后便开始计数。该计数器设计成为减法计数的模式,当其计数到 0 时,输出端 pulse 由高电平变为低电平。便可得到单脉冲的输出。系统功能描述时序关系:可编程单脉冲发生器的操作过程是:(1) 预置脉宽参数。(2) 按下复位键,初始化系统。(3) 按下启动键,发出单脉冲。以上三步可用三个按键来完成。但是,由于目标板已确定

4、,故考虑在复位键按下后,经过延时自动产生预置脉宽参数的动作。输出的信号加到灯上,输如的脉宽有开发版上的拨码开关决定,当输入脉宽后,按下复位键置入脉宽,然后按下启动键,发出单脉冲,延时一段时间后灯开始亮,亮一段时间后灯熄灭。延时模块的时序图如下:clk clr load 3.流程图的设计:根据时序关系,可以做出图所示的流程图。在系统复位后,经一定的延时产生一个预置脉冲 load,用来预置脉宽参数。当按键 key 有效后产生脉冲 pulse。开始系统复位延时启动计数器预置脉宽计数器结束?产生单脉冲结束计数器减一四、验证方案:1.验证方案的设计: 分频模块的设计:分频模块的代码:module div

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

6、e/结束分频模块。分频模块的仿真结果:在验证的时候设计了一个 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 为低电平时begin

7、counta=5;/清零。load=0;end/结束清零。else / 当 clr 为高电平时计数器减一。begincounta=counta-8d1;if(counta=8d0)/计数器减到零时,进行复位输出 load 为高begincounta=8d0;load=1;/ 输出 load 为高。endendendendmodule /结束延时模块。延时模块的仿真结果:从波形图可以看出当 clr 为高电平,且时钟的上升沿到来的时候,延时 5 个时钟周期后输出 load 为高电平。计数模块的设计:计数模块代码:module count(clk,data,clr,load,pulse,key);/

8、模块名定义。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)beginif(!clr)/低电平复位。begincount=data;/置入脉宽。pulse=0;/输出为零。endelse if(load=1)/load 有效的时候。beginif(key=0)/当有按键按下的时候。begincount=coun

9、t-8d1;/计数器减一。pulse=1;/输出为高电平。if(count=8d0)/当计数器减到零的时候。begincount=8d0;pulse=0;/输出为低电平。end/ end beginend/end beginend/end beginend/end alwaysendmodule/结束计数模块。计数模块的仿真结果:上图为可编程单脉冲发生器的逻辑仿真结果。由仿真结果可以看出,单脉冲输出的持续时间(脉冲宽度)由输入的脉宽参数 data 决定。2.仿真激励源代码:timescale 1ns/100ps module confirmpulse_tb;/仿真模块名字的定义。 ,reg 7

10、:0 data;/ 输入的脉宽。reg clk_50M,key,clr;/输入的时钟,按键,清零。wire pulse;/输出。always #10 clk_50M=clk_50M;/时钟周期。initialbeginclk_50M=0;clr=0;key=1;data=8d10; /赋初值。#10 clr=1;key=0;#10000 $finish;/结束仿真。endinitial/ 监控。begin$monitor($time,“clk_50M=%d,clr=%d,data=%d,key=%d,pulse=%dn“ ,clk_50M,clr,data,key,pulse);endconf

11、irmpulse /实例化。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(c

12、lk_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);/模块名及端口的定义,到endmodule。input clk_50M;/输入端口的定义。output clk;/输出端口的定义。reg 31:0 a=32d0;/定义内部寄存器并赋初值。reg cl

13、k=0;/给输出赋初值。always(posedge clk_50M)beginif(a=32d500000)/判断计数器是不是记到了 500000begina=32d0;/ 计数器记到了 500000 清零。clk=clk; / 输出脉冲取反end/ 结束。else a=a+1;/ 计数器没有记到了 500000 自加。end/结束 always 块。endmodule/结束分频模块。/*延时模块*/module dely(clk,clr,load); /模块名及端口的定义,endmodule。input clk,clr; /输入端口的定义。output load; /输出端口的定义。reg

14、 2:0 counta; /延时计数器。reg load;/输出。always(posedge clk or negedge clr)beginif(!clr) / 当 clr 为低电平时begincounta=5;/清零。load=0;end/结束清零。else / 当 clr 为高电平时计数器减一。begincounta=counta-8d1;if(counta=8d0)/计数器减到零时,进行复位输出 load 为高begincounta=8d0;load=1;/ 输出 load 为高。endendendendmodule /结束延时模块。/*计数模块*/module count(clk,

15、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)beginif(!clr)/低电平复位。begincount=data;/置入脉宽。pulse=0;/输出为零。endelse if(load=1)/load 有效的时候。beginif(key=0)

16、/当有按键按下的时候。begincount=count-8d1;/计数器减一。pulse=1;/输出为高电平。if(count=8d0)/当计数器减到零的时候。begincount=8d0;pulse=0;/输出为低电平。end/ end beginend/end beginend/end beginend/end alwaysendmodule/结束计数模块。六、功能仿真报告:下图为可编程单脉冲发生器的逻辑仿真结果。由仿真结果可以看出,单脉冲输出的持续时间(脉冲宽度)由输入的脉宽参数 data 决定。功能仿真符合设计规范。七、综合与布局布线报告1.综合的结果:综合工具采用的是 Altera

17、公司的 Quartus II 6.0。综合的结果如下:2.布局布线的结果:八、时序仿真报告:采用的第三方工具是 modelsim6.0,后仿真的结果如下:九、结论及讨论:在设计过程中,经过验证与思考,在设计的时候需要加上一个延时模块,延时模块起了消抖的作用,如果不加延时模块输出的结果和不稳定。十、课程设计的心得与体会:通过这次课程设计,我真正认识了 FPGA 的设计流程,熟悉了Verilog 的程序设计,并让我有机会把理论与实际相结合,掌握了宝贵的实践经验。这是我第一次比较系统的做 FPGA 程序设计,在设计过程中出现了许多问题,而且发现了自己的诸多不足之处,在老师和同学的帮助下最终完成了本次课程设计,并让我在设计过程中学到了许多在课本上无法学到的知识,对我学好 Verilog 和 FPGA 有很大的帮助。最后要感谢老师和同学们在课程设计过程中给予我的指导与帮助!

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 学术论文 > 大学论文

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报