简易计算器设计.docx
18页1 .引言 1..2 . 设计技术指标 1..2.1 计算器性能 1..2.2 计算器人机接口 1.3 . 设计方案 1..4 .设计实现 2..4.1 加法 2.4.2 减法 3.4.3 乘法 3.4.4 除法 4.4.5 清零 5.4.6 移位 .6.4.7 数据分配器 6.4.8 ROM .8a.4.9 RAM 9.4.10 CPU 1.05 .设计结果 1.45.1 加法 1.45.2 减法 1.45.3 乘法 1.55.4 除法 1.55.6 移位 1.55.7 显示原理图 1.56 .结论 167 .参考文献 1.6EDA设计 简易计算器设计1 .引言计算器是我们日常生活中经常接触到的计算工具之一,最早的计算工具诞生 在中国中国古代 最早采用的一种计算工具叫筹策,又被叫做算筹这种算筹 多用竹子制成,也有用木头,兽骨 充当材料的.约二百七十枚一束,放在布袋 里可随身携带直到今天仍在使用的珠算盘,是中 国古代计算工具领域中的另一项发明,明代时的珠算盘已经与现代的珠算盘几乎相同 17世纪初,西方国家的计算工具有了较大的发展,英国数学家纳皮尔发明的 "纳皮尔算筹”,英国牧师奥却德发明了圆柱型对数计算尺,这种计算尺不仅能做加减乘除、乘方、 开 方运算,甚至可以计算三角函数,指数函数和对数函数,这些计算工具不仅带 动了计算器的发展,也为 现代计算器发展奠定了良好的基础,成为现代社会应 用广泛的计算工具。
1642年,年仅19岁的 法国伟大科学家帕斯卡引用算盘的 原理,发明了第一部机械式计算器,在他的计算器中有一些 互相联锁的齿轮,一个转过十位的齿轮会使另一个齿轮转过一位, 人们可以像拨号码盘那 样, 把数字拨进去,计算结果就会出现在另一个窗口中,但是只能做加减计算 1694年,莱布 尼兹在德国将其改进成可以进行乘除的计算此后,一直要到 20世纪50年代末才有电子计算器的出现本文介绍一种基于VHDL的通用计算器 的设计方法,可以实现了加、减、乘、除、清零和移位的运算2 .设计技术指标2.1 计算器性能处理器处理字长:4位处理器工作速度:处理器指令数量:6种2.2 计算器人机接口程序存储方式:数据输入方式:NBI按键结果显示方式:NBI模拟显示3 .设计方案先用vhdl设计一个ALU包括加法器、减法器、乘法器、除法器、清零、移 位,由于按键是4*4的,所以只能输入4位数,而且必须只能输入一个数,所以 我把进位都删了再设计两个分配器,分别把数据 a, b送入运算模块,使操作码为 000时数 据给加法器,进行加法;输入操作码 001时数据给减法器,进行减法;输入操作 码010时数据给乘法器,进行乘法;输入操作码011时数据给除法器,进行除法; 输入操作码100时,进行清零;输入操作码101地址时,把数据进行移位。
然后设计一个ROMK块,输出操作码、a和b的地址,设置a的地址为110, b的地址为111RO时再连一个RAM写入数据a、b,输入a、b的地址,读出a、b的数据 并且在RAM!用clk产生了另一个clk_2 ,用clk控制a和b;用clk_2控制读 和写最后设计一个CPUffi所有的模块用元件例化连接起来连接顺序为ROMRAM 分配器、ALU另外在din中又设定了前三位为操作码,第四位为输入数据 a,若第四位为1时输入为a,若第五位为1时输入为bo程序存储器数据线 r处理器地址线r 数据线, %数据存储器地址线图1、基础结构图2、进阶结构4 .设计实现4.1 加法LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY plus ISPORT(a:IN STD_LOGIC_VECTOR(3 DOWNTO 0);b:IN STD_LOGIC_VECTOR(3 DOWNTO 0);ALU_OUT:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));end plus;ARCHITECTURE behave OF plus ISbeginALU_OUT<=a+b;end behave;4.2 减法LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY jian ISPORT(a:IN STD_LOGIC_VECTOR(3 DOWNTO 0);b:IN STD_LOGIC_VECTOR(3 DOWNTO 0);ALU_OUT:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));end jian;ARCHITECTURE behave OF jian ISbeginALU_OUT<=a-b;end behave;4.3 乘法LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;use ieee.std_logic_arith.all;ENTITY cheng ISPORT(a:IN STD_LOGIC_VECTOR(3 DOWNTO 0);b:IN STD_LOGIC_VECTOR(3 DOWNTO 0);ALU_OUT:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END cheng;ARCHITECTURE behave OF cheng ISbeginprocess(a,b)variable t1 : integer range 0 to 15;variable t2 : integer range 0 to 15;variable t3 : integer range 0 to 15;begint1:=conv_integer(a);t2:=conv_integer(b);t3:=t1*t2;if t3<=15then ALU_OUT(3 downto 0)<=conv_STD_LOGIC_VECTOR(t3,4);else ALU_OUT<=X"8";end if;end process;end behave;4.4 除法LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;use ieee.std_logic_arith.all;ENTITY chu ISPORT(a:IN STD_LOGIC_VECTOR(3 DOWNTO 0);b:IN STD_LOGIC_VECTOR(3 DOWNTO 0);ALU_OUT:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);co:OUT STD_LOGIC_vector(3 downto 0));END chu;ARCHITECTURE behave OF chu ISsignal aa,bb:std_logic_vector(3 downto 0);signal fuhao,sign,d:std_logic;begind<=(a(3) xor b(3));aa<=a;bb<=b;process(aa,bb,fuhao,sign,d)variable temp_a,temp_b:std_logic_vector(7 downto 0);variable n:integer;begintemp_a:="0000"&aa;temp_b:=bb&"0000";n:=0;while(n<4) looptemp_a:=temp_a(6 downto 0)&'0';n:=n+1;if temp_a(7 downto 4)>=bb thentemp_a:=temp_a-temp_b+1;end if;end loop;if d='1'thentemp_a(3 downto 0):=(not temp_a(3 downto 0))+1;end if;if sign='1'thentemp_a(7 downto 4):=(not temp_b(7 downto 4))+1;end if;ALU_OUT<=temp_a(3 downto 0);co<=temp_a(7 downto 4);if(bb<="0000")thenALU_OUT<="0000";end if;end process;end behave;4.5 清零LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY clr ISPORT(ALU_OUT:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END clr;ARCHITECTURE behave OF clr ISbeginALU_OUT<="0000";end behave;4.6 移位LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY shift ISPORT(a:IN STD_LOGIC_VECTOR(3 DOWNTO 0);ALU_OUT:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END shift;ARCHITECTURE behave OF shift ISsignal aa:std_logic_vector(4 downto 0);beginaa<=a&a(3);ALU_OUT<=aa(3 downto 0);end behave;4.7 数据分配器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY fenpeia ISPORT(clk:IN STD_LOGIC;dina:IN STD_LOGIC_VECTOR(3 DOWNTO 0);sel: IN STD_LOGIC_VECTOR(2 DOWNTO 0);D0,D1,D2,D3,D4,D5:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END fenpeia;ARCHITECTURE abc OF fenpeia ISBEGINPROCESS(clk)BEGINif(clk'event and clk='1')thenCASE sel ISWHEN "000"=>D0<=dina;D1<="0000";D2<="0000";D3<="0000";D4<="0000";D5<="0000";WHEN "001"=>D1<=dina;D0<="0000";D2<="0000";D3<="0000";D4<="0000";D5<="0000";WHEN "010"=>D2<=dina;D0<="0000";D0<="0000";D3<="。





