EDA实验数控分频器的设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
***大学本科实验报告(2011-2012学年下学期)
课程名称:EDA
任课教员:
系:
专业:
二0一一年十月八日
《EDA》课程实验报告
实验项目名称:数控分频器的设计
系::专业:指导教员:
姓名:学号:成绩:
同组姓名:
实验地点:实验室实验日期:
数控分频器的设计一、实验目的和要求
学习数控分频器的设计、分析和测试方法。
二、实验内容和原理
1、实验内容:
a)分析程序一中的各语句功能、设计原理及逻辑功能,详述进程
P_REG和P_DIV的作用,并画出该程序的RTL电路图;
b)仿真:输入不同的CLK频率和预置值D,给出如书图6-21的
时序波形。
c)将程序一扩展成16位分频器;
d)利用两个程序一给出的模块设计一个电路,使其输出方波的正
负脉宽的宽度分别由两个8位输入数据控制。
2、实验原理:
数控分频器的功能就是当在输入端给定不同输入数据时,将对输入的时钟信号有不同的分频比,数控分频器就是用计数值可并行预的加法计数器设计完成的,方法是将计数溢出位与预置数加载输入信号相接即可,详细设计程序如程序一。
三、实验环境
QuartⅡ软件
四、操作方法与实验步骤
1、在QuartⅡ中建立工程,进行程序编写、调试、编译、仿真,设置CLK频率和D为不同值;
2、分析程序一,类推出16位分频器的设计方法;
3、仔细分析程序一中如何控制正负脉宽的宽度,采用元件例化语句,将DVF和SEL2两个VHDL设计实体组合起来,设计如题中要求的电路,具体程序见程序三,并按步骤1执行。
五、实验数据记录和处理
将程序进行仿真得到的波形图如下所示:
(1)8位数控分频器
(2)16位数控分频器
(3)正负脉冲宽度可变分频器
六、实验结果与分析:
仿真结果基本正确,但在对16位数控分频器做仿真时应把endtime设置在ms级以上,即仿真时长要稍长些,才能出来明显结果。正负脉冲宽度可变分频器的正负脉冲宽度分别由D1和D2控制,其基本原理与8位数控分频器原理一致。
七、实验心得与体会
通过该实验,我掌握了数控分频器的工作原理及其设计方法,学会了元件例化语句的使用。
八、程序代码
程序一:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY DVF IS
PORT( CLK:IN STD_LOGIC;
D:IN STD_LOGIC_VECTOR(7 DOWNTO 0); FOUT:OUT STD_LOGIC);
END;
ARCHITECTURE one OF DVF IS
SIGNAL FULL:STD_LOGIC;
BEGIN
P_REG:PROCESS(CLK)
VARIABLE CNT8:STD_LOGIC_VECTOR(7 DOWNTO 0); BEGIN
IF CLK 'EVENT AND CLK='1' THEN
IF CNT8="11111111" THEN
CNT8:=D;
FULL<='1';
ELSE CNT8:=CNT8+1;
FULL<='0';
END IF;
END IF;
END PROCESS P_REG;
P_DIV:PROCESS(FULL)
VARIABLE CNT2:STD_LOGIC;
BEGIN
IF FULL 'EVENT AND FULL='1' THEN
CNT2:=NOT CNT2;
IF CNT2='1' THEN FOUT<='1';ELSE FOUT<='0'; END IF;
END IF;
END PROCESS P_DIV;
END ;
程序二:
L IBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY DVF16 IS
PORT( CLK:IN STD_LOGIC;
D:IN STD_LOGIC_VECTOR(15 DOWNTO 0);
FOUT:OUT STD_LOGIC);
END;
ARCHITECTURE one OF DVF16 IS
SIGNAL FULL:STD_LOGIC;
BEGIN
P_REG:PROCESS(CLK)
VARIABLE CNT8:STD_LOGIC_VECTOR(15 DOWNTO 0);
BEGIN
IF CLK 'EVENT AND CLK='1' THEN
IF CNT8="1111111111111111" THEN
CNT8:=D;
FULL<='1';
ELSE CNT8:=CNT8+1;
FULL<='0';
END IF;
END IF;
END PROCESS P_REG;
P_DIV:PROCESS(FULL)
VARIABLE CNT2:STD_LOGIC;
BEGIN
IF FULL 'EVENT AND FULL='1' THEN
CNT2:=NOT CNT2;
IF CNT2='1' THEN FOUT<='1';ELSE FOUT<='0'; END IF;
END IF;
END PROCESS P_DIV;
END ;