ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:189.26KB ,
资源ID:3360087      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3360087.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(基于FPGA的模可变16进制加法器的设计.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

基于FPGA的模可变16进制加法器的设计.docx

1、基于FPGA的模可变16进制加法器的设计课程设计任务书学生姓名: 兰翔 专业班级: 电子科学与技术2班指导教师: 葛华 工作单位: 信息工程学院 题 目: 模可变16位加法计数器设计 初始条件: QuartusII6.0,微机要求完成的主要任务: 深入学习Verilog HDL语言与FPGA理论知识。利用QuartusII强大的硬件语言处理功能,数字电路仿真功能以及波形处理功能,实现模可变16位加法计数器设计。1.利用Verilog HDL语言描述计数器功能;2.用QuartusII对Verilog HDL语言进行仿真;3. 撰写EDA技术应用实践课程设计说明书。时间安排:学习Verilog

2、HDL语言的概况 第1天学习Verilog HDL语言的基本知识 第2、3天学习QuartusII的应用环境,仿真功能。 第4、5天课程设计 第6-9天答辩 第10天指导教师签名: 年 月 日系主任(或责任教师)签名: 年 月 日目录摘要 IAbstract II1. 设计任务 11.1初始条件 11.2课题要求 11.3设计要求 12. QuartusII简介 23. 课题内容 33.1 总体框图 33.2 各部分功能 33.2.1按键触发 33.2.2 LED显示部分 53.2.3计数部分 64. 心得体会 8参考文献 9附录一 Verilog HDL原程序 10附录二 总原理图 15摘要

3、FPGA(Field Programmable Gate Array)即“现场可编程门阵列”是应着当代微电子技术迅猛发展而产生的一种技术,到现在为止,已经存在了27年。由于其电路执行速度快、上市时间短、成本低廉、可靠性高、易于维护升级而被人们所青睐,目前已经广泛用于通信、信号处理、嵌入式处理器、图形处理和工业控制的领域。本次课设就是在Altera公司的FPGA设计平台QuartusII上进行的计数器设计。这是一个16位多模计数器,可实现多种不同进制的计数,以适应不同场合的应用。Abstract FPGA (Field Programmable Gate Array) is a kind of

4、technology that conform with the rapid development of microelectronics until now, has existed for 27 years. because of fast time to market, short, low-cost, high reliability, easy maintenance upgrades, it have been favored by people, is now widely used in communications, signal processing, embedded

5、processor, graphics processing and industrial control fields.This lesson is the design of counter based on Alteras FPGA design platform QuartusII. It is a 16-bit multi-mode counter, can realize a variety of binary counting, in order to adapt to different occasions applications.模可变16位加法计数器设计1. 设计任务1.

6、1初始条件QuartusII6.0、微机1.2课题要求 深入学习Verilog HDL语言与FPGA理论知识。利用QuartusII强大的硬件语言处理功能,数字电路仿真功能以及波形处理功能,实现模可变16位加法计数器设计。1.利用Verilog HDL语言描述计数器功能;2.用QuartusII对Verilog HDL语言进行仿真;1.3设计要求1.计数器可通过3个选择位M1,M2,M3实现最多8种不同模式的计数方式。2.以按键为触发信号,每按一次,计数器加1。3.当计数器进制满后,下一次触发清零。2. QuartusII简介Quartus II 是Altera公司的综合性PLD开发软件,支持

7、原理图、VHDL、VerilogHDL以及AHDL(Altera Hardware Description Language)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。Quartus II可以在XP、Linux以及Unix上使用,除了可以使用Tcl脚本完成设计流程外,提供了完善的用户图形界面设计方式。具有运行速度快,界面统一,功能集中,易学易用等特点。Quartus II支持Altera的IP核,包含了LPM/MegaFunction宏功能模块库,使用户可以充分利用成熟的模块,简化了设计的复杂性、加快了设计速度。对第三方EDA工具的良好支

8、持也使用户可以在设计流程的各个阶段使用熟悉的第三放EDA工具。此外,Quartus II 通过和DSP Builder工具与Matlab/Simulink相结合,可以方便地实现各种DSP应用系统;支持Altera的片上可编程系统(SOPC)开发,集系统级设计、嵌入式软件开发、可编程逻辑设计于一体,是一种综合性的开发平台。Maxplus II 作为Altera的上一代PLD设计软件,由于其出色的易用性而得到了广泛的应用。目前Altera已经停止了对Maxplus II 的更新支持,Quartus II 与之相比不仅仅是支持器件类型的丰富和图形界面的改变。Altera在Quartus II 中包含

9、了许多诸如SignalTap II、Chip Editor和RTL Viewer的设计辅助工具,集成了SOPC和HardCopy设计流程,并且继承了Maxplus II 友好的图形界面及简便的使用方法。Altera Quartus II 作为一种可编程逻辑的设计环境, 由于其强大的设计能力和直观易用的接口,越来越受到数字系统设计者的欢迎。Altera的Quartus II可编程逻辑软件属于第四代PLD开发平台。该平台支持一个工作组环境下的设计要求,其中包括支持基于Internet的协作设计。Quartus平台与Cadence、ExemplarLogic、 MentorGraphics、Syno

10、psys和Synplicity等EDA供应商的开发工具相兼容。改进了软件的LogicLock模块设计功能,增添 了FastFit编译选项,推进了网络编辑性能,而且提升了调试能力。支持MAX7000/MAX3000等乘积项器件3. 课题内容 众所周知,计数器在人们的日常生活中扮演着非常重要的角色,在生活的各个方面为人们带来的极大的方便。下面就来介绍此次课设所做的计数器。3.1 总体框图按键触发部分计数部分LED显示部分这个计数器主要由三部分组成:按键触发部分、计数部分、LED显示部分。图1即为其结构框图。图1 计数器总体框图3.2 各部分功能下面就来介绍计数器各个部分的具体功能。3.2.1按键触

11、发这部分功能其实是由两部分功能组成:按键去抖、按键控制。首先来介绍按键去抖功能。有点硬件常识的人都知道,按键是靠导电介质接触来实现其通断功能的。但是只要是有接触,就难免出现抖动现象,即导电介质在很短的时间内出现多次通断交替的现象。如果想要通过物理的方法除去这种抖动,则一个按键开关需要增加成本。这对于大批量生产时非常不利的。而且这种抖动的时间极短,在普通非逻辑电路的设计中,也不必太在意。只有在逻辑电路,特别是用FPGA设计的这种高频时钟逻辑电路中,才会产生影响。这时,去抖工作就显得非常重要。去抖的方法有很多,在这次课设中,也就是我下面将要介绍的这种方法名为中断去抖。它的原理可以归纳为八个字:低频

12、采样,高频处理。所谓低频采样,就是用低频时钟去驱动触发器,对输入信号进行采样。由于一般情况下,按键的抖动是在10ms20ms内的,所以只要将采样时钟设置在50HZ100HZ的范围内,就可以实现在按一次按键的情况下只采集到一个相异信号,这样就可以把抖动的原始信号与将要处理的信号隔离开了。在处理已采集到的信号时可以用两个串联的原始时钟触发器来进行。在第一个原始时钟触发器在第一个原始时钟上升沿采集到低频已采集信号时,必然与第二个触发器的此时的输出信号不同,而在第二个原始时钟上升沿到来后,第二个触发器也采集到的第一个触发器的输出信号,这时,两触发器输出信号相同。把这两个信号进行异或后就可以得到一个只有

13、一个时钟周期的时间的高频信号。在每次按键按下,或放开时,这个信号就会出现一次。再利用这个信号去触发原始时钟驱动的反相器,使得每次信号到来时,去抖模块的输出就与信号到来前相反。让输出与按键的初始状态相同,就实现的模块的输出与按键的同步,并且无抖动。它的主要实现代码如下:always(posedge clk or negedge rst) if(rst) begin count=b0; key_r=b0; endelse if(count=20hfffff) begin count=b0; key_r=key_i; endelse count=count+1;always(posedge clk

14、or negedge rst)if(rst) key_m=b0;else key_m=key_r;assign signal=key_r key_m;always(posedge clk or negedge rst) if(rst) key_o=b0;else if(signal) key_o=key_o;else ;其中,key_i为按键输入信号,key_o为模块输出信号,count是原始时钟计数器;图2为其时序仿真波形 图2 去抖模块时序仿真波形由时序仿真波形可以看出结果符合要求。下面要介绍的就是按键触发部分的第二部分按键控制。因为有时候计数不是从0,而是任意某个数。所以需要很快到达那个

15、数。设置这部分的目的就是为了方便使用者计数。这部分的功能就是在按键按下一定时间后,立即开始高速计数。这部分原理很简单,只是一个延时而已,在此就不详细说明了,其代码见附录。图3为其时序仿真波形图3 按键控制部分时序仿真波形由仿真波形可以看出其功能完全正确。3.2.2 LED显示部分顾名思义,此部分就是为了让LED能够正常显示而设计的。普通硬件电路上的LED是靠译码器译码的静态显示,这种显示方式结构及原理都很简单,在硬件电路中也比较实用。但是,在FPGA的设计中,是不能够采用这种显示方式的。因为FPGA的驱动电流不够大。普通LED每一位是由7段小的LED组成,每一段都需要一定的电流驱动,这样驱动一

16、位LED的电流就是每一段的7倍。这样,驱动起来已经快饱和了,再加上一般的LED数码显示需要68位LED,这样,如果用静态显示,那么驱动电流是绝对不够的,否则芯片可能因为驱动电流过大而烧毁。所以必须要采用另一种方法动态显示。动态显示就是利用多位LED的位选端进行快速的循环位选择,当循环频率达到一定速度后,则人眼是无法看出这种逐位选择的。这样,在相应的选位的同时,输入相应的LED段码,就能够让LED看起来好像静态显示一样,而且避免了驱动电流过大的现象。这部分外在的功能就是将每一位输入的8421BCD码译成LED的段选码。在写这段代码时,用到了Verilog HDL的一种函数结构定义了8421BCD

17、码到段选码的转换,其函数代码如下所示:function 6:0led_f;input3:0 bcd_f;case(bcd_f) 4b0000:led_f=7b1111110; 4b0001:led_f=7b0110000; 4b0010:led_f=7b1101101; 4b0011:led_f=7b1111001; 4b0100:led_f=7b0110011; 4b0101:led_f=7b1011011; 4b0110:led_f=7b1011111; 4b0111:led_f=7b1110000; 4b1000:led_f=7b1111111; 4b1001:led_f=7b11110

18、11; default:;endcaseendfunction在写后续代码时,只需要对其进行调用就可以。这种结构在很大程度上减少的代码量,而且方便了阅读以及修改。图4就是LED显示部分的时序仿真波形。图4 LED显示部分时序仿真波形从时序仿真波形可以看出除了一些毛刺之外,功能完全正确。由于毛刺存在时间极短,可以忽略。3.2.3计数部分计数部分是这个计数器的核心部分,最主要的功能都是由它完成的。它是由六种进制的计数器和计数器控制输出部分组成。控制输出部分里包含了十进制及其以下的进制计数。控制部分负责将通过选择位M1、M2、M3所选择的计数方式输出至LED显示部分。共可以选择8种不同的进制。在这个

19、设计中,这8钟计数方式分别为5、10、16、46、100、128、200、256进制。由于人们习惯于用10进制数显示各种进制计数,十进制数每位最大为9,而8421BCD码每位最大为15。所以在计数部分的代码编写过程中大量的用到了Verilog HDL语言的控制流结构 “if.else.”及“case.endcase”,它们的任务就是将8421BCD码的原本的16进制控制为10进制计数。这些控制流结构是编写各种代码都不可或缺的。下面的代码就是这个设计中一个典型的控制语句:3b010: if(bcd1=1 & bcd0=5) bcd1,bcd0=b0; else if(bcd0=9) begin

20、bcd0=b0; bcd1=bcd1+1; end else;这段代码的目的是完成16进制计数的两位8421BCD码的计数编码。图5为十六位加计数器时序仿真波形图。图5 十六进制加法模块时序仿真波形其它计数模块与其类似,在此不多赘述。图6是控制输出部分的时序仿真波形。图6 控制输出部分时序仿真波形 将上述各个模块用QuartusII所提供的原理图连接工具进行顶层模块的连接,可得到最终设计,其顶层模块原理图见附录二。4. 心得体会 这次课程设计让我进一步了解了FPGA这种可编程硬件。通过自己编写程序,我对Verilog HDL语言也有了更加深入的理解和掌握。但是在写程序的过程中,还是遇到了很多困

21、难,就如功能仿真结果正确,但是时序仿真却出问题。即使是很仔细的检查程序,也发现不了实质性问题;虽然警告这种东西可以不用理它,但是如果警告过多,程序就无法完成相应的功能。很多时候都能碰到这些问题,虽然查阅的很多资料,但是很多问题到现在都还没有解决,这也算是这次课设完成后留下的遗憾吧。不过我相信,问题总会有解决的一天。参考文献1吴戈.Verilog HDL与数字系统设计简明教程.北京:人民邮电出版社,2009.22夏宇闻.Verilog数字系统设计教程.北京:北京航空航天大学出版社,2008.63潘松,黄继业.EDA技术与VHDL.北京:清华大学出版社,2007.14曹昕燕,周凤臣,聂春燕.EDA

22、技术试验与课程设计.北京:清华大学出版社,2006.1附录一 Verilog HDL原程序1. 按键去抖module key(clk,rst,key_i,key_o);input clk,rst;input key_i;output key_o;reg key_o,key_r,key_m;reg19:0count;always(posedge clk or negedge rst) if(rst) begin count=b0; key_r=b0; endelse if(count=20hfffff) begin count=b0; key_r=key_i; endelse count=cou

23、nt+1;always(posedge clk or negedge rst)if(rst) key_m=b0;else key_m=key_r;assign signal=key_r key_m;always(posedge clk or negedge rst) if(rst) key_o=b0;else if(signal) key_o=key_o;else ;endmodule2. 按键控制module key_c(clk,rst,key,key_o);input clk,rst;input key;output key_o;reg key_o;reg key_r;reg 20:0 c

24、ount_p;reg 25:0 count_k;reg pulse;wire signal_k;reg signal_p;always(posedge clk or negedge rst) if(rst) begin count_p=b0; pulse=b0; endelse if(count_p=2000000) begin count_p=b0; pulse=b1; endelse begin count_p=count_p+1; pulse=b0; endalways(posedge clk or negedge rst) if(rst) begin signal_p=b0; coun

25、t_k=b0; endelse if(key=b1) if(count_k=26h3fffff) begin count_k=count_k; signal_p=pulse; end else count_k=count_k+1;else begin count_k=b0; signal_p=b0; end always(posedge clk or negedge rst)if(rst) key_r=b0;else key_r=key;assign signal_k=key & !key_r;always(posedge clk or negedge rst)if(rst) key_o=b0

26、;else key_o=(signal_k | signal_p);endmodule3. LED显示控制module led_7s(clk,rst,bcd7,bcd6,bcd5,bcd4,bcd3,bcd2,bcd1,bcd0, led,scan);input clk,rst;input 3:0 bcd7,bcd6,bcd5,bcd4,bcd3,bcd2,bcd1,bcd0;output 6:0 led;reg 6:0 led;output 2:0 scan;reg 2:0 scan;reg 15:0 count;function 6:0led_f;input3:0 bcd_f;case(b

27、cd_f) 4b0000:led_f=7b1111110; 4b0001:led_f=7b0110000; 4b0010:led_f=7b1101101; 4b0011:led_f=7b1111001; 4b0100:led_f=7b0110011; 4b0101:led_f=7b1011011; 4b0110:led_f=7b1011111; 4b0111:led_f=7b1110000; 4b1000:led_f=7b1111111; 4b1001:led_f=7b1111011; default:;endcaseendfunctionalways(posedge clk or neged

28、ge rst) if(rst) begin count=b0; scan =b0; endelse if(count=16h1) begin count=b0; scan =scan+1; endelse count=count+1;always(posedge clk or negedge rst)if(rst) led=bcd0;else case(scan) 3b000:led=led_f(bcd0); 3b001:led=led_f(bcd1); 3b010:led=led_f(bcd2); 3b011:led=led_f(bcd3); 3b100:led=led_f(bcd4); 3

29、b101:led=led_f(bcd5); 3b110:led=led_f(bcd6); 3b111:led=led_f(bcd7); default:; endcaseendmodule4. 计数进制控制module counter_c(clk,rst,key,m2,m1,m0,b1_16,b0_16,b1_46,b0_46,b1_100,b0_100,b2_128,b1_128,b0_128,b2_200,b1_200,b0_200,b2_256,b1_256,b0_256,bcd2_o,bcd1_o,bcd0_o, signal_16,signal_46,signal_100,signa

30、l_128,signal_200,signal_256);input clk,rst;input key;input m2,m1,m0;input 3:0 b1_16,b0_16;input 3:0 b1_46,b0_46;input 3:0 b1_100,b0_100;input 3:0 b2_128,b1_128,b0_128;input 3:0 b2_200,b1_200,b0_200;input 3:0 b2_256,b1_256,b0_256;output 3:0 bcd2_o,bcd1_o,bcd0_o;reg 3:0 bcd2_o,bcd1_o,bcd0_o;output signal_16,signal_46,signal_100,signal_128,signal_200,signal_256;reg signal_16,signal_46,signal_100,signal_1

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1