实验一-加法器的设计与实现

实验一-加法器的设计与实现
实验一-加法器的设计与实现

实验项目二:简单计算器设计与实现基本要求:

1. 能够实现加减运算

2. 能够实现乘法运算

扩展要求:

1.能够实现除法运算

一、实验目的

利用原件例化语句完成一个8位加法器的设计。

二、实验环境

Quartus II 开发系统

三、实验容

1、掌握层次化设计的方法;

2、掌握一位全加器工作原理;

3、掌握用VHDL文本输入法设计电子线路的详细流程;

4、掌握元件例化语句用法;

5、熟悉软硬件设计验证方法。

四、实验过程

设计思想:

8位二进制加法器可以由8个全加器通过级联的方式构成。根据全加器级联的原理,用VHDL设计一个8位二进制数的加法器,可以先设计一个一位全加器,然后利用一位全加器采用元件例化的方式实现加法器。

实验步骤:

1、设计一个全加器

新建工程,建立源文件,输入VHDL设计文件,如下图所示:

完成设计文件输入后,保存文件,对文件进行编译、仿真,以下是仿真结果,如图所示:

由图可知仿真结果正确。

2、元件例化

把VHDL设计文件转为原理图中使用的元件。在文件菜单File中选择Creat/Update选项,单击Create Symbol File for Current File 选项,系统自动生成相应的元件标号。

重复新建文件的操作,选择Block Diagram/Schmatic File 选项,新建一个原理图文件,在添加元件列表中可以看到自动生成的元件,选择full_adder这个元件添加到原理图中,如下图所示:

3、完成顶层图的设计

用生成的元件标号,完成顶层图的设计。这里有两种方法,一种是直接用原理图设计,根据原理图设计工具的使用方法,完成顶层文件的设计,这个方法比较复杂,所以这里选择另一种方法,通过VHDL设计文件。

继续建立源文件,输入VHDL设计文件,如下图所示:

依照上述步骤,保存文件,对文件进行编译、仿真,以下是仿真结果,如图所示:

五、实验总结

本次实验的目的是设计一个8位二进制加法器,而8位二进制加法器可以由8个全加器通过级联的方式构成。

根据全加器级联的原理,用VHDL设计一个8位二进制数的加法器,可以先设计一个一位全加器,然后利用一位全加器采用元件例化的方式实现加法器。

总结实验过程中遇到的各种问题,问题产生的原因,解决方法,分析仿真结果,验证8位加法器设计的是否正确。

根据实验设计思路,我先用VHDL设计了一个全加器full_adder.vhd,编译、仿真成功后,通过元件例化的方式,采用原理图设计了一个8位的加法器adder8.bdf,但是在这个过程中出现了很多问题,即由于我是把这个8位的加法器的每个全加器元件输入输出引脚分开的,因此一开始就设计了17个输入引脚,这使得我在给输入引脚添加信号时不知道添加什么信号,才能够起到验证仿真结果是否正确的目的。

另外,我在这里还遇到了一些其他问题,由于在建立原理图文件adder8.bdf以后没有将该原理图文件设置成顶层文件,这使得我在给输入引脚添加信号时无法添加引脚。这里还存在一个问题:当通过原理图设计8位加法器时,我不知道能不能把它当着一个整体,即3输入2输出。另外,怎么通过在原理图设计里面把这一思想表示出来。

由于通过原理图设计无法完成8位加法器的设计,所以我又换了VHDL设计。通过VHDL 设计比原理图设计简单,但是更容易出错,比如输入引脚、中间信号生成等的不匹配。

建立VHDL源文件以后,保存为adder8.vhd文件名,编译、仿真,但是由于我是将8位加法器当成的一个整体,即3输入2输出,并且在端口定义时我所定义的数据类型为逻辑矢量,因此这里又出现一个问题,即在仿真时给输入信号添加信号时不能确定到底应该怎么添加,并且其中间信号无法确定。不过后来在老师的指导下,我明白了错误根源在哪里。

在对8位的加法器进行仿真时,一开始我是用的时序仿真,这里就出现一个问题,即仿真结果为未知,但是换用功能仿真的时候,其结果就是正确的,不指导是什么原因。还有另外一个问题,即我在将adder8.vhd文件设置为顶层文件以后,并没有进行编译就开始仿真,这使得我在给引脚添加信号时始终也找不到输入信号,不过好在面意识到了这个问题。

在本次实验过程中,虽然出现了很多问题,但正是因为在操作过程中发现了很多问题并且通过对这些问题的解决,我对Quartus II 7.0 开发系统环境也有了更深入的了解和认识。

每一次发现错误,都是一个新的进步,比起上次实验课,我觉得自己在操作动手能力方面又有了提升,至少现在看到一个问题的时候,能够明白是什么问题,能够知道该怎么去问,该怎么去解决它。所以说,无论干什么,但凡是要想真正学一门知识,都要自己去摸索,只有自己亲自动手去做了,才能够真正深入地认识和了解它,才能够学到自己想要的东西。另外,在学习的过程中,还要掌握技巧,我觉得在这方面自己就很欠缺,因此,以后一定要注意,努力培养这方面的能力。

实验六乘法器的设计

一、实验目的

1、了解乘法器的工作原理。

2、了解复杂时序电路的设计流程。

二、实验原理及容

实验原理

设计一个能进行两个十进制数的乘法器,乘数和被乘数的输入用开关K1~K10代表0~9,用编码器对数据开关进行编码,设置相乘信号,当输入完毕后,相乘信号有效,使输入的乘数送进寄存器寄存。在输入被乘数。设计等于信号。当输入完毕后。启动乘法模块。

实验容

1、设计一个能进行两个十进制数相乘的乘法器,乘数和被乘数均小于100。(可以参考教材231页的VHDL代码来设计)

2、对所编写的电路进行编译及正确的仿真。

三、实验条件

Quartus II实验环境

四、实验及仿真

顶层文件如下:

该器件multi对乘法过程进行时序控制。

Clk为时钟信号;

lStart控制乘法器的开始;

Endd控制乘法器结束;

Clr起到复位作用;

Ca用来控制乘数移位寄存器(74194)的移位功能,在乘法器进行移位相加的过程中进行移位;

Cb[0]、cb[1]用来控制被乘数移位寄存器(74194)的移位功能,在乘法器进行移位相加的过程中进行移位;

Cm[0]、cm[1]控制八位移位寄存器(74198)的移位功能,使得和乘数与被乘数的移位相一致;

编码如下;

library ieee;

use ieee.std_logic_1164.all;

entity multi is

port

(

start:in std_logic;

i4:in std_logic;

bi:in std_logic;

clk:in std_logic;

endd:out std_logic;

clr:out std_logic;

ca:out std_logic;

cb1:out std_logic;

cb0:out std_logic;

cm1:out std_logic;

cm0:out std_logic;

cc:out std_logic

);

end multi;

architecture multi_architecture of multi is

signal current_state,next_state:bit_vector(1 downto 0); constant s0:bit_vector(1 downto 0):="00";

constant s1:bit_vector(1 downto 0):="01";

constant s2:bit_vector(1 downto 0):="10";

constant s3:bit_vector(1 downto 0):="11";

begin

com1:process(current_state,start,i4)

begin

case current_state is

when s0=>if(start='1')then next_state<=s1;

else next_state<=s0;

end if;

when s1=>next_state<=s2;

when s2=>next_state<=s3;

when s3=>if(i4='1')then next_state<=s0;

else next_state<=s2;

end if;

end case;

end process com1;

com2:process(current_state,bi)

begin

case current_state is

when s0=>endd<='1';clr<='1';ca<='0';cb1<='0';cb0<='0'; cm1<='0';cm0<='0';cc<='0';

when s1=>endd<='0';clr<='0';ca<='1';cb1<='1';cb0<='1'; cm1<='0';cm0<='0';cc<='0';

when s2=>if(bi='1')then

endd<='0';clr<='1';ca<='0';cb1<='0';cb0<='0';

cm1<='1';cm0<='1';cc<='1';

else

endd<='0';clr<='1';ca<='0';cb1<='0';cb0<='0';

cm1<='0';cm0<='0';cc<='1';

end if;

when s3=>endd<='0';clr<='1';ca<='0';cb1<='0';cb0<='1'; cm1<='0';cm0<='1';cc<='0';

end case;

end process com2;

reg:process(clk)

begin

if clk='1'and clk'event then

current_state<=next_state;

相关主题
相关文档
最新文档