文档视界 最新最全的文档下载
当前位置:文档视界 › 用verilog语言知识学习设计简单计算器

用verilog语言知识学习设计简单计算器

用verilog语言知识学习设计简单计算器
用verilog语言知识学习设计简单计算器

目录

第一章设计任务及要求 (1)

1.1课程设计依据 (1)

1.2课程设计内容 (1)

1.3课程设计要求 (2)

第二章设计思路 (2)

2.1设计原理 (2)

2.1.1计算器原理 (2)

2.1.2数码管显示原理 (2)

2.1.3 8位扫描原理 (3)

2.2设计总体框图 (3)

第三章设计源序及分析 (4)

3.1计算器模块 (4)

3.1.1计算器源程序 (4)

3.1.2模块分析 (4)

3.2数码管显示模块 (5)

3.2.1数码管源程序 (5)

3.2.2模块分析 (5)

3.3循环扫描模块 (6)

3.3.1循环扫描程序 (6)

* *

3.3.2模块分析 (6)

3.4总程序 (7)

3.4.1总体源程序 (7)

3.4.2程序分析 (9)

第四章序仿真结果及分析 (9)

4.1计算器设计仿真及分析 (9)

4.2数码管仿真图及分析 (10)

4.3总体仿真图 (11)

第五章结果验证 (12)

5.1实验结果及分析 (12)

第六章心得体会 (12)

第七章参考文献 (13)

第一章设计任务及要求

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.

相关文档