1、 目 录1. 引言12. 设计技术指标12.1 计算器性能1 2.2 计算器人机接口13. 设计方案14. 设计实现2 4.1 加法2 4.2 减法3 4.3 乘法3 4.4 除法4 4.5 清零5 4.6 移位6 4.7 数据分配器6 4.8 ROM8 4.9 RAM9 4.10 CPU105. 设计结果14 5.1 加法14 5.2 减法14 5.3 乘法15 5.4 除法15 5.6 移位15 5.7 显示原理图156. 结论167. 参考文献16EDA设计 简易计算器设计1. 引言计算器是我们日常生活中经常接触到的计算工具之一,最早的计算工具诞生在中国。中国古代 最早采用的一种计算工具
2、叫筹策,又被叫做算筹。这种算筹多用竹子制成,也有用木头,兽骨 充当材料的约二百七十枚一束,放在布袋里可随身携带。直到今天仍在使用的珠算盘,是中 国古代计算工具领域中的另一项发明,明代时的珠算盘已经与现代的珠算盘几乎相同。 17 世纪初,西方国家的计算工具有了较大的发展,英国数学家纳皮尔发明的纳皮尔算筹, 英国牧师奥却德发明了圆柱型对数计算尺,这种计算尺不仅能做加减乘除、乘方、开方运算, 甚至可以计算三角函数,指数函数和对数函数,这些计算工具不仅带动了计算器的发展,也为 现代计算器发展奠定了良好的基础,成为现代社会应用广泛的计算工具。1642 年,年仅 19 岁的 法国伟大科学家帕斯卡引用算盘的
3、原理,发明了第一部机械式计算器,在他的计算器中有一些 互相联锁的齿轮,一个转过十位的齿轮会使另一个齿轮转过一位,人们可以像拨电话号码盘那 样,把数字拨进去,计算结果就会出现在另一个窗口中,但是只能做加减计算。1694 年,莱布 尼兹在德国将其改进成可以进行乘除的计算。此后,一直要到 20 世纪 50 年代末才有电子计算 器的出现。 本文介绍一种基于 VHDL 的通用计算器的设计方法,可以实现了加、减、乘、除、清零和移位的运算。2. 设计技术指标2.1 计算器性能 处理器处理字长:4位 处理器工作速度: 处理器指令数量:6种2.2 计算器人机接口 程序存储方式: 数据输入方式:NBI按键 结果显
4、示方式:NBI模拟显示3. 设计方案先用vhdl设计一个ALU包括加法器、减法器、乘法器、除法器、清零、移位,由于按键是4*4的,所以只能输入4位数,而且必须只能输入一个数,所以我把进位都删了。再设计两个分配器,分别把数据a,b送入运算模块,使操作码为000时数据给加法器,进行加法;输入操作码001时数据给减法器,进行减法;输入操作码010时数据给乘法器,进行乘法;输入操作码011时数据给除法器,进行除法;输入操作码100时,进行清零;输入操作码101地址时,把数据进行移位。然后设计一个ROM模块,输出操作码、a和b的地址,设置a的地址为110,b的地址为111。ROM后再连一个RAM,写入数
5、据a、b,输入a、b的地址,读出a、b的数据。并且在RAM里用clk产生了另一个clk_2,用clk控制a和b;用clk_2控制读和写。最后设计一个CPU把所有的模块用元件例化连接起来。连接顺序为ROM、RAM、分配器、ALU。另外在din中又设定了前三位为操作码,第四位为输入数据a,若第四位为1时输入为a,若第五位为1时输入为b。图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
6、_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
7、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);
8、 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
9、 t3=15then ALU_OUT(3 downto 0)=conv_STD_LOGIC_VECTOR(t3,4);else ALU_OUT=X8;end if;end process;end behave;44.4 除法 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; use ieee.std_logic_arith.all; ENTITY chu IS PORT( a:IN STD_LOGIC_VECTOR(3 DOWNTO 0); b:IN STD_LOGIC_VECTOR(3 DO
10、WNTO 0); ALU_OUT:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); co:OUT STD_LOGIC_vector(3 downto 0); END chu; ARCHITECTURE behave OF chu IS signal aa,bb:std_logic_vector(3 downto 0); signal fuhao,sign,d:std_logic; begin d=(a(3) xor b(3);aa=a;bb=b;process(aa,bb,fuhao,sign,d)variable temp_a,temp_b:std_logic_vector
11、(7 downto 0);variable n:integer; begintemp_a:=0000&aa;temp_b:=bb&0000;n:=0;while(n=bb thentemp_a:=temp_a-temp_b+1;end if;end loop;if d=1thentemp_a(3 downto 0):=(not temp_a(3 downto 0)+1;end if;if sign=1thentemp_a(7 downto 4):=(not temp_b(7 downto 4)+1;end if;ALU_OUT=temp_a(3 downto 0);co=temp_a(7 do
12、wnto 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.ST
13、D_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 D0=dina;D1=0000;D2=0000;D3=0000;D4=0000;D5 D1=dina;D
14、0=0000;D2=0000;D3=0000;D4=0000;D5 D2=dina;D0=0000;D0=0000;D3=0000;D4=0000;D5 D3=dina;D0=0000;D1=0000;D2=0000;D4=0000;D5 D5=dina;D0=0000;D1=0000;D2=0000;D3=0000;D4 D4=dina; D0=0000;D1=0000;D2=0000;D3=0000;D5 D0=dinb;D1=0000;D2=0000;D3=0000;D4=0000;D5 D1=dinb;D0=0000;D2=0000;D3=0000;D4=0000;D5 D2=dinb
15、;D0=0000;D0=0000;D3=0000;D4=0000;D5 D3=dinb;D0=0000;D1=0000;D2=0000;D4=0000;D5 D5=dinb;D0=0000;D1=0000;D2=0000;D3=0000;D4 D4=dinb; D0=0000;D1=0000;D2=0000;D3=0000;D5nnnnnnnull;end case;end if;end process;addr=n;ma(2 downto 0)=n(8 downto 6);A(2 downto 0)=n(5 downto 3);B(2 downto 0)=n(2 downto 0);end
16、behave; 4.9 RAMLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY ram ISPORT( clk:IN STD_LOGIC;dataa,datab:IN STD_LOGIC_VECTOR(3 DOWNTO 0); Aa:IN STD_LOGIC_VECTOR(2 DOWNTO 0);Bb:IN STD_LOGIC_VECTOR(2 DOWNTO 0);a:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);b:OUT STD_LOGIC_VECTOR(3 D
17、OWNTO 0);END ram;ARCHITECTURE behave OF ram IStype ramtype is array(3 downto 0) of std_logic_vector(3 downto 0);signal ram_name:ramtype;signal w,r,clk_2:std_logic;signal count:integer range 0 to 1; beginprocess(clk,clk_2,count)beginif (clkevent and clk=1) thenif count=1 thenclk_2=0; count=0;if(r=1)t
18、henram_name(conv_integer(Aa)=dataa;end if; if(w=1)thena=ram_name(conv_integer(Aa);end if; else count=count+1;clk_2=1;if(r=1)thenram_name(conv_integer(Bb)=datab;end if; if(w=1)thenb=ram_name(conv_integer(Bb);end if;end if;end if;end process;process(clk,r,w)beginif(clk=1)thenr=1;w=0;elsif(clk=0)thenw=
19、1;r=0;end if;end process;end behave;4.10 CPULIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;entity cpu isport(din:in std_logic_vector(4 downto 0);data:in std_logic_vector(3 downto 0);clk:in std_logic;alu_out:out std_logic_vector(3 downto 0);yushu
20、:out std_logic_vector(3 downto 0);end cpu;architecture behave of cpu iscomponent rom isPORT(clk:in std_logic; datain:IN STD_LOGIC_VECTOR(2 DOWNTO 0); addr:OUT STD_LOGIC_VECTOR(8 DOWNTO 0);ma,A,B:OUT STD_LOGIC_VECTOR(2 DOWNTO 0);END component;component ram isPORT( clk:IN STD_LOGIC;dataa,datab:IN STD_
21、LOGIC_VECTOR(3 DOWNTO 0); Aa:IN STD_LOGIC_VECTOR(2 DOWNTO 0);Bb:IN STD_LOGIC_VECTOR(2 DOWNTO 0);a:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);b:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);end component;component fenpeia isPORT(clk:IN STD_LOGIC;dina:IN STD_LOGIC_VECTOR(3 DOWNTO 0);sel: IN STD_LOGIC_VECTOR(2 DOWNTO 0);D0,D
22、1,D2,D3,D4,D5:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);end component;component fenpeib isport(clk:IN STD_LOGIC;dinb: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 component;component plus isPORT(a:IN STD_LOGIC_VECTOR(3 DOWNTO 0);b:
23、IN STD_LOGIC_VECTOR(3 DOWNTO 0);ALU_OUT:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);end component;component 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 component;component cheng isPORT( a:IN STD_LOGIC_VECTOR(3 DOWNTO 0); b:IN STD_
24、LOGIC_VECTOR(3 DOWNTO 0);ALU_OUT:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);end component;component 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 component;component clr isPORT(ALU_OUT:OUT STD_L
25、OGIC_VECTOR(3 DOWNTO 0);end component;component shift isPORT(a:IN STD_LOGIC_VECTOR(3 DOWNTO 0); ALU_OUT:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);end component;signal addr:STD_LOGIC_VECTOR(8 DOWNTO 0);signal ma,Aa,Bb,dinma:STD_LOGIC_VECTOR(2 DOWNTO 0);signal a,b:STD_LOGIC_VECTOR(3 DOWNTO 0);signal D0a,D1a,D2
26、a,D3a,D4a,D5a,D0b,D1b,D2b,D3b,D4b,D5b:STD_LOGIC_VECTOR(3 DOWNTO 0);signal alu_out1,alu_out2,alu_out3,alu_out4,alu_out5,alu_out6:std_logic_vector(3 downto 0);signal aaa,bbb:std_logic;signal dataa,datab:std_logic_vector(3 downto 0);beginprocess(clk,din)begindinma=din(2 downto 0);if(din(3)=1)thendataa=
27、data;elsif(din(4)=1)thendatab=data;end if;end process;A1:rom port map(clk,dinma,addr,ma,Aa,Bb);A2:ram port map(clk,dataa,datab,Aa,Bb,a,b);A3:fenpeia port map(clk,a,dinma,D0a,D1a,D2a,D3a,D4a,D5a); A4:fenpeib port map(clk,b,dinma,D0b,D1b,D2b,D3b,D4b,D5b); A5:plus port map(D0a,D0b,alu_out1);A6:jian por
28、t map(D1a,D1b,alu_out2);A7:cheng port map(D2a,D2b,alu_out3);A8:chu port map(D3a,D3b,alu_out4,yushu); A9:clr port map(alu_out5); A10:shift port map(D5a,alu_out6);alu_out=alu_out1 or alu_out2 or alu_out3 or alu_out4 or alu_out5 or alu_out6;end behave;5. 设计结果5.1 加法5.2 减法5.3 乘法5.4 除法5.5 清零5.6 移位5.7 显示原理
29、图6. 结论经过对EDA以及相关软件的研究,完成了用VHDL语言实现通用计算器的设计。本设计实现了基本的加、减、乘、除、清零、移位的功能。通过本实验,我了解了VHDL 具有极强的描述能力,能支持系统行为级、寄存器传输级和逻辑门电路级三个不同层次的设计,能够完成从上层到下层(从抽象到具体)逐层描述的结构化设计思想。要注意在程序编写过程中出现的错误提示信息,对其进行正确改正,基本上掌握 EDA 工具QuartusII 软件和DXP的使用方法,并学会了用QuartusII 软件建立项目并编写程序和调试下载的方法,基本上熟悉了VHDL 程序的软件的仿真方法,也熟练掌握VHDL 程序的编写方法和注意事项。7. 参考文献1 秦鸿刚,刘京科,吴迪. 基于FPGA的双口RAM实现及应用2 曹听燕,周凤臣,聂春燕.EDA技术实验与课程设计. M北京:清华大学出版社,2006.8.3 李广第等. 单片机基础 第1版. 北京:北京航空航天大学出版社,1999.8.4 何立民等. 单片机高等教程 第1版. 北京:北京航空航天大学出版社,2006.6.5 朱家兴,付伟. 用VHDL实现计算机组成原理实验中的RAM存储器系统. 红河学院学报,2006.4.指导教师姓名:是否有专题调研专题题目厂矿方面意见:签字:_ _年 _月 _日指导教师意见:评定成绩_ 签字:_ _年 _月 _日备注:-18-