简易计算器
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
摘要:
计算器(calculator ;counter)一般是指“电子计算器”,该名词由日文传入中国。计算器能进行数学运算。计算器一般由运算器、控制器、存储器、键盘、显示器、电源和一些可选外围设备组成。低档计算器的运算器、控制器由数字逻辑电路实现简单的串行运算,其随机存储器只有一、二个单元,供累加存储用。使用简单计算器可进行加(+)、减(-)、乘(*)、除(/)、开方(sqrt)、百分数(%)、倒数(1/x)等简单算术计算。本次设计只完成加(+)、减(-)、乘(*)、除(/)运算。
关键字:
加减乘除、优先级、进制转换、数据选择、有效数字、正负
1 设计内容与设计要求
1、1基本内容:设计一个简易计算器
1、2基本要求:
?实现最大输入两位十进制数字的四则运算(加减乘除)
?能够实现多次连算(无优先级,从左到右计算结果)
如 12+34×56-78?90+9=36.75
?最大长度以数码管最大个数为限,溢出报警
?有正负数区分;
?除法不能除尽时小数保留2位有效数字
1、3扩展要求:
能够区分运算优先级(先乘除,后加减)
如12+34×56-78?90+9=1924.13
2
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
选择
能够进行区分优先级的计算,先乘除,后加减。
乘除运算同步进行,从左往右;
乘除结束后的数据进行加减运算。
1
3 系统具体设计
3、1总体框架(总电路图附录1)
数据(包括正负)
除 乘
乘法运算 乘法运算
包括一个乘法器 包括一个乘法器
选择乘或除
的结果输出 若出现加减符
号或第一次计
算,结果反馈
的都是输入的 结果反馈输出 数据
根据加减法选择数据正负,a-b即a+(-b)
进行加减法运算
结果输出 注:各主要
或数据选择输出 模块都加
reset复位
进制转换输出
3、2各个模块设计
?乘法模块(VHDL附录2)
当乘法符号的上升沿的时候读入反馈的结果(包括数据及正负号)并输出到data1、data1_pn;
当乘法符号的下降沿的时候读入数据(包括数据及正负号)并输出到data2、data2_pn。并进行计算,结果的数据由乘法器计算得到;结果的正负号即为两个相乘数据的正负号取异或。
2
数据为保留两位小数,输出的当成被乘数的数乘上100。
元件例化:
lpm_mult0
multongdataa[27..0]
result[35..0]clkdata1[27..0]datain[35..0]dataout[27..0]Unsigneddatab[7..0]multiplicationresetdata2[7..0]instdata[7..0]data1_pn
data_pndata2_pninst9XORres[27..0]
res_pn
inst19inst2
?除法模块(VHDL附录3)
当除法符号的上升沿的时候读入反馈的结果(包括数据及正负号)并输出到data1、data1_pn;
当除法符号的下降沿的时候读入数据(包括数据及正负号)并输出到data2、data2_pn。并进行计算,结果的数据由除法器计算得到;结果的正负号即为两个相除数据的正负号取异或。
数据为保留两位小数,输出的当成被除数的数乘上100。
元件例化:
div
divide0clkdata1[27..0]numer[27..0]quotient[27..0]
resetdata2[7..0]denom[7..0]remain[7..0]
data[7..0]data1_pnNumer is UNSIGNED
data_pndata2_pnDenom is UNSIGNEDinst6res[27..0]XORres_pn
inst18inst3
?乘或除数据选择输出模块(VHDL附录4)
乘或除的数据及正负在各自符号的下降沿时输出,在输出时确定输出的是乘的结果还是除的结果。即预期在乘符号的下降沿时输出乘的结果;在除符号的下降沿时输出除的结果。
又由于两个时钟信号不能控制同一个变量,所以把clk1当成是清零信号,clk2当成时钟信号,当clk2的下降沿的时候输出数据2(即除的结果),clk2为1时,输出数据1(即除的结果)。又为了防止clk2为1与其后面要用到的上升沿冲突,故添加dout。
元件例化:
3
tt
resetresout[27..0]
pn1pnout
pn2dout
res1[27..0]
res2[27..0]
clk1
clk2
inst6
?结果反馈及输出模块(VHDL附录5)
当第一次进行运算或出现过加减再进行乘除的第一次运算时读取输入的数据值,否则读
取前一级的结果值。
其中clr为恢复信号(加or 减),当其为1时,恢复到第一次运算的模式。clk本为乘或
除,又为了避开与上一级的清零错位,故其变为(乘or(除and not dout))
元件例化:
res_cs
resetresult[27..0]
data[7..0]result_pn
data_pn
clr
clk
res[27..0]
res_pn
inst16
?加减选择模块(VHDL附录6)
减法是加法的逆运算,A-B等同于A+(-B),即减法运算只需在进行加法运算前把数据
的正负取反,所以当减法的下降沿时输出的正负为输入的取反,加法的下降沿时输出的正负
为输入的,实现
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
与乘除选择模块一致。
元件例化:
tt2
resetpnout
pndout
clk1
clk2
inst21
?加减运算模块(VHDL附录7)
由于上一级已考虑加减情况,此模块只需实现加法运算。A+B有四种情况:
1、A>0,B>0 输出数据A+B,正负号为正
2、A>0,B<0 |A|>|B| 输出数据|A|-|B| 正负号为正
4
|A|<|B| 输出数据|B|-|A| 正负号为负
3、A<0,B>0 |A|>|B| 输出数据|A|-|B| 正负号为负
|A|<|B| 输出数据|B|-|A| 正负号为正
4、A<0,B<0 输出数据A+B,正负号为负
其中clk为加or减,上升沿时读新数据并计算。
元件例化:
add
clkdout[27..0]
resetdout_pn
data[27..0]
data_pn
inst11
? 数据输出选择模块(VHDL附录8)
当按下等号时输出计算结果,否则输出输入的数据。
当输出为负时:第一个数码管显示F;当输出为负时:第一个数码管显示E;当数据超
出范围溢出是第一个数码管显示C。
元件例化:
choose_out
resetresult[27..0]
equalresult_pn[3..0]
data[7..0]
data_pn
res[27..0]
res_pn
inst3
?进制转换模块
28位二进制数(根据7个数码管为限,最大输出为十进制的9999999,后两位为小
数位)以十进制的方式显示到数码管上,采用各位求余分别显示的方法。
其中除数分别为十进制的1000000、100000、10000、1000、100、10,需要输出的
是每次相除后的商及最后一个余数。
元件例化:
change16_10
resultin[27..0]resultout[27..0]
inst4 其实现电路:
5
INPUTresultin[27..0]VCCdivide8chage_doutnumer[27..0]quotient[27..0]lpm_constant1divide1denom[19..0]remain[19..0]numer[19..0]quotient[19..0]1000000divide2OUTPUTresultout[27..0]20in1[27..0]dout[27..0]inst1denom[19..0]remain[19..0]numer[19..0]quotient[19..0]Numer is UNSIGNEDdivide3in2[19..0]Denom is UNSIGNEDdenom[15..0]remain[15..0]numer[15..0]quotient[15..0]Numer is UNSIGNEDin3[19..0]instDenom is UNSIGNEDdenom[11..0]remain[11..0]Numer is UNSIGNEDin4[15..0]inst8Denom is UNSIGNEDNumer is UNSIGNEDlpm_constant2lpm_constant3in5[11..0]inst910000010000Denom is UNSIGNEDlpm_constant42016in6[7..0]inst3inst4inst10100012in7[3..0]inst5inst13divide4numer[11..0]quotient[11..0]lpm_constant5divide5100denom[7..0]remain[7..0]numer[7..0]quotient[7..0]8inst6Numer is UNSIGNEDdenom[3..0]remain[3..0]Denom is UNSIGNEDNumer is UNSIGNEDinst11Denom is UNSIGNEDinst12lpm_constant6104inst7
?数据输入模块(VHDL附录9)
受限于输入按键有限,输入的两位二进制数有计数器实现,每按下clk加1,到99后恢复零
元件例化:
leijia
resetdataout[7..0]
clk
inst10
4 系统测试
4、1 波形仿真及部分仿真结果
仿真的式子为12+34×56-78?90+9
结果数据为192414,代
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
1924.14
正负为E,代表正
理论结果为1924.13,仿真结果符合。
仿真的式子为(-12)+34×(-56)-78?90+9
结果数据为190786,代表1907.86
正负为F, 代表负
理论结果为-1907.87,仿真结果符合。
6
仿真的式子为90*90*90
结果数据为0,代表0
正负为C,代表溢出
理论结果为27000.00,为溢出,仿真结果符合。
、2 下载到实验箱进行验证 4
输入:
key4:加
key3:减
key2:乘
key1:除
key5:正、负(不亮时为正,亮时为负)
key6:等号 (不亮时为输出为数据,亮时输出为计算结果)
key7:复位
key8:数据累加输入
输出显示:从左到右,第一个数码管显示正负或溢出,后七个输出输入数据或结果。
验证:1、按正确方式按入式子1+2×3?4-5?6×15+25
输出结果E 0 0 0 1 5 0 0 代表正15.00
和理论值15一致。
2、按正确方式按入式子12+25?31×(-45) -46
输出结果F 0 0 0 7 0 2 9 代表正-70.29
和理论值70.29一致。
3、按正确方式按入式子10×10×10×10×10
输出结果C 0 0 0 0 0 0 0 代表溢出
理论值为100000,溢出,符合要求。
5 实验结论:
由仿真结果和下载验证结果可知:
设计的计算器能够:
实现最大输入两位十进制数字的四则运算(加减乘除);
最大长度以数码管最大个数(数据显示7个,正负号或溢出显示为1个)
为限,溢出报警;
有正负数区分;
结果保留2位小数;
能够区分运算优先级(先乘除,后加减);
7
附录1 result_pn[3..0]result[27..0]
OUTPUTOUTPUT
change16_10resultin[27..0]resultout[27..0]inst4
addclkdout[27..0]resetdout_pndata[27..0]data_pnleijiainst11resetdataout[7..0]clk
inst10
inst15OR3
1AND2inst14
res_cschoose_outresetresult[27..0]data[7..0]result_pnNOTinst13resetresult[27..0]data_pnequalresult_pn[3..0]clrdata[7..0]inst7clkinst9data_pnres[27..0]NOTres[27..0]res_pnres_pnAND2inst16inst3tt2ttresetpnoutpndoutresetresout[27..0]clk1pn1pnoutclk2pn2doutres1[27..0]inst21res2[27..0]clk1clk2inst17OR2inst6
inst19inst18XORXOR
divide0multongclkdata1[27..0]resetdata2[7..0]datain[35..0]dataout[27..0]numer[27..0]quotient[27..0]inst5data[7..0]data1_pndenom[7..0]remain[7..0]data_pndata2_pnres[27..0]inst8res_pn
Unsignedinst1multiplication
inst12OR2lpm_mult0
instdataa[27..0]result[35..0]datab[7..0]
divclkdata1[27..0]resetdata2[7..0]data[7..0]data1_pnNumer is UNSIGNEDdata_pndata2_pnDenom is UNSIGNEDres[27..0]res_pn
inst2VCCINPUTINPUTINPUTINPUTVCCINPUTVCCINPUTINPUTVCCVCCVCC
syaddsyminusdata_pnsydivsymulVCCresetequalINPUT 8
VCCclk
附录2(乘法模块)
library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity mul is
port( clk : in std_logic;
reset: in std_logic;
data : in std_logic_vector(7 downto 0);
data_pn : in std_logic;
res : in std_logic_vector(27 downto 0);
res_pn: in std_logic;
data1: out std_logic_vector(27 downto 0);
data2: out std_logic_vector(7 downto 0);
data1_pn:out std_logic;
data2_pn:out std_logic
);
end entity mul;
architecture behave of mul is signal temp1:std_logic;
signal temp2:std_logic;
begin
process(reset,clk)
begin
if(reset='0')then
if(clk'event and clk='1')then
data1<=res; data1_pn<=res_pn;
end if;
if(clk'event and clk='0')then
data2<=data; data2_pn<=data_pn;
end if;
else data1<="0000000000000000000000000000";data2<="00000000";
end if;
end process;
end behave;
9
附录3(除法模块)
library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity div is
port( clk : in std_logic;
reset: in std_logic;
data : in std_logic_vector(7 downto 0);
data_pn : in std_logic;
res : in std_logic_vector(27 downto 0);
res_pn: in std_logic;
data1: out std_logic_vector(27 downto 0);
data2: out std_logic_vector(7 downto 0);
data1_pn:out std_logic;
data2_pn:out std_logic
);
end entity div;
architecture behave of div is signal temp1:std_logic;
signal temp2:std_logic;
begin
process(reset,clk)
begin
if(reset='0')then
if(clk'event and clk='1')then
data1<=res; data1_pn<=res_pn;
end if;
if(clk'event and clk='0')then
data2<=data; data2_pn<=data_pn;
end if;
else data1<="0000000000000000000000000000";data2<="00000000";
end if;
end process;
end behave;
10
附录4(乘或除数据选择输出模块) library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity tt is
port(
reset:in std_logic;
pn1:in std_logic;
pn2:in std_logic;
res1:in std_logic_vector(27 downto 0 );
res2:in std_logic_vector(27 downto 0 );
clk1: in std_logic;
clk2: in std_logic;
resout: out std_logic_vector(27 downto 0 );
pnout:out std_logic;
dout:out std_logic
);
end entity tt;
architecture behave of tt is signal temp:std_logic;
begin
dout<=temp;
process(clk1,clk2)
begin
if(reset='0')then
if(clk1='1')then temp<='0'; elsif(clk2'event and clk2='0')then
temp<='1';
end if;
if(temp='1')then
resout<=res2;pnout<=pn2; else resout<=res1;pnout<=pn1; end if;
else temp<='0';
end if;
end process;
end behave;
11
附录5(结果反馈及输出模块)
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity res_cs is
port( reset:in std_logic;
data: in std_logic_vector(7 downto 0);
data_pn: in std_logic;
clr: in std_logic;
clk: in std_logic;
res: in std_logic_vector(27 downto 0);
res_pn:in std_logic;
result: out std_logic_vector(27 downto 0);
result_pn:out std_logic
);
end entity res_cs;
architecture behave of res_cs is signal cn:std_logic_vector(3 downto 0); begin
process(clk,clr)
begin
if(reset='0')then
if(clr='0')then
if(cn="0000")then result<="0000000000000"&(data*"1100100");result_pn<=data_pn;
else result<=res;result_pn<=res_pn;
end if;
if(clk'event and clk='1')then
cn<=cn+1;
end if;
else cn<="0000";
end if;
else cn<="0000";
end if;
end process;
end behave;
12
附录6(加减选择模块) library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity tt2 is
port( reset:in std_logic;
pn:in std_logic;
clk1: in std_logic;
clk2: in std_logic;
pnout:out std_logic;
dout:out std_logic
);
end entity tt2;
architecture behave of tt2 is signal temp:std_logic;
begin
dout<=temp;
process(clk1,clk2)
begin
if(reset='0')then
if(clk1='1')then temp<='0'; elsif(clk2'event and clk2='0')then
temp<='1';
end if;
if(temp='1')then
pnout<=not(pn); else pnout<=pn;
end if;
else temp<='0';
end if;
end process;
end behave;
13
附录7(加减运算模块)
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity add is
port(clk :in std_logic;
reset:in std_logic;
data:in std_logic_vector(27 downto 0);
data_pn:in std_logic;
dout :out std_logic_vector(27 downto 0);
dout_pn:out std_logic
);
end entity add;
architecture behave of add is
signal temp: std_logic_vector(27 downto 0):="0000000000000000000000000000";
signal temp_pn:std_logic:='0';
begin
dout<=temp;
dout_pn<=temp_pn;
process(clk,reset)
begin
if(reset='1')then temp<="0000000000000000000000000000";temp_pn<='0';
elsif(clk'event and clk='1')then
if(temp_pn='0')then
if(data_pn='0')then temp<=temp+data;temp_pn<='0';
else
if(temp>data or temp=data)then temp<=temp-data;temp_pn<='0';
else temp<=data-temp;temp_pn<='1';
end if;
end if;
else
if(data_pn='1')then temp<=temp+data;temp_pn<='1';
else
if(temp
"100110001001011001111111")then result<="0000000000000000000000000000";result_pn<="1100";
else result<=res;
if(res_pn='0')then result_pn<="1110";
else result_pn<="1111";
end if;
end if;
end if;
else result<="0000000000000000000000000000";result_pn<="0000";
end if;
end process;
end behave;
15
附录9(数据输入模块)
library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity leijia is
port( reset:in std_logic;
clk: in std_logic;
dataout: out std_logic_vector(7 downto 0)
);
end entity leijia;
architecture behave of leijia is signal temp:std_logic_vector(7 downto 0);
begin
dataout<=temp;
process(clk,reset)
begin
if(reset='0')then
if(clk'event and clk='1')then
if(temp="01100100")then temp<="00000000";
else
temp<=temp+1;
end if;
end if;
else temp<="00000000";
end if;
end process;
end behave;
16