用verilog语言设计简单计算器Word格式.docx
《用verilog语言设计简单计算器Word格式.docx》由会员分享,可在线阅读,更多相关《用verilog语言设计简单计算器Word格式.docx(13页珍藏版)》请在冰豆网上搜索。
仿真时序图和结果显示图,并对其进行说明和分析。
第二章设计思路
设计原理
计算器原理
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位扫描原理
图二所示的是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]out
reg[7:
0]out1,out2;
always@(a,b,c,out)
case(c)
2'
b00:
out=a+b;
b01:
out=a-b;
b10:
out=a*b;
b11:
begin
out1=a/b;
out2=a%b;
out={out1,out2};
end
default:
;
endcase
endmodule
模块分析
该模块是本次设计的核心部分,用于实现四则运算,两位八位二进制数a、b作为待计算的输入,并输入两位二进制数c作为计算功能选择,00代表加法运算、01代表减法运算、10代表乘法运算、11代表除法运算。
输出16位二进制数out位运算结果。
并在总体设计中把输入、输出端接到数码管上。
数码管显示模块
数码管源程序
moduleDECL7S(A,LED7S);
input[3:
0]A;
output[6:
0]LED7S;
reg[6:
always@(A)
begin
case(A)
4'
b0000:
LED7S<
=7'
b0111111;
b0001:
LED7S<
=7'
b0000110;
b0010:
b1011011;
b0011:
b1001111;
b0100:
b1100110;
b0101:
b1101101;
b0110:
b1111101;
b0111:
b0000111;
b1000:
b1111111;
b1001:
b1101111;
b1010:
b1110111;
b1011:
b1111100;
b1100:
b0111001;
b1101:
b1011110;
b1110:
b1111001;
b1111:
b1110001;
endcase
end
该模块是整个设计中的显示部分,是一个编码器组合逻辑设计,每个数码管可显示十六进制0至F,对应4位二进制数,因此输入端a、b分别用两个数码管显示,输出out用四个数码管显示,该设计中需要八个同样的数码管显示器,即。
此模块将在总程序中被调用八次。
循环扫描模块
循环扫描程序
modulexhsm(clk,rst,count,Dout);
inputclk,rst;
output[6:
0]Dout;
output[2:
0]count;
reg[6:
reg[2:
always@(posedgeclkornegedgerst)
if(!
rst)
count<
=3'
b000;
elseif(count==3'
b111)
else
=count+3'
b001;
always@(posedgeclk)
case(count)
3'
b000:
Dout<
=LED7S1;
b001:
Dout<
=LED7S2;
b010:
=LED7S3;
b011:
=LED7S4;
b100:
=LED7S5;
b101:
=LED7S6;
b110:
=LED7S7;
b111:
=LED7S8;
该模块是一个循环计数器,在时钟和复位信号的控制下,从000—111循环计数分别控制八个数码管循环点亮,由于时钟的频率比较快,大于人眼的分辨率,所以显示出八个数码管同时点亮,即同时显示计算器的输入、输出。
总程序
总体源程序
modulejsq9(a,b,c,Dout,count,clk,rst);
inputclk,rst;
output[2:
reg[15:
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));
always@(a,b,c,Dout,count,clk,rst)
LE