比较器的设计与实现实验报告

  • 格式:doc
  • 大小:348.05 KB
  • 文档页数:11

比较器的设计与实现实验报告

一、 实验目的

1. 学习常用组合逻辑的可综合代码的编写;

2. 学习VHDL语言的编程思想与调试方法;

3. 学习通过定制LPM原件实现逻辑设计,通过波形仿真及硬件试验箱验证设计的正确与否。

4. 设计一个能实现两个二位数大小的比较电路并实现利用LPM原件实现。

二、 实验原理

1. 功能

设A2、A1、B2、B1为输入端,F1、F2、F3为输出端,设A=A2A1。B=B2B1(A2A1,B2B1表示两位二进制数)。当A >B时,F1为1,F2、F3为0;当A

A2

A1

B2

B1

2. 实现

1)VHDL实现

系统的VHDL设计通常采用层次化的设计方法,自顶向下划分F1

F2

F3 A<BA<B

A>B

A=B 比较电路 系统功能并逐层细化逻辑描述。VHDL 实体功能的描述可分为结构式、行为式 和 寄存器传输级(Register Transfer Level, RTL)描述三种。此次实验结构比较简单,采用寄存器传输级描述的实现方式,选用并行信号赋值语句。

2)LPM实现

参数化模板库(Library Parameterized Modules, LPM)提供了一系列可以参数化定制的逻辑功能模块。采用LPM设计方法的主要优势在于设计文件与器件结构无关、高效布线和通用性三方面。

三、 实验内容

1. VHDL实现

新建VHDL文件,输入以下代码

说明:当VHDL设计电路反馈时,应将端口声明为buffer端口,而不是out端口。若out端口需要反馈至电路内部时,常使用signal去实现反馈。

查看波形仿真

网格参数设置:

Simulation mode: Functional;

End time: 2 us;

Gride size: 100 ns;

信号说明:

a2a1和b2b1为二位二进制输入信号;

f1f2f3 为三位二进制输出信号;

数据信号参数设置:

a2a1: Count Value→Counting→Increment by:01

Count Value→Timing→Count every:400.0ns

b2b1: Count Value→Counting→Increment by:01

Count Value→Timing→Count every:100.0ns

管脚绑定:

下载测试: 程序下载完成后,由于管脚86、87、88、89均为关闭状态,即A、B输入均为00,f1f2f3输出为010,故只有管脚41所对应的二极管亮。

按照开关闭合为输入1断开为输入0 的规则闭合和断开管脚86、87、88、89,管脚41、39、38所对应的二极管的亮灭结果符合实验预期和逻辑结果,与波形图一致。

2. LPM实现

1. 新建工程并选择目标器件;

2. 选择Tools→Mega Wizard Plug-in Manager命令,选择Create a new custom megafunction variation定制一个新的宏模块;

3.设置目标器件为Flex10K,元件名为lpm_compare2文件输出类型为VHDL;

4.设置输出数据宽度为2位,并选择所需输出端口;

5.设置datab和比较符号类型;

6.设置流水线,进入EDA设置界面;

7.设置Generate netlist,打开仿真图。

四、 实验结论

数位相同的两个二进制数通过从高位到低位逐项比较可得其大小关系。若所有位上的数值都相等,则两数相等;若在某一位开始,第一个数比第二个数大(小),那么第一个数比第二个数大(小)。 五、 实验总结

1、 这次做实验报告吸取了上次做实验报告的教训,不再是截图截图了,对实验原理等实质性的东西增加了许多文字性的描述。

2、 每次做实验总会出现许多自己意想不到的小错误导致实验失败,需要多加实践练习和理论学习,更加深层次理解其原理。

3、 敲了许多次代码,对VHDL语言的语法习惯有了一些理解。

六、 实验日志

问题1:第一次设置输入数据信号参数时,没有定义周期,结果导致A、B信号周期相同,仿真图和实验书上的结果出现了很大差别,后来进行了设置,至少形式上有所相同了。后来想到的确是需要调整周期,否则不会出现A、B数据的分别对应结果,只能是00对应00,11对应11了。

问题2:经过以上的调整,虽然形式上一样了,但是实验结果出现了差别,原来我以为是代码的逻辑错误,但我看了许多遍,更改了许多遍,还是有错误,后来发现是建立网格时a1a2的顺序弄错了,应该是a2在上a1在下。以后做实验的时候应该多动脑筋思考,许多细节上的东西,实验书上不会展示出来。

思考题:

(2)、VHDL 中如何调用用户自定义元件、旧式 74 系列元件、参数化元件?

用户自定义元件:

library WORK;

use WORK._user_package.all; --_user_package代表用户程序包

旧式 74 系列元件:

library ALTERA;

use ALTERA.maxplus2.all;

参数化元件:

library LPM;

use LPM.lpm_components.all;

(3)、比较 VHDL 中的 signal 和 variable ?

signal :

1)、变量必须先定义,后使用。它无实际的物理意义;

2)、VHDL 中的变量都是局部变量;

3)、变量的赋值用 “:=” 来表示,没有延时;

variable:

1)、VHDL 的信号一般是有实际的物理意义的。(在 entity 的 port 部分所定义的接口实际上都属于信号范畴);

2)、信号可以使全局定义的,也可以是局部定义的;

3)、信号的赋值用 “<=” 来表示(有时这种操作也称为信号的传送),可以规定延迟(若没指定延迟时,信号的传送也会有一最小延迟Δ)。

(4)、VHDL 中如何设计反馈电路?

使用 buffer 信号。

(5)、举例说明常用的VHDL 的顺序执行和并行执行语句?

例:x,y,z 三个信号初始值为 ‘0’:

signal x,y,z: std_logic;

x<=’0’;

y<=’0’;

z<=’0’;

然后执行语句:

y<=x;

x<=z;

z<=’1’;

1)、若是顺序执行,则最终结果 x<=’0’, y<=’0’, z<=’1’;

2)、若是并行执行,则最终结果 x<=’1’, y<=’1’, z<=’1’;

(7)、说明 VHDL 描述组合逻辑电路时 signal 的作用是什么?

连接电路。