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

上传人:b****5 文档编号:3360087 上传时间:2022-11-22 格式:DOCX 页数:17 大小:189.26KB
下载 相关 举报
基于FPGA的模可变16进制加法器的设计.docx_第1页
第1页 / 共17页
基于FPGA的模可变16进制加法器的设计.docx_第2页
第2页 / 共17页
基于FPGA的模可变16进制加法器的设计.docx_第3页
第3页 / 共17页
基于FPGA的模可变16进制加法器的设计.docx_第4页
第4页 / 共17页
基于FPGA的模可变16进制加法器的设计.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

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

《基于FPGA的模可变16进制加法器的设计.docx》由会员分享,可在线阅读,更多相关《基于FPGA的模可变16进制加法器的设计.docx(17页珍藏版)》请在冰豆网上搜索。

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

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

课程设计任务书

学生姓名:

兰翔专业班级:

电子科学与技术2班

指导教师:

葛华工作单位:

信息工程学院

题目:

模可变16位加法计数器设计

初始条件:

QuartusII6.0,微机

要求完成的主要任务:

深入学习VerilogHDL语言与FPGA理论知识。

利用QuartusII强大的硬件语言处理功能,数字电路仿真功能以及波形处理功能,实现模可变16位加法计数器设计。

1.利用VerilogHDL语言描述计数器功能;

2.用QuartusII对VerilogHDL语言进行仿真;

3.撰写《EDA技术应用实践》课程设计说明书。

时间安排:

学习VerilogHDL语言的概况第1天

学习VerilogHDL语言的基本知识第2、3天

学习QuartusII的应用环境,仿真功能。

第4、5天

课程设计第6-9天

答辩第10天

指导教师签名:

年月日

系主任(或责任教师)签名:

年月日

目录

摘要I

AbstractII

1.设计任务1

1.1初始条件1

1.2课题要求1

1.3设计要求1

2.QuartusII简介2

3.课题内容3

3.1总体框图3

3.2各部分功能3

3.2.1按键触发3

3.2.2LED显示部分5

3.2.3计数部分6

4.心得体会8

参考文献9

附录一VerilogHDL原程序10

附录二总原理图15

摘要

FPGA(FieldProgrammableGateArray)即“现场可编程门阵列”是应着当代微电子技术迅猛发展而产生的一种技术,到现在为止,已经存在了27年。

由于其电路执行速度快、上市时间短、成本低廉、可靠性高、易于维护升级而被人们所青睐,目前已经广泛用于通信、信号处理、嵌入式处理器、图形处理和工业控制的领域。

本次课设就是在Altera公司的FPGA设计平台QuartusII上进行的计数器设计。

这是一个16位多模计数器,可实现多种不同进制的计数,以适应不同场合的应用。

Abstract

FPGA(FieldProgrammableGateArray)isakindoftechnologythatconformwiththerapiddevelopmentofmicroelectronicsuntilnow,hasexistedfor27years.becauseoffasttimetomarket,short,low-cost,highreliability,easymaintenanceupgrades,ithavebeenfavoredbypeople,isnowwidelyusedincommunications,signalprocessing,embeddedprocessor,graphicsprocessingandindustrialcontrolfields.

ThislessonisthedesignofcounterbasedonAltera'sFPGAdesignplatformQuartusII.Itisa16-bitmulti-modecounter,canrealizeavarietyofbinarycounting,inordertoadapttodifferentoccasionsapplications.

模可变16位加法计数器设计

 

1.设计任务

1.1初始条件

QuartusII6.0、微机

1.2课题要求

深入学习VerilogHDL语言与FPGA理论知识。

利用QuartusII强大的硬件语言处理功能,数字电路仿真功能以及波形处理功能,实现模可变16位加法计数器设计。

1.利用VerilogHDL语言描述计数器功能;

2.用QuartusII对VerilogHDL语言进行仿真;

1.3设计要求

1.计数器可通过3个选择位M1,M2,M3实现最多8种不同模式的计数方式。

2.以按键为触发信号,每按一次,计数器加1。

3.当计数器进制满后,下一次触发清零。

2.QuartusII简介

QuartusII是Altera公司的综合性PLD开发软件,支持原理图、VHDL、VerilogHDL以及AHDL(AlteraHardwareDescriptionLanguage)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。

QuartusII可以在XP、Linux以及Unix上使用,除了可以使用Tcl脚本完成设计流程外,提供了完善的用户图形界面设计方式。

具有运行速度快,界面统一,功能集中,易学易用等特点。

QuartusII支持Altera的IP核,包含了LPM/MegaFunction宏功能模块库,使用户可以充分利用成熟的模块,简化了设计的复杂性、加快了设计速度。

对第三方EDA工具的良好支持也使用户可以在设计流程的各个阶段使用熟悉的第三放EDA工具。

此外,QuartusII通过和DSPBuilder工具与Matlab/Simulink相结合,可以方便地实现各种DSP应用系统;支持Altera的片上可编程系统(SOPC)开发,集系统级设计、嵌入式软件开发、可编程逻辑设计于一体,是一种综合性的开发平台。

MaxplusII作为Altera的上一代PLD设计软件,由于其出色的易用性而得到了广泛的应用。

目前Altera已经停止了对MaxplusII的更新支持,QuartusII与之相比不仅仅是支持器件类型的丰富和图形界面的改变。

Altera在QuartusII中包含了许多诸如SignalTapII、ChipEditor和RTLViewer的设计辅助工具,集成了SOPC和HardCopy设计流程,并且继承了MaxplusII友好的图形界面及简便的使用方法。

AlteraQuartusII作为一种可编程逻辑的设计环境,由于其强大的设计能力和直观易用的接口,越来越受到数字系统设计者的欢迎。

Altera的QuartusII可编程逻辑软件属于第四代PLD开发平台。

该平台支持一个工作组环境下的设计要求,其中包括支持基于Internet的协作设计。

Quartus平台与Cadence、ExemplarLogic、MentorGraphics、Synopsys和Synplicity等EDA供应商的开发工具相兼容。

改进了软件的LogicLock模块设计功能,增添了FastFit编译选项,推进了网络编辑性能,而且提升了调试能力。

支持MAX7000/MAX3000等乘积项器件

3.课题内容

众所周知,计数器在人们的日常生活中扮演着非常重要的角色,在生活的各个方面为人们带来的极大的方便。

下面就来介绍此次课设所做的计数器。

3.1总体框图

按键触发部分

计数部分

LED显示部分

这个计数器主要由三部分组成:

按键触发部分、计数部分、LED显示部分。

图1即为其结构框图。

 

图1计数器总体框图

3.2各部分功能

下面就来介绍计数器各个部分的具体功能。

3.2.1按键触发

这部分功能其实是由两部分功能组成:

按键去抖、按键控制。

首先来介绍按键去抖功能。

有点硬件常识的人都知道,按键是靠导电介质接触来实现其通断功能的。

但是只要是有接触,就难免出现抖动现象,即导电介质在很短的时间内出现多次通断交替的现象。

如果想要通过物理的方法除去这种抖动,则一个按键开关需要增加成本。

这对于大批量生产时非常不利的。

而且这种抖动的时间极短,在普通非逻辑电路的设计中,也不必太在意。

只有在逻辑电路,特别是用FPGA设计的这种高频时钟逻辑电路中,才会产生影响。

这时,去抖工作就显得非常重要。

去抖的方法有很多,在这次课设中,也就是我下面将要介绍的这种方法名为中断去抖。

它的原理可以归纳为八个字:

低频采样,高频处理。

所谓低频采样,就是用低频时钟去驱动触发器,对输入信号进行采样。

由于一般情况下,按键的抖动是在10ms~20ms内的,所以只要将采样时钟设置在50HZ~100HZ的范围内,就可以实现在按一次按键的情况下只采集到一个相异信号,这样就可以把抖动的原始信号与将要处理的信号隔离开了。

在处理已采集到的信号时可以用两个串联的原始时钟触发器来进行。

在第一个原始时钟触发器在第一个原始时钟上升沿采集到低频已采集信号时,必然与第二个触发器的此时的输出信号不同,而在第二个原始时钟上升沿到来后,第二个触发器也采集到的第一个触发器的输出信号,这时,两触发器输出信号相同。

把这两个信号进行异或后就可以得到一个只有一个时钟周期的时间的高频信号。

在每次按键按下,或放开时,这个信号就会出现一次。

再利用这个信号去触发原始时钟驱动的反相器,使得每次信号到来时,去抖模块的输出就与信号到来前相反。

让输出与按键的初始状态相同,就实现的模块的输出与按键的同步,并且无抖动。

它的主要实现代码如下:

always@(posedgeclkornegedgerst)

if(~rst)

begin

count<='b0;

key_r<='b0;

end

elseif(count==20'hfffff)

begin

count<='b0;

key_r<=key_i;

end

else

count<=count+1;

always@(posedgeclkornegedgerst)

if(~rst)key_m<='b0;

elsekey_m<=key_r;

assignsignal=key_r^key_m;

always@(posedgeclkornegedgerst)

if(~rst)

key_o<='b0;

elseif(signal)

key_o<=~key_o;

else;

其中,key_i为按键输入信号,key_o为模块输出信号,count是原始时钟计数器;图2为其时序仿真波形

图2去抖模块时序仿真波形

由时序仿真波形可以看出结果符合要求。

下面要介绍的就是按键触发部分的第二部分——按键控制。

因为有时候计数不是从0,而是任意某个数。

所以需要很快到达那个数。

设置这部分的目的就是为了方便使用者计数。

这部分的功能就是在按键按下一定时间后,立即开始高速计数。

这部分原理很简单,只是一个延时而已,在此就不详细说明了,其代码见附录。

图3为其时序仿真波形

图3按键控制部分时序仿真波形

由仿真波形可以看出其功能完全正确。

3.2.2LED显示部分

顾名思义,此部分就是为了让LED能够正常显示而设计的。

普通硬件电路上的LED是靠译码器译码的静态显示,这种显示方式结构及原理都很简单,在硬件电路中也比较实用。

但是,在FPGA的设计中,是不能够采用这种显示方式的。

因为FPGA的驱动电流不够大。

普通LED每一位是由7段小的LED组成,每一段都需要一定的电流驱动,这样驱动一位LED的电流就是每一段的7倍。

这样,驱动起来已经快饱和了,再加上一般的LED数码显示需要6~8位LED,这样,如果用静态显示,那么驱动电流是绝对不够的,否则芯片可能因为驱动电流过大而烧毁。

所以必须要采用另一种方法——动态显示。

动态显示就是利用多位LED的位选端进行快速的循环位选择,当循环频率达到一定速度后,则人眼是无法看出这种逐位选择的。

这样,在相应的选位的同时,输入相应的LED段码,就能够让LED看起来好像静态显示一样,而且避免了驱动电流过大的现象。

这部分外在的功能就是将每一位输入的8421BCD码译成LED的段选码。

在写这段代码时,用到了VerilogHDL的一种函数结构定义了8421BCD码到段选码的转换,其函数代码如下所示:

function[6:

0]led_f;

input[3:

0]bcd_f;

case(bcd_f)

4'b0000:

led_f=7'b1111110;

4'b0001:

led_f=7'b0110000;

4'b0010:

led_f=7'b1101101;

4'b0011:

led_f=7'b1111001;

4'b0100:

led_f=7'b0110011;

4'b0101:

led_f=7'b1011011;

4'b0110:

led_f=7'b1011111;

4'b0111:

led_f=7'b1110000;

4'b1000:

led_f=7'b1111111;

4'b1001:

led_f=7'b1111011;

default:

;

endcase

endfunction

在写后续代码时,只需要对其进行调用就可以。

这种结构在很大程度上减少的代码量,而且方便了阅读以及修改。

图4就是LED显示部分的时序仿真波形。

图4LED显示部分时序仿真波形

从时序仿真波形可以看出除了一些毛刺之外,功能完全正确。

由于毛刺存在时间极短,可以忽略。

3.2.3计数部分

计数部分是这个计数器的核心部分,最主要的功能都是由它完成的。

它是由六种进制的计数器和计数器控制输出部分组成。

控制输出部分里包含了十进制及其以下的进制计数。

控制部分负责将通过选择位M1、M2、M3所选择的计数方式输出至LED显示部分。

共可以选择8种不同的进制。

在这个设计中,这8钟计数方式分别为5、10、16、46、100、128、200、256进制。

由于人们习惯于用10进制数显示各种进制计数,十进制数每位最大为9,而8421BCD码每位最大为15。

所以在计数部分的代码编写过程中大量的用到了VerilogHDL语言的控制流结构“if….else….”及“case….endcase”,它们的任务就是将8421BCD码的原本的16进制控制为10进制计数。

这些控制流结构是编写各种代码都不可或缺的。

下面的代码就是这个设计中一个典型的控制语句:

3'b010:

if(bcd1==1&&bcd0==5)

{bcd1,bcd0}<='b0;

elseif(bcd0==9)

begin

bcd0<='b0;

bcd1<=bcd1+1;

end

else;

这段代码的目的是完成16进制计数的两位8421BCD码的计数编码。

图5为十六位加计数器时序仿真波形图。

图5十六进制加法模块时序仿真波形

其它计数模块与其类似,在此不多赘述。

图6是控制输出部分的时序仿真波形。

图6控制输出部分时序仿真波形

将上述各个模块用QuartusII所提供的原理图连接工具进行顶层模块的连接,可得到最终设计,其顶层模块原理图见附录二。

4.心得体会

这次课程设计让我进一步了解了FPGA这种可编程硬件。

通过自己编写程序,我对VerilogHDL语言也有了更加深入的理解和掌握。

但是在写程序的过程中,还是遇到了很多困难,就如功能仿真结果正确,但是时序仿真却出问题。

即使是很仔细的检查程序,也发现不了实质性问题;虽然警告这种东西可以不用理它,但是如果警告过多,程序就无法完成相应的功能。

很多时候都能碰到这些问题,虽然查阅的很多资料,但是很多问题到现在都还没有解决,这也算是这次课设完成后留下的遗憾吧。

不过我相信,问题总会有解决的一天。

参考文献

[1]吴戈.VerilogHDL与数字系统设计简明教程.北京:

人民邮电出版社,2009.2

[2]夏宇闻.Verilog数字系统设计教程.北京:

北京航空航天大学出版社,2008.6

[3]潘松,黄继业.EDA技术与VHDL.北京:

清华大学出版社,2007.1

[4]曹昕燕,周凤臣,聂春燕.EDA技术试验与课程设计.北京:

清华大学出版社,2006.1

附录一VerilogHDL原程序

1.按键去抖

modulekey(clk,rst,key_i,key_o);

inputclk,rst;

inputkey_i;

outputkey_o;

regkey_o,key_r,key_m;

reg[19:

0]count;

always@(posedgeclkornegedgerst)

if(~rst)

begin

count<='b0;

key_r<='b0;

end

elseif(count==20'hfffff)

begin

count<='b0;

key_r<=key_i;

end

else

count<=count+1;

always@(posedgeclkornegedgerst)

if(~rst)key_m<='b0;

elsekey_m<=key_r;

assignsignal=key_r^key_m;

always@(posedgeclkornegedgerst)

if(~rst)

key_o<='b0;

elseif(signal)

key_o<=~key_o;

else;

endmodule

2.按键控制

modulekey_c(clk,rst,key,key_o);

inputclk,rst;

inputkey;

outputkey_o;

regkey_o;

regkey_r;

reg[20:

0]count_p;

reg[25:

0]count_k;

regpulse;

wiresignal_k;

regsignal_p;

always@(posedgeclkornegedgerst)

if(~rst)

begin

count_p<='b0;

pulse<='b0;

end

elseif(count_p==2000000)

begin

count_p<='b0;

pulse<='b1;

end

else

begin

count_p<=count_p+1;

pulse<='b0;

end

always@(posedgeclkornegedgerst)

if(~rst)

begin

signal_p<='b0;

count_k<='b0;

end

elseif(key=='b1)

if(count_k==26'h3fffff)

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@(posedgeclkornegedgerst)

if(~rst)key_r<='b0;

elsekey_r<=key;

assignsignal_k=key&&!

key_r;

always@(posedgeclkornegedgerst)

if(~rst)key_o<='b0;

elsekey_o<=(signal_k||signal_p);

endmodule

3.LED显示控制

moduleled_7s(clk,rst,bcd7,bcd6,bcd5,bcd4,bcd3,bcd2,bcd1,bcd0,

led,scan);

inputclk,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:

0]led_f;

input[3:

0]bcd_f;

case(bcd_f)

4'b0000:

led_f=7'b1111110;

4'b0001:

led_f=7'b0110000;

4'b0010:

led_f=7'b1101101;

4'b0011:

led_f=7'b1111001;

4'b0100:

led_f=7'b0110011;

4'b0101:

led_f=7'b1011011;

4'b0110:

led_f=7'b1011111;

4'b0111:

led_f=7'b1110000;

4'b1000:

led_f=7'b1111111;

4'b1001:

led_f=7'b1111011;

default:

;

endcase

endfunction

always@(posedgeclkornegedgerst)

if(~rst)

begin

count<='b0;

scan<='b0;

end

elseif(count==16'h1)

begin

count<='b0;

scan<=scan+1;

end

else

count<=count+1;

always@(posedgeclkornegedgerst)

if(~rst)

led<=bcd0;

else

case(scan)

3'b000:

led<=led_f(bcd0);

3'b001:

led<=led_f(bcd1);

3'b010:

led<=led_f(bcd2);

3'b011:

led<=led_f(bcd3);

3'b100:

led<=led_f(bcd4);

3'b101:

led<=led_f(bcd5);

3'b110:

led<=led_f(bcd6);

3'b111:

led<=led_f(bcd7);

default:

;

endcase

endmodule

4.计数进制控制

modulecounter_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,signal_128,signal_200,signal_256);

inputclk,rst;

inputkey;

inputm2,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;

outputsignal_16,signal_46,signal_100,signal_128,signal_200,signal_256;

regsignal_16,signal_46,signal_100,signal_1

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

当前位置:首页 > 小学教育 > 学科竞赛

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

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