首页资源分类嵌入式开发嵌入式系统 > 用verliog语言设计计算器

用verliog语言设计计算器

已有 460221个资源

下载专区


TI最新应用解决方案

工业电子 汽车电子 个人消费电子

上传者其他资源

文档信息举报收藏

标    签: verlig计算器

分    享:

文档简介

绍了一个简单计算器的设计,该设计采用了现场可编程逻辑器件FPGA设计,并基于硬件描述语言VHDL在Altera公司的Quartus Ⅱ软件上实现仿真

文档预览

目录 第一章设计任务及要求 2 1.1课程设计依据 2 1.2课程设计内容 2 第二章 设计思路 3 2.1设计原理 3 2.1.1计算器原理 3 2.1.2数码管显示原理 3 2.1.3 8位扫描原理 4 2.2设计总体框图 5 第三章 设计源序及分析 6 3.1计算器模块 6 3.1.1计算器源程序 6 3.1.2模块分析 6 3.2数码管显示模块 7 3.2.1数码管源程序 7 3.2.2模块分析 7 3.3循环扫描模块 8 3.3.1循环扫描程序 8 3.3.2模块分析 8 3.4总程序 9 3.4.1总体源程序 9 3.4.2程序分析 11 第四章 序仿真结果及分析 12 4.1计算器设计仿真及分析 12 4.2数码管仿真图及分析 13 4.3总体仿真图 14 第五章 结果验证 15 5.1实验结果及分析 15 第六章心得体会 16 第七章 参考文献 16 第一章设计任务及要求 1.1课程设计依据 在掌握常用数字电路功能和原理的基础上,根据EDA技术课程所学知识,利用硬件描述语言Verilog HDL、EDA软件Quartus II和硬件平台Cyclone/Cyclone II FPGA进行电路系统的设计。 1.2课程设计内容 设计一个简单计算器,输入为8位二进制数,分别用两位数码管显示,输出的计算结果为16位二进制数,并用四位数码管显示,能够实现+、-、 *、/ 四种运算,其中除法的结果显示分为商和余数两部分,分别用两位数码管显示。 1.3课程设计要求 1、 要求独立完成设计任务。 2、 课程设计说明书封面格式要求见《天津城市建设学院课程设计教学规范》附表1。 3、 课程设计的说明书要求简洁、通顺,计算正确,图纸表达内容完整、清楚、规范。 4、 测试要求:根据题目的特点,采用相应的时序仿真或者在实验系统上观察结果。 5、 课程设计说明书要求: 1) 说明题目的设计原理和思路、采用方法及设计流程。 2) 系统框图、Verilog语言设计程序或原理图。 3) 对各子模块的功能以及各子模块之间的关系做较详细的描述。 4) 详细说明调试方法和调试过程。 5) 说明测试结果:仿真时序图和结果显示图,并对其进行说明和分析。 第二章 设计思路 2.1设计原理 2.1.1计算器原理 Verilog语言中可直接用运算符+、-、*、/、%来实现四则运算,系统会根据程序自动综合出相应的计算器。 2.1.2数码管显示原理 7段数码是纯组合电路,通常的小规模专用IC,如74或4000系列的器件只能作十进制BCD码译码,然而数字系统中的数据处理和运算都是2进制的,所以输出表达都是16进制的,为了满足16进制数的译码显示,最方便的方法就是利用译码程序在FPGA/CPLD中来实现。设计7段译码器,输出信号LED7S的7位分别接如图一数码管的7个段,高位在左,低位在右。例如当LED7S输出为“1101101”时,数码管的7个段:g、f、e、d、c、b、a分别接1、1、0、1、1、0、1;接有高电平的段发亮,于是数码管显示“5”。注意,这里没有考虑表示小数点的发光管,如果要考虑,需要增加段h。 图一 共阴数码管及其电路 2.1.3 8位扫描原理 图二所示的是8位数码扫描显示电路,其中每个数码管的7个段: g、f、e、d、c、b、a都分别连在一起,8个数码管分别由8个选通信号k1、k2、…k8来选择。被选通的数码管显示数据,其余关闭。如在某一时刻,k3为高电平,其余选通信号为低电平,这时仅k3对应的数码管显示来自段信号端的数据,而其它7个数码管呈现关闭状态。根据这种电路状况,如果希望在8个数码管显示希望的数据,就必须使得8个选通信号k1、k2、…k8分别被单独选通,并在此同时,在段信号输入口加上希望在该对应数码管上显示的数据,于是随着选通信号的扫变,就能实现扫描显示的目的。 图二 8位数码驱动显示电路 扫描电路通过可调时钟输出片选地址SEL[2..0]。由SEL[2..0] 通过3-8译码器决定了8位中的哪一位显示,SEL[2..0]变化的快慢决定了扫描频率f扫描的快慢。扫描频率大于人眼的分辨率时,呈现出八个数码管同时点亮。 2.2设计总体框图 图三 设计总体框图 第三章 设计源序及分析 3.1计算器模块 3.1.1计算器源程序 mdule jsq(a,b,c,out); input[7:0]a,b; input[1:0]c; otput[15:0]out; reg [15:0]out reg[7:0]out1,out2; always@(a,b,c,out) case(c) 2'b00:out=a+b; 2'b01:out=a-b; 2'b10:out=a*b; 2'b11: begin out1=a/b; out2=a%b; out={out1,out2}; end default:; endcase endmodule 3.1.2模块分析 该模块是本次设计的核心部分,用于实现四则运算,两位八位二进制数a、b作为待计算的输入,并输入两位二进制数c作为计算功能选择,00代表加法运算、01代表减法运算、10代表乘法运算、11代表除法运算。输出16位二进制数out位运算结果。并在总体设计中把输入、输出端接到数码管上。 3.2数码管显示模块 3.2.1数码管源程序 module DECL7S (A, LED7S); input [3:0] A; output [6:0] LED7S; reg [6:0] LED7S; always @(A) begin case(A) 4'b0000 : LED7S<=7'b0111111; 4'b0001: LED7S <= 7'b0000110 ; 4'b0010: LED7S <= 7'b1011011; 4'b0011: LED7S <= 7'b1001111; 4'b0100: LED7S <= 7'b1100110 ; 4'b0101: LED7S <= 7'b1101101; 4'b0110: LED7S <= 7'b1111101 ; 4'b0111: LED7S <= 7'b0000111 ; 4'b1000: LED7S <= 7'b1111111 ; 4'b1001: LED7S <= 7'b1101111 ; 4'b1010: LED7S <= 7'b1110111 ; 4'b1011: LED7S <= 7'b1111100 ; 4'b1100: LED7S <= 7'b0111001 ; 4'b1101: LED7S <= 7'b1011110 ; 4'b1110: LED7S <= 7'b1111001 ; 4'b1111: LED7S <= 7'b1110001 ; endcase end endmodule 3.2.2模块分析 该模块是整个设计中的显示部分,是一个编码器组合逻辑设计,每个数码管可显示十六进制0至F,对应4位二进制数,因此输入端a、b分别用两个数码管显示,输出out用四个数码管显示,该设计中需要八个同样的数码管显示器,即。此模块将在总程序中被调用八次。 3.3循环扫描模块 3.3.1循环扫描程序 modulexhsm(clk,rst,count,Dout); inputclk,rst; output[6:0]Dout; output[2:0]count; reg[6:0]Dout; reg[2:0]count; always@(posedge clk or negedge rst) begin if(!rst) count<=3'b000; else if(count==3'b111) count<=3'b000; else count<=count+3'b001; end always@(posedge clk) begin case(count) 3'b000: Dout<=LED7S1; 3'b001:Dout<=LED7S2; 3'b010:Dout<=LED7S3; 3'b011:Dout<=LED7S4; 3'b100: Dout<=LED7S5; 3'b101:Dout<=LED7S6; 3'b110:Dout<=LED7S7; 3'b111:Dout<=LED7S8; endcase end endmodule 3.3.2模块分析 该模块是一个循环计数器,在时钟和复位信号的控制下,从000—111循环计数分别控制八个数码管循环点亮,由于时钟的频率比较快,大于人眼的分辨率,所以显示出八个数码管同时点亮,即同时显示计算器的输入、输出。 3.4总程序 3.4.1总体源程序 module jsq9(a,b,c,Dout,count,clk,rst); input[7:0]a,b; input clk,rst; input[1:0]c; output[6:0]Dout; output [2:0]count; reg[6:0]Dout; reg[2:0]count; reg[15:0]out; reg[6:0] LED7S1,LED7S2,LED7S3,LED7S4, LED7S5,LED7S6,LED7S7,LED7S8; DECL7S u1(.A(a[7:4]) , .LED7S(LED7S1)); DECL7S u2(.A(a[3:0]) , .LED7S(LED7S2)); DECL7S u3(.A(b[7:4]) , .LED7S(LED7S3)); DECL7S u4(.A(b[3:0]) , .LED7S(LED7S4)); DECL7S u5(.A(out[15:12]) , .LED7S(LED7S5)); DECL7S u6(.A(out[11:8]) , .LED7S(LED7S6)); DECL7S u7(.A(out[7:4]) , .LED7S(LED7S7)); DECL7S u8(.A(out[3:0]) , .LED7S(LED7S8)); reg[7:0]out1,out2; always@(a,b,c,Dout,count,clk,rst) case(c) 2'b00:out=a+b; 2'b01:out=a-b; 2'b10:out=a*b; 2'b11: begin out1=a/b; out2=a%b; out={out1,out2}; end default:; endcase always@(posedge clk or negedge rst) begin if(!rst) count<=3'b000; else if(count==3'b111) count<=3'b000; else count<=count+3'b001; end always@(posedge clk) begin case(count) 3'b000: Dout<=LED7S1; 3'b001:Dout<=LED7S2; 3'b010:Dout<=LED7S3; 3'b011:Dout<=LED7S4; 3'b100: Dout<=LED7S5; 3'b101:Dout<=LED7S6; 3'b110:Dout<=LED7S7; 3'b111:Dout<=LED7S8; endcase end endmodule module DECL7S (A, LED7S); input [3:0] A; output [6:0] LED7S; reg [6:0] LED7S; always @(A) begin case(A) 4'b0000 : LED7S<=7'b0111111; 4'b0001: LED7S <= 7'b0000110 ; 4'b0010: LED7S <= 7'b1011011; 4'b0011: LED7S <= 7'b1001111; 4'b0100: LED7S <= 7'b1100110 ; 4'b0101: LED7S <= 7'b1101101; 4'b0110: LED7S <= 7'b1111101 ; 4'b0111: LED7S <= 7'b0000111 ; 4'b1000: LED7S <= 7'b1111111 ; 4'b1001: LED7S <= 7'b1101111 ; 4'b1010: LED7S <= 7'b1110111 ; 4'b1011: LED7S <= 7'b1111100 ; 4'b1100: LED7S <= 7'b0111001 ; 4'b1101: LED7S <= 7'b1011110 ; 4'b1110: LED7S <= 7'b1111001 ; 4'b1111: LED7S <= 7'b1110001 ; endcase end endmodule 3.4.2程序分析 该程序是本次设计的最终程序,主要是将以上三个模块联系起来。 其中反复调用数码管显示模块,将其与计算器模块相连。其输入A在u1中与计算器输入a的高四位相连,输出LED7S与LED7S1相连,在硬件上实现用一个数码管显示输入a的高四位,以此类推u2模块实现用数码管显示a的低四位,u3对应b的高四位,u4对应b的第四位,u5对应out的高四位,u6对应out次高四位,u7对应out的次低四位,u8对应out的低四位。 循环计数器模块,与八个数码管显示模块相连,当输出count为某一确定时,将不同数码管的输出赋给程序的总输出Dout点亮相应的数码管,例如当count=3‘b000时,LED7S1赋给Dout,此时试验箱是对应输入a的高四位的数码管被点亮。 通过以上连接该程序实现了输入为8位二进制数,分别用两位数码管显示,输出的计算结果为16位二进制数,并用四位数码管显示,能够实现+、-、 *、/ 四种运算,其中除法的结果显示分为商和余数两部分,分别用两位数码管显示的设计要求。 第四章 序仿真结果及分析 4.1计算器设计仿真及分析 图四 计算器仿真图 如图四所示为计算器的实序仿真图,当输入a为00000001、b为00000001、c为01时输出out为0000000000000000即1-1=0;当输入a=00000010,b=00000010,c=10时输出out=0000000000000100.即2*2=4,当输入a=00000011,b=00000011,c=11时输出out1=00000001,out2=00000000,即3/3=1余数为0当输入a=00000100,b=00000100,c=00时输出out=00001000即4+4=8.经此验证分析证明此计算器计算准确无误。模块设计成功。 4.2数码管仿真图及分析 图五 数码管仿真图 如图五所示为数码管显示器的时序仿真波形,当输入为0011时七段数码管中abcdefg的高低电平分别为1111001即abcdg点亮显示数字3,当输入为0000时七段数码管对应显示1111110即abcdef被点亮显示数字0.经验证其他数字显示均正确,七段数码管显示器模块设计仿真成功。 4.3总体仿真图 图六 总体仿真图 图六所示为整个设计的仿真波形图,对其分析如下,首先分析最下边三行的循环计数器部分,当复位信号为0时count计为000当复位为1每当时钟上升沿来临时count加1,计满后恢复000继续循环,此部分验证成功。 接下来看控制显示部分,输入a=00000000,b=00000000,c=00,当count=000时显示a的高四位0000,Dout=01111111,显示数字0;正确。当count=001时显示a的低四位0000,Dout=01111111,显示数字0,正确。经验证,其他数码管显示与相应的输入也是一一对应,因此时序仿真成功。 第五章 结果验证 5.1实验结果及分析 如下图所示在试验箱中输入a=00000010,b=00001100,c=00即显示如下结果:02+0C=000E,即2+12=14,验证结果正确 图七 设计结果 第六章心得体会 通过本次课程设计,我对EDA这门课程有了更深入的体会和了解,也加深了我在理论课堂和实验课程中所学知识的理解,从拿到题目开始,就首先分析,完成这样的设计需要用到哪些模块?这些模块基本上都是课上讲过的,关键是怎样把他们连接起来,构思好之后就要分模块写程序,在软件上编译、仿真,由于一开始对于自己写程序不是很熟练,也有点粗心马虎,所以第一个模块程序编译总是不成功,用了很长一段时间查错、改正,才把第一个模块完成,在下面的模块设计中就明显比前一个顺畅多了,通过这次课设我明白,对于工程类科目的学习只掌握课堂的理论知识是远远不够的,一定要在亲身实践中去发现问题,解决问题,提高自己的水平和能力。同时也感谢老师们的悉心指导,希望本次课设学到的知识在以后的学习工作中,能发挥更大的作用。 第七章 参考文献 [1]潘松,黄继业等.EDA技术实用教程——Verilog HDL(第四版).科学出版社,2010. [1]潘松,黄继业.EDA技术实用教程——(第三版).科学出版社,2006.

Top_arrow
回到顶部
EEWORLD下载中心所有资源均来自网友分享,如有侵权,请发送举报邮件到客服邮箱bbs_service@eeworld.com.cn 或通过站内短信息或QQ:273568022联系管理员 高进,我们会尽快处理。