您好,欢迎来到吉趣旅游网。
搜索
您的当前位置:首页简易计算器设计

简易计算器设计

来源:吉趣旅游网
目 录

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 .................................................................................................................... 8 4.9 RAM ................................................................................................................... 9 4.10 CPU ............................................................................................................... 10 5. 设计结果 ................................................................................................................ 14 5.1 加法 ............................................................................................................... 14 5.2 减法 ............................................................................................................... 14 5.3 乘法 ............................................................................................................... 15 5.4 除法 ............................................................................................................... 15 5.6 移位 ............................................................................................................... 15 5.7 显示原理图 ................................................................................................... 15 6. 结论 ........................................................................................................................ 16 7. 参考文献 ................................................................................................................ 16

EDA设计 简易计算器设计

1. 引言

计算器是我们日常生活中经常接触到的计算工具之一,最早的计算工具诞生在中国。中国古代 最早采用的一种计算工具叫筹策,又被叫做算筹。这种算筹多用竹子制成,也有用木头,兽骨 充当材料的.约二百七十枚一束,放在布袋里可随身携带。直到今天仍在使用的珠算盘,是中 国古代计算工具领域中的另一项发明,明代时的珠算盘已经与现代的珠算盘几乎相同。 17 世纪初,西方国家的计算工具有了较大的发展,英国数学家纳皮尔发明的\"纳皮尔算筹\", 英国牧师奥却德发明了圆柱型对数计算尺,这种计算尺不仅能做加减乘除、乘方、开方运算, 甚至可以计算三角函数,指数函数和对数函数,这些计算工具不仅带动了计算器的发展,也为 现代计算器发展奠定了良好的基础,成为现代社会应用广泛的计算工具。12 年,年仅 19 岁的 法国伟大科学家帕斯卡引用算盘的原理,发明了第一部机械式计算器,在他的计算器中有一些 互相联锁的齿轮,一个转过十位的齿轮会使另一个齿轮转过一位,人们可以像拨电话号码盘那 样,把数字拨进去,计算结果就会出现在另一个窗口中,但是只能做加减计算。1694 年,莱布 尼兹在德国将其改进成可以进行乘除的计算。此后,一直要到 20 世纪 50 年代末才有电子计算 器的出现。 本文介绍一种基于 VHDL 的通用计算器的设计方法,可以实现了加、减、乘、除、清零和移位的运算。

2. 设计技术指标

2.1 计算器性能

处理器处理字长:4位 处理器工作速度: 处理器指令数量:6种 2.2 计算器人机接口 程序存储方式: 数据输入方式:NBI按键 结果显示方式:NBI模拟显示

3. 设计方案

先用vhdl设计一个ALU包括加法器、减法器、乘法器、除法器、清零、移位,由于按键是4*4的,所以只能输入4位数,而且必须只能输入一个数,所以

-1-

我把进位都删了。

再设计两个分配器,分别把数据a,b送入运算模块,使操作码为000时数据给加法器,进行加法;输入操作码001时数据给减法器,进行减法;输入操作码010时数据给乘法器,进行乘法;输入操作码011时数据给除法器,进行除法;输入操作码100时,进行清零;输入操作码101地址时,把数据进行移位。

然后设计一个ROM模块,输出操作码、a和b的地址,设置a的地址为110,b的地址为111。

ROM后再连一个RAM,写入数据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_11.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY plus IS PORT(

a:IN STD_LOGIC_VECTOR(3 DOWNTO 0); b:IN STD_LOGIC_VECTOR(3 DOWNTO 0);

-2-

ALU_OUT:OUT STD_LOGIC_VECTOR(3 DOWNTO 0) ); end plus;

ARCHITECTURE behave OF plus IS begin

ALU_OUT<=a+b; end behave; 4.2 减法

LIBRARY IEEE;

USE IEEE.STD_LOGIC_11.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY jian IS PORT(

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 IS begin

ALU_OUT<=a-b; end behave; 4.3 乘法

LIBRARY IEEE;

USE IEEE.STD_LOGIC_11.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; use ieee.std_logic_arith.all; ENTITY cheng IS PORT(

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;

-3-

ARCHITECTURE behave OF cheng IS begin process(a,b)

variable t1 : integer range 0 to 15; variable t2 : integer range 0 to 15; variable t3 : integer range 0 to 15; begin

t1:=conv_integer(a); t2:=conv_integer(b); t3:=t1*t2; if t3<=15

then 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_11.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 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 IS signal aa,bb:std_logic_vector(3 downto 0); signal fuhao,sign,d:std_logic; begin d<=(a(3) xor b(3));

-4-

aa<=a;bb<=b;

process(aa,bb,fuhao,sign,d)

variable temp_a,temp_b:std_logic_vector(7 downto 0); variable n:integer; begin

temp_a:=\"0000\"&aa; temp_b:=bb&\"0000\"; n:=0;

while(n<4) loop

temp_a:=temp_a(6 downto 0)&'0'; n:=n+1;

if temp_a(7 downto 4)>=bb then temp_a:=temp_a-temp_b+1; end if; end loop; if d='1'then

temp_a(3 downto 0):=(not temp_a(3 downto 0))+1; end if; if sign='1'then

temp_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\")then ALU_OUT<=\"0000\"; end if; end process; end behave;

4.5 清零

LIBRARY IEEE;

USE IEEE.STD_LOGIC_11.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL;

-5-

ENTITY clr IS PORT(

ALU_OUT:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END clr;

ARCHITECTURE behave OF clr IS begin

ALU_OUT<=\"0000\"; end behave; 4.6 移位

LIBRARY IEEE;

USE IEEE.STD_LOGIC_11.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY shift IS PORT(

a:IN STD_LOGIC_VECTOR(3 DOWNTO 0); ALU_OUT:OUT STD_LOGIC_VECTOR(3 DOWNTO 0) ); END shift;

ARCHITECTURE behave OF shift IS signal aa:std_logic_vector(4 downto 0); begin aa<=a&a(3);

ALU_OUT<=aa(3 downto 0); end behave; 4.7 数据分配器

LIBRARY IEEE;

USE IEEE.STD_LOGIC_11.ALL; ENTITY fenpeia IS PORT(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 IS

-6-

BEGIN PROCESS(clk) BEGIN

if(clk'event and clk='1')then CASE sel IS WHEN \"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<=\"0000\";D4<=\"0000\";D5<=\"0000\";

WHEN \"011\"=>

D3<=dina;D0<=\"0000\";D1<=\"0000\";D2<=\"0000\";D4<=\"0000\";D5<=\"0000\";

WHEN \"101\"=>

D5<=dina;D0<=\"0000\";D1<=\"0000\";D2<=\"0000\";D3<=\"0000\";D4<=\"0000\";

WHEN others => D4<=dina;

D0<=\"0000\";D1<=\"0000\";D2<=\"0000\";D3<=\"0000\";D5<=\"0000\";

END CASE; end if;

END PROCESS; END abc;

LIBRARY IEEE;

USE IEEE.STD_LOGIC_11.ALL; ENTITY fenpeib IS PORT(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 fenpeib;

ARCHITECTURE abc OF fenpeib IS BEGIN PROCESS(clk) BEGIN

if(clk'event and clk='1')then

-7-

CASE sel IS WHEN \"000\"=>

D0<=dinb;D1<=\"0000\";D2<=\"0000\";D3<=\"0000\";D4<=\"0000\";D5<=\"0000\";

WHEN \"001\"=>

D1<=dinb;D0<=\"0000\";D2<=\"0000\";D3<=\"0000\";D4<=\"0000\";D5<=\"0000\";

WHEN \"010\" =>

D2<=dinb;D0<=\"0000\";D0<=\"0000\";D3<=\"0000\";D4<=\"0000\";D5<=\"0000\";

WHEN \"011\"=>

D3<=dinb;D0<=\"0000\";D1<=\"0000\";D2<=\"0000\";D4<=\"0000\";D5<=\"0000\";

WHEN \"101\"=>

D5<=dinb;D0<=\"0000\";D1<=\"0000\";D2<=\"0000\";D3<=\"0000\";D4<=\"0000\";

WHEN others => D4<=dinb;

D0<=\"0000\";D1<=\"0000\";D2<=\"0000\";D3<=\"0000\";D5<=\"0000\";

END CASE; end if;

END PROCESS; END abc; 4.8 ROM

LIBRARY IEEE;

USE IEEE.STD_LOGIC_11.ALL;

ENTITY rom IS PORT(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 rom;

ARCHITECTURE behave OF rom IS signal n:std_logic_vector(8 downto 0); begin

process(clk,datain) begin

if(clk'event and clk='1')then case datain is

-8-

when \"000\" =>n<=\"000110111\"; when \"001\" =>n<=\"001110111\"; when \"010\" =>n<=\"010110111\" ; when \"011\" =>n<=\"011110111\" ; when \"100\" =>n<=\"100110111\" ; when \"101\" =>n<=\"101110111\" ; when others =>null; 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 behave; 4.9 RAM

LIBRARY IEEE;

USE IEEE.STD_LOGIC_11.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY ram IS

PORT( 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 DOWNTO 0) ); END ram;

ARCHITECTURE behave OF ram IS

type 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; begin

-9-

process(clk,clk_2,count) begin

if (clk'event and clk='1') then if count=1 then clk_2<='0'; count<=0; if(r='1')then

ram_name(conv_integer(Aa))<=dataa; end if; if(w='1')then

a<=ram_name(conv_integer(Aa)); end if;

else count<=count+1; clk_2<='1'; if(r='1')then

ram_name(conv_integer(Bb))<=datab; end if; if(w='1')then

b<=ram_name(conv_integer(Bb)); end if; end if; end if; end process; process(clk,r,w) begin if(clk='1')then r<='1';w<='0'; elsif(clk='0')then w<='1';r<='0'; end if; end process; end behave; 4.10 CPU LIBRARY IEEE;

-10-

USE IEEE.STD_LOGIC_11.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; entity cpu is port(

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:out std_logic_vector(3 downto 0) ); end cpu;

architecture behave of cpu is

component rom is PORT(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 is

PORT( 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 DOWNTO 0) );

end component;

component fenpeia is PORT(clk:IN STD_LOGIC;

dina:IN STD_LOGIC_VECTOR(3 DOWNTO 0); sel: IN STD_LOGIC_VECTOR(2 DOWNTO 0);

-11-

D0,D1,D2,D3,D4,D5:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); end component;

component fenpeib is port(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 is PORT(

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 jian is PORT(

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 is PORT(

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 chu is

-12-

PORT(

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 is PORT(

ALU_OUT:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); end component;

component shift is

PORT(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,D2a,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); begin

process(clk,din) begin

dinma<=din(2 downto 0); if(din(3)='1')then dataa<=data; elsif(din(4)='1')then

-13-

datab<=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 port 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 减法

-14-

5.3 乘法

5.4 除法

5.5 清零

5.6 移位

5.7 显示原理图

-15-

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.

-16-

指导教师姓名: 是否有专题调研 专题题目 厂矿方面意见: 签字:________ ___年 __月 __日 指导教师意见: 评定成绩________ 签字:________ _____年 __月 __日 -17-

备注:

-18-

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- jqkq.cn 版权所有 赣ICP备2024042794号-4

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务