EDA计数器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告
课程名称CPU设计
实验项目实验二四位二进制数可预置可
逆计数器设计
实验仪器LP-2900 FPGA实验装置
系别计算机科学与技术
专业计算机科学与技术
班级/学号计科1206/
学生姓名
实验日期 2014/05/29 成绩
指导教师胡信裕
实验二四位二进制数可预置可逆计数器设计
一、实验目的
熟悉掌握QUARTUSⅡ文本编辑器的使用及VHDL文本输入方式,并进一步熟悉掌握设计源文件的编译及仿真操作。
通过本实验设计:
1.学习、理解VHDL文本文件的基本结构,掌握VHDL文本文件设计的基本方法。
2.学习使用QUARTUSⅡ文本编辑器的模板输入方法,熟悉常用语句的语法现象,掌握VHDL 功能描述和结构描述的方法。
3.学习、理解并掌握运用VHDL实现常用组合逻辑和时序逻辑的设计。
二、实验器材
微机系统、LP-2900 FPGA实验装置、QUARTUSⅡ
三、实验内容
(一)四位二进制数可预置可逆计数器功能要求
1.具有异步清零和同步置数操作功能控制,各一位控制输入,四位二进制数预置输入。
2.具有可控的四位二进制正(加一)、负(减一)循环计数功能,四位计数输出、一位正、负计数控制输入。
3.扩展设计:具有可级联能力。
(二)实验步骤
1.上机,学习掌握QUARTUSⅡ工具软件的操作及文本设计输入、编辑工具的使用方法;
2.建立一个设计项目文件夹(Ex2)和一个VHDL文本文件(counter_n16.vhd),将模块(实体)名和文件名设为相同并保存为VHDL格式文件;
3.根据VHDL文本文件的基本结构和实验内容要求,借助文本模板命令分别输入和编辑“库和程序包”的申明、实体中的端口和结构体中的逻辑功能描述;
4.对VHDL文本设计文件进行编译、修改,直至没有语法错误;
5.建立一个仿真测试波形文件,针对电路功能要求,设计仿真输入波形;
6.进行仿真测试操作,分析仿真结果并对文本设计文件进行修改,直至全部功能正确实现;
7.保存设计文件,完成实验报告。
(三)实验设计
1.文本设计:
上次实验,我们通过图形的方法,创建了10进制加法计数器,使用了库中现有的T触发器进行设计。
使用图形方法进行电路的设计其优点为可以清楚的阐述其内部的构造,以及相关的实现的细节。
而其缺点也相当明显,就是操作比较繁琐且复杂,不利于芯片的快速高效的开发。
而文本设计方式,给我们提供了一种简单高效的开发工具。
它采用结果控制的思想(即不关心具体
的实现过程,只关心实现什么样的功能)大大简化了对芯片电路的开发流程。
我们此次使用文本文件的设计方法,进行一个四位二进制数可预置可逆计数器设计。
采用文本方式进行开发要先清楚该芯片有什么样的引脚,每种引脚的类型是如何的(哪些是输入的,哪些是输出的,哪些是总线类型的等等)然后进行相关功能的定义和实现。
所以我们先在ENTITY 中定义端口。
注意,文件名和ENTITY的名要求一致。
下面我们来分析用到的信号端口:首先要有CLK时钟信号。
另外,因其可以预置数,所以要有输入信号LD信号;然后因为有异步清零功能,所以设置一个输入信号NCLR(N表示为低电平有效);然后还有4位二进制数预置输入,要有DIN,其类型为向量(从3到0);然后要有方向标志来指明是加一计数器或者是减一计数器;要有输出端Q,他是输出向量(从3到0);因其可级联,不但要有低位的进位(CI输入信号),还有向高位的进位(CO输出信号);相关代码如下:
P ORT
(
NCLR, LD, DIR, CI, CLK : IN S TD_LOGIC;
DIN : IN S TD_LOGIC_VECTOR(3 DOWNTO 0);
Q : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
CO : OUT STD_LOGIC
);
完成了信号端口的定义,我们下面在结构体中对其具体的实现的功能进行描述。
首先分析一下,芯片的清零是异步实现的,并不需要等待时钟到来,所以其优先级最高,先处理此类信号。
其次,当时钟信号来的时候,要先判断是否有置位操作,如果有,立即响应,如果没有判断是加法计数器还是减法计数器。
其次还应该对从低位来的进位有所考虑,如果有进位,并且当计数器为加法,已经记到”1111”的时候,就要输出向高位的进位’1’否则,输出’0’,如果为减法计数器,并且已经记到”0000”的时候,就要向高位的进位输出’1’否则,输出’0’。
如果来自低位的进位为’0’即,没有用到该片计数器,则输出0.具体的步骤如下:
IF NCLR='0' THEN
QQ := "0000";
ELSIF CLK = '1' AND CLK 'EVENT THEN
IF LD = '1' THEN
QQ := DIN;
ELSIF CI = '1' THEN
IF DIR = '1' THEN
QQ := QQ + 1;
ELSE
QQ := QQ - 1;
END IF;
END IF;
END IF;
IF CI = '1' THEN
IF DIR = '1' THEN
IF QQ = "1111" THEN
CO <= '1';
ELSE
CO <= '0';
END IF;
ELSE
IF QQ = "0000" THEN
CO <= '1';
ELSE
CO <= '0';
END IF;
END IF;
ELSE
CO <= '0';
END IF;
2.仿真设计:
新建波形文件(counter_n16sim.vwf),添加信号节点对CLK设置时钟信号。
然后设置CI为高,先测试减法一计数器(DIR为0,加法与此相同)的基本功能,具体的生成波形报告的方式不再赘述,如图2-1:
图2-1
图中发现,计数器在从0~F总共16个脉冲后,输出了一个进位脉冲CO。
证明其能够实现加一计数器的功能。
上图中发现还对CI进行了相关设置,如果CI为0,则计数器不计数产生延时现象如图2-2,
并且CO应该为0如图2-3所示:
同步置数的测试,即将输出端Q的数据与输入端DIN相同,如图2-4
图2-4
对于同步置数和异步清零的优先级关系,我们已经分析了,异步因为不需要等待时钟信号故
先相应,图2-5中也可清楚的看出:
该计数器可在运行中时间加法计数和减法计数的相互转换,如图2-6:
图2-6
四、实验总结
1.实验中,先建立VHDL文本counter_n16.vhd,然后,通过插入代码块模版的方式,快速的将一些常用的代码框架添加到代码文件中。
其中
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
四行代码在以后的实验中都会用到,故可以直接拷贝。
注意在定义ENTITY的时候,
ENTITY的名称要与VHDL文件名一致。
在ARCHITECTURE中,在BEGIN之前可以定义节点信号,节点信号是其内部传递的信号,本实验中可以省略。
ARCHITECTURE中的语句一般都是并行的,即每条语句没有先后之分,而我们的计数器要通过判断来相应不同情况下不同的反映,这就需要用到串行语句,解决方法是使用PROCESS。
PROCESS语句需要声明敏感信号,敏感信号都为输入信号,可以所有的输入信号全都添加进来作为敏感信号。
PROCESS中的BEGIN之前可以定义变量,这种变量的赋值符号为’:=’,而端口信号的赋值符号为’<=’或’=>’箭头指向被赋值的端口。
另外要注意的是,虽然VHDL语言的结构与BASIC语言相似但VHDL语言以’;’作为一条语句的结束,要千万注意。
另外CLK=’1’AND CLK ‘EVENT为时钟的上升沿,类似的CLK=’0’ AND CLK ‘EVENT为时钟的下降沿。
2.本次实验在编译过程中,出现了数次错误,说明我对VHDL语言的语法还不熟,对常用的语法规则还不清楚。
如在END IF后加’;’。
这一点是需要注意的,虽然VHDL与BASIC 语言相似,但一定要注意其不同之处。
另外有些同学会出现IF的个数与END IF的个数不匹配的问题,解决此问题的方法是在写IF的时候,马上把END IF写上,并且按照嵌套的层次进行相应的缩进。
3.通过此次实验,我熟悉并掌握了Quartus II文本编辑器的使用和VHDL文件的输入方式(如通过代码块插入方式输入),理解了VHDL语言的结构,掌握了简单的VHDL语言设计的基本方法,清楚了VHDL语言的一些语法规则,实现了使用VHDL语言进行简单的组合逻辑以及时序逻辑电路的设计。
最后再次熟悉了使用波形文件进行仿真的设计方法以及实现步骤。
4.通过此次实验,我发现了VHDL语言设计电路的简洁性,高效性,以及易维护性。
体会到了使用文本开发的好处。