您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > Verilog-HDL简单计算器设计
目录第一章设计目的及任务要求设计目的(1)进一步加强熟练EDA基础知识。(2)熟练掌握Quartus软件的使用以及用该软件编程和仿真的全过程。(3)培养独立思考问题,解决问题的能力以及查阅相关资料和资料的正确使用能力,为明年的毕业设计打下良好的设计基础。设计任务设计一个简单计算器,输入为8位二进制数,分别用两位数码管显示,输出的计算结果为16位二进制数,并用四位数码管显示,能够实现+、-、*、/四种运算,其中除法的结果显示分为商和余数两部分,分别用两位数码管显示。课设要求(1)说明题目的设计原理和思路、采用方法及设计流程。(2)系统框图、Verilog语言设计程序或原理图。(3)对各子模块的功能以及各子模块之间的关系做较详细的描述。(4)详细说明调试方法和调试过程。(5)说明测试结果:仿真时序图和结果显示图,并对其进行说明和分析。第二章设计思路设计总体框图有分析可知,本次课程设计可以分成五个木块来实现相应的功能,分别是输入模块,计算模块,扫描模块,输出模块以及显示模块。图一设计总体框图设计原理计算其原理Verilog语言中可直接用运算符+、-、*、/、%来实现四则运算,系统会根据程序自动综合出相应的计算器。分别是加法器模块,减法器模块,乘法器模块和除法器模块,当程序变得正确的话则各个程序会按照一定的步骤一步步的往下执行的。数码显示原理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。共阴极七段数码管的原理图如下图二所示。图二共阴极七段数码管八位数码管扫描的原理图三所示的是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扫描的快慢。扫描频率大于人眼的分辨率时,呈现出八个数码管同时点亮。第三章设计源程序及分析计算器模块计算器源程序mdulejsq(a,b,c,out);input[7:0]a,b;input[1:0]c;otput[15:0]out;reg[15:0]outreg[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:beginout1=a/b;out2=a%b;out={out1,out2};enddefault:;endcaseendmodule计算器程序分析该模块是本次设计的核心部分,用于实现四则运算,两位八位二进制数a、b作为待计算的输入,并输入两位二进制数c作为计算功能选择,00代表加法运算、01代表减法运算、10代表乘法运算、11代表除法运算。输出16位二进制数out位运算结果。并在总体设计中把输入、输出端接到数码管上。数码管显示部分数码管显示源程序moduleDECL7S(A,LED7S);input[3:0]A;output[6:0]LED7S;reg[6:0]LED7S;always@(A)begincase(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;endcaseendendmodule数码管显示程序分析该模块是整个设计中的显示部分,是一个编码器组合逻辑设计,每个数码管可显示十六进制0至F,对应4位二进制数,因此输入端a、b分别用两个数码管显示,输出out用四个数码管显示,该设计中需要八个同样的数码管显示器,即。此模块将在总程序中被调用八次。循环扫描模块循环扫描程序modulexhsm(clk,rst,count,Dout);inputclk,rst;output[6:0]Dout;output[2:0]count;reg[6:0]Dout;reg[2:0]count;always@(posedgeclkornegedgerst)beginif(!rst)count=3'b000;elseif(count==3'b111)count=3'b000;elsecount=count+3'b001;endalways@(posedgeclk)begincase(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;endcaseendendmodule循环程序分析该模块是一个循环计数器,在时钟和复位信号的控制下,从000—111循环计数分别控制八个数码管循环点亮,由于时钟的频率比较快,大于人眼的分辨率,所以显示出八个数码管同时点亮,即同时显示计算器的输入、输出。总程序及其分析modulejsq9(a,b,c,Dout,count,clk,rst);input[7:0]a,b;inputclk,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;DECL7Su1(.A(a[7:4]),.LED7S(LED7S1));DECL7Su2(.A(a[3:0]),.LED7S(LED7S2));DECL7Su3(.A(b[7:4]),.LED7S(LED7S3));DECL7Su4(.A(b[3:0]),.LED7S(LED7S4));DECL7Su5(.A(out[15:12]),.LED7S(LED7S5));DECL7Su6(.A(out[11:8]),.LED7S(LED7S6));DECL7Su7(.A(out[7:4]),.LED7S(LED7S7));DECL7Su8(.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:beginout1=a/b;out2=a%b;out={out1,out2};enddefault:;endcasealways@(posedgeclkornegedgerst)beginif(!rst)count=3'b000;elseif(count==3'b111)count=3'b000;elsecount=count+3'b001;endalways@(posedgeclk)begincase(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;endcaseendendmodulemoduleDECL7S(A,LED7S);input[3:0]A;output[6:0]LED7S;reg[6:0]LED7S;always@(A)begincase(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;endcaseendendmodule该程序是本次设计的最终程序,主要是将以上三个模块联系起来。其中反复调用数码管显示模块,将其与计算器模块相连。其输入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位二进制数,并用四位数码管显示,能够实现+、-、*、/四种运算,其中除法的结果显示分为商和余数两部分,分别用两位数码管显示的设计要求。第四章时序仿真和结果验证计算器时序仿真及其分析图四计算器时序仿真图如图四所示为计算器的实序仿真图,当输入a为00000001、b为00000001、c为01时输出out为0000000000000000即1-1=0;当输入a=
本文标题:Verilog-HDL简单计算器设计
链接地址:https://www.777doc.com/doc-7334363 .html